{
  "version": 3,
  "sources": ["../src/cli.ts", "../../src/contracts/animations.ts", "../../src/contracts/result.ts", "../../src/frontend/detect.ts", "../../src/frontend/preprocess.ts", "../../src/frontend/registry.ts", "../../src/render/registry.ts", "../../src/theme/preset.ts", "../../src/theme/resolver.ts", "../../src/routing/registry.ts", "../../src/routing/router.ts", "../../src/overlay/compiler.ts", "../../src/overlay/layout.ts", "../../src/overlay/apply.ts", "../../src/scene/build.ts", "../../src/diagrams/mermaid/flowchart/layout.ts", "../../src/diagrams/mermaid/flowchart/parser.js", "../../src/diagrams/mermaid/flowchart/index.ts", "../../src/time/dates.ts", "../../src/util/round.ts", "../../src/text/metrics.ts", "../../src/text/wrap.ts", "../../src/palette/categorical.ts", "../../src/diagrams/mermaid/timeline/shared.ts", "../../src/diagrams/mermaid/timeline/vertical-spine.ts", "../../src/diagrams/mermaid/timeline/serpentine.ts", "../../src/diagrams/mermaid/timeline/roadmap.ts", "../../src/diagrams/mermaid/timeline/timeline-columns.ts", "../../src/diagrams/mermaid/timeline/numbered.ts", "../../src/diagrams/mermaid/timeline/layout.ts", "../../src/diagrams/mermaid/timeline/parser.js", "../../src/diagrams/mermaid/timeline/index.ts", "../../src/crosslink/render.ts", "../../src/crosslink/engine3.ts", "../../src/crosslink/connectors.ts", "../../src/diagrams/triton/ds/struct/shared.ts", "../../src/diagrams/triton/ds/struct/array.ts", "../../src/diagrams/triton/poster/layout.ts", "../../src/diagrams/triton/poster/parser.js", "../../src/diagrams/triton/poster/index.ts", "../../src/diagrams/mermaid/pie/layout.ts", "../../src/diagrams/mermaid/pie/parser.js", "../../src/diagrams/mermaid/pie/index.ts", "../../src/diagrams/mermaid/xychart/layout.ts", "../../src/diagrams/mermaid/xychart/parser.js", "../../src/diagrams/mermaid/xychart/index.ts", "../../src/diagrams/mermaid/quadrant/layout.ts", "../../src/diagrams/mermaid/quadrant/parser.js", "../../src/diagrams/mermaid/quadrant/index.ts", "../../src/diagrams/mermaid/radar/layout.ts", "../../src/diagrams/mermaid/radar/parser.js", "../../src/diagrams/mermaid/radar/index.ts", "../../src/diagrams/mermaid/gantt/layout.ts", "../../src/diagrams/mermaid/gantt/parser.js", "../../src/diagrams/mermaid/gantt/index.ts", "../../src/diagrams/mermaid/journey/layout.ts", "../../src/diagrams/mermaid/journey/parser.js", "../../src/diagrams/mermaid/journey/index.ts", "../../src/diagrams/mermaid/kanban/layout.ts", "../../src/diagrams/mermaid/kanban/parser.js", "../../src/diagrams/mermaid/kanban/index.ts", "../../src/diagrams/mermaid/sequence/layout.ts", "../../src/diagrams/mermaid/sequence/parser.js", "../../src/diagrams/mermaid/sequence/index.ts", "../../src/graph/connect.ts", "../../src/graph/layered.ts", "../../src/diagrams/mermaid/class/layout.ts", "../../src/diagrams/mermaid/class/parser.js", "../../src/diagrams/mermaid/class/index.ts", "../../src/diagrams/mermaid/state/layout.ts", "../../src/diagrams/mermaid/state/parser.js", "../../src/diagrams/mermaid/state/index.ts", "../../src/diagrams/mermaid/er/layout.ts", "../../src/diagrams/mermaid/er/parser.js", "../../src/diagrams/mermaid/er/index.ts", "../../src/diagrams/triton/block/layout.ts", "../../src/diagrams/triton/block/parser.js", "../../src/diagrams/triton/block/index.ts", "../../src/diagrams/mermaid/requirement/layout.ts", "../../src/diagrams/mermaid/requirement/parser.js", "../../src/diagrams/mermaid/requirement/index.ts", "../../src/diagrams/mermaid/sankey/layout.ts", "../../src/diagrams/mermaid/sankey/parser.js", "../../src/diagrams/mermaid/sankey/index.ts", "../../src/diagrams/mermaid/mindmap/layout.ts", "../../src/diagrams/mermaid/mindmap/parser.js", "../../src/diagrams/mermaid/mindmap/index.ts", "../../src/diagrams/mermaid/gitgraph/layout.ts", "../../src/diagrams/mermaid/gitgraph/parser.js", "../../src/diagrams/mermaid/gitgraph/index.ts", "../../src/diagrams/mermaid/c4/layout.ts", "../../src/diagrams/mermaid/c4/parser.js", "../../src/diagrams/mermaid/c4/index.ts", "../../src/diagrams/triton/architecture/layout.ts", "../../src/diagrams/triton/architecture/parser.js", "../../src/diagrams/triton/architecture/index.ts", "../../src/diagrams/triton/packet/layout.ts", "../../src/diagrams/triton/packet/parser.js", "../../src/diagrams/triton/packet/index.ts", "../../src/graph/tree.ts", "../../src/diagrams/triton/ds/tree/layout.ts", "../../src/diagrams/triton/ds/tree/parser.js", "../../src/diagrams/triton/ds/tree/build.ts", "../../src/diagrams/triton/ds/tree/index.ts", "../../src/diagrams/triton/ds/tree/plan.ts", "../../src/diagrams/triton/ds/tree/avl.ts", "../../src/diagrams/triton/ds/tree/rbtree.ts", "../../src/diagrams/triton/ds/tree/btree.ts", "../../src/diagrams/triton/ds/tree/radix.ts", "../../src/diagrams/triton/ds/tree/segtree.ts", "../../src/diagrams/triton/ds/tree/heap.ts", "../../src/diagrams/triton/ds/struct/linkedlist.ts", "../../src/diagrams/triton/ds/struct/memory.ts", "../../src/diagrams/triton/ds/struct/page.ts", "../../src/scene/strip.ts", "../../src/diagrams/triton/ds/queue/shared.ts", "../../src/diagrams/triton/ds/queue/queue.ts", "../../src/diagrams/triton/ds/queue/cqueue.ts", "../../src/diagrams/triton/ds/queue/deque.ts", "../../src/diagrams/triton/ds/queue/pqueue.ts", "../../src/diagrams/triton/ds/stack/stack.ts", "../../src/diagrams/triton/ds/hashmap/hashmap.ts", "../../src/diagrams/triton/ds/matrix/matrix.ts", "../../src/diagrams/triton/ds/trie/trie.ts", "../../src/diagrams/triton/ds/graph/graph.ts", "../../src/diagrams/triton/ds/unionfind/unionfind.ts", "../../src/style/cost.ts", "../../src/diagrams/triton/topology/topology.ts", "../../src/render/svg.ts", "../../src/frontend/index.ts", "../src/pdf.ts"],
  "sourcesContent": ["/**\n * triton-latex \u2014 render Triton diagrams to vector PDF for LaTeX `\\includegraphics`.\n *\n * Commands:\n *   triton-latex render <input.triton|.mmd> -o <out.pdf|.svg> [--theme N] [--scale S]\n *   triton-latex render-dir <srcDir> -o <outDir> [--theme N] [--scale S]\n *\n * The CLI reuses the core compiler's `renderSync()` (SVG) and converts to vector\n * PDF via ./pdf.ts. It is editor-independent (no `vscode`) and never throws \u2014\n * core returns a Result, which we surface as a clean exit code + message.\n *\n * Core is imported by RELATIVE PATH (the repo has no package `main`/`exports`);\n * esbuild bundles the whole compiler graph in. The PDF toolchain stays external.\n */\n\nimport { readFileSync, writeFileSync, readdirSync, mkdirSync, statSync } from 'node:fs';\nimport { basename, dirname, extname, join, resolve } from 'node:path';\n\nimport { renderSync } from '../../src/frontend/index.js';\nimport { getThemePreset } from '../../src/theme/preset.js';\nimport { svgToPdf } from './pdf.js';\n\n// \u2500\u2500\u2500 Arg parsing (tiny, dependency-free) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface Args {\n  readonly command?: string;\n  readonly positionals: string[];\n  readonly out?: string;\n  readonly theme?: string;\n  readonly scale: number;\n  readonly help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n  const positionals: string[] = [];\n  let out: string | undefined;\n  let theme: string | undefined;\n  let scale = 1;\n  let help = false;\n\n  for (let i = 0; i < argv.length; i++) {\n    const a = argv[i];\n    switch (a) {\n      case '-o':\n      case '--out':\n        out = argv[++i];\n        break;\n      case '--theme':\n        theme = argv[++i];\n        break;\n      case '--scale':\n        scale = Number(argv[++i]) || 1;\n        break;\n      case '-h':\n      case '--help':\n        help = true;\n        break;\n      default:\n        positionals.push(a);\n    }\n  }\n\n  return { command: positionals.shift(), positionals, out, theme, scale, help };\n}\n\nconst USAGE = `triton-latex \u2014 render Triton diagrams to vector PDF for LaTeX.\n\nUsage:\n  triton-latex render <input.triton|.mmd> -o <out.pdf|.svg> [options]\n  triton-latex render-dir <srcDir> -o <outDir> [options]\n\nOptions:\n  -o, --out <path>   Output file (render) or output directory (render-dir).\n  --theme <name>     Theme preset (default, executive, minimal, \u2026).\n  --scale <number>   Uniform scale for the PDF page box (default 1).\n  -h, --help         Show this help.\n\nExamples:\n  triton-latex render diagram.mmd -o figures/diagram.pdf\n  triton-latex render diagram.mmd -o diagram.svg          # SVG pass-through\n  triton-latex render-dir diagrams/ -o figures/           # batch \u2192 *.pdf\n`;\n\n// \u2500\u2500\u2500 Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DIAGRAM_EXTS = new Set(['.triton', '.mmd']);\n\n/** Render one source file to an SVG string, throwing a clean Error on failure. */\nfunction renderToSvg(source: string, themeName?: string): string {\n  const themeInput = themeName ? getThemePreset(themeName) : undefined;\n  const result = renderSync(source, themeInput);\n  if (!result.ok) {\n    throw new Error(`${result.error.code}: ${result.error.message}`);\n  }\n  return result.value;\n}\n\n/** Render a single input file to a .pdf or .svg output. */\nasync function renderFile(\n  inputPath: string,\n  outPath: string,\n  themeName: string | undefined,\n  scale: number,\n): Promise<void> {\n  const source = readFileSync(inputPath, 'utf8');\n  const svg = renderToSvg(source, themeName);\n\n  // The inline LaTeX environment renders into a content-hashed cache dir\n  // (e.g. `\\jobname.triton-cache/<hash>.pdf`) that may not exist yet \u2014 single\n  // `render` must create the parent directory, not just `render-dir`.\n  mkdirSync(dirname(resolve(outPath)), { recursive: true });\n\n  if (extname(outPath).toLowerCase() === '.svg') {\n    writeFileSync(outPath, svg, 'utf8');\n    return;\n  }\n\n  const pdf = await svgToPdf(svg, { scale });\n  writeFileSync(outPath, pdf);\n}\n\n/** Batch-render every *.triton / *.mmd in srcDir to <name>.pdf in outDir. */\nasync function renderDir(\n  srcDir: string,\n  outDir: string,\n  themeName: string | undefined,\n  scale: number,\n): Promise<{ rendered: number; failed: string[] }> {\n  mkdirSync(outDir, { recursive: true });\n\n  const entries = readdirSync(srcDir).filter((f) => {\n    const full = join(srcDir, f);\n    return statSync(full).isFile() && DIAGRAM_EXTS.has(extname(f).toLowerCase());\n  });\n\n  let rendered = 0;\n  const failed: string[] = [];\n\n  for (const file of entries) {\n    const inputPath = join(srcDir, file);\n    const name = basename(file, extname(file));\n    const outPath = join(outDir, `${name}.pdf`);\n    try {\n      await renderFile(inputPath, outPath, themeName, scale);\n      console.log(`  \u2713 ${file} \u2192 ${name}.pdf`);\n      rendered++;\n    } catch (cause) {\n      const message = cause instanceof Error ? cause.message : String(cause);\n      console.error(`  \u2717 ${file}: ${message}`);\n      failed.push(file);\n    }\n  }\n\n  return { rendered, failed };\n}\n\n// \u2500\u2500\u2500 Entry point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function main(): Promise<number> {\n  const args = parseArgs(process.argv.slice(2));\n\n  if (args.help || !args.command) {\n    console.log(USAGE);\n    return args.help ? 0 : 1;\n  }\n\n  if (args.command === 'render') {\n    const input = args.positionals[0];\n    if (!input || !args.out) {\n      console.error('error: `render` needs <input> and -o <output>.\\n');\n      console.error(USAGE);\n      return 1;\n    }\n    await renderFile(resolve(input), resolve(args.out), args.theme, args.scale);\n    console.log(`\u2713 ${input} \u2192 ${args.out}`);\n    return 0;\n  }\n\n  if (args.command === 'render-dir') {\n    const srcDir = args.positionals[0];\n    if (!srcDir || !args.out) {\n      console.error('error: `render-dir` needs <srcDir> and -o <outDir>.\\n');\n      console.error(USAGE);\n      return 1;\n    }\n    const { rendered, failed } = await renderDir(\n      resolve(srcDir),\n      resolve(args.out),\n      args.theme,\n      args.scale,\n    );\n    console.log(`\\n${rendered} rendered, ${failed.length} failed.`);\n    return failed.length > 0 ? 1 : 0;\n  }\n\n  console.error(`error: unknown command \"${args.command}\".\\n`);\n  console.error(USAGE);\n  return 1;\n}\n\nmain()\n  .then((code) => process.exit(code))\n  .catch((cause) => {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    console.error(`error: ${message}`);\n    process.exit(1);\n  });\n", "export const CONNECTOR_ANIMATIONS = [\n  'march',\n  'particle',\n  'draw',\n  'pulse',\n  'glow',\n  'comet',\n  'stream',\n  'flow',\n  'colorcycle',\n] as const;\n\nexport type RenderedConnectorAnimation = typeof CONNECTOR_ANIMATIONS[number];\nexport type CrossLinkAnimation = RenderedConnectorAnimation | 'none';\n\nexport function isRenderedConnectorAnimation(value: unknown): value is RenderedConnectorAnimation {\n  return typeof value === 'string' && (CONNECTOR_ANIMATIONS as readonly string[]).includes(value);\n}\n", "/**\n * Result\n *\n * A discriminated union for all public API return values.\n *\n * All public-facing functions (render, compile) return Result<T> instead\n * of throwing. Internal functions may still throw \u2014 errors are caught at\n * the pipeline boundary and wrapped into Err values.\n *\n * Usage:\n *   const result = await render(input);\n *   if (!result.ok) { console.error(result.error.message); return; }\n *   console.log(result.value); // string\n */\n\nexport type DiagramErrorCode =\n  | 'PARSE_ERROR'\n  | 'LAYOUT_ERROR'\n  | 'UNKNOWN_DIAGRAM'\n  | 'UNSUPPORTED_FORMAT'\n  | 'UNKNOWN_RENDERER'\n  | 'THEME_VALIDATION_ERROR';\n\nexport interface DiagramError {\n  readonly code: DiagramErrorCode;\n  readonly message: string;\n  readonly cause?: unknown;\n}\n\nexport type Result<T> =\n  | { readonly ok: true;  readonly value: T }\n  | { readonly ok: false; readonly error: DiagramError };\n\n/** Construct a successful result. */\nexport function ok<T>(value: T): Result<T> {\n  return { ok: true, value };\n}\n\n/** Construct a failed result. */\nexport function err(\n  code: DiagramErrorCode,\n  message: string,\n  cause?: unknown,\n): Result<never> {\n  return {\n    ok: false,\n    error: { code, message, ...(cause !== undefined ? { cause } : {}) },\n  };\n}\n", "import type { DiagramKind, InputFormat } from '../contracts/index.js';\n\nexport interface DetectionResult {\n  readonly format: InputFormat;\n  readonly diagramType: DiagramKind;\n}\n\n/**\n * Detect whether input is YAML or Mermaid, and which diagram type it is.\n * Returns the result without parsing \u2014 no grammar is invoked here.\n *\n * A leading `---` frontmatter block is allowed in front of Mermaid source\n * (e.g. gantt with title/theme); the diagram type is detected from the body\n * after the closing fence. Only a `type:` key without a Mermaid body routes\n * to the YAML path.\n */\nconst MERMAID_PATTERNS: [RegExp, DiagramKind][] = [\n  [/^(flowchart|graph)\\s/i,                            'flowchart'],\n  [/^sequenceDiagram/i,                                'sequence'],\n  [/^timeline/i,                                       'timeline'],\n  [/^mindmap/i,                                        'mindmap'],\n  [/^stateDiagram/i,                                   'state'],\n  [/^classDiagram/i,                                   'class'],\n  [/^erDiagram/i,                                      'er'],\n  [/^gantt/i,                                          'gantt'],\n  [/^journey/i,                                        'journey'],\n  [/^C4(Context|Container|Component|Dynamic|Deployment)/i, 'c4'],\n  [/^sankey/i,                                         'sankey'],\n  [/^kanban/i,                                         'kanban'],\n  [/^requirement(Diagram)?/i,                          'requirement'],\n  [/^gitGraph/i,                                       'gitgraph'],\n  [/^packet/i,                                         'packet'],\n  [/^pie\\b/i,                                          'pie'],\n  [/^xychart(-beta)?/i,                                'xychart'],\n  [/^quadrantChart/i,                                  'quadrant'],\n  [/^radar(-beta)?/i,                                  'radar'],\n  [/^block/i,                                          'block'],\n  [/^architecture/i,                                   'architecture'],\n  [/^poster/i,                                         'poster'],\n  [/^tree\\b/i,                                          'tree'],\n  [/^plan\\b/i,                                          'plan'],\n  [/^avl\\b/i,                                           'avl'],\n  [/^rbtree\\b/i,                                        'rbtree'],\n  [/^btree\\b/i,                                         'btree'],\n  [/^radix\\b/i,                                         'radix'],\n  [/^segtree\\b/i,                                       'segtree'],\n  [/^heap\\b/i,                                          'heap'],\n  [/^array\\b/i,                                        'array'],\n  [/^linkedlist\\b/i,                                   'linkedlist'],\n  [/^memory\\b/i,                                       'memory'],\n  [/^page\\b/i,                                         'page'],\n  [/^cqueue\\b/i,                                       'cqueue'],\n  [/^deque\\b/i,                                        'deque'],\n  [/^pqueue\\b/i,                                       'pqueue'],\n  [/^queue\\b/i,                                        'queue'],\n  [/^stack\\b/i,                                        'stack'],\n  [/^hashmap\\b/i,                                      'hashmap'],\n  [/^matrix\\b/i,                                       'matrix'],\n  [/^trie\\b/i,                                         'trie'],\n  // `graph` is owned by Mermaid flowchart (`graph TD`), so the data-structure\n  // graph uses a distinct, unambiguous keyword instead.\n  [/^nodegraph\\b/i,                                    'nodegraph'],\n  [/^dsgraph\\b/i,                                      'nodegraph'],\n  [/^unionfind\\b/i,                                    'unionfind'],\n  [/^dsu\\b/i,                                          'unionfind'],\n  [/^topology\\b/i,                                     'topology'],\n];\n\nfunction matchMermaid(text: string): DiagramKind | undefined {\n  for (const [pattern, type] of MERMAID_PATTERNS) {\n    if (pattern.test(text)) return type;\n  }\n  return undefined;\n}\n\nexport function detect(input: string): DetectionResult {\n  const trimmed = input.trimStart();\n\n  // Frontmatter block (--- \u2026 ---): peek at the body for a Mermaid keyword.\n  if (trimmed.startsWith('---')) {\n    const fm = trimmed.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/);\n    if (fm) {\n      const body = trimmed.slice(fm[0].length).trimStart();\n      const bodyType = matchMermaid(body);\n      if (bodyType) return { format: 'mermaid', diagramType: bodyType };\n      const typeInFm = fm[0].match(/^\\s*type:\\s*(\\w+)/m);\n      if (typeInFm) return { format: 'yaml', diagramType: typeInFm[1] as DiagramKind };\n    }\n    const typeMatch = trimmed.match(/^type:\\s*(\\w+)/m);\n    return { format: 'yaml', diagramType: (typeMatch?.[1] ?? 'flowchart') as DiagramKind };\n  }\n\n  // YAML with a leading `type:` key (first line only \u2014 avoid matching a\n  // `type:` field inside a diagram body, e.g. requirement element blocks).\n  if (/^type:\\s/.test(trimmed)) {\n    const typeMatch = trimmed.match(/^type:\\s*(\\w+)/);\n    return { format: 'yaml', diagramType: (typeMatch?.[1] ?? 'flowchart') as DiagramKind };\n  }\n\n  // Mermaid: match the first non-comment, non-whitespace token.\n  return { format: 'mermaid', diagramType: matchMermaid(trimmed) ?? 'flowchart' };\n}\n", "/**\n * @file frontend/preprocess.ts \u2014 Source pre-processing before grammar dispatch.\n *\n * Central `%%` comment stripping so that every diagram family accepts comment\n * lines without requiring per-grammar Comment rules.\n */\n\n/**\n * Strip full-line `%%` comments from Mermaid diagram source.\n *\n * ### Semantics (aligned with the 4 built-in grammars that handle `%%` natively)\n *\n * - **Full-line only:** a line is a comment iff its first non-whitespace\n *   characters are `%%`. Such lines are removed entirely.\n * - **No inline trailing comments:** `A --> B %% note` is NOT stripped. This\n *   is the safe default \u2014 distinguishing a real trailing comment from `%%`\n *   inside node labels such as `A[\"50%% off\"]` is unsafe without a full parse.\n *   The 4 grammars that already handle their own Comment rules continue to work\n *   unchanged on the pre-stripped input.\n * - **Frontmatter preserved:** if the input opens with a `---\\n\u2026\\n---` YAML\n *   frontmatter block, that block is passed through verbatim (YAML may contain\n *   `%%` in values). Comment stripping applies only to the Mermaid body that\n *   follows the closing fence.\n * - **Pure-YAML inputs untouched:** if the first non-whitespace token is\n *   `type:` (the Triton YAML path), the input is returned unchanged so that\n *   `parseYaml` receives exactly what the author wrote.\n */\nexport function stripComments(input: string): string {\n  const trimmed = input.trimStart();\n\n  // Pure-YAML path: do not strip \u2014 `%%` is not a YAML construct and may\n  // appear legitimately inside YAML string values.\n  if (/^type:\\s/.test(trimmed)) return input;\n\n  // Frontmatter path: preserve the `---\u2026---` block verbatim; strip comments\n  // only in the Mermaid body that follows.\n  if (trimmed.startsWith('---')) {\n    const fmMatch = trimmed.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/);\n    if (fmMatch) {\n      const leadingWs = input.slice(0, input.length - trimmed.length);\n      const frontmatter = fmMatch[0];\n      const body = trimmed.slice(frontmatter.length);\n      return leadingWs + frontmatter + removeCommentLines(body);\n    }\n    // Malformed frontmatter (no closing `---`) \u2014 treat conservatively as\n    // YAML-ish and return untouched.\n    return input;\n  }\n\n  // Plain Mermaid text \u2014 strip comment lines from the entire input.\n  return removeCommentLines(input);\n}\n\n/**\n * Remove every line whose first non-whitespace characters are `%%`.\n * Lines are joined back with `\\n`; `\\r` characters within lines are preserved.\n */\nfunction removeCommentLines(text: string): string {\n  return text\n    .split('\\n')\n    .filter(line => !/^\\s*%%/.test(line))\n    .join('\\n');\n}\n", "/**\n * Diagram Registry\n *\n * Central registry of all available diagram modules.\n * Built-in modules are registered in frontend/index.ts at startup.\n * Third-party diagrams call registerDiagram() from their own package.\n *\n * The registry stores modules as DiagramModule<any> internally to handle\n * the contravariance of layout()'s IR parameter. Type safety is preserved\n * at registration time via the generic constraint on registerDiagram().\n */\n\nimport type { DiagramKind, DiagramModule, BaseIR } from '../contracts/index.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyModule = DiagramModule<any>;\n\nconst registry = new Map<DiagramKind, AnyModule>();\n\n/** Register a diagram module under the given kind key. */\nexport function registerDiagram<IR extends BaseIR>(\n  kind: DiagramKind,\n  module: DiagramModule<IR>,\n): void {\n  registry.set(kind, module as AnyModule);\n}\n\n/** Look up a registered diagram module by kind. Returns undefined if not found. */\nexport function getModule(kind: DiagramKind): AnyModule | undefined {\n  return registry.get(kind);\n}\n\n/** Return all currently registered diagram kind strings. */\nexport function registeredKinds(): DiagramKind[] {\n  return [...registry.keys()];\n}\n", "/**\n * Renderer Registry\n *\n * Central registry of all available output renderers.\n * The built-in 'svg' renderer is registered in frontend/index.ts.\n * Third-party renderers (PNG, Canvas, PDF\u2026) call registerRenderer().\n */\n\nimport type { Renderer } from '../contracts/index.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst registry = new Map<string, Renderer<any>>();\n\n/** Register an output renderer under its name. */\nexport function registerRenderer<Output>(renderer: Renderer<Output>): void {\n  registry.set(renderer.name, renderer);\n}\n\n/** Look up a renderer by name. Returns undefined if not registered. */\nexport function getRenderer<Output = string>(name: string): Renderer<Output> | undefined {\n  return registry.get(name) as Renderer<Output> | undefined;\n}\n\n/** Return all currently registered renderer names. */\nexport function registeredRenderers(): string[] {\n  return [...registry.keys()];\n}\n", "import type { ResolvedTheme } from '../contracts/index.js';\n\n// \u2500\u2500\u2500 Shared base tokens (typography / spacing / edges) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Palettes vary per theme; structure stays constant so every diagram responds\n// identically to a theme switch.\n\nconst SANS = 'Inter, system-ui, -apple-system, sans-serif';\nconst SERIF = 'Georgia, \"Times New Roman\", serif';\nconst MONO = 'JetBrains Mono, Fira Code, monospace';\n\nconst baseTypography = {\n  fontFamily:    SANS,\n  monoFamily:    MONO,\n  baseFontSize:  14,\n  titleFontSize: 18,\n  smallFontSize: 11,\n  lineHeight:    1.4,\n} as const;\n\nconst baseSpacing = {\n  unit:          8,\n  nodePadding:   12,\n  nodeGap:       40,\n  diagramMargin: 24,\n} as const;\n\nconst baseEdges = {\n  strokeWidth:   1.5,\n  arrowSize:     8,\n  labelFontSize: 12,\n  curveTension:  0.4,\n} as const;\n\n// Default panel/cell-title chrome: plain text, top-left, inside the frame.\nconst basePanel = {\n  titleAlign:    'left',\n  titlePosition: 'inside',\n  titleChrome:   'none',\n} as const;\n\n// \u2500\u2500\u2500 Themes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const defaultTheme: ResolvedTheme = {\n  name: 'default',\n  palette: {\n    primary:    '#4A90D9',\n    secondary:  '#7C3AED',\n    background: '#FFFFFF',\n    surface:    '#F8FAFC',\n    border:     '#CBD5E1',\n    text:       '#1E293B',\n    textMuted:  '#64748B',\n    success:    '#22C55E',\n    warning:    '#F59E0B',\n    error:      '#EF4444',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      basePanel,\n} as const;\n\n/** Boardroom / presentation aesthetic \u2014 deep navy canvas, light text. */\nexport const executiveTheme: ResolvedTheme = {\n  name: 'executive',\n  palette: {\n    primary:    '#3A86C8',\n    secondary:  '#7986CB',\n    background: '#0D1B2A',\n    surface:    '#16263B',\n    border:     '#2A4060',\n    text:       '#E8EEF5',\n    textMuted:  '#8BAAC8',\n    success:    '#2DD4BF',\n    warning:    '#F4A742',\n    error:      '#E05252',\n  },\n  typography: { ...baseTypography, fontFamily: SERIF },\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'box' },\n} as const;\n\n/** Greyscale, ink-on-paper minimalism. */\nexport const minimalTheme: ResolvedTheme = {\n  name: 'minimal',\n  palette: {\n    primary:    '#525252',\n    secondary:  '#A3A3A3',\n    background: '#FFFFFF',\n    surface:    '#F5F5F5',\n    border:     '#E5E5E5',\n    text:       '#171717',\n    textMuted:  '#737373',\n    success:    '#737373',\n    warning:    '#A3A3A3',\n    error:      '#404040',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      basePanel,\n} as const;\n\n/** Navy + amber on white \u2014 classic consulting deck. */\nexport const consultingTheme: ResolvedTheme = {\n  name: 'consulting',\n  palette: {\n    primary:    '#1F497D',\n    secondary:  '#D97706',\n    background: '#FFFFFF',\n    surface:    '#F4F6FA',\n    border:     '#D6DEE8',\n    text:       '#111111',\n    textMuted:  '#555555',\n    success:    '#1F8A5B',\n    warning:    '#D97706',\n    error:      '#DC2626',\n  },\n  typography: { ...baseTypography, fontFamily: SERIF },\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'left', titlePosition: 'on-border', titleChrome: 'none' },\n} as const;\n\n/** Modern SaaS product \u2014 violet + blue on white. */\nexport const productTheme: ResolvedTheme = {\n  name: 'product',\n  palette: {\n    primary:    '#3B82F6',\n    secondary:  '#8B5CF6',\n    background: '#FFFFFF',\n    surface:    '#F9FAFB',\n    border:     '#E5E7EB',\n    text:       '#111827',\n    textMuted:  '#6B7280',\n    success:    '#10B981',\n    warning:    '#F59E0B',\n    error:      '#EF4444',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'center', titlePosition: 'inside', titleChrome: 'pill' },\n} as const;\n\n/** Release-management palette \u2014 vivid status hues. */\nexport const releaseTheme: ResolvedTheme = {\n  name: 'release',\n  palette: {\n    primary:    '#2563EB',\n    secondary:  '#16A34A',\n    background: '#FFFFFF',\n    surface:    '#F8FAFC',\n    border:     '#E2E8F0',\n    text:       '#111111',\n    textMuted:  '#6B7280',\n    success:    '#16A34A',\n    warning:    '#D97706',\n    error:      '#DC2626',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'left', titlePosition: 'inside', titleChrome: 'box' },\n} as const;\n\n/** Indigo accent on near-white \u2014 the AI-timeline editorial look. */\nexport const aiTimelineTheme: ResolvedTheme = {\n  name: 'ai-timeline',\n  palette: {\n    primary:    '#5B4FCF',\n    secondary:  '#0EA5A8',\n    background: '#F8F9FF',\n    surface:    '#FFFFFF',\n    border:     '#C0C4DF',\n    text:       '#1A1A2E',\n    textMuted:  '#4A4A6A',\n    success:    '#2D9E67',\n    warning:    '#D97706',\n    error:      '#E05B5B',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'left', titlePosition: 'above', titleChrome: 'none' },\n} as const;\n\n/** ByteByteGo-style dark infographic \u2014 navy canvas, vivid teal accent. */\nexport const byteByteGoTheme: ResolvedTheme = {\n  name: 'bytebytego',\n  palette: {\n    primary:    '#2DD4BF',\n    secondary:  '#4D9AFF',\n    background: '#111827',\n    surface:    '#1F2937',\n    border:     '#374151',\n    text:       '#F9FAFB',\n    textMuted:  '#9CA3AF',\n    success:    '#2DD4BF',\n    warning:    '#FFB800',\n    error:      '#FF4D6D',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'pill' },\n} as const;\n\n/** Gitline dark-card look \u2014 deep navy canvas, periwinkle-blue accent. */\nexport const gitlineTheme: ResolvedTheme = {\n  name: 'gitline',\n  palette: {\n    primary:    '#4D9AFF',\n    secondary:  '#2C6EA8',\n    background: '#0A1628',\n    surface:    '#132035',\n    border:     '#1C3558',\n    text:       '#E8EDF5',\n    textMuted:  '#6B8FAF',\n    success:    '#3FB950',\n    warning:    '#D29922',\n    error:      '#F85149',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'left', titlePosition: 'on-border', titleChrome: 'box' },\n} as const;\n\n/** \"Our Timeline\" infographic \u2014 white canvas, navy + amber. */\nexport const ourTimelineTheme: ResolvedTheme = {\n  name: 'our-timeline',\n  palette: {\n    primary:    '#1F497D',\n    secondary:  '#D97706',\n    background: '#FFFFFF',\n    surface:    '#F4F6FA',\n    border:     '#CCCCCC',\n    text:       '#111111',\n    textMuted:  '#555555',\n    success:    '#1F8A5B',\n    warning:    '#D97706',\n    error:      '#DC2626',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'center', titlePosition: 'above', titleChrome: 'none' },\n} as const;\n\n/** Subject Timeline dark theme \u2014 deep navy, vivid cyan + pink accents. */\nexport const subjectTimelineTheme: ResolvedTheme = {\n  name: 'subject-timeline',\n  palette: {\n    primary:    '#22D3EE',\n    secondary:  '#EC4899',\n    background: '#1A1A2E',\n    surface:    '#2A2A48',\n    border:     '#3A3A5C',\n    text:       '#E8EEF4',\n    textMuted:  '#8A9BB0',\n    success:    '#34D399',\n    warning:    '#F59E0B',\n    error:      '#EC4899',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'pill' },\n} as const;\n\n/** Showcase Tier-3 aesthetic \u2014 deep navy canvas, electric-cyan accent. */\nexport const showcaseTheme: ResolvedTheme = {\n  name: 'showcase',\n  palette: {\n    primary:    '#00D4FF',\n    secondary:  '#9B8FDF',\n    background: '#0D1B2A',\n    surface:    '#132035',\n    border:     '#1E3A5A',\n    text:       '#E8EEF5',\n    textMuted:  '#7AACCC',\n    success:    '#00CC88',\n    warning:    '#FFB800',\n    error:      '#FF4D6D',\n  },\n  typography: baseTypography,\n  spacing:    baseSpacing,\n  edges:      baseEdges,\n  panel:      { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'box' },\n} as const;\n\n// \u2500\u2500\u2500 Registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Named theme presets. Selected via a diagram's `theme:` / metadata.theme. */\nexport const THEMES: Readonly<Record<string, ResolvedTheme>> = {\n  default:           defaultTheme,\n  executive:         executiveTheme,\n  minimal:           minimalTheme,\n  consulting:        consultingTheme,\n  product:           productTheme,\n  release:           releaseTheme,\n  'ai-timeline':     aiTimelineTheme,\n  bytebytego:        byteByteGoTheme,\n  gitline:           gitlineTheme,\n  'our-timeline':    ourTimelineTheme,\n  'subject-timeline': subjectTimelineTheme,\n  showcase:          showcaseTheme,\n};\n\n/** Ordered names of every built-in theme preset. */\nexport const themePresetNames = Object.freeze(Object.keys(THEMES)) as readonly string[];\n\n/** Resolve a theme preset by name, falling back to the default theme. */\nexport function getThemePreset(name?: string): ResolvedTheme {\n  return (name !== undefined && THEMES[name]) || defaultTheme;\n}\n", "import type { ResolvedTheme, ThemeInput } from '../contracts/index.js';\n\n/**\n * Merge a partial ThemeInput over a base ResolvedTheme.\n * Only present fields override the base \u2014 absent fields keep the base value.\n */\nexport function resolveTheme(input: ThemeInput, base: ResolvedTheme): ResolvedTheme {\n  return {\n    name:       input.name       ?? base.name,\n    palette:    { ...base.palette,    ...input.palette },\n    typography: { ...base.typography, ...input.typography },\n    spacing:    { ...base.spacing,    ...input.spacing },\n    edges:      { ...base.edges,      ...input.edges },\n    panel:      { ...base.panel,      ...input.panel },\n  };\n}\n", "/**\n * Router Registry\n *\n * Central registry of all available routing algorithms.\n * Built-in routers (straight, orthogonal, bezier, polyline) are\n * registered in frontend/index.ts.\n * Third-party routers call registerRouter().\n */\n\nimport type { Router, RouteStyle } from '../contracts/index.js';\n\nconst registry = new Map<RouteStyle, Router>();\n\n/** Register a routing algorithm under a route style name. */\nexport function registerRouter(style: RouteStyle, router: Router): void {\n  registry.set(style, router);\n}\n\n/** Look up a router by style. Returns undefined if not registered. */\nexport function getRouter(style: RouteStyle): Router | undefined {\n  return registry.get(style);\n}\n\n/** Return all currently registered route style names. */\nexport function registeredRouters(): RouteStyle[] {\n  return [...registry.keys()];\n}\n", "import type { Router, RouteRequest, Route, RouteStyle, PortDirection } from '../contracts/index.js';\nimport type { Point, Rect } from '../contracts/index.js';\n\n// \u2500\u2500\u2500 Straight \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass StraightRouter implements Router {\n  route({ from, to, obstacles, padding }: RouteRequest): Route {\n    const pad = padding ?? 12;\n\n    // If no obstacles or no crossing, use a direct line\n    if (!obstacles || obstacles.length === 0 ||\n        !straightHitsObstacles(from, to, obstacles, pad)) {\n      return {\n        points: [from, to],\n        path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n        labelPosition: midpoint(from, to),\n      };\n    }\n\n    // Deflect: find a waypoint that avoids all obstacles.\n    // Try perpendicular offsets of increasing magnitude in both directions.\n    const dx = to.x - from.x, dy = to.y - from.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    if (len < 1) {\n      return { points: [from, to], path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`, labelPosition: from };\n    }\n\n    const perpX = -dy / len, perpY = dx / len;\n    const mid = midpoint(from, to);\n\n    for (let offset = len * 0.1; offset <= len * 0.6; offset += len * 0.1) {\n      for (const sign of [1, -1]) {\n        const wp: Point = { x: mid.x + perpX * offset * sign, y: mid.y + perpY * offset * sign };\n        if (!straightHitsObstacles(from, wp, obstacles, pad) &&\n            !straightHitsObstacles(wp, to, obstacles, pad)) {\n          return {\n            points: [from, wp, to],\n            path: `M ${from.x} ${from.y} L ${wp.x} ${wp.y} L ${to.x} ${to.y}`,\n            labelPosition: wp,\n          };\n        }\n      }\n    }\n\n    // Fallback: direct line (best effort)\n    return {\n      points: [from, to],\n      path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n      labelPosition: midpoint(from, to),\n    };\n  }\n}\n\n/** Check if a straight line from\u2192to passes through any obstacle interior. */\nfunction straightHitsObstacles(\n  from: Point, to: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): boolean {\n  for (const obs of obstacles) {\n    if (segCrossesInterior(from, to, {\n      x: obs.x - pad, y: obs.y - pad,\n      width: obs.width + 2 * pad, height: obs.height + 2 * pad,\n    }, 0)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// \u2500\u2500\u2500 Orthogonal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass OrthogonalRouter implements Router {\n  route({ from, to, fromDir, toDir, obstacles, padding }: RouteRequest): Route {\n    const dx = to.x - from.x;\n    const dy = to.y - from.y;\n    const midX = (from.x + to.x) / 2;\n    const midY = (from.y + to.y) / 2;\n    const pad = padding ?? 12;\n    // Minimum straight \"landing\" run before an arrowhead / after an exit port,\n    // so a same-wall detour never places the arrowhead directly on a bend.\n    const STUB = Math.max(pad, 20);\n\n    // Already aligned on one axis \u2014 straight line. But only shortcut when the\n    // segment actually leaves the source along its wall normal, approaches the\n    // target from that wall's outboard side, and crosses no obstacles.\n    const straightH = Math.abs(dy) < 1;   // horizontal straight line\n    const straightV = Math.abs(dx) < 1;   // vertical straight line\n    if (straightH || straightV) {\n      const dirsOk = straightDirsOk(from, to, straightH, straightV, fromDir, toDir);\n      const clear = !obstacles || countRouteCollisions([from, to], obstacles) === 0;\n      if (dirsOk && clear) {\n        return {\n          points: [from, to],\n          path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n          labelPosition: { x: midX, y: midY },\n        };\n      }\n    }\n\n    // With port direction hints, route so the first segment leaves in\n    // fromDir and the last segment arrives along toDir.\n    if (fromDir && toDir) {\n      const exitH = fromDir === 'E' || fromDir === 'W';\n      const entryH = toDir === 'E' || toDir === 'W';\n\n      let points: Point[];\n      let path: string;\n\n      if (exitH && entryH) {\n        // Both horizontal \u2014 bend at midX, shifted to avoid obstacles.\n        // For a same-wall pair (both E or both W) the two stubs point the same\n        // way, so the connecting segment must sit OUTSIDE both ports, otherwise\n        // the route collapses back onto the wall.\n        const sameWall = fromDir === toDir;\n        const baseX =\n          sameWall\n            ? fromDir === 'E'\n              ? Math.max(from.x, to.x) + STUB\n              : Math.min(from.x, to.x) - STUB\n            : midX;\n        let bendX: number;\n        if (sameWall) {\n          // The connecting channel must stay OUTBOARD of the shared wall. The\n          // generic avoidance keeps the bend within the port x-range, which for\n          // a same-wall pair pulls it to the INBOARD side \u2014 driving the landing\n          // segment straight through the target box to reach the far wall\n          // (\"behind the target\"). Only ever shift the channel further outboard.\n          bendX = clearBendXOutboard(baseX, from, to, obstacles, pad, fromDir === 'E' ? 1 : -1);\n        } else {\n          bendX = clearVerticalBend(baseX, from.y, to.y, from.x, to.x, obstacles, pad);\n          bendX = clearHorizontalSegments(bendX, from, to, obstacles, pad);\n        }\n        const v1: Point = { x: bendX, y: from.y };\n        const v2: Point = { x: bendX, y: to.y };\n        let hhPoints: Point[] = [from, v1, v2, to];\n        if (sameWall && obstacles && routeHitsEndpointObstacle(hhPoints, from, to, obstacles)) {\n          hhPoints = buildSameHorizontalWallRoute(from, to, fromDir, obstacles, pad, STUB);\n        }\n\n        // Verify the H+H route is clear; if not, try V+V with direction stubs.\n        // Skip the fallback for same-wall pairs: the outboard H+H route is the\n        // one that honours the wall hint without crossing the target, so we keep\n        // it even if it grazes other cells.\n        if (!sameWall && obstacles && countRouteCollisions(hhPoints, obstacles) > 0) {\n          const vvRoute = buildVVRouteWithStubs(from, to, fromDir!, toDir!, obstacles, pad);\n          if (countRouteCollisions(vvRoute, obstacles) < countRouteCollisions(hhPoints, obstacles)) {\n            points = vvRoute;\n          } else {\n            points = hhPoints;\n          }\n        } else {\n          points = hhPoints;\n        }\n        path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n      } else if (!exitH && !entryH) {\n        // Both vertical \u2014 bend at midY, shifted to avoid obstacles.\n        // For a same-wall pair (both N or both S) push the connecting segment\n        // OUTSIDE both ports so the route arcs over/under the nodes.\n        const sameWall = fromDir === toDir;\n        const baseY =\n          sameWall\n            ? fromDir === 'S'\n              ? Math.max(from.y, to.y) + STUB\n              : Math.min(from.y, to.y) - STUB\n            : midY;\n        let bendY: number;\n        if (sameWall) {\n          // Same reasoning as the horizontal case: keep the connecting channel\n          // outboard of the shared wall so the landing segment never passes\n          // through the target box.\n          bendY = clearBendYOutboard(baseY, from, to, obstacles, pad, fromDir === 'S' ? 1 : -1);\n        } else {\n          bendY = clearHorizontalBend(baseY, from.x, to.x, from.y, to.y, obstacles, pad);\n          bendY = clearVerticalSegments(bendY, from, to, obstacles, pad);\n        }\n        const v1: Point = { x: from.x, y: bendY };\n        const v2: Point = { x: to.x,   y: bendY };\n        let vvPoints: Point[] = [from, v1, v2, to];\n        if (sameWall && obstacles && routeHitsEndpointObstacle(vvPoints, from, to, obstacles)) {\n          vvPoints = buildSameVerticalWallRoute(from, to, fromDir, obstacles, pad, STUB);\n        }\n\n        // Verify the V+V route is clear; if not, try H+H with direction stubs.\n        // Same-wall pairs keep their outboard V+V route (see horizontal case).\n        if (!sameWall && obstacles && countRouteCollisions(vvPoints, obstacles) > 0) {\n          const hhRoute = buildHHRouteWithStubs(from, to, fromDir!, toDir!, obstacles, pad);\n          if (countRouteCollisions(hhRoute, obstacles) < countRouteCollisions(vvPoints, obstacles)) {\n            points = hhRoute;\n          } else {\n            points = vvPoints;\n          }\n        } else {\n          points = vvPoints;\n        }\n        path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n      } else if (exitH && !entryH) {\n        // Exit horizontal, enter vertical \u2014 single bend\n        const corner: Point = { x: to.x, y: from.y };\n        points = [from, corner, to];\n        path = `M ${from.x} ${from.y} L ${corner.x} ${corner.y} L ${to.x} ${to.y}`;\n      } else {\n        // Exit vertical, enter horizontal \u2014 single bend\n        const corner: Point = { x: from.x, y: to.y };\n        points = [from, corner, to];\n        path = `M ${from.x} ${from.y} L ${corner.x} ${corner.y} L ${to.x} ${to.y}`;\n      }\n\n      return { points, path, labelPosition: { x: midX, y: midY } };\n    }\n\n    // Fallback: no direction hints \u2014 heuristic based on geometry\n    let points: Point[];\n    let path: string;\n\n    if (Math.abs(dy) >= Math.abs(dx)) {\n      // Mainly vertical \u2014 bend at mid-Y\n      const bendY = clearHorizontalBend(midY, from.x, to.x, from.y, to.y, obstacles, pad);\n      const v1: Point = { x: from.x, y: bendY };\n      const v2: Point = { x: to.x,   y: bendY };\n      points = [from, v1, v2, to];\n      path   = `M ${from.x} ${from.y} L ${v1.x} ${v1.y} L ${v2.x} ${v2.y} L ${to.x} ${to.y}`;\n    } else {\n      // Mainly horizontal \u2014 bend at mid-X\n      const bendX = clearVerticalBend(midX, from.y, to.y, from.x, to.x, obstacles, pad);\n      const v1: Point = { x: bendX, y: from.y };\n      const v2: Point = { x: bendX, y: to.y };\n      points = [from, v1, v2, to];\n      path   = `M ${from.x} ${from.y} L ${v1.x} ${v1.y} L ${v2.x} ${v2.y} L ${to.x} ${to.y}`;\n    }\n\n    return { points, path, labelPosition: { x: midX, y: midY } };\n  }\n}\n\n/**\n * Clear a same-wall vertical bend channel by shifting it ONLY further outboard\n * (in `dir`: -1 = west, +1 = east). Unlike clearVerticalBend, this never pulls\n * the channel back toward the ports \u2014 for a same-wall pair the inboard side is\n * across the target box, so an inboard shift would route the landing segment\n * \"behind the target\". The channel and both horizontal stubs are checked; on a\n * hit the channel jumps past the obstacle's outboard edge.\n */\nfunction clearBendXOutboard(\n  baseX: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n  dir: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return baseX;\n  let x = baseX;\n  const yMin = Math.min(from.y, to.y);\n  const yMax = Math.max(from.y, to.y);\n  for (let pass = 0; pass < obstacles.length * 2 + 2; pass++) {\n    let moved = false;\n    for (const obs of obstacles) {\n      const oLeft   = obs.x - pad;\n      const oRight  = obs.x + obs.width + pad;\n      const oTop    = obs.y;\n      const oBottom = obs.y + obs.height;\n      const vHits = x > oLeft && x < oRight && yMax > oTop && yMin < oBottom;\n      const hHitTo   = segCrossesInterior({ x, y: to.y },   { x: to.x,   y: to.y   }, obs, pad);\n      const hHitFrom = segCrossesInterior({ x: from.x, y: from.y }, { x, y: from.y }, obs, pad);\n      if (vHits || hHitTo || hHitFrom) {\n        const edge = dir < 0 ? oLeft : oRight;\n        if ((dir < 0 && edge < x) || (dir > 0 && edge > x)) {\n          x = edge;\n          moved = true;\n          break;\n        }\n      }\n    }\n    if (!moved) break;\n  }\n  return x;\n}\n\n/**\n * Vertical-wall analogue of clearBendXOutboard: shift a same-wall horizontal\n * bend line only further outboard (dir: -1 = north, +1 = south).\n */\nfunction clearBendYOutboard(\n  baseY: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n  dir: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return baseY;\n  let y = baseY;\n  const xMin = Math.min(from.x, to.x);\n  const xMax = Math.max(from.x, to.x);\n  for (let pass = 0; pass < obstacles.length * 2 + 2; pass++) {\n    let moved = false;\n    for (const obs of obstacles) {\n      const oTop    = obs.y - pad;\n      const oBottom = obs.y + obs.height + pad;\n      const oLeft   = obs.x;\n      const oRight  = obs.x + obs.width;\n      const hHits = y > oTop && y < oBottom && xMax > oLeft && xMin < oRight;\n      const vHitTo   = segCrossesInterior({ x: to.x,   y },        { x: to.x,   y: to.y   }, obs, pad);\n      const vHitFrom = segCrossesInterior({ x: from.x, y: from.y }, { x: from.x, y },        obs, pad);\n      if (hHits || vHitTo || vHitFrom) {\n        const edge = dir < 0 ? oTop : oBottom;\n        if ((dir < 0 && edge < y) || (dir > 0 && edge > y)) {\n          y = edge;\n          moved = true;\n          break;\n        }\n      }\n    }\n    if (!moved) break;\n  }\n  return y;\n}\n\nfunction straightDirsOk(\n  from: Point,\n  to: Point,\n  straightH: boolean,\n  straightV: boolean,\n  fromDir?: PortDirection,\n  toDir?: PortDirection,\n): boolean {\n  if (!fromDir && !toDir) return true;\n  const dx = to.x - from.x;\n  const dy = to.y - from.y;\n  if (straightH && Math.abs(dx) < 1) return true;\n\n  let requiredFrom: PortDirection;\n  let requiredTo: PortDirection;\n  if (straightH) {\n    requiredFrom = dx > 0 ? 'E' : 'W';\n    requiredTo = dx > 0 ? 'W' : 'E';\n  } else if (straightV) {\n    requiredFrom = dy > 0 ? 'S' : 'N';\n    requiredTo = dy > 0 ? 'N' : 'S';\n  } else {\n    return false;\n  }\n\n  return (!fromDir || fromDir === requiredFrom) && (!toDir || toDir === requiredTo);\n}\n\nfunction buildSameVerticalWallRoute(\n  from: Point,\n  to: Point,\n  wall: PortDirection,\n  obstacles: ReadonlyArray<Rect>,\n  pad: number,\n  stub: number,\n): Point[] {\n  const dir = wall === 'S' ? 1 : -1;\n  const fromOut: Point = { x: from.x, y: from.y + dir * stub };\n  const toOut: Point = { x: to.x, y: to.y + dir * stub };\n  const colliders = collidingObstacles([from, fromOut, { x: to.x, y: fromOut.y }, to], obstacles);\n  const relevant = colliders.length > 0 ? colliders : obstacles;\n  const leftX = Math.min(...relevant.map(o => o.x - pad));\n  const rightX = Math.max(...relevant.map(o => o.x + o.width + pad));\n  return bestSameVerticalCandidate(from, to, fromOut, toOut, [leftX, rightX], obstacles);\n}\n\nfunction buildSameHorizontalWallRoute(\n  from: Point,\n  to: Point,\n  wall: PortDirection,\n  obstacles: ReadonlyArray<Rect>,\n  pad: number,\n  stub: number,\n): Point[] {\n  const dir = wall === 'E' ? 1 : -1;\n  const fromOut: Point = { x: from.x + dir * stub, y: from.y };\n  const toOut: Point = { x: to.x + dir * stub, y: to.y };\n  const colliders = collidingObstacles([from, fromOut, { x: fromOut.x, y: to.y }, to], obstacles);\n  const relevant = colliders.length > 0 ? colliders : obstacles;\n  const topY = Math.min(...relevant.map(o => o.y - pad));\n  const bottomY = Math.max(...relevant.map(o => o.y + o.height + pad));\n  return bestSameHorizontalCandidate(from, to, fromOut, toOut, [topY, bottomY], obstacles);\n}\n\nfunction bestSameVerticalCandidate(\n  from: Point,\n  to: Point,\n  fromOut: Point,\n  toOut: Point,\n  escapeXs: readonly number[],\n  obstacles: ReadonlyArray<Rect>,\n): Point[] {\n  let best: Point[] | undefined;\n  let bestCost = Infinity;\n  for (const escapeX of escapeXs) {\n    const candidate = [\n      from,\n      fromOut,\n      { x: escapeX, y: fromOut.y },\n      { x: escapeX, y: toOut.y },\n      toOut,\n      to,\n    ];\n    const cost = countRouteCollisions(candidate, obstacles) * 1_000_000 + polylineLength(candidate);\n    if (cost < bestCost) {\n      best = candidate;\n      bestCost = cost;\n    }\n  }\n  return best!;\n}\n\nfunction bestSameHorizontalCandidate(\n  from: Point,\n  to: Point,\n  fromOut: Point,\n  toOut: Point,\n  escapeYs: readonly number[],\n  obstacles: ReadonlyArray<Rect>,\n): Point[] {\n  let best: Point[] | undefined;\n  let bestCost = Infinity;\n  for (const escapeY of escapeYs) {\n    const candidate = [\n      from,\n      fromOut,\n      { x: fromOut.x, y: escapeY },\n      { x: toOut.x, y: escapeY },\n      toOut,\n      to,\n    ];\n    const cost = countRouteCollisions(candidate, obstacles) * 1_000_000 + polylineLength(candidate);\n    if (cost < bestCost) {\n      best = candidate;\n      bestCost = cost;\n    }\n  }\n  return best!;\n}\n\nfunction collidingObstacles(points: readonly Point[], obstacles: ReadonlyArray<Rect>): Rect[] {\n  return obstacles.filter(obs => {\n    for (let i = 0; i < points.length - 1; i++) {\n      if (segCrossesInterior(points[i]!, points[i + 1]!, obs, 0)) return true;\n    }\n    return false;\n  });\n}\n\nfunction routeHitsEndpointObstacle(\n  points: readonly Point[],\n  from: Point,\n  to: Point,\n  obstacles: ReadonlyArray<Rect>,\n): boolean {\n  return collidingObstacles(points, obstacles).some(obs =>\n    pointInOrOnRect(from, obs) || pointInOrOnRect(to, obs),\n  );\n}\n\nfunction pointInOrOnRect(p: Point, r: Rect): boolean {\n  const eps = 1e-6;\n  return p.x >= r.x - eps && p.x <= r.x + r.width + eps &&\n    p.y >= r.y - eps && p.y <= r.y + r.height + eps;\n}\n\nfunction polylineLength(points: readonly Point[]): number {\n  let len = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!;\n    const b = points[i + 1]!;\n    len += Math.abs(b.x - a.x) + Math.abs(b.y - a.y);\n  }\n  return len;\n}\n/**\n * Shift a vertical bend line (at x=bendX, spanning yMin\u2013yMax) to avoid obstacles.\n * Returns the original bendX if it doesn't intersect anything, otherwise shifts\n * to the nearest clear side of all intersecting obstacles.\n */\nfunction clearVerticalBend(\n  bendX: number, y1: number, y2: number,\n  fromX: number, toX: number,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendX;\n\n  const yMin = Math.min(y1, y2);\n  const yMax = Math.max(y1, y2);\n\n  // Iteratively shift until clear of all obstacles (max passes to avoid infinite loop)\n  let shifted = bendX;\n  for (let pass = 0; pass < obstacles.length; pass++) {\n    let hit = false;\n    for (const obs of obstacles) {\n      const oLeft   = obs.x - pad;\n      const oRight  = obs.x + obs.width + pad;\n      const oTop    = obs.y;\n      const oBottom = obs.y + obs.height;\n\n      if (shifted > oLeft && shifted < oRight && yMax > oTop && yMin < oBottom) {\n        const leftCandidate  = oLeft;\n        const rightCandidate = oRight;\n        const minX = Math.min(fromX, toX);\n        const maxX = Math.max(fromX, toX);\n\n        const leftValid  = leftCandidate >= minX;\n        const rightValid = rightCandidate <= maxX;\n\n        if (leftValid && rightValid) {\n          shifted = (shifted - leftCandidate < rightCandidate - shifted)\n            ? leftCandidate : rightCandidate;\n        } else if (leftValid) {\n          shifted = leftCandidate;\n        } else if (rightValid) {\n          shifted = rightCandidate;\n        } else {\n          shifted = (shifted - leftCandidate < rightCandidate - shifted)\n            ? leftCandidate : rightCandidate;\n        }\n        hit = true;\n        break; // re-check from start with new position\n      }\n    }\n    if (!hit) break;\n  }\n\n  return shifted;\n}\n\n/**\n * Shift a horizontal bend line (at y=bendY, spanning xMin\u2013xMax) to avoid obstacles.\n */\nfunction clearHorizontalBend(\n  bendY: number, x1: number, x2: number,\n  fromY: number, toY: number,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendY;\n\n  const xMin = Math.min(x1, x2);\n  const xMax = Math.max(x1, x2);\n\n  // Iteratively shift until clear of all obstacles\n  let shifted = bendY;\n  for (let pass = 0; pass < obstacles.length; pass++) {\n    let hit = false;\n    for (const obs of obstacles) {\n      const oTop    = obs.y - pad;\n      const oBottom = obs.y + obs.height + pad;\n      const oLeft   = obs.x;\n      const oRight  = obs.x + obs.width;\n\n      if (shifted > oTop && shifted < oBottom && xMax > oLeft && xMin < oRight) {\n        const topCandidate    = oTop;\n        const bottomCandidate = oBottom;\n        const minY = Math.min(fromY, toY);\n        const maxY = Math.max(fromY, toY);\n\n        const topValid    = topCandidate >= minY;\n        const bottomValid = bottomCandidate <= maxY;\n\n        if (topValid && bottomValid) {\n          shifted = (shifted - topCandidate < bottomCandidate - shifted)\n            ? topCandidate : bottomCandidate;\n        } else if (topValid) {\n          shifted = topCandidate;\n        } else if (bottomValid) {\n          shifted = bottomCandidate;\n        } else {\n          shifted = (shifted - topCandidate < bottomCandidate - shifted)\n            ? topCandidate : bottomCandidate;\n        }\n        hit = true;\n        break; // re-check from start with new position\n      }\n    }\n    if (!hit) break;\n  }\n\n  return shifted;\n}\n\n/**\n * After placing a vertical bend at bendX for an H\u2192V\u2192H route (from\u2192(bendX, from.y)\u2192(bendX, to.y)\u2192to),\n * verify that the two horizontal segments don't cross obstacles. If they do, shift bendX\n * so it's on the target/source side of the obstacle.\n * If conflicting (fixing one breaks the other), push bendX outside all obstacles.\n */\nfunction clearHorizontalSegments(\n  bendX: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendX;\n\n  let shifted = bendX;\n  let prevShifted = NaN;\n  for (let pass = 0; pass < obstacles.length * 2; pass++) {\n    // Detect oscillation (conflicting constraints)\n    if (shifted === prevShifted) break;\n    prevShifted = shifted;\n\n    let hit = false;\n    for (const obs of obstacles) {\n      // Check last horizontal: shifted \u2192 to.x at y=to.y\n      if (segCrossesInterior({ x: shifted, y: to.y }, { x: to.x, y: to.y }, obs, pad)) {\n        shifted = (to.x < obs.x) ? obs.x - pad : obs.x + obs.width + pad;\n        hit = true;\n        break;\n      }\n\n      // Check first horizontal: from.x \u2192 shifted at y=from.y\n      if (segCrossesInterior({ x: from.x, y: from.y }, { x: shifted, y: from.y }, obs, pad)) {\n        shifted = (from.x < obs.x) ? obs.x - pad : obs.x + obs.width + pad;\n        hit = true;\n        break;\n      }\n    }\n    if (!hit) break;\n  }\n\n  // Final verification \u2014 if still colliding, push outside all obstacles\n  const stillCollides = obstacles.some(obs =>\n    segCrossesInterior({ x: shifted, y: to.y }, { x: to.x, y: to.y }, obs, pad) ||\n    segCrossesInterior({ x: from.x, y: from.y }, { x: shifted, y: from.y }, obs, pad),\n  );\n  if (stillCollides) {\n    // Compute the leftmost and rightmost obstacle edges\n    let globalLeft = Infinity, globalRight = -Infinity;\n    for (const obs of obstacles) {\n      globalLeft = Math.min(globalLeft, obs.x - pad);\n      globalRight = Math.max(globalRight, obs.x + obs.width + pad);\n    }\n    // Push to whichever side is closer to the target\n    const leftDist = Math.abs(to.x - globalLeft) + Math.abs(from.x - globalLeft);\n    const rightDist = Math.abs(to.x - globalRight) + Math.abs(from.x - globalRight);\n    shifted = leftDist < rightDist ? globalLeft : globalRight;\n  }\n\n  return shifted;\n}\n\n/**\n * After placing a horizontal bend at bendY for a V\u2192H\u2192V route (from\u2192(from.x, bendY)\u2192(to.x, bendY)\u2192to),\n * verify that the two vertical segments don't cross obstacles. If they do, shift bendY.\n * If conflicting, push outside all obstacles.\n */\nfunction clearVerticalSegments(\n  bendY: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendY;\n\n  let shifted = bendY;\n  let prevShifted = NaN;\n  for (let pass = 0; pass < obstacles.length * 2; pass++) {\n    if (shifted === prevShifted) break;\n    prevShifted = shifted;\n\n    let hit = false;\n    for (const obs of obstacles) {\n      if (segCrossesInterior({ x: to.x, y: shifted }, { x: to.x, y: to.y }, obs, pad)) {\n        shifted = (to.y < obs.y) ? obs.y - pad : obs.y + obs.height + pad;\n        hit = true;\n        break;\n      }\n      if (segCrossesInterior({ x: from.x, y: from.y }, { x: from.x, y: shifted }, obs, pad)) {\n        shifted = (from.y < obs.y) ? obs.y - pad : obs.y + obs.height + pad;\n        hit = true;\n        break;\n      }\n    }\n    if (!hit) break;\n  }\n\n  // Final verification\n  const stillCollides = obstacles.some(obs =>\n    segCrossesInterior({ x: to.x, y: shifted }, { x: to.x, y: to.y }, obs, pad) ||\n    segCrossesInterior({ x: from.x, y: from.y }, { x: from.x, y: shifted }, obs, pad),\n  );\n  if (stillCollides) {\n    let globalTop = Infinity, globalBottom = -Infinity;\n    for (const obs of obstacles) {\n      globalTop = Math.min(globalTop, obs.y - pad);\n      globalBottom = Math.max(globalBottom, obs.y + obs.height + pad);\n    }\n    const topDist = Math.abs(to.y - globalTop) + Math.abs(from.y - globalTop);\n    const bottomDist = Math.abs(to.y - globalBottom) + Math.abs(from.y - globalBottom);\n    shifted = topDist < bottomDist ? globalTop : globalBottom;\n  }\n\n  return shifted;\n}\n\n/** Test if segment p1\u2192p2 crosses the strict interior of obs (boundary touches don't count). */\nfunction segCrossesInterior(\n  p1: { x: number; y: number },\n  p2: { x: number; y: number },\n  obs: import('../contracts/index.js').Rect,\n  _pad: number,\n): boolean {\n  const dx = p2.x - p1.x, dy = p2.y - p1.y;\n  const xmin = obs.x, xmax = obs.x + obs.width;\n  const ymin = obs.y, ymax = obs.y + obs.height;\n  let tmin = 0, tmax = 1;\n  const edges = [\n    { p: -dx, q: p1.x - xmin },\n    { p:  dx, q: xmax - p1.x },\n    { p: -dy, q: p1.y - ymin },\n    { p:  dy, q: ymax - p1.y },\n  ];\n  for (const { p, q } of edges) {\n    if (Math.abs(p) < 1e-10) {\n      // Parallel: segment must be strictly inside (not on boundary) to count\n      if (q <= 0) return false;\n    } else {\n      const t = q / p;\n      if (p < 0) tmin = Math.max(tmin, t);\n      else tmax = Math.min(tmax, t);\n      if (tmin > tmax) return false;\n    }\n  }\n  return tmin < tmax; // strict interior crossing only\n}\n\n/** Count total segment-obstacle collisions along a polyline route. */\nexport function countRouteCollisions(\n  points: readonly Point[],\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n): number {\n  let count = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    for (const obs of obstacles) {\n      if (segCrossesInterior(points[i]!, points[i + 1]!, obs, 0)) count++;\n    }\n  }\n  return count;\n}\n\n/** Build a V\u2192H\u2192V route (vertical-first) with obstacle avoidance. */\nfunction buildVVRoute(\n  from: Point, to: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const midY = (from.y + to.y) / 2;\n  let bendY = clearHorizontalBend(midY, from.x, to.x, from.y, to.y, obstacles, pad);\n  bendY = clearVerticalSegments(bendY, from, to, obstacles, pad);\n  return [from, { x: from.x, y: bendY }, { x: to.x, y: bendY }, to];\n}\n\n/** Build an H\u2192V\u2192H route (horizontal-first) with obstacle avoidance. */\nfunction buildHHRoute(\n  from: Point, to: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const midX = (from.x + to.x) / 2;\n  let bendX = clearVerticalBend(midX, from.y, to.y, from.x, to.x, obstacles, pad);\n  bendX = clearHorizontalSegments(bendX, from, to, obstacles, pad);\n  return [from, { x: bendX, y: from.y }, { x: bendX, y: to.y }, to];\n}\n\n/**\n * Build a V+V fallback route that honours H exit/entry port directions.\n * Adds short horizontal stubs at start/end, then routes V\u2192H\u2192V in between.\n * Route shape: from \u2192 stub1 \u2192 (stub1.x, bendY) \u2192 (stub2.x, bendY) \u2192 stub2 \u2192 to\n */\nfunction buildVVRouteWithStubs(\n  from: Point, to: Point,\n  fromDir: PortDirection, toDir: PortDirection,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  // Stub must be long enough to look intentional (at least 24px)\n  const stubLen = Math.max(pad, 24);\n  const stub1: Point = {\n    x: from.x + (fromDir === 'W' ? -stubLen : fromDir === 'E' ? stubLen : 0),\n    y: from.y + (fromDir === 'N' ? -stubLen : fromDir === 'S' ? stubLen : 0),\n  };\n  const stub2: Point = {\n    x: to.x + (toDir === 'W' ? -stubLen : toDir === 'E' ? stubLen : 0),\n    y: to.y + (toDir === 'N' ? -stubLen : toDir === 'S' ? stubLen : 0),\n  };\n\n  // Route V+V between the stubs\n  const midY = (stub1.y + stub2.y) / 2;\n  let bendY = clearHorizontalBend(midY, stub1.x, stub2.x, stub1.y, stub2.y, obstacles, pad);\n  bendY = clearVerticalSegments(bendY, stub1, stub2, obstacles, pad);\n\n  return [from, stub1, { x: stub1.x, y: bendY }, { x: stub2.x, y: bendY }, stub2, to];\n}\n\n/**\n * Build an H+H fallback route that honours V exit/entry port directions.\n * Adds short vertical stubs at start/end, then routes H\u2192V\u2192H in between.\n */\nfunction buildHHRouteWithStubs(\n  from: Point, to: Point,\n  fromDir: PortDirection, toDir: PortDirection,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const stubLen = Math.max(pad, 24);\n  const stub1: Point = {\n    x: from.x + (fromDir === 'W' ? -stubLen : fromDir === 'E' ? stubLen : 0),\n    y: from.y + (fromDir === 'N' ? -stubLen : fromDir === 'S' ? stubLen : 0),\n  };\n  const stub2: Point = {\n    x: to.x + (toDir === 'W' ? -stubLen : toDir === 'E' ? stubLen : 0),\n    y: to.y + (toDir === 'N' ? -stubLen : toDir === 'S' ? stubLen : 0),\n  };\n\n  const midX = (stub1.x + stub2.x) / 2;\n  let bendX = clearVerticalBend(midX, stub1.y, stub2.y, stub1.x, stub2.x, obstacles, pad);\n  bendX = clearHorizontalSegments(bendX, stub1, stub2, obstacles, pad);\n\n  return [from, stub1, { x: bendX, y: stub1.y }, { x: bendX, y: stub2.y }, stub2, to];\n}\n\n// \u2500\u2500\u2500 Bezier \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass BezierRouter implements Router {\n  route({ from, to, tension, obstacles, padding }: RouteRequest): Route {\n    const t  = tension ?? 0.4;\n    const dx = to.x - from.x;\n    const dy = to.y - from.y;\n    const pad = padding ?? 12;\n    const dist = Math.sqrt(dx * dx + dy * dy);\n\n    // Cap the control point pull to avoid exaggerated arcs on long routes.\n    // Pull scales with distance but is clamped to a sensible maximum.\n    const MAX_PULL = 150;\n\n    let cp1: Point;\n    let cp2: Point;\n\n    if (Math.abs(dy) >= Math.abs(dx)) {\n      const pull = Math.min(Math.abs(dy) * t, MAX_PULL);\n      cp1 = { x: from.x, y: from.y + (dy >= 0 ? pull : -pull) };\n      cp2 = { x: to.x,   y: to.y   + (dy >= 0 ? -pull : pull) };\n    } else {\n      const pull = Math.min(Math.abs(dx) * t, MAX_PULL);\n      cp1 = { x: from.x + (dx >= 0 ? pull : -pull), y: from.y };\n      cp2 = { x: to.x   + (dx >= 0 ? -pull : pull), y: to.y };\n    }\n\n    // Check for obstacle collisions and adjust control points if needed\n    if (obstacles && obstacles.length > 0) {\n      const adjusted = avoidObstaclesBezier(from, to, cp1, cp2, obstacles, pad, t);\n      cp1 = adjusted.cp1;\n      cp2 = adjusted.cp2;\n    }\n\n    return {\n      points: [from, cp1, cp2, to],\n      path: `M ${from.x} ${from.y} C ${cp1.x} ${cp1.y} ${cp2.x} ${cp2.y} ${to.x} ${to.y}`,\n      labelPosition: midpoint(from, to),\n    };\n  }\n}\n\n/**\n * Adjust bezier control points to avoid obstacles.\n *\n * Strategy: sample the curve and check for obstacle hits.\n * If the default curve collides, try offsetting control points\n * perpendicular to the from\u2192to axis in both directions.\n * Pick the direction with fewer collisions. If both still collide,\n * increase the perpendicular offset until clear (up to a limit).\n */\nfunction avoidObstaclesBezier(\n  from: Point, to: Point,\n  cp1: Point, cp2: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n  tension: number,\n): { cp1: Point; cp2: Point } {\n  const SAMPLES = 16;\n\n  // Check if default curve hits any obstacle\n  if (!bezierHitsObstacles(from, cp1, cp2, to, obstacles, pad, SAMPLES)) {\n    return { cp1, cp2 };\n  }\n\n  // Perpendicular to from\u2192to\n  const dx = to.x - from.x, dy = to.y - from.y;\n  const len = Math.sqrt(dx * dx + dy * dy);\n  if (len < 1) return { cp1, cp2 };\n  const perpX = -dy / len;\n  const perpY = dx / len;\n\n  // The from\u2192to midpoint \u2014 prefer curves that stay close to this\n  const mid = midpoint(from, to);\n\n  // Try increasing perpendicular offsets; at each step, try BOTH directions\n  // and prefer the one whose curve stays closer to the from\u2192to midpoint (inner arc).\n  // Cap maximum offset to avoid pushing curves far outside the content area.\n  const MAX_OFFSET = Math.min(len * 0.5, 80);\n  for (let offset = len * 0.1; offset <= MAX_OFFSET; offset += len * 0.1) {\n    const cp1p: Point = { x: cp1.x + perpX * offset, y: cp1.y + perpY * offset };\n    const cp2p: Point = { x: cp2.x + perpX * offset, y: cp2.y + perpY * offset };\n    const clearP = !bezierHitsObstacles(from, cp1p, cp2p, to, obstacles, pad, SAMPLES);\n\n    const cp1n: Point = { x: cp1.x - perpX * offset, y: cp1.y - perpY * offset };\n    const cp2n: Point = { x: cp2.x - perpX * offset, y: cp2.y - perpY * offset };\n    const clearN = !bezierHitsObstacles(from, cp1n, cp2n, to, obstacles, pad, SAMPLES);\n\n    if (clearP && clearN) {\n      // Both clear \u2014 pick the one whose curve midpoint is closer to from\u2192to midpoint\n      const midP = sampleBezier(from, cp1p, cp2p, to, 0.5);\n      const midN = sampleBezier(from, cp1n, cp2n, to, 0.5);\n      const distP = (midP.x - mid.x) ** 2 + (midP.y - mid.y) ** 2;\n      const distN = (midN.x - mid.x) ** 2 + (midN.y - mid.y) ** 2;\n      return distP <= distN ? { cp1: cp1p, cp2: cp2p } : { cp1: cp1n, cp2: cp2n };\n    }\n    if (clearP) return { cp1: cp1p, cp2: cp2p };\n    if (clearN) return { cp1: cp1n, cp2: cp2n };\n  }\n\n  // Fallback: return the least-colliding direction at capped offset, preferring inner\n  const maxOff = MAX_OFFSET;\n  const cp1p: Point = { x: cp1.x + perpX * maxOff, y: cp1.y + perpY * maxOff };\n  const cp2p: Point = { x: cp2.x + perpX * maxOff, y: cp2.y + perpY * maxOff };\n  const cp1n: Point = { x: cp1.x - perpX * maxOff, y: cp1.y - perpY * maxOff };\n  const cp2n: Point = { x: cp2.x - perpX * maxOff, y: cp2.y - perpY * maxOff };\n\n  const hitsP = countBezierHits(from, cp1p, cp2p, to, obstacles, pad, SAMPLES);\n  const hitsN = countBezierHits(from, cp1n, cp2n, to, obstacles, pad, SAMPLES);\n  if (hitsP === hitsN) {\n    const midP = sampleBezier(from, cp1p, cp2p, to, 0.5);\n    const midN = sampleBezier(from, cp1n, cp2n, to, 0.5);\n    const distP = (midP.x - mid.x) ** 2 + (midP.y - mid.y) ** 2;\n    const distN = (midN.x - mid.x) ** 2 + (midN.y - mid.y) ** 2;\n    return distP <= distN ? { cp1: cp1p, cp2: cp2p } : { cp1: cp1n, cp2: cp2n };\n  }\n  return hitsP < hitsN ? { cp1: cp1p, cp2: cp2p } : { cp1: cp1n, cp2: cp2n };\n}\n\n/** Sample a cubic bezier and check if any sample is inside an obstacle. */\nfunction bezierHitsObstacles(\n  p0: Point, p1: Point, p2: Point, p3: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number, samples: number,\n): boolean {\n  for (let i = 1; i < samples; i++) {\n    const t = i / samples;\n    const pt = sampleBezier(p0, p1, p2, p3, t);\n    for (const obs of obstacles) {\n      if (\n        pt.x > obs.x - pad && pt.x < obs.x + obs.width + pad &&\n        pt.y > obs.y - pad && pt.y < obs.y + obs.height + pad\n      ) return true;\n    }\n  }\n  return false;\n}\n\n/** Count obstacle hits along a bezier curve. */\nfunction countBezierHits(\n  p0: Point, p1: Point, p2: Point, p3: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number, samples: number,\n): number {\n  let count = 0;\n  for (let i = 1; i < samples; i++) {\n    const t = i / samples;\n    const pt = sampleBezier(p0, p1, p2, p3, t);\n    for (const obs of obstacles) {\n      if (\n        pt.x > obs.x - pad && pt.x < obs.x + obs.width + pad &&\n        pt.y > obs.y - pad && pt.y < obs.y + obs.height + pad\n      ) count++;\n    }\n  }\n  return count;\n}\n\n/** Evaluate a cubic bezier at parameter t \u2208 [0, 1]. */\nfunction sampleBezier(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n  const u = 1 - t;\n  return {\n    x: u*u*u*p0.x + 3*u*u*t*p1.x + 3*u*t*t*p2.x + t*t*t*p3.x,\n    y: u*u*u*p0.y + 3*u*u*t*p1.y + 3*u*t*t*p2.y + t*t*t*p3.y,\n  };\n}\n\n// \u2500\u2500\u2500 Polyline \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Placeholder \u2014 routes straight until explicit waypoints are in RouteRequest.\n\nclass PolylineRouter implements Router {\n  route(req: RouteRequest): Route {\n    return new StraightRouter().route(req);\n  }\n}\n\n// \u2500\u2500\u2500 Singleton Instances \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const straightRouter: Router   = new StraightRouter();\nexport const orthogonalRouter: Router  = new OrthogonalRouter();\nexport const bezierRouter: Router      = new BezierRouter();\nexport const polylineRouter: Router    = new PolylineRouter();\n\n// \u2500\u2500\u2500 Factory & Default \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Create (or look up) a router by style name. */\nexport function createRouter(style: RouteStyle): Router {\n  switch (style) {\n    case 'straight':    return straightRouter;\n    case 'orthogonal':  return orthogonalRouter;\n    case 'bezier':      return bezierRouter;\n    case 'polyline':    return polylineRouter;\n  }\n}\n\n/** Default router used by layout engines unless overridden. */\nexport const defaultRouter: Router = orthogonalRouter;\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction midpoint(a: Point, b: Point): Point {\n  return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n}\n", "import type {\n  RawOverlay,\n  CompiledOverlays,\n  Annotation,\n  Legend,\n  LegendCorner,\n} from '../contracts/index.js';\n\n/**\n * Convert raw grammar-emitted overlay directives into resolved overlay types.\n *\n * Position resolution for notes is deferred \u2014 positions are relative offsets\n * from the anchor element. The overlay layout function resolves these to\n * absolute coordinates once node positions are known.\n */\nexport function compileOverlays(raw: readonly RawOverlay[]): CompiledOverlays {\n  const annotations: Annotation[] = [];\n  let legend: Legend | undefined;\n\n  for (const item of raw) {\n    switch (item.type) {\n      case 'note': {\n        const dx = item.offset?.dx ?? 0;\n        const dy = item.offset?.dy ?? -60;\n        annotations.push({\n          id: `note-${slugify(item.target)}-${annotations.length}`,\n          text: item.text,\n          // position is the offset from the anchor; absolute coords resolved at layout time\n          position: { x: dx, y: dy },\n          anchor: { elementId: item.target },\n        });\n        break;\n      }\n\n      case 'legend': {\n        legend = {\n          ...(item.title !== undefined ? { title: item.title } : {}),\n          entries: item.entries,\n          corner: parseLegendCorner(item.corner),\n        };\n        break;\n      }\n    }\n  }\n\n  return { annotations, ...(legend !== undefined ? { legend } : {}) };\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction slugify(text: string): string {\n  return text\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n}\n\nfunction parseLegendCorner(raw: string): LegendCorner {\n  const valid: LegendCorner[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n  return valid.includes(raw as LegendCorner) ? (raw as LegendCorner) : 'bottom-right';\n}\n", "import type {\n  CompiledOverlays,\n  Annotation,\n  Legend,\n  Scene,\n  SceneElement,\n  SceneGroup,\n  Rect,\n  Point,\n  ResolvedTheme,\n} from '../contracts/index.js';\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ANNO_MIN_W   = 100;\nconst ANNO_MAX_W   = 200;\nconst ANNO_PAD     = 10;\nconst ANNO_FOLD    = 10;\nconst LEGEND_MIN_W = 140;\nconst LEGEND_ROW_H = 20;\nconst LEGEND_PAD   = 10;\nconst LEGEND_MARGIN = 12;\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface OverlayResult {\n  /** Additional elements to append to the scene's elements list. */\n  elements: SceneElement[];\n  /** Expanded viewBox that encompasses all overlay geometry. */\n  viewBox: Rect;\n}\n\n/**\n * Lay out compiled overlays (annotations + legend) relative to an existing scene.\n *\n * Diagram layout functions call this internally after positioning all nodes/edges.\n * The returned elements are appended to the scene's element list. The returned\n * viewBox replaces the scene's viewBox if it has expanded.\n */\nexport function layoutOverlays(\n  compiled: CompiledOverlays,\n  scene: Scene,\n  theme: ResolvedTheme,\n): OverlayResult {\n  const result: SceneElement[] = [];\n  let viewBox: Rect = { ...scene.viewBox };\n\n  // Build element-id \u2192 bounding box map for annotation anchor resolution\n  const boundsMap = new Map<string, Rect>();\n  for (const el of scene.elements) {\n    collectGroupBounds(el, 0, 0, boundsMap);\n  }\n\n  for (const anno of compiled.annotations) {\n    const laid = layoutAnnotation(anno, boundsMap, theme);\n    if (laid) {\n      result.push(laid.group);\n      viewBox = expandViewBox(viewBox, laid.bounds);\n    }\n  }\n\n  if (compiled.legend) {\n    const laid = layoutLegend(compiled.legend, viewBox, theme);\n    result.push(laid.group);\n    viewBox = expandViewBox(viewBox, laid.bounds);\n  }\n\n  return { elements: result, viewBox };\n}\n\n// \u2500\u2500\u2500 Annotation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction layoutAnnotation(\n  anno: Annotation,\n  boundsMap: Map<string, Rect>,\n  theme: ResolvedTheme,\n): { group: SceneGroup; bounds: Rect } | null {\n  const { palette, typography } = theme;\n\n  // Resolve absolute anchor point\n  let anchorPt: Point;\n  let boxOrigin: Point;\n\n  if ('elementId' in anno.anchor) {\n    const elBounds = boundsMap.get(anno.anchor.elementId);\n    if (!elBounds) return null;\n    anchorPt = { x: elBounds.x + elBounds.width / 2, y: elBounds.y };\n    boxOrigin = { x: anchorPt.x + anno.position.x, y: anchorPt.y + anno.position.y };\n  } else {\n    anchorPt = anno.anchor.point;\n    boxOrigin = anno.position;\n  }\n\n  // Measure text\n  const charW  = typography.baseFontSize * 0.52;\n  const maxW   = anno.width ?? ANNO_MAX_W;\n  const lines  = wrapText(anno.text, maxW, charW);\n  const textW  = Math.max(ANNO_MIN_W, Math.min(maxW, Math.max(...lines.map(l => l.length * charW)) + ANNO_PAD * 2));\n  const lineH  = typography.baseFontSize * typography.lineHeight;\n  const boxW   = textW;\n  const boxH   = lines.length * lineH + ANNO_PAD * 2;\n  const { x, y } = boxOrigin;\n\n  // Connector: dashed line from closest box-edge point to anchor\n  const connStart = closestEdgePoint({ x, y, width: boxW, height: boxH }, anchorPt);\n\n  const children: SceneElement[] = [\n    // Connector\n    {\n      type: 'path',\n      d: `M ${connStart.x} ${connStart.y} L ${anchorPt.x} ${anchorPt.y}`,\n      stroke: palette.border,\n      strokeWidth: 1,\n      strokeDasharray: '4 3',\n    },\n    // Box body with folded corner\n    {\n      type: 'path',\n      d: `M ${x} ${y} L ${x + boxW - ANNO_FOLD} ${y} L ${x + boxW} ${y + ANNO_FOLD} L ${x + boxW} ${y + boxH} L ${x} ${y + boxH} Z`,\n      fill: palette.surface,\n      stroke: palette.border,\n      strokeWidth: 1,\n    },\n    // Fold triangle\n    {\n      type: 'path',\n      d: `M ${x + boxW - ANNO_FOLD} ${y} L ${x + boxW - ANNO_FOLD} ${y + ANNO_FOLD} L ${x + boxW} ${y + ANNO_FOLD} Z`,\n      fill: palette.border,\n      stroke: palette.border,\n      strokeWidth: 1,\n    },\n  ];\n\n  // Text lines\n  for (let i = 0; i < lines.length; i++) {\n    children.push({\n      type: 'text',\n      content: lines[i] ?? '',\n      position: { x: x + ANNO_PAD, y: y + ANNO_PAD + typography.baseFontSize + i * lineH },\n      fontSize: typography.baseFontSize,\n      fontFamily: typography.fontFamily,\n      fill: palette.text,\n    });\n  }\n\n  const bx = Math.min(x, anchorPt.x);\n  const by = Math.min(y, anchorPt.y);\n  const bounds: Rect = {\n    x: bx,\n    y: by,\n    width:  Math.max(boxW, Math.abs(anchorPt.x - x)) + Math.max(0, x - bx),\n    height: Math.max(boxH, Math.abs(anchorPt.y - y)) + Math.max(0, y - by),\n  };\n\n  return { group: { type: 'group', id: anno.id, children }, bounds };\n}\n\n// \u2500\u2500\u2500 Legend \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction layoutLegend(\n  legend: Legend,\n  viewBox: Rect,\n  theme: ResolvedTheme,\n): { group: SceneGroup; bounds: Rect } {\n  const { palette, typography } = theme;\n  const titleH = legend.title ? LEGEND_ROW_H + 4 : 0;\n  const boxH   = LEGEND_PAD * 2 + titleH + legend.entries.length * LEGEND_ROW_H;\n  const boxW   = Math.max(\n    legend.width ?? LEGEND_MIN_W,\n    ...(legend.title ? [legend.title.length * typography.baseFontSize * 0.55 + LEGEND_PAD * 2] : []),\n    ...legend.entries.map(e =>\n      (e.key.length + e.value.length + 3) * typography.smallFontSize * 0.52 + LEGEND_PAD * 2,\n    ),\n  );\n\n  const c = legend.corner;\n  const x = (c === 'top-left'  || c === 'bottom-left')\n    ? viewBox.x + LEGEND_MARGIN\n    : viewBox.x + viewBox.width - boxW - LEGEND_MARGIN;\n  const y = (c === 'top-left'  || c === 'top-right')\n    ? viewBox.y + LEGEND_MARGIN\n    : viewBox.y + viewBox.height - boxH - LEGEND_MARGIN;\n\n  const children: SceneElement[] = [\n    { type: 'rect', bounds: { x, y, width: boxW, height: boxH }, fill: palette.background, stroke: palette.border, strokeWidth: 1, rx: 4 },\n  ];\n\n  let rowY = y + LEGEND_PAD;\n\n  if (legend.title) {\n    children.push({ type: 'text', content: legend.title, position: { x: x + LEGEND_PAD, y: rowY + typography.baseFontSize }, fontSize: typography.baseFontSize, fontFamily: typography.fontFamily, fontWeight: 'bold', fill: palette.text });\n    rowY += LEGEND_ROW_H + 4;\n    children.push({ type: 'path', d: `M ${x + 4} ${rowY - 2} L ${x + boxW - 4} ${rowY - 2}`, stroke: palette.border, strokeWidth: 1 });\n  }\n\n  for (const entry of legend.entries) {\n    children.push({ type: 'text', content: entry.key, position: { x: x + LEGEND_PAD, y: rowY + typography.smallFontSize }, fontSize: typography.smallFontSize, fontFamily: typography.fontFamily, fontWeight: 'bold', fill: palette.text });\n    children.push({ type: 'text', content: entry.value, position: { x: x + boxW / 2 + 4, y: rowY + typography.smallFontSize }, fontSize: typography.smallFontSize, fontFamily: typography.fontFamily, fill: palette.textMuted });\n    rowY += LEGEND_ROW_H;\n  }\n\n  return {\n    group: { type: 'group', children },\n    bounds: { x, y, width: boxW, height: boxH },\n  };\n}\n\n// \u2500\u2500\u2500 Scene Tree Walking \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Walk the element tree collecting id \u2192 bounding box for every named group. */\nfunction collectGroupBounds(\n  el: SceneElement,\n  ox: number,\n  oy: number,\n  map: Map<string, Rect>,\n): void {\n  if (el.type !== 'group') return;\n\n  const [tx, ty] = parseTranslate(el.transform);\n  const nx = ox + tx;\n  const ny = oy + ty;\n\n  if (el.id) {\n    const childBounds = el.children\n      .map(c => elementBoundsAt(c, nx, ny))\n      .filter((b): b is Rect => b !== null);\n    if (childBounds.length > 0) map.set(el.id, unionRects(childBounds));\n  }\n\n  for (const child of el.children) {\n    collectGroupBounds(child, nx, ny, map);\n  }\n}\n\nfunction elementBoundsAt(el: SceneElement, ox: number, oy: number): Rect | null {\n  switch (el.type) {\n    case 'rect':\n      return { x: el.bounds.x + ox, y: el.bounds.y + oy, width: el.bounds.width, height: el.bounds.height };\n    case 'circle':\n      return { x: el.center.x - el.radius + ox, y: el.center.y - el.radius + oy, width: el.radius * 2, height: el.radius * 2 };\n    case 'text':\n      return { x: el.position.x + ox, y: el.position.y - el.fontSize + oy, width: el.content.length * el.fontSize * 0.5, height: el.fontSize * 1.4 };\n    case 'group': {\n      const [tx, ty] = parseTranslate(el.transform);\n      const kids = el.children.map(c => elementBoundsAt(c, ox + tx, oy + ty)).filter((b): b is Rect => b !== null);\n      return kids.length > 0 ? unionRects(kids) : null;\n    }\n    case 'path':\n      return null;\n  }\n}\n\n// \u2500\u2500\u2500 Geometry Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseTranslate(transform: string | undefined): [number, number] {\n  if (!transform) return [0, 0];\n  const m = transform.match(/translate\\(\\s*(-?[\\d.]+)\\s*[, ]\\s*(-?[\\d.]+)\\s*\\)/);\n  return m ? [parseFloat(m[1]!), parseFloat(m[2]!)] : [0, 0];\n}\n\nfunction closestEdgePoint(box: Rect, target: Point): Point {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  const dx = target.x - cx;\n  const dy = target.y - cy;\n\n  if (Math.abs(dx) * box.height > Math.abs(dy) * box.width) {\n    const sx = dx > 0 ? 1 : -1;\n    const ex = cx + sx * box.width / 2;\n    const ey = cy + (Math.abs(dx) > 0 ? (dy / Math.abs(dx)) * (box.width / 2) : 0);\n    return { x: ex, y: clamp(ey, box.y, box.y + box.height) };\n  } else {\n    const sy = dy > 0 ? 1 : -1;\n    const ey = cy + sy * box.height / 2;\n    const ex = cx + (Math.abs(dy) > 0 ? (dx / Math.abs(dy)) * (box.height / 2) : 0);\n    return { x: clamp(ex, box.x, box.x + box.width), y: ey };\n  }\n}\n\nfunction wrapText(text: string, maxWidth: number, charWidth: number): string[] {\n  const words = text.split(' ');\n  const lines: string[] = [];\n  let current = '';\n  for (const word of words) {\n    const candidate = current ? `${current} ${word}` : word;\n    if (candidate.length * charWidth > maxWidth && current) {\n      lines.push(current);\n      current = word;\n    } else {\n      current = candidate;\n    }\n  }\n  if (current) lines.push(current);\n  return lines.length > 0 ? lines : [''];\n}\n\nfunction expandViewBox(vb: Rect, bounds: Rect): Rect {\n  const x      = Math.min(vb.x, bounds.x);\n  const y      = Math.min(vb.y, bounds.y);\n  const right  = Math.max(vb.x + vb.width,  bounds.x + bounds.width);\n  const bottom = Math.max(vb.y + vb.height, bounds.y + bounds.height);\n  return { x, y, width: right - x, height: bottom - y };\n}\n\nfunction unionRects(rects: Rect[]): Rect {\n  const x      = Math.min(...rects.map(r => r.x));\n  const y      = Math.min(...rects.map(r => r.y));\n  const right  = Math.max(...rects.map(r => r.x + r.width));\n  const bottom = Math.max(...rects.map(r => r.y + r.height));\n  return { x, y, width: right - x, height: bottom - y };\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n  return Math.max(lo, Math.min(hi, v));\n}\n", "/**\n * @file overlay/apply.ts \u2014 Uniform overlay application for layout engines.\n *\n * Every diagram layout ends the same way: if the IR carries overlays, compile\n * them, lay them out against the finished scene, and merge their elements +\n * expanded viewBox back in. This helper centralizes that tail so each layout\n * engine reduces to a single call.\n */\n\nimport type { RawOverlay, Scene, ResolvedTheme } from '../contracts/index.js';\nimport { compileOverlays } from './compiler.js';\nimport { layoutOverlays } from './layout.js';\n\n/**\n * Return a scene with the IR's overlays merged in. When there are no overlays\n * the input scene is returned unchanged.\n */\nexport function applyOverlays(\n  scene: Scene,\n  overlays: readonly RawOverlay[] | undefined,\n  theme: ResolvedTheme,\n): Scene {\n  if (!overlays || overlays.length === 0) return scene;\n  const compiled = compileOverlays(overlays);\n  const { elements, viewBox } = layoutOverlays(compiled, scene, theme);\n  return { ...scene, elements: [...scene.elements, ...elements], viewBox };\n}\n", "/**\n * @file scene/build.ts \u2014 Scene-element construction helpers.\n *\n * A `Pen` is bound once to a theme and produces SceneElements, removing the\n * `type` discriminant and the repeated `fontFamily: typography.fontFamily`\n * plumbing from every call site. Shapes take explicit colours (which vary per\n * element); only the font family \u2014 the one token that is invariant per theme \u2014\n * is defaulted. Output is identical to the equivalent object literals.\n */\n\nimport type {\n  SceneElement, SceneText, SceneRect, SceneCircle, ScenePath, SceneGroup,\n  Rect, Point, Color, FontWeight, TextAnchor, ResolvedTheme,\n} from '../contracts/index.js';\nimport type { RenderedConnectorAnimation } from '../contracts/animations.js';\n\nexport interface TextOpts {\n  weight?: FontWeight;\n  anchor?: TextAnchor;\n  opacity?: number;\n}\n\nexport interface RectOpts {\n  rx?: number;\n  fillOpacity?: number;\n  opacity?: number;\n}\n\nexport interface PathOpts {\n  fill?: Color;\n  dash?: string;\n  markerEnd?: string;\n  markerStart?: string;\n  animated?: RenderedConnectorAnimation;\n  opacity?: number;\n}\n\nexport interface GroupOpts {\n  id?: string;\n  transform?: string;\n  opacity?: number;\n}\n\nexport interface Pen {\n  /** Text at (x, y) with the theme font family; size + fill are explicit. */\n  text(content: string, x: number, y: number, size: number, fill: Color, opts?: TextOpts): SceneText;\n  rect(bounds: Rect, fill: Color, stroke: Color, strokeWidth: number, opts?: RectOpts): SceneRect;\n  circle(center: Point, radius: number, fill: Color, stroke: Color, strokeWidth: number, opts?: { opacity?: number }): SceneCircle;\n  path(d: string, stroke: Color, strokeWidth: number, opts?: PathOpts): ScenePath;\n  group(children: readonly SceneElement[], opts?: GroupOpts): SceneGroup;\n}\n\n/** Create a Pen bound to a theme's font family. */\nexport function pen(theme: ResolvedTheme): Pen {\n  const fontFamily = theme.typography.fontFamily;\n  return {\n    text(content, x, y, size, fill, opts = {}) {\n      return {\n        type: 'text', content, position: { x, y }, fontSize: size, fontFamily, fill,\n        ...(opts.weight !== undefined  ? { fontWeight: opts.weight } : {}),\n        ...(opts.anchor !== undefined  ? { anchor: opts.anchor } : {}),\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    rect(bounds, fill, stroke, strokeWidth, opts = {}) {\n      return {\n        type: 'rect', bounds, fill, stroke, strokeWidth,\n        ...(opts.rx !== undefined          ? { rx: opts.rx } : {}),\n        ...(opts.fillOpacity !== undefined ? { fillOpacity: opts.fillOpacity } : {}),\n        ...(opts.opacity !== undefined     ? { opacity: opts.opacity } : {}),\n      };\n    },\n    circle(center, radius, fill, stroke, strokeWidth, opts = {}) {\n      return {\n        type: 'circle', center, radius, fill, stroke, strokeWidth,\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    path(d, stroke, strokeWidth, opts = {}) {\n      return {\n        type: 'path', d, stroke, strokeWidth,\n        ...(opts.fill !== undefined      ? { fill: opts.fill } : {}),\n        ...(opts.dash !== undefined      ? { strokeDasharray: opts.dash } : {}),\n        ...(opts.markerEnd !== undefined ? { markerEnd: opts.markerEnd } : {}),\n        ...(opts.markerStart !== undefined ? { markerStart: opts.markerStart } : {}),\n        ...(opts.animated !== undefined  ? { animated: opts.animated } : {}),\n        ...(opts.opacity !== undefined   ? { opacity: opts.opacity } : {}),\n      };\n    },\n    group(children, opts = {}) {\n      return {\n        type: 'group', children,\n        ...(opts.id !== undefined        ? { id: opts.id } : {}),\n        ...(opts.transform !== undefined ? { transform: opts.transform } : {}),\n        ...(opts.opacity !== undefined   ? { opacity: opts.opacity } : {}),\n      };\n    },\n  };\n}\n", "import type { FlowDocument, FlowNode, FlowEdge, FlowDirection } from './ir.js';\nimport type { Scene, SceneElement, Rect, Point, LayoutResult, NodeAnchorRegistry, NodeAnchor, OccupiedPort, LayoutOptions } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { CardinalSide, RouteStyle } from '../../../contracts/index.js';\nimport { getRouter } from '../../../routing/registry.js';\nimport { defaultRouter } from '../../../routing/router.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { pen } from '../../../scene/build.js';\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst NODE_W = 120;\nconst NODE_H = 40;\nconst ARROW_MARKER_ID = 'triton-arrow';\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutFlowchart(ir: FlowDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n  const { spacing, palette, typography, edges: edgeTheme } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const isLR = ir.direction === 'LR' || ir.direction === 'RL';\n  const isReverse = ir.direction === 'RL' || ir.direction === 'BT';\n\n  // \u2500\u2500 Layer assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const layers = assignLayers(ir.nodes, ir.edges);\n  const byLayer = groupByLayer(ir.nodes, layers);\n\n  // \u2500\u2500 Phase 3: Crossing minimisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Back-edges computed once; reused by both layout phases and the edge-drawing\n  // loop below (avoids a second DFS).\n  const backEdges = findBackEdges(ir.nodes, ir.edges);\n  const orderedByLayer = minimizeCrossings(byLayer, ir.edges, backEdges);\n\n  // \u2500\u2500 Phase 4: Brandes\u2013K\u00F6pf coordinate assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const colGap = spacing.nodeGap;\n  const rowGap = spacing.nodeGap;\n\n  let maxNodesInLayer = 0;\n  for (const [, nodes] of orderedByLayer) maxNodesInLayer = Math.max(maxNodesInLayer, nodes.length);\n\n  const nodePos = assignCoordinatesBK(\n    orderedByLayer, ir.edges, backEdges,\n    isLR, isReverse, maxNodesInLayer,\n    NODE_W, NODE_H, colGap, rowGap, margin,\n  );\n\n  // \u2500\u2500 Build scene elements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const elements: SceneElement[] = [];\n\n  // Title\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, margin, margin - 8, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // Subgraph backgrounds (drawn first \u2014 behind nodes)\n  for (const sg of ir.subgraphs) {\n    const sgRects = sg.nodeIds\n      .map(id => nodePos.get(id))\n      .filter((r): r is Rect => r !== undefined);\n    if (sgRects.length === 0) continue;\n    const pad = 12;\n    const minX = Math.min(...sgRects.map(r => r.x)) - pad;\n    const minY = Math.min(...sgRects.map(r => r.y)) - pad - 20;\n    const maxX = Math.max(...sgRects.map(r => r.x + r.width))  + pad;\n    const maxY = Math.max(...sgRects.map(r => r.y + r.height)) + pad;\n    elements.push(p.rect({ x: minX, y: minY, width: maxX - minX, height: maxY - minY }, palette.surface, palette.border, 1, { rx: 6, opacity: 0.6 }));\n    elements.push(p.text(sg.label, minX + 8, minY + 14, typography.smallFontSize, palette.textMuted));\n  }\n\n  // Edges (drawn before nodes so nodes appear on top).\n  //\n  // Back-edges (the cycle-closing edges identified by `findBackEdges`, the same\n  // set excluded from layer ranks) and self-loops are routed specially so they\n  // read as \"feedback\" instead of cutting straight back through the node column.\n  // Every OTHER (forward / acyclic) edge takes the unchanged orthogonal-router\n  // path below, so acyclic diagrams render byte-identically.\n  // (backEdges was computed in the layout phase above \u2014 reused here.)\n  let bowMaxX = -Infinity;\n  let bowMaxY = -Infinity;\n\n  for (let ei = 0; ei < ir.edges.length; ei++) {\n    const edge = ir.edges[ei]!;\n    const fromRect = nodePos.get(edge.from);\n    const toRect   = nodePos.get(edge.to);\n    if (!fromRect || !toRect) continue;\n\n    const dash = edge.style === 'dotted' ? '6 3' : edge.style === 'dashed' ? '8 4' : undefined;\n    const sw   = edge.style === 'thick'  ? edgeTheme.strokeWidth * 2 : edgeTheme.strokeWidth;\n    const color = edge.style === 'dotted' ? palette.textMuted : palette.primary;\n\n    // Self-loop (A \u2192 A): a small loop off one side, never a zero-length line.\n    if (edge.from === edge.to) {\n      const loop = selfLoopRoute(fromRect, isLR);\n      elements.push(p.path(loop.path, color, sw, {\n        ...(dash !== undefined ? { dash } : {}),\n        markerEnd: ARROW_MARKER_ID,\n      }));\n      bowMaxX = Math.max(bowMaxX, loop.maxX);\n      bowMaxY = Math.max(bowMaxY, loop.maxY);\n      if (edge.label) {\n        elements.push(p.text(edge.label, loop.labelPos.x, loop.labelPos.y - 4, edgeTheme.labelFontSize, palette.textMuted, { anchor: 'middle' }));\n      }\n      continue;\n    }\n\n    // Back-edge (feedback): bow out to one side around the intervening nodes.\n    if (backEdges.has(ei)) {\n      const bow = backEdgeRoute(fromRect, toRect, isLR);\n      elements.push(p.path(bow.path, color, sw, {\n        ...(dash !== undefined ? { dash } : {}),\n        markerEnd: ARROW_MARKER_ID,\n      }));\n      bowMaxX = Math.max(bowMaxX, bow.maxX);\n      bowMaxY = Math.max(bowMaxY, bow.maxY);\n      if (edge.label) {\n        elements.push(p.text(edge.label, bow.labelPos.x, bow.labelPos.y - 4, edgeTheme.labelFontSize, palette.textMuted, { anchor: 'middle' }));\n      }\n      continue;\n    }\n\n    // Forward edge \u2014 default orthogonal route; an @route hint may override the\n    // routing style (straight | bezier | polyline) and/or the exit/entry walls.\n    const fromAnchor = edge.exitWall\n      ? wallAnchor(fromRect, edge.exitWall)\n      : edgeAnchor(fromRect, ir.direction, 'exit',  toRect);\n    const toAnchor   = edge.entryWall\n      ? wallAnchor(toRect, edge.entryWall)\n      : edgeAnchor(toRect,   ir.direction, 'enter', fromRect);\n\n    const style: RouteStyle = edge.routing ?? 'orthogonal';\n    const router = getRouter(style) ?? defaultRouter;\n    const route = router.route({\n      from: fromAnchor.point,\n      to: toAnchor.point,\n      style,\n      curveStyle: 'linear',\n      obstacles: [],\n      padding: 8,\n      fromDir: fromAnchor.portDir,\n      toDir: toAnchor.portDir,\n    });\n\n    elements.push(p.path(route.path, color, sw, {\n      ...(dash !== undefined ? { dash } : {}),\n      markerEnd: ARROW_MARKER_ID,\n    }));\n\n    if (edge.label) {\n      const lp = route.labelPosition;\n      elements.push(p.text(edge.label, lp.x, lp.y - 4, edgeTheme.labelFontSize, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  // Nodes\n  for (const node of ir.nodes) {\n    const r = nodePos.get(node.id);\n    if (!r) continue;\n\n    const nodeElements: SceneElement[] = [];\n    const fill   = nodeStatusFill(node, palette);\n    const stroke = palette.border;\n\n    nodeElements.push(...renderNodeShape(node, r, fill, stroke, edgeTheme.strokeWidth));\n    nodeElements.push(p.text(node.label, r.x + NODE_W / 2, r.y + NODE_H / 2 + typography.baseFontSize * 0.35, typography.baseFontSize, palette.text, { anchor: 'middle' }));\n\n    elements.push(p.group(nodeElements, { id: node.id }));\n  }\n\n  // \u2500\u2500 Compute viewBox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allRects = [...nodePos.values()];\n  const nodeRight  = Math.max(...allRects.map(r => r.x + r.width));\n  const nodeBottom = Math.max(...allRects.map(r => r.y + r.height));\n  // Grow only for back-edge / self-loop bows; with none, this is byte-identical.\n  const right  = (Number.isFinite(bowMaxX) ? Math.max(nodeRight,  bowMaxX) : nodeRight)  + margin;\n  const bottom = (Number.isFinite(bowMaxY) ? Math.max(nodeBottom, bowMaxY) : nodeBottom) + margin;\n  const titleOffset = ir.metadata.title ? typography.titleFontSize + 12 : 0;\n\n  let scene: Scene = {\n    viewBox: { x: 0, y: 0, width: right, height: bottom + titleOffset },\n    background: palette.background,\n    elements,\n    defs: [arrowMarkerDef(palette.primary, edgeTheme.arrowSize)],\n  };\n\n  // \u2500\u2500 Overlays \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  scene = applyOverlays(scene, ir.overlays, theme);\n\n  // \u2500\u2500 Build anchor registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const anchors: Record<string, NodeAnchor> = {};\n  for (const [id, rect] of nodePos) {\n    anchors[id] = {\n      bounds: rect,\n      ports: {\n        N: { x: rect.x + rect.width / 2, y: rect.y },\n        S: { x: rect.x + rect.width / 2, y: rect.y + rect.height },\n        E: { x: rect.x + rect.width, y: rect.y + rect.height / 2 },\n        W: { x: rect.x, y: rect.y + rect.height / 2 },\n      },\n    };\n  }\n\n  // \u2500\u2500 Occupied ports: record which wall each edge exits/enters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const occupiedPorts: OccupiedPort[] = [];\n  for (const edge of ir.edges) {\n    const fromRect = nodePos.get(edge.from);\n    const toRect   = nodePos.get(edge.to);\n    if (!fromRect || !toRect) continue;\n    const fromAnch = edgeAnchor(fromRect, ir.direction, 'exit',  toRect);\n    const toAnch   = edgeAnchor(toRect,   ir.direction, 'enter', fromRect);\n    occupiedPorts.push({\n      nodeKey: edge.from,\n      wall:    fromAnch.portDir as CardinalSide,\n      t:       wallT(fromRect, fromAnch.portDir as CardinalSide, fromAnch.point),\n      source:  'intra',\n    });\n    occupiedPorts.push({\n      nodeKey: edge.to,\n      wall:    toAnch.portDir as CardinalSide,\n      t:       wallT(toRect, toAnch.portDir as CardinalSide, toAnch.point),\n      source:  'intra',\n    });\n  }\n\n  return { scene, anchors, occupiedPorts };\n}\n\n// \u2500\u2500\u2500 Layer Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Identify back-edges (the edges that close a cycle) via an iterative DFS.\n *\n * Removing a DFS's back-edge set always yields a DAG, so the longest-path\n * layering below is guaranteed to terminate on ANY graph. The back-edges are\n * still drawn in their original direction by the edge loop in\n * {@link layoutFlowchart}; they are only excluded from rank assignment.\n *\n * Returns a set of indices into `edges`. Deterministic: nodes and edges are\n * visited in their given order. Iterative (explicit stack) to stay safe on\n * deep graphs.\n */\nfunction findBackEdges(nodes: readonly FlowNode[], edges: readonly FlowEdge[]): Set<number> {\n  const adj = new Map<string, Array<{ to: string; idx: number }>>();\n  for (const n of nodes) adj.set(n.id, []);\n  edges.forEach((e, idx) => { adj.get(e.from)?.push({ to: e.to, idx }); });\n\n  const WHITE = 0, GRAY = 1, BLACK = 2;\n  const color = new Map<string, number>();\n  for (const n of nodes) color.set(n.id, WHITE);\n\n  const backEdges = new Set<number>();\n\n  for (const start of nodes) {\n    if (color.get(start.id) !== WHITE) continue;\n    const stack: Array<{ id: string; i: number }> = [{ id: start.id, i: 0 }];\n    color.set(start.id, GRAY);\n\n    while (stack.length > 0) {\n      const frame = stack[stack.length - 1]!;\n      const neighbors = adj.get(frame.id)!;\n      if (frame.i < neighbors.length) {\n        const { to, idx } = neighbors[frame.i]!;\n        frame.i++;\n        const c = color.get(to);\n        // GRAY target (incl. a self-loop, where target === current) closes a cycle.\n        if (c === GRAY) {\n          backEdges.add(idx);\n        } else if (c === WHITE) {\n          color.set(to, GRAY);\n          stack.push({ id: to, i: 0 });\n        }\n        // BLACK target \u2192 forward/cross edge: keep it.\n      } else {\n        color.set(frame.id, BLACK);\n        stack.pop();\n      }\n    }\n  }\n\n  return backEdges;\n}\n\nfunction assignLayers(nodes: readonly FlowNode[], edges: readonly FlowEdge[]): Map<string, number> {\n  // Cycle breaking: drop back-edges so layering runs on a DAG and terminates.\n  // (Back-edges are still rendered by the edge loop \u2014 only excluded from ranks.)\n  const backEdges = findBackEdges(nodes, edges);\n  const forwardEdges = edges.filter((_, i) => !backEdges.has(i));\n\n  const predecessors = new Map<string, Set<string>>();\n  for (const n of nodes) predecessors.set(n.id, new Set());\n  for (const e of forwardEdges) predecessors.get(e.to)?.add(e.from);\n\n  const layers = new Map<string, number>();\n  const queue: Array<{ id: string; layer: number }> = [];\n\n  // Roots: nodes with no predecessors (in the acyclic edge subset)\n  for (const n of nodes) {\n    if ((predecessors.get(n.id)?.size ?? 0) === 0) {\n      queue.push({ id: n.id, layer: 0 });\n    }\n  }\n\n  while (queue.length > 0) {\n    const item = queue.shift()!;\n    const current = layers.get(item.id) ?? -1;\n    if (item.layer <= current) continue;\n    layers.set(item.id, item.layer);\n    for (const e of forwardEdges) {\n      if (e.from === item.id) queue.push({ id: e.to, layer: item.layer + 1 });\n    }\n  }\n\n  // Assign disconnected nodes to layer 0\n  for (const n of nodes) {\n    if (!layers.has(n.id)) layers.set(n.id, 0);\n  }\n\n  return layers;\n}\n\nfunction groupByLayer(nodes: readonly FlowNode[], layers: Map<string, number>): Map<number, FlowNode[]> {\n  const groups = new Map<number, FlowNode[]>();\n  for (const node of nodes) {\n    const l = layers.get(node.id) ?? 0;\n    if (!groups.has(l)) groups.set(l, []);\n    groups.get(l)!.push(node);\n  }\n  return new Map([...groups.entries()].sort(([a], [b]) => a - b));\n}\n\n// \u2500\u2500\u2500 Phase 3: Barycentric Crossing Minimisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Reorder nodes within each layer to reduce edge crossings using the\n * barycentric heuristic with bi-directional sweeps (Sugiyama Phase 3).\n *\n * - Back-edges and self-loops are excluded from barycenter computation.\n * - Nodes without neighbors in the reference layer keep their current relative\n *   order (their current position index is used as the barycenter).\n * - Tie-breaking uses the original insertion index (deterministic / stable).\n * - At most MAX_PASSES (4) bi-directional passes \u2014 provably terminates.\n */\nfunction minimizeCrossings(\n  byLayer: Map<number, FlowNode[]>,\n  edges: readonly FlowEdge[],\n  backEdgeSet: Set<number>,\n): Map<number, FlowNode[]> {\n  // Build forward-edge predecessor and successor maps.\n  const pred = new Map<string, string[]>();\n  const succ = new Map<string, string[]>();\n  for (const [, nodes] of byLayer) {\n    for (const n of nodes) { pred.set(n.id, []); succ.set(n.id, []); }\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    pred.get(e.to)?.push(e.from);\n    succ.get(e.from)?.push(e.to);\n  });\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n\n  // Original insertion index \u2014 stable tie-break preserved across all passes.\n  const origOrder = new Map<string, number>();\n  for (const [, nodes] of byLayer) nodes.forEach((n, i) => origOrder.set(n.id, i));\n\n  // Working layer arrays starting from insertion order.\n  const order = new Map<number, FlowNode[]>();\n  for (const k of layerKeys) order.set(k, [...byLayer.get(k)!]);\n\n  // Position of each node in its current layer (rebuilt after every reorder).\n  const posInLayer = new Map<string, number>();\n  function rebuildPos(): void {\n    for (const [, nodes] of order) nodes.forEach((n, i) => posInLayer.set(n.id, i));\n  }\n  rebuildPos();\n\n  function reorderLayer(layerIdx: number, neighborMap: Map<string, string[]>): void {\n    const curr = order.get(layerIdx)!;\n    const bary = curr.map((node, i) => {\n      const nbrs = neighborMap.get(node.id) ?? [];\n      if (nbrs.length === 0) {\n        // No anchoring neighbors: use current position so relative order is kept.\n        return { node, b: i, orig: origOrder.get(node.id) ?? i };\n      }\n      const sum = nbrs.reduce((s, nid) => s + (posInLayer.get(nid) ?? 0), 0);\n      return { node, b: sum / nbrs.length, orig: origOrder.get(node.id) ?? i };\n    });\n    // Stable sort: primary = barycenter, secondary = original insertion order.\n    bary.sort((a, b) => (a.b !== b.b ? a.b - b.b : a.orig - b.orig));\n    order.set(layerIdx, bary.map(e => e.node));\n    rebuildPos();\n  }\n\n  const MAX_PASSES = 4;\n  for (let pass = 0; pass < MAX_PASSES; pass++) {\n    if (pass % 2 === 0) {\n      // Downward sweep: reorder each layer using predecessor positions.\n      for (let li = 1; li < layerKeys.length; li++) reorderLayer(layerKeys[li]!, pred);\n    } else {\n      // Upward sweep: reorder each layer using successor positions.\n      for (let li = layerKeys.length - 2; li >= 0; li--) reorderLayer(layerKeys[li]!, succ);\n    }\n  }\n\n  return order;\n}\n\n// \u2500\u2500\u2500 Phase 4: Simplified Brandes\u2013K\u00F6pf Coordinate Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Assign cross-axis coordinates (x for TB, y for LR) using a two-pass\n * simplified Brandes\u2013K\u00F6pf style approach (Sugiyama Phase 4).\n *\n * Each pass places every layer as a uniform block:\n *   - Each node's \"preference\" is the MEAN cross-axis position of its\n *     forward-edge neighbors in the adjacent layer (mean gives a centred\n *     result, matching what dagre does with weighted edges).\n *   - Nodes with no neighbors fall back to the same centering formula the\n *     old code used (keeps root/leaf layers stable when no anchor exists).\n *   - The block's start is max(margin, medianOfPrefs \u2212 \u00BD\u00B7totalSpan) so the\n *     whole layer is centred on its collective preference, clamped to margin.\n *\n * Pass 1 (top-down) aligns each layer with its predecessors.\n * Pass 2 (bottom-up) aligns each layer with its successors.\n * Final positions = average of the two passes.\n *\n * Both passes independently produce non-overlapping layouts (uniform step\n * \u2265 crossSize + gap), and the average of two such arrangements with the same\n * step is also non-overlapping \u2014 so no extra collision check is needed.\n *\n * Back-edges and self-loops are excluded from preference computation.\n */\nfunction assignCoordinatesBK(\n  byLayer: Map<number, FlowNode[]>,\n  edges: readonly FlowEdge[],\n  backEdgeSet: Set<number>,\n  isLR: boolean,\n  isReverse: boolean,\n  maxNodesInLayer: number,\n  nodeW: number,\n  nodeH: number,\n  colGap: number,\n  rowGap: number,\n  margin: number,\n): Map<string, Rect> {\n  // Forward-edge predecessor and successor maps.\n  const predMap = new Map<string, string[]>();\n  const succMap = new Map<string, string[]>();\n  for (const [, nodes] of byLayer) {\n    for (const n of nodes) { predMap.set(n.id, []); succMap.set(n.id, []); }\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    predMap.get(e.to)?.push(e.from);\n    succMap.get(e.from)?.push(e.to);\n  });\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n  const numLayers = layerKeys.length;\n\n  // Cross-axis = x for TB layout, y for LR layout.\n  const crossSize = isLR ? nodeH : nodeW;\n  const mainSize  = isLR ? nodeW : nodeH;\n  const crossGap  = isLR ? rowGap : colGap;\n  const mainGap   = isLR ? colGap : rowGap;\n  const crossStep = crossSize + crossGap;\n  const mainStep  = mainSize  + mainGap;\n\n  /**\n   * Run one coordinate pass (top-down or bottom-up).\n   * Returns a map of node id \u2192 cross-axis left-edge position.\n   */\n  function onePass(topDown: boolean): Map<string, number> {\n    const crossPos = new Map<string, number>();\n    const neighborMap = topDown ? predMap : succMap;\n    const indices = topDown\n      ? Array.from({ length: numLayers }, (_, i) => i)\n      : Array.from({ length: numLayers }, (_, i) => numLayers - 1 - i);\n\n    for (const li of indices) {\n      const layerIdx = layerKeys[li]!;\n      const nodes    = byLayer.get(layerIdx)!;\n      const count    = nodes.length;\n      if (count === 0) continue;\n\n      // Default (centering) start \u2014 same formula as the old algorithm so that\n      // layers with no anchoring neighbors fall back to a centred arrangement.\n      const centeredStart = margin + ((maxNodesInLayer - count) * crossStep) / 2;\n\n      // Compute preference for each node: mean of neighbor cross-axis positions.\n      const pref: number[] = nodes.map((node, i) => {\n        const nbrs = neighborMap.get(node.id) ?? [];\n        const nbrPos = nbrs\n          .map(nid => crossPos.get(nid))\n          .filter((p): p is number => p !== undefined);\n        if (nbrPos.length === 0) return centeredStart + i * crossStep;\n        return nbrPos.reduce((s, p) => s + p, 0) / nbrPos.length;\n      });\n\n      // Block centre = median of individual preferences.\n      const sortedPrefs = [...pref].sort((a, b) => a - b);\n      const medianPref  = sortedPrefs[Math.floor((sortedPrefs.length - 1) / 2)]!;\n\n      // Centre block on medianPref; clamp so nothing goes left/above margin.\n      const blockStart = Math.max(margin, medianPref - ((count - 1) * crossStep) / 2);\n      for (let i = 0; i < count; i++) {\n        crossPos.set(nodes[i]!.id, blockStart + i * crossStep);\n      }\n    }\n    return crossPos;\n  }\n\n  const pass1 = onePass(true);   // predecessor-aligned (top-down)\n  const pass2 = onePass(false);  // successor-aligned   (bottom-up)\n\n  // Average the two passes and emit Rect entries.\n  const nodePos = new Map<string, Rect>();\n  for (let li = 0; li < numLayers; li++) {\n    const layerIdx = layerKeys[li]!;\n    const layerNum = isReverse ? numLayers - 1 - li : li;\n    const nodes    = byLayer.get(layerIdx)!;\n    const mainPos  = margin + layerNum * mainStep;\n\n    for (const node of nodes) {\n      const c1 = pass1.get(node.id) ?? margin;\n      const c2 = pass2.get(node.id) ?? margin;\n      const crossP = (c1 + c2) / 2;\n      nodePos.set(node.id, {\n        x:      isLR ? mainPos : crossP,\n        y:      isLR ? crossP  : mainPos,\n        width:  nodeW,\n        height: nodeH,\n      });\n    }\n  }\n\n  return nodePos;\n}\n\n// \u2500\u2500\u2500 Node Shape Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderNodeShape(node: FlowNode, r: Rect, fill: string, stroke: string, sw: number): SceneElement[] {\n  const { x, y, width: w, height: h } = r;\n\n  switch (node.shape) {\n    case 'diamond': {\n      const cx = x + w / 2, cy = y + h / 2;\n      return [{ type: 'path', d: `M ${cx} ${y} L ${x + w} ${cy} L ${cx} ${y + h} L ${x} ${cy} Z`, fill, stroke, strokeWidth: sw }];\n    }\n    case 'circle':\n      return [{ type: 'circle', center: { x: x + w / 2, y: y + h / 2 }, radius: Math.min(w, h) / 2, fill, stroke, strokeWidth: sw }];\n    case 'rounded-rect':\n    case 'stadium':\n      return [{ type: 'rect', bounds: r, fill, stroke, strokeWidth: sw, rx: h / 2 }];\n    case 'subroutine':\n      return [\n        { type: 'rect', bounds: r, fill, stroke, strokeWidth: sw },\n        { type: 'rect', bounds: { x: x + 6, y, width: w - 12, height: h }, fill: 'none', stroke, strokeWidth: sw * 0.5 },\n      ];\n    default:\n      return [{ type: 'rect', bounds: r, fill, stroke, strokeWidth: sw, rx: 2 }];\n  }\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Pick the best connection point on a node's boundary.\n *\n * Instead of always using the flow-direction side (right for LR),\n * we compare the relative position of the peer node. If the peer is\n * significantly off-axis (more than half the node height/width away),\n * we exit/enter from the perpendicular side closest to the peer.\n */\ntype AnchorResult = { point: Point; portDir: import('../../../contracts/index.js').PortDirection };\n\n/**\n * Anchor on an explicitly requested wall (from a wall hint). Overrides the\n * auto-derivation in `edgeAnchor` \u2014 the port sits at the midpoint of the named\n * side with the matching port direction.\n */\nfunction wallAnchor(r: Rect, wall: import('../../../contracts/index.js').CardinalSide): AnchorResult {\n  const cx = r.x + r.width  / 2;\n  const cy = r.y + r.height / 2;\n  switch (wall) {\n    case 'N': return { point: { x: cx,             y: r.y             }, portDir: 'N' };\n    case 'S': return { point: { x: cx,             y: r.y + r.height  }, portDir: 'S' };\n    case 'E': return { point: { x: r.x + r.width,  y: cy              }, portDir: 'E' };\n    case 'W': return { point: { x: r.x,            y: cy              }, portDir: 'W' };\n  }\n}\n\nfunction edgeAnchor(r: Rect, dir: FlowDirection, role: 'exit' | 'enter', peer: Rect): AnchorResult {\n  const cx = r.x + r.width  / 2;\n  const cy = r.y + r.height / 2;\n  const pcx = peer.x + peer.width  / 2;\n  const pcy = peer.y + peer.height / 2;\n\n  const dx = pcx - cx;\n  const dy = pcy - cy;\n\n  const isLR = dir === 'LR' || dir === 'RL';\n\n  if (isLR) {\n    // Primary axis is horizontal\n    const offAxis = Math.abs(dy);\n    const onAxis  = Math.abs(dx);\n\n    // If the peer is more off-axis than on-axis, use top/bottom port\n    if (offAxis > onAxis && offAxis > r.height / 2) {\n      return dy > 0\n        ? { point: { x: cx, y: r.y + r.height }, portDir: 'S' }\n        : { point: { x: cx, y: r.y },             portDir: 'N' };\n    }\n\n    // Otherwise use the flow-direction side\n    return role === 'exit'\n      ? { point: { x: r.x + r.width, y: cy }, portDir: 'E' }\n      : { point: { x: r.x,           y: cy }, portDir: 'W' };\n  } else {\n    // Primary axis is vertical\n    const offAxis = Math.abs(dx);\n    const onAxis  = Math.abs(dy);\n\n    if (offAxis > onAxis && offAxis > r.width / 2) {\n      return dx > 0\n        ? { point: { x: r.x + r.width, y: cy }, portDir: 'E' }\n        : { point: { x: r.x,           y: cy }, portDir: 'W' };\n    }\n\n    return role === 'exit'\n      ? { point: { x: cx, y: r.y + r.height }, portDir: 'S' }\n      : { point: { x: cx, y: r.y },             portDir: 'N' };\n  }\n}\n\n/** Feedback / self-loop route result: a path plus its extent and label anchor. */\ninterface EdgeRoute {\n  path: string;\n  labelPos: Point;\n  maxX: number;\n  maxY: number;\n}\n\n/**\n * Back-edge (\"feedback\") route. A back-edge runs against the layer flow (a lower\n * layer back up to an ancestor); drawn like a forward edge it slices straight\n * through the intervening node column. Instead we bow it out to one lateral side\n * with a cubic B\u00E9zier: endpoints sit on the side wall (East for vertical flow,\n * South for horizontal flow) and the control points push further out, so the arc\n * stays clear of the centered node column. The arrowhead still lands on the\n * target wall (the tangent at the end points back into the node).\n *\n * This is intentionally a simple offset arc, not an obstacle-avoiding router:\n * the bar is \"reads as feedback and doesn't cut through a node\".\n */\nfunction backEdgeRoute(from: Rect, to: Rect, isLR: boolean): EdgeRoute {\n  if (isLR) {\n    // Horizontal flow \u2192 bow downward, off the South walls.\n    const start: Point = { x: from.x + from.width / 2, y: from.y + from.height };\n    const end:   Point = { x: to.x   + to.width   / 2, y: to.y   + to.height };\n    const span = Math.abs(end.x - start.x);\n    const bow = Math.max(NODE_H * 0.9, span * 0.35);\n    const c1: Point = { x: start.x, y: start.y + bow };\n    const c2: Point = { x: end.x,   y: end.y   + bow };\n    return {\n      path: `M ${start.x} ${start.y} C ${c1.x} ${c1.y}, ${c2.x} ${c2.y}, ${end.x} ${end.y}`,\n      labelPos: { x: (start.x + end.x) / 2, y: Math.max(start.y, end.y) + bow * 0.75 },\n      maxX: Math.max(start.x, end.x),\n      maxY: Math.max(c1.y, c2.y),\n    };\n  }\n  // Vertical flow \u2192 bow to the right, off the East walls.\n  const start: Point = { x: from.x + from.width, y: from.y + from.height / 2 };\n  const end:   Point = { x: to.x   + to.width,   y: to.y   + to.height   / 2 };\n  const span = Math.abs(end.y - start.y);\n  const bow = Math.max(NODE_W * 0.75, span * 0.35);\n  const c1: Point = { x: start.x + bow, y: start.y };\n  const c2: Point = { x: end.x   + bow, y: end.y };\n  return {\n    path: `M ${start.x} ${start.y} C ${c1.x} ${c1.y}, ${c2.x} ${c2.y}, ${end.x} ${end.y}`,\n    labelPos: { x: Math.max(start.x, end.x) + bow * 0.75, y: (start.y + end.y) / 2 },\n    maxX: Math.max(c1.x, c2.x),\n    maxY: Math.max(start.y, end.y),\n  };\n}\n\n/**\n * Self-loop (A \u2192 A) route. A small cubic loop hung off one side of the node\n * (East for vertical flow, South for horizontal flow) so it never degenerates\n * into a zero-length line drawn through the node. The arrowhead re-enters the\n * same wall a little below/right of where it left.\n */\nfunction selfLoopRoute(r: Rect, isLR: boolean): EdgeRoute {\n  const loop = 28;\n  if (isLR) {\n    // Loop hangs below the node (South wall).\n    const x1 = r.x + r.width * 0.35;\n    const x2 = r.x + r.width * 0.65;\n    const sy = r.y + r.height;\n    return {\n      path: `M ${x1} ${sy} C ${x1 - loop} ${sy + loop}, ${x2 + loop} ${sy + loop}, ${x2} ${sy}`,\n      labelPos: { x: r.x + r.width / 2, y: sy + loop + 4 },\n      maxX: x2 + loop,\n      maxY: sy + loop,\n    };\n  }\n  // Loop sits to the right of the node (East wall).\n  const y1 = r.y + r.height * 0.3;\n  const y2 = r.y + r.height * 0.7;\n  const ex = r.x + r.width;\n  return {\n    path: `M ${ex} ${y1} C ${ex + loop} ${y1 - loop}, ${ex + loop} ${y2 + loop}, ${ex} ${y2}`,\n    labelPos: { x: ex + loop, y: r.y + r.height / 2 },\n    maxX: ex + loop,\n    maxY: y2 + loop,\n  };\n}\n\nfunction nodeStatusFill(node: FlowNode, palette: ResolvedTheme['palette']): string {\n  switch (node.status) {\n    case 'active':  return palette.primary + '22';\n    case 'success': return palette.success + '22';\n    case 'warning': return palette.warning + '22';\n    case 'error':   return palette.error   + '22';\n    case 'muted':   return palette.surface;\n    default:        return palette.surface;\n  }\n}\n\nfunction arrowMarkerDef(color: string, size: number): string {\n  const s = size;\n  return `<marker id=\"${ARROW_MARKER_ID}\" markerWidth=\"${s}\" markerHeight=\"${s * 0.7}\" refX=\"${s - 1}\" refY=\"${s * 0.35}\" orient=\"auto\"><polygon points=\"0 0, ${s} ${s * 0.35}, 0 ${s * 0.7}\" fill=\"${color}\" /></marker>`;\n}\n\n/**\n * Fractional position of a point along a node wall.\n * N/S walls: fraction of width (0=left, 1=right).\n * E/W walls: fraction of height (0=top, 1=bottom).\n */\nfunction wallT(bounds: Rect, wall: CardinalSide, pt: Point): number {\n  switch (wall) {\n    case 'N': case 'S':\n      return bounds.width  > 0 ? Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width))  : 0.5;\n    case 'E': case 'W':\n      return bounds.height > 0 ? Math.max(0, Math.min(1, (pt.y - bounds.y) / bounds.height)) : 0.5;\n  }\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function sanitizeId(raw) {\n    let id = raw\n      .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n      .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n      .toLowerCase()\n      .replace(/[_\\s]+/g, '-')\n      .replace(/[^a-z0-9-]/g, '')\n      .replace(/-+/g, '-')\n      .replace(/^-|-$/g, '');\n    if (!id || /^[0-9]/.test(id)) id = 'n' + id;\n    return id;\n  }\n\n  function stripQuotes(text) {\n    if (text.length >= 2 && text[0] === '\"' && text[text.length - 1] === '\"') {\n      return text.slice(1, -1);\n    }\n    return text;\n  }\n\n  const nodeMap  = new Map();\n  const edges    = [];\n  const overlays = [];\n  const idCounts = new Map();\n\n  function registerNode(rawId, label, shape) {\n    const id = sanitizeId(rawId);\n    if (!nodeMap.has(id)) {\n      nodeMap.set(id, { id, label: label || rawId, shape: shape || 'rect', status: 'default' });\n    } else if (label !== null && label !== undefined) {\n      const n = nodeMap.get(id);\n      n.label = label;\n      if (shape) n.shape = shape;\n    }\n    return id;\n  }\n\n  function addEdge(from, to, label, style, ann, edgeProps) {\n    const e = { from, to, label: label || undefined, style: style || 'solid' };\n    if (edgeProps) {\n      if (edgeProps.bidirectional) e.bidirectional = true;\n      if (edgeProps.undirected)    e.undirected    = true;\n      if (edgeProps.endMarker)     e.endMarker     = edgeProps.endMarker;\n    }\n    if (ann) {\n      if (ann.routing)   e.routing   = ann.routing;\n      if (ann.exitWall)  e.exitWall  = ann.exitWall;\n      if (ann.entryWall) e.entryWall = ann.entryWall;\n    }\n    edges.push(e);\n  }\n\n  function reset() {\n    nodeMap.clear();\n    edges.length = 0;\n    overlays.length = 0;\n    idCounts.clear();\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"---\";\n  var peg$c1 = \"flowchart\";\n  var peg$c2 = \"graph\";\n  var peg$c3 = \"TD\";\n  var peg$c4 = \"TB\";\n  var peg$c5 = \"BT\";\n  var peg$c6 = \"LR\";\n  var peg$c7 = \"RL\";\n  var peg$c8 = \";\";\n  var peg$c9 = \"end\";\n  var peg$c10 = \"%%\";\n  var peg$c11 = \"subgraph\";\n  var peg$c12 = \"[\";\n  var peg$c13 = \"]\";\n  var peg$c14 = \"@\";\n  var peg$c15 = \"|\";\n  var peg$c16 = \"<-~->\";\n  var peg$c17 = \"<-_->\";\n  var peg$c18 = \"<-.->\";\n  var peg$c19 = \"<==>\";\n  var peg$c20 = \"<-->\";\n  var peg$c21 = \"-~->\";\n  var peg$c22 = \"-_->\";\n  var peg$c23 = \"-..->\";\n  var peg$c24 = \"-.->\";\n  var peg$c25 = \"===>\";\n  var peg$c26 = \"==>\";\n  var peg$c27 = \"--->\";\n  var peg$c28 = \"-->\";\n  var peg$c29 = \"--x\";\n  var peg$c30 = \"--o\";\n  var peg$c31 = \"-~-\";\n  var peg$c32 = \"-_-\";\n  var peg$c33 = \"-.-\";\n  var peg$c34 = \"===\";\n  var peg$c35 = \":\";\n  var peg$c36 = \"straight\";\n  var peg$c37 = \"orthogonal\";\n  var peg$c38 = \"bezier\";\n  var peg$c39 = \"polyline\";\n  var peg$c40 = \"((\";\n  var peg$c41 = \"))\";\n  var peg$c42 = \"([\";\n  var peg$c43 = \"])\";\n  var peg$c44 = \"[[\";\n  var peg$c45 = \"]]\";\n  var peg$c46 = \"[(\";\n  var peg$c47 = \")]\";\n  var peg$c48 = \"{{\";\n  var peg$c49 = \"}}\";\n  var peg$c50 = \"[/\";\n  var peg$c51 = \"/]\";\n  var peg$c52 = \"[\\\\\";\n  var peg$c53 = \"\\\\]\";\n  var peg$c54 = \">\";\n  var peg$c55 = \"{\";\n  var peg$c56 = \"}\";\n  var peg$c57 = \"(\";\n  var peg$c58 = \")\";\n  var peg$c59 = \"style\";\n  var peg$c60 = \"classDef\";\n  var peg$c61 = \"class\";\n  var peg$c62 = \"click\";\n  var peg$c63 = \"note\";\n  var peg$c64 = \"\\\"\";\n  var peg$c65 = \"at\";\n  var peg$c66 = \"offset\";\n  var peg$c67 = \",\";\n  var peg$c68 = \"-\";\n  var peg$c69 = \"legend\";\n  var peg$c70 = \"bottom-right\";\n  var peg$c71 = \"bottom-left\";\n  var peg$c72 = \"top-right\";\n  var peg$c73 = \"top-left\";\n  var peg$c74 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[a-zA-Z_]/;\n  var peg$r2 = /^[a-zA-Z0-9_]/;\n  var peg$r3 = /^[^\\]]/;\n  var peg$r4 = /^[^\\n%]/;\n  var peg$r5 = /^[^|]/;\n  var peg$r6 = /^[ENSW]/;\n  var peg$r7 = /^[^)]/;\n  var peg$r8 = /^[^}]/;\n  var peg$r9 = /^[^\\/]/;\n  var peg$r10 = /^[^\\\\]/;\n  var peg$r11 = /^[^\\n;]/;\n  var peg$r12 = /^[^\"]/;\n  var peg$r13 = /^[0-9]/;\n  var peg$r14 = /^[^:\\n]/;\n  var peg$r15 = /^[ \\t]/;\n  var peg$r16 = /^[\\n\\r]/;\n\n  var peg$e0 = peg$literalExpectation(\"---\", false);\n  var peg$e1 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e2 = peg$literalExpectation(\"flowchart\", false);\n  var peg$e3 = peg$literalExpectation(\"graph\", false);\n  var peg$e4 = peg$literalExpectation(\"TD\", false);\n  var peg$e5 = peg$literalExpectation(\"TB\", false);\n  var peg$e6 = peg$literalExpectation(\"BT\", false);\n  var peg$e7 = peg$literalExpectation(\"LR\", false);\n  var peg$e8 = peg$literalExpectation(\"RL\", false);\n  var peg$e9 = peg$literalExpectation(\";\", false);\n  var peg$e10 = peg$literalExpectation(\"end\", false);\n  var peg$e11 = peg$anyExpectation();\n  var peg$e12 = peg$literalExpectation(\"%%\", false);\n  var peg$e13 = peg$literalExpectation(\"subgraph\", false);\n  var peg$e14 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"_\"], false, false);\n  var peg$e15 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e16 = peg$literalExpectation(\"[\", false);\n  var peg$e17 = peg$classExpectation([\"]\"], true, false);\n  var peg$e18 = peg$literalExpectation(\"]\", false);\n  var peg$e19 = peg$classExpectation([\"\\n\", \"%\"], true, false);\n  var peg$e20 = peg$literalExpectation(\"@\", false);\n  var peg$e21 = peg$literalExpectation(\"|\", false);\n  var peg$e22 = peg$classExpectation([\"|\"], true, false);\n  var peg$e23 = peg$literalExpectation(\"<-~->\", false);\n  var peg$e24 = peg$literalExpectation(\"<-_->\", false);\n  var peg$e25 = peg$literalExpectation(\"<-.->\", false);\n  var peg$e26 = peg$literalExpectation(\"<==>\", false);\n  var peg$e27 = peg$literalExpectation(\"<-->\", false);\n  var peg$e28 = peg$literalExpectation(\"-~->\", false);\n  var peg$e29 = peg$literalExpectation(\"-_->\", false);\n  var peg$e30 = peg$literalExpectation(\"-..->\", false);\n  var peg$e31 = peg$literalExpectation(\"-.->\", false);\n  var peg$e32 = peg$literalExpectation(\"===>\", false);\n  var peg$e33 = peg$literalExpectation(\"==>\", false);\n  var peg$e34 = peg$literalExpectation(\"--->\", false);\n  var peg$e35 = peg$literalExpectation(\"-->\", false);\n  var peg$e36 = peg$literalExpectation(\"--x\", false);\n  var peg$e37 = peg$literalExpectation(\"--o\", false);\n  var peg$e38 = peg$literalExpectation(\"-~-\", false);\n  var peg$e39 = peg$literalExpectation(\"-_-\", false);\n  var peg$e40 = peg$literalExpectation(\"-.-\", false);\n  var peg$e41 = peg$literalExpectation(\"===\", false);\n  var peg$e42 = peg$literalExpectation(\":\", false);\n  var peg$e43 = peg$literalExpectation(\"straight\", false);\n  var peg$e44 = peg$literalExpectation(\"orthogonal\", false);\n  var peg$e45 = peg$literalExpectation(\"bezier\", false);\n  var peg$e46 = peg$literalExpectation(\"polyline\", false);\n  var peg$e47 = peg$classExpectation([\"E\", \"N\", \"S\", \"W\"], false, false);\n  var peg$e48 = peg$literalExpectation(\"((\", false);\n  var peg$e49 = peg$classExpectation([\")\"], true, false);\n  var peg$e50 = peg$literalExpectation(\"))\", false);\n  var peg$e51 = peg$literalExpectation(\"([\", false);\n  var peg$e52 = peg$literalExpectation(\"])\", false);\n  var peg$e53 = peg$literalExpectation(\"[[\", false);\n  var peg$e54 = peg$literalExpectation(\"]]\", false);\n  var peg$e55 = peg$literalExpectation(\"[(\", false);\n  var peg$e56 = peg$literalExpectation(\")]\", false);\n  var peg$e57 = peg$literalExpectation(\"{{\", false);\n  var peg$e58 = peg$classExpectation([\"}\"], true, false);\n  var peg$e59 = peg$literalExpectation(\"}}\", false);\n  var peg$e60 = peg$literalExpectation(\"[/\", false);\n  var peg$e61 = peg$classExpectation([\"/\"], true, false);\n  var peg$e62 = peg$literalExpectation(\"/]\", false);\n  var peg$e63 = peg$literalExpectation(\"[\\\\\", false);\n  var peg$e64 = peg$classExpectation([\"\\\\\"], true, false);\n  var peg$e65 = peg$literalExpectation(\"\\\\]\", false);\n  var peg$e66 = peg$literalExpectation(\">\", false);\n  var peg$e67 = peg$literalExpectation(\"{\", false);\n  var peg$e68 = peg$literalExpectation(\"}\", false);\n  var peg$e69 = peg$literalExpectation(\"(\", false);\n  var peg$e70 = peg$literalExpectation(\")\", false);\n  var peg$e71 = peg$literalExpectation(\"style\", false);\n  var peg$e72 = peg$classExpectation([\"\\n\", \";\"], true, false);\n  var peg$e73 = peg$literalExpectation(\"classDef\", false);\n  var peg$e74 = peg$literalExpectation(\"class\", false);\n  var peg$e75 = peg$literalExpectation(\"click\", false);\n  var peg$e76 = peg$literalExpectation(\"note\", false);\n  var peg$e77 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e78 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e79 = peg$literalExpectation(\"at\", false);\n  var peg$e80 = peg$literalExpectation(\"offset\", false);\n  var peg$e81 = peg$literalExpectation(\",\", false);\n  var peg$e82 = peg$literalExpectation(\"-\", false);\n  var peg$e83 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e84 = peg$literalExpectation(\"legend\", false);\n  var peg$e85 = peg$literalExpectation(\"bottom-right\", false);\n  var peg$e86 = peg$literalExpectation(\"bottom-left\", false);\n  var peg$e87 = peg$literalExpectation(\"top-right\", false);\n  var peg$e88 = peg$literalExpectation(\"top-left\", false);\n  var peg$e89 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e90 = peg$otherExpectation(\"optional whitespace\");\n  var peg$e91 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e92 = peg$otherExpectation(\"required whitespace\");\n  var peg$e93 = peg$otherExpectation(\"newline\");\n  var peg$e94 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e95 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n\n  var peg$f0 = function(frontmatter, header, statements) {\n      return {\n        version:   '1.0',\n        metadata:  frontmatter || {},\n        direction: header.direction,\n        flow: { nodes: [...nodeMap.values()], edges },\n        overlays,\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f3 = function(dir) { return { direction: dir }; };\n  var peg$f4 = function(stmts) { return stmts.filter(Boolean); };\n  var peg$f5 = function(stmt) {\n      return stmt;\n    };\n  var peg$f6 = function() { return null; };\n  var peg$f7 = function(id, label, body) {\n      return { type: 'subgraph', id, label: label || id, body };\n    };\n  var peg$f8 = function(text) { return stripQuotes(text.trim()); };\n  var peg$f9 = function(label) { return stripQuotes(label.trim()); };\n  var peg$f10 = function(head, edge, target, ann) { return { edge, target, ann: ann ? ann[2] : null }; };\n  var peg$f11 = function(head, rest) {\n      let prev = head;\n      for (const { edge, target, ann } of rest) {\n        addEdge(prev.id, target.id, edge.label, edge.style, ann, edge);\n        prev = target;\n      }\n      return { type: 'chain' };\n    };\n  var peg$f12 = function(op, label) { return { ...op, label: label || undefined }; };\n  var peg$f13 = function(text) { return text.trim(); };\n  var peg$f14 = function() { return { style: 'wavy',   bidirectional: true  }; };\n  var peg$f15 = function() { return { style: 'dashed', bidirectional: true  }; };\n  var peg$f16 = function() { return { style: 'dotted', bidirectional: true  }; };\n  var peg$f17 = function() { return { style: 'thick',  bidirectional: true  }; };\n  var peg$f18 = function() { return { style: 'solid',  bidirectional: true  }; };\n  var peg$f19 = function() { return { style: 'wavy'   }; };\n  var peg$f20 = function() { return { style: 'dashed' }; };\n  var peg$f21 = function() { return { style: 'dotted' }; };\n  var peg$f22 = function() { return { style: 'dotted' }; };\n  var peg$f23 = function() { return { style: 'thick'  }; };\n  var peg$f24 = function() { return { style: 'thick'  }; };\n  var peg$f25 = function() { return { style: 'solid'  }; };\n  var peg$f26 = function() { return { style: 'solid'  }; };\n  var peg$f27 = function() { return { style: 'solid', endMarker: 'cross'  }; };\n  var peg$f28 = function() { return { style: 'solid', endMarker: 'circle' }; };\n  var peg$f29 = function() { return { style: 'wavy',   undirected: true }; };\n  var peg$f30 = function() { return { style: 'dashed', undirected: true }; };\n  var peg$f31 = function() { return { style: 'dotted', undirected: true }; };\n  var peg$f32 = function() { return { style: 'thick',  undirected: true }; };\n  var peg$f33 = function() { return { style: 'solid',  undirected: true }; };\n  var peg$f34 = function(route, walls) { return { routing: route, ...(walls ? walls[1] : {}) }; };\n  var peg$f35 = function(walls) { return walls; };\n  var peg$f36 = function() { return 'straight'; };\n  var peg$f37 = function() { return 'orthogonal'; };\n  var peg$f38 = function() { return 'bezier'; };\n  var peg$f39 = function() { return 'polyline'; };\n  var peg$f40 = function(exit, entry) { return { exitWall: exit, entryWall: entry }; };\n  var peg$f41 = function(exit) { return { exitWall: exit }; };\n  var peg$f42 = function(w) { return w; };\n  var peg$f43 = function(id, shape) {\n      return { id: registerNode(id, shape ? shape.label : null, shape ? shape.shape : null) };\n    };\n  var peg$f44 = function(ref) { return { type: 'node', ...ref }; };\n  var peg$f45 = function(id) { return id; };\n  var peg$f46 = function(text) { return { shape: 'circle',           label: stripQuotes(text.trim()) }; };\n  var peg$f47 = function(text) { return { shape: 'stadium',          label: stripQuotes(text.trim()) }; };\n  var peg$f48 = function(text) { return { shape: 'subroutine',       label: stripQuotes(text.trim()) }; };\n  var peg$f49 = function(text) { return { shape: 'cylinder',         label: stripQuotes(text.trim()) }; };\n  var peg$f50 = function(text) { return { shape: 'hexagon',          label: stripQuotes(text.trim()) }; };\n  var peg$f51 = function(text) { return { shape: 'parallelogram',    label: stripQuotes(text.trim()) }; };\n  var peg$f52 = function(text) { return { shape: 'parallelogram-alt',label: stripQuotes(text.trim()) }; };\n  var peg$f53 = function(text) { return { shape: 'asymmetric',       label: stripQuotes(text.trim()) }; };\n  var peg$f54 = function(text) { return { shape: 'rect',             label: stripQuotes(text.trim()) }; };\n  var peg$f55 = function(text) { return { shape: 'diamond',          label: stripQuotes(text.trim()) }; };\n  var peg$f56 = function(text) { return { shape: 'rounded-rect',     label: stripQuotes(text.trim()) }; };\n  var peg$f57 = function(content) { return { type: 'style',    raw: content }; };\n  var peg$f58 = function(content) { return { type: 'class', raw: content }; };\n  var peg$f59 = function(content) { return { type: 'click',    raw: content }; };\n  var peg$f60 = function(text, target, offset) {\n      const note = { type: 'note', text, target, offset: offset || undefined };\n      overlays.push(note);\n      return note;\n    };\n  var peg$f61 = function(dx, dy) { return { dx, dy }; };\n  var peg$f62 = function(sign, digits) { return parseInt((sign || '') + digits, 10); };\n  var peg$f63 = function(corner, t) { return t; };\n  var peg$f64 = function(corner, title, entries) {\n      const legend = { type: 'legend', corner, title: title || undefined, entries };\n      overlays.push(legend);\n      return legend;\n    };\n  var peg$f65 = function(key, value) { return { key: key.trim(), value: value.trim() }; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parseHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parse_();\n      s5 = peg$parseStatements();\n      s6 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s5);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s7 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c0) {\n            s7 = peg$c0;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s4 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHeader() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 9) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 9;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c2) {\n        s1 = peg$c2;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseDirection();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirection() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c3) {\n      s0 = peg$c3;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c4) {\n        s0 = peg$c4;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c5) {\n          s0 = peg$c5;\n          peg$currPos += 2;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c6) {\n            s0 = peg$c6;\n            peg$currPos += 2;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c7) {\n              s0 = peg$c7;\n              peg$currPos += 2;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatements() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseStatement();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseBlankLine();\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseStatement();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseBlankLine();\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f4(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseNoteDirective();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseLegendBlock();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseSubgraphBlock();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseEdgeChain();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseNodeDecl();\n            if (s2 === peg$FAILED) {\n              s2 = peg$parseStyleDirective();\n              if (s2 === peg$FAILED) {\n                s2 = peg$parseClassDirective();\n                if (s2 === peg$FAILED) {\n                  s2 = peg$parseClickDirective();\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseComment();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseNL();\n      if (s5 === peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 59) {\n          s5 = peg$c8;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s5 === peg$FAILED) {\n          s5 = peg$currPos;\n          peg$silentFails++;\n          if (input.substr(peg$currPos, 3) === peg$c9) {\n            s6 = peg$c9;\n            peg$currPos += 3;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e10); }\n          }\n          peg$silentFails--;\n          if (s6 !== peg$FAILED) {\n            peg$currPos = s5;\n            s5 = undefined;\n          } else {\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = peg$currPos;\n            peg$silentFails++;\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e11); }\n            }\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          }\n        }\n      }\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f6();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c10) {\n      s1 = peg$c10;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSubgraphBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c11) {\n      s1 = peg$c11;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseSubgraphId();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parse_();\n          s5 = peg$parseSubgraphLabel();\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parse_();\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseStatements();\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parse_();\n              if (input.substr(peg$currPos, 3) === peg$c9) {\n                s10 = peg$c9;\n                peg$currPos += 3;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e10); }\n              }\n              if (s10 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f7(s3, s5, s8);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSubgraphId() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSubgraphLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 93) {\n        s3 = peg$c13;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r4.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r4.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e19); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f9(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeChain() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNodeRef();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = peg$parseEdgeOp();\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseNodeRef();\n        if (s7 !== peg$FAILED) {\n          s8 = peg$currPos;\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 64) {\n            s10 = peg$c14;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e20); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parseRouteAnnotation();\n            if (s11 !== peg$FAILED) {\n              s9 = [s9, s10, s11];\n              s8 = s9;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 === peg$FAILED) {\n            s8 = null;\n          }\n          peg$savedPos = s3;\n          s3 = peg$f10(s1, s5, s7, s8);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parse_();\n          s5 = peg$parseEdgeOp();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parse_();\n            s7 = peg$parseNodeRef();\n            if (s7 !== peg$FAILED) {\n              s8 = peg$currPos;\n              s9 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s10 = peg$c14;\n                peg$currPos++;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e20); }\n              }\n              if (s10 !== peg$FAILED) {\n                s11 = peg$parseRouteAnnotation();\n                if (s11 !== peg$FAILED) {\n                  s9 = [s9, s10, s11];\n                  s8 = s9;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 === peg$FAILED) {\n                s8 = null;\n              }\n              peg$savedPos = s3;\n              s3 = peg$f10(s1, s5, s7, s8);\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f11(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeOp() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseEdgeArrow();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseEdgeLabel();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f12(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s1 = peg$c15;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r5.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r5.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e22); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 124) {\n          s3 = peg$c15;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f13(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c16) {\n      s1 = peg$c16;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 5) === peg$c17) {\n        s1 = peg$c17;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f15();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 5) === peg$c18) {\n          s1 = peg$c18;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e25); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f16();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 4) === peg$c19) {\n            s1 = peg$c19;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e26); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f17();\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 4) === peg$c20) {\n              s1 = peg$c20;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e27); }\n            }\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$f18();\n            }\n            s0 = s1;\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 4) === peg$c21) {\n                s1 = peg$c21;\n                peg$currPos += 4;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e28); }\n              }\n              if (s1 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$f19();\n              }\n              s0 = s1;\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 4) === peg$c22) {\n                  s1 = peg$c22;\n                  peg$currPos += 4;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e29); }\n                }\n                if (s1 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s1 = peg$f20();\n                }\n                s0 = s1;\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.substr(peg$currPos, 5) === peg$c23) {\n                    s1 = peg$c23;\n                    peg$currPos += 5;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e30); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$f21();\n                  }\n                  s0 = s1;\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.substr(peg$currPos, 4) === peg$c24) {\n                      s1 = peg$c24;\n                      peg$currPos += 4;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$f22();\n                    }\n                    s0 = s1;\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.substr(peg$currPos, 4) === peg$c25) {\n                        s1 = peg$c25;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s1 = peg$f23();\n                      }\n                      s0 = s1;\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.substr(peg$currPos, 3) === peg$c26) {\n                          s1 = peg$c26;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$f24();\n                        }\n                        s0 = s1;\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          if (input.substr(peg$currPos, 4) === peg$c27) {\n                            s1 = peg$c27;\n                            peg$currPos += 4;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e34); }\n                          }\n                          if (s1 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$f25();\n                          }\n                          s0 = s1;\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            if (input.substr(peg$currPos, 3) === peg$c28) {\n                              s1 = peg$c28;\n                              peg$currPos += 3;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e35); }\n                            }\n                            if (s1 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$f26();\n                            }\n                            s0 = s1;\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              if (input.substr(peg$currPos, 3) === peg$c29) {\n                                s1 = peg$c29;\n                                peg$currPos += 3;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e36); }\n                              }\n                              if (s1 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s1 = peg$f27();\n                              }\n                              s0 = s1;\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                if (input.substr(peg$currPos, 3) === peg$c30) {\n                                  s1 = peg$c30;\n                                  peg$currPos += 3;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e37); }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                  peg$savedPos = s0;\n                                  s1 = peg$f28();\n                                }\n                                s0 = s1;\n                                if (s0 === peg$FAILED) {\n                                  s0 = peg$currPos;\n                                  if (input.substr(peg$currPos, 3) === peg$c31) {\n                                    s1 = peg$c31;\n                                    peg$currPos += 3;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e38); }\n                                  }\n                                  if (s1 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s1 = peg$f29();\n                                  }\n                                  s0 = s1;\n                                  if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos;\n                                    if (input.substr(peg$currPos, 3) === peg$c32) {\n                                      s1 = peg$c32;\n                                      peg$currPos += 3;\n                                    } else {\n                                      s1 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n                                    }\n                                    if (s1 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s1 = peg$f30();\n                                    }\n                                    s0 = s1;\n                                    if (s0 === peg$FAILED) {\n                                      s0 = peg$currPos;\n                                      if (input.substr(peg$currPos, 3) === peg$c33) {\n                                        s1 = peg$c33;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s1 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e40); }\n                                      }\n                                      if (s1 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s1 = peg$f31();\n                                      }\n                                      s0 = s1;\n                                      if (s0 === peg$FAILED) {\n                                        s0 = peg$currPos;\n                                        if (input.substr(peg$currPos, 3) === peg$c34) {\n                                          s1 = peg$c34;\n                                          peg$currPos += 3;\n                                        } else {\n                                          s1 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e41); }\n                                        }\n                                        if (s1 !== peg$FAILED) {\n                                          peg$savedPos = s0;\n                                          s1 = peg$f32();\n                                        }\n                                        s0 = s1;\n                                        if (s0 === peg$FAILED) {\n                                          s0 = peg$currPos;\n                                          if (input.substr(peg$currPos, 3) === peg$c0) {\n                                            s1 = peg$c0;\n                                            peg$currPos += 3;\n                                          } else {\n                                            s1 = peg$FAILED;\n                                            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                                          }\n                                          if (s1 !== peg$FAILED) {\n                                            peg$savedPos = s0;\n                                            s1 = peg$f33();\n                                          }\n                                          s0 = s1;\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteAnnotation() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseRouteWord();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c35;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWallPair();\n        if (s4 !== peg$FAILED) {\n          s3 = [s3, s4];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f34(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWallPair();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f35(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteWord() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c36) {\n      s1 = peg$c36;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e43); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f36();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 10) === peg$c37) {\n        s1 = peg$c37;\n        peg$currPos += 10;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e44); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f37();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 6) === peg$c38) {\n          s1 = peg$c38;\n          peg$currPos += 6;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e45); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f38();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 8) === peg$c39) {\n            s1 = peg$c39;\n            peg$currPos += 8;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e46); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f39();\n          }\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWallPair() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseWall();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseWall();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f40(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWall();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f41(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseWall() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r6.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e47); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f42(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNodeRef() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNodeId();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseShape();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f43(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeDecl() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNodeRef();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = peg$parseEdgeArrow();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s3 === peg$FAILED) {\n        s2 = undefined;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f44(s1);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeId() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c9) {\n      s3 = peg$c9;\n      peg$currPos += 3;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      peg$silentFails++;\n      s5 = input.charAt(peg$currPos);\n      if (peg$r2.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      peg$silentFails--;\n      if (s5 === peg$FAILED) {\n        s4 = undefined;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$currPos;\n      if (input.substr(peg$currPos, 8) === peg$c11) {\n        s4 = peg$c11;\n        peg$currPos += 8;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = input.charAt(peg$currPos);\n        if (peg$r2.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s3 === peg$FAILED) {\n        s2 = undefined;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$currPos;\n        s5 = input.charAt(peg$currPos);\n        if (peg$r1.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r2.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r2.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n          }\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f45(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseShape() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c40) {\n      s1 = peg$c40;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e48); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r7.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e49); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r7.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e49); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c41) {\n          s3 = peg$c41;\n          peg$currPos += 2;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e50); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f46(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c42) {\n        s1 = peg$c42;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e51); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r3.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e17); }\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        if (input.substr(peg$currPos, 2) === peg$c43) {\n          s3 = peg$c43;\n          peg$currPos += 2;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e52); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f47(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c44) {\n          s1 = peg$c44;\n          peg$currPos += 2;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e53); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = input.charAt(peg$currPos);\n          if (peg$r3.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e17); }\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = input.charAt(peg$currPos);\n            if (peg$r3.test(s4)) {\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e17); }\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          if (input.substr(peg$currPos, 2) === peg$c45) {\n            s3 = peg$c45;\n            peg$currPos += 2;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e54); }\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f48(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 2) === peg$c46) {\n            s1 = peg$c46;\n            peg$currPos += 2;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e55); }\n          }\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = input.charAt(peg$currPos);\n            if (peg$r7.test(s4)) {\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e49); }\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = input.charAt(peg$currPos);\n              if (peg$r7.test(s4)) {\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e49); }\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            if (input.substr(peg$currPos, 2) === peg$c47) {\n              s3 = peg$c47;\n              peg$currPos += 2;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e56); }\n            }\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f49(s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 2) === peg$c48) {\n              s1 = peg$c48;\n              peg$currPos += 2;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e57); }\n            }\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = input.charAt(peg$currPos);\n              if (peg$r8.test(s4)) {\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e58); }\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = input.charAt(peg$currPos);\n                if (peg$r8.test(s4)) {\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e58); }\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              if (input.substr(peg$currPos, 2) === peg$c49) {\n                s3 = peg$c49;\n                peg$currPos += 2;\n              } else {\n                s3 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e59); }\n              }\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f50(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 2) === peg$c50) {\n                s1 = peg$c50;\n                peg$currPos += 2;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e60); }\n              }\n              if (s1 !== peg$FAILED) {\n                s2 = peg$currPos;\n                s3 = [];\n                s4 = input.charAt(peg$currPos);\n                if (peg$r9.test(s4)) {\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e61); }\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  s4 = input.charAt(peg$currPos);\n                  if (peg$r9.test(s4)) {\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e61); }\n                  }\n                }\n                s2 = input.substring(s2, peg$currPos);\n                if (input.substr(peg$currPos, 2) === peg$c51) {\n                  s3 = peg$c51;\n                  peg$currPos += 2;\n                } else {\n                  s3 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e62); }\n                }\n                if (s3 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f51(s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 2) === peg$c52) {\n                  s1 = peg$c52;\n                  peg$currPos += 2;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e63); }\n                }\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = input.charAt(peg$currPos);\n                  if (peg$r10.test(s4)) {\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e64); }\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = input.charAt(peg$currPos);\n                    if (peg$r10.test(s4)) {\n                      peg$currPos++;\n                    } else {\n                      s4 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  if (input.substr(peg$currPos, 2) === peg$c53) {\n                    s3 = peg$c53;\n                    peg$currPos += 2;\n                  } else {\n                    s3 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e65); }\n                  }\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f52(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 62) {\n                    s1 = peg$c54;\n                    peg$currPos++;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e66); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$currPos;\n                    s3 = [];\n                    s4 = input.charAt(peg$currPos);\n                    if (peg$r3.test(s4)) {\n                      peg$currPos++;\n                    } else {\n                      s4 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                    }\n                    while (s4 !== peg$FAILED) {\n                      s3.push(s4);\n                      s4 = input.charAt(peg$currPos);\n                      if (peg$r3.test(s4)) {\n                        peg$currPos++;\n                      } else {\n                        s4 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                      }\n                    }\n                    s2 = input.substring(s2, peg$currPos);\n                    if (input.charCodeAt(peg$currPos) === 93) {\n                      s3 = peg$c13;\n                      peg$currPos++;\n                    } else {\n                      s3 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                    }\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f53(s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.charCodeAt(peg$currPos) === 91) {\n                      s1 = peg$c12;\n                      peg$currPos++;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      s2 = peg$currPos;\n                      s3 = [];\n                      s4 = input.charAt(peg$currPos);\n                      if (peg$r3.test(s4)) {\n                        peg$currPos++;\n                      } else {\n                        s4 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                      }\n                      while (s4 !== peg$FAILED) {\n                        s3.push(s4);\n                        s4 = input.charAt(peg$currPos);\n                        if (peg$r3.test(s4)) {\n                          peg$currPos++;\n                        } else {\n                          s4 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                        }\n                      }\n                      s2 = input.substring(s2, peg$currPos);\n                      if (input.charCodeAt(peg$currPos) === 93) {\n                        s3 = peg$c13;\n                        peg$currPos++;\n                      } else {\n                        s3 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                      }\n                      if (s3 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s0 = peg$f54(s2);\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.charCodeAt(peg$currPos) === 123) {\n                        s1 = peg$c55;\n                        peg$currPos++;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e67); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        s2 = peg$currPos;\n                        s3 = [];\n                        s4 = input.charAt(peg$currPos);\n                        if (peg$r8.test(s4)) {\n                          peg$currPos++;\n                        } else {\n                          s4 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e58); }\n                        }\n                        while (s4 !== peg$FAILED) {\n                          s3.push(s4);\n                          s4 = input.charAt(peg$currPos);\n                          if (peg$r8.test(s4)) {\n                            peg$currPos++;\n                          } else {\n                            s4 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e58); }\n                          }\n                        }\n                        s2 = input.substring(s2, peg$currPos);\n                        if (input.charCodeAt(peg$currPos) === 125) {\n                          s3 = peg$c56;\n                          peg$currPos++;\n                        } else {\n                          s3 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e68); }\n                        }\n                        if (s3 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s0 = peg$f55(s2);\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.charCodeAt(peg$currPos) === 40) {\n                          s1 = peg$c57;\n                          peg$currPos++;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e69); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          s2 = peg$currPos;\n                          s3 = [];\n                          s4 = input.charAt(peg$currPos);\n                          if (peg$r7.test(s4)) {\n                            peg$currPos++;\n                          } else {\n                            s4 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e49); }\n                          }\n                          while (s4 !== peg$FAILED) {\n                            s3.push(s4);\n                            s4 = input.charAt(peg$currPos);\n                            if (peg$r7.test(s4)) {\n                              peg$currPos++;\n                            } else {\n                              s4 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e49); }\n                            }\n                          }\n                          s2 = input.substring(s2, peg$currPos);\n                          if (input.charCodeAt(peg$currPos) === 41) {\n                            s3 = peg$c58;\n                            peg$currPos++;\n                          } else {\n                            s3 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e70); }\n                          }\n                          if (s3 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s0 = peg$f56(s2);\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStyleDirective() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c59) {\n      s1 = peg$c59;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e71); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r11.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e72); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r11.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e72); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f57(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseClassDirective() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c60) {\n      s1 = peg$c60;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e73); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c61) {\n        s1 = peg$c61;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e74); }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r11.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e72); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r11.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e72); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f58(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseClickDirective() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c62) {\n      s1 = peg$c62;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e75); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r11.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e72); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r11.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e72); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f59(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteDirective() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c63) {\n      s1 = peg$c63;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e76); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 34) {\n          s3 = peg$c64;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e77); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = [];\n          s6 = input.charAt(peg$currPos);\n          if (peg$r12.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e78); }\n          }\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r12.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e78); }\n            }\n          }\n          s4 = input.substring(s4, peg$currPos);\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s5 = peg$c64;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e77); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parse__();\n            if (s6 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c65) {\n                s7 = peg$c65;\n                peg$currPos += 2;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e79); }\n              }\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parse__();\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$currPos;\n                  s10 = peg$currPos;\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r1.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                  }\n                  if (s11 !== peg$FAILED) {\n                    s12 = [];\n                    s13 = input.charAt(peg$currPos);\n                    if (peg$r2.test(s13)) {\n                      peg$currPos++;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                    }\n                    while (s13 !== peg$FAILED) {\n                      s12.push(s13);\n                      s13 = input.charAt(peg$currPos);\n                      if (peg$r2.test(s13)) {\n                        peg$currPos++;\n                      } else {\n                        s13 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                      }\n                    }\n                    s11 = [s11, s12];\n                    s10 = s11;\n                  } else {\n                    peg$currPos = s10;\n                    s10 = peg$FAILED;\n                  }\n                  if (s10 !== peg$FAILED) {\n                    s9 = input.substring(s9, peg$currPos);\n                  } else {\n                    s9 = s10;\n                  }\n                  if (s9 !== peg$FAILED) {\n                    s10 = peg$parseNoteOffset();\n                    if (s10 === peg$FAILED) {\n                      s10 = null;\n                    }\n                    peg$savedPos = s0;\n                    s0 = peg$f60(s4, s9, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteOffset() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c66) {\n        s2 = peg$c66;\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e80); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseSignedInt();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s6 = peg$c67;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e81); }\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              s8 = peg$parseSignedInt();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f61(s4, s8);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSignedInt() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s1 = peg$c68;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e82); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r13.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e83); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r13.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e83); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f62(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 6) === peg$c69) {\n      s1 = peg$c69;\n      peg$currPos += 6;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e84); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseLegendCorner();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s6 = peg$c64;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e77); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$currPos;\n            s8 = [];\n            s9 = input.charAt(peg$currPos);\n            if (peg$r12.test(s9)) {\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e78); }\n            }\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = input.charAt(peg$currPos);\n              if (peg$r12.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e78); }\n              }\n            }\n            s7 = input.substring(s7, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 34) {\n              s8 = peg$c64;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e77); }\n            }\n            if (s8 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f63(s3, s7);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          if (s4 === peg$FAILED) {\n            s4 = null;\n          }\n          s5 = peg$parse_();\n          s6 = peg$parseNL();\n          if (s6 !== peg$FAILED) {\n            s7 = [];\n            s8 = peg$parseLegendEntryLine();\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = peg$parseLegendEntryLine();\n            }\n            s8 = peg$parse_();\n            if (input.substr(peg$currPos, 3) === peg$c9) {\n              s9 = peg$c9;\n              peg$currPos += 3;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n            if (s9 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f64(s3, s4, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendCorner() {\n    var s0;\n\n    if (input.substr(peg$currPos, 12) === peg$c70) {\n      s0 = peg$c70;\n      peg$currPos += 12;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e85); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 11) === peg$c71) {\n        s0 = peg$c71;\n        peg$currPos += 11;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e86); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 9) === peg$c72) {\n          s0 = peg$c72;\n          peg$currPos += 9;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e87); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 8) === peg$c73) {\n            s0 = peg$c73;\n            peg$currPos += 8;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e88); }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendEntryLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    s3 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c9) {\n      s4 = peg$c9;\n      peg$currPos += 3;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = input.charAt(peg$currPos);\n      if (peg$r2.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r14.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e89); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r14.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e89); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c35;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e42); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNL();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f65(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r15.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e91); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r15.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e91); }\n      }\n    }\n    peg$silentFails--;\n    s1 = peg$FAILED;\n    if (peg$silentFails === 0) { peg$fail(peg$e90); }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r15.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e91); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r15.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e91); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e92); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1;\n\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 2) === peg$c74) {\n      s0 = peg$c74;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e94); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r16.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e95); }\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e93); }\n    }\n\n    return s0;\n  }\n\n\n  reset();\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult, LayoutOptions } from '../../../contracts/index.js';\nimport type { FlowDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutFlowchart } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { FlowDocument, FlowNode, FlowEdge, FlowSubgraph, FlowDirection, NodeShape, NodeStatus, EdgeStyle, EdgeEndMarker } from './ir.js';\n\nexport const flowchart: DiagramModule<FlowDocument> = {\n  parseMermaid(input: string): FlowDocument {\n    const raw = parser.parse(input) as any;\n    return {\n      version:   raw.version,\n      metadata:  raw.metadata ?? {},\n      direction: raw.direction,\n      nodes:     raw.flow.nodes,\n      edges:     raw.flow.edges,\n      subgraphs: raw.subgraphs ?? [],\n      overlays:  raw.overlays?.length > 0 ? raw.overlays : undefined,\n    };\n  },\n\n  parseYaml(input: string): FlowDocument {\n    // TODO: replace with schema validation\n    return JSON.parse(input) as FlowDocument;\n  },\n\n  layout(ir: FlowDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutFlowchart(ir, theme, options);\n  },\n};\n", "/**\n * @file time/dates.ts \u2014 Deterministic date arithmetic.\n *\n * General utility for any time-based diagram (timeline, gantt, roadmap).\n * All functions are pure: no system clock, no locale. The day-ordinal\n * representation (integer days since 2000-01-01 = day 0) underpins every\n * time\u2192coordinate calculation.\n *\n * Ported from packages/core/src/layout/dates.ts.\n */\n\n/** An IR date string: \"2026\", \"2026-06\", \"2026-06-09\", \"2026-Q2\", \"2026-H1\". */\nexport type IRDate = string;\n\n/** Axis granularity. */\nexport type AxisUnit = 'day' | 'week' | 'month' | 'quarter' | 'half' | 'year';\n\nexport type DatePrecision = 'day' | 'month' | 'year' | 'quarter' | 'half';\n\nexport interface ParsedDate {\n  precision: DatePrecision;\n  year: number;\n  /** 1-12; present for precision month/day */\n  month?: number;\n  /** 1-31; present for precision day */\n  day?: number;\n  /** 1-4; present for precision quarter */\n  quarter?: number;\n  /** 1-2; present for precision half */\n  half?: number;\n}\n\n// \u2500\u2500\u2500 Calendar helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function isLeapYear(year: number): boolean {\n  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nexport function daysInMonth(year: number, month: number): number {\n  const table = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n  return table[month - 1] ?? 30;\n}\n\nfunction daysInYear(year: number): number {\n  return isLeapYear(year) ? 366 : 365;\n}\n\n// \u2500\u2500\u2500 Day ordinal (days since 2000-01-01 = 0) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function dateToOrdinal(year: number, month: number, day: number): number {\n  let ord = 0;\n  if (year >= 2000) {\n    for (let y = 2000; y < year; y++) ord += daysInYear(y);\n  } else {\n    for (let y = year; y < 2000; y++) ord -= daysInYear(y);\n  }\n  for (let m = 1; m < month; m++) ord += daysInMonth(year, m);\n  ord += day - 1;\n  return ord;\n}\n\nexport function ordinalToDate(ord: number): [number, number, number] {\n  let year = 2000;\n  let remaining = ord;\n  if (remaining >= 0) {\n    while (remaining >= daysInYear(year)) {\n      remaining -= daysInYear(year);\n      year += 1;\n    }\n  } else {\n    while (remaining < 0) {\n      year -= 1;\n      remaining += daysInYear(year);\n    }\n  }\n  let month = 1;\n  while (month <= 12 && remaining >= daysInMonth(year, month)) {\n    remaining -= daysInMonth(year, month);\n    month += 1;\n  }\n  return [year, month, remaining + 1];\n}\n\n// \u2500\u2500\u2500 IRDate parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse an IRDate into a structured form.\n * Supports: ISO day (2026-06-09), ISO month (2026-06), year (2026),\n * quarter (2026-Q2), half (2026-H1).\n */\nexport function parseIRDate(s: IRDate): ParsedDate {\n  const dayM = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n  if (dayM) return { precision: 'day', year: +dayM[1]!, month: +dayM[2]!, day: +dayM[3]! };\n\n  const monthM = /^(\\d{4})-(\\d{2})$/.exec(s);\n  if (monthM) return { precision: 'month', year: +monthM[1]!, month: +monthM[2]! };\n\n  const quarterM = /^(\\d{4})-Q([1-4])$/.exec(s);\n  if (quarterM) return { precision: 'quarter', year: +quarterM[1]!, quarter: +quarterM[2]! };\n\n  const halfM = /^(\\d{4})-H([12])$/.exec(s);\n  if (halfM) return { precision: 'half', year: +halfM[1]!, half: +halfM[2]! };\n\n  const yearM = /^(\\d{4})$/.exec(s);\n  if (yearM) return { precision: 'year', year: +yearM[1]! };\n\n  throw new Error(`Unsupported IRDate format: \"${s}\"`);\n}\n\n// \u2500\u2500\u2500 Date coercion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Coerce a parsed date to its period-start day (left-edge rule). */\nexport function coerceLeft(parsed: ParsedDate): [number, number, number] {\n  switch (parsed.precision) {\n    case 'day':     return [parsed.year, parsed.month!, parsed.day!];\n    case 'month':   return [parsed.year, parsed.month!, 1];\n    case 'year':    return [parsed.year, 1, 1];\n    case 'quarter': return [parsed.year, (parsed.quarter! - 1) * 3 + 1, 1];\n    case 'half':    return [parsed.year, parsed.half! === 1 ? 1 : 7, 1];\n  }\n}\n\n/** Coerce a parsed date to its period-end day (right-edge rule). */\nexport function coerceRight(parsed: ParsedDate): [number, number, number] {\n  switch (parsed.precision) {\n    case 'day':   return [parsed.year, parsed.month!, parsed.day!];\n    case 'month': return [parsed.year, parsed.month!, daysInMonth(parsed.year, parsed.month!)];\n    case 'year':  return [parsed.year, 12, 31];\n    case 'quarter': {\n      const lastMonth = parsed.quarter! * 3;\n      return [parsed.year, lastMonth, daysInMonth(parsed.year, lastMonth)];\n    }\n    case 'half': {\n      const lastMonth = parsed.half! === 1 ? 6 : 12;\n      return [parsed.year, lastMonth, daysInMonth(parsed.year, lastMonth)];\n    }\n  }\n}\n\n/** Parse an IRDate and coerce it to its period-start ordinal. */\nexport function parseAndCoerceLeft(s: IRDate): number {\n  const [y, m, d] = coerceLeft(parseIRDate(s));\n  return dateToOrdinal(y, m, d);\n}\n\n/** Parse an IRDate and coerce it to its period-end ordinal. */\nexport function parseAndCoerceRight(s: IRDate): number {\n  const [y, m, d] = coerceRight(parseIRDate(s));\n  return dateToOrdinal(y, m, d);\n}\n\n// \u2500\u2500\u2500 Axis unit inference \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Infer the axis unit from the span in days (first-match rule). */\nexport function inferAxisUnit(spanDays: number): AxisUnit {\n  if (spanDays <= 14)   return 'day';\n  if (spanDays <= 91)   return 'week';\n  if (spanDays <= 548)  return 'month';\n  if (spanDays <= 1461) return 'quarter';\n  if (spanDays <= 2922) return 'half';\n  return 'year';\n}\n\n// \u2500\u2500\u2500 Tick enumeration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface TickDate {\n  year: number;\n  month: number;\n  day: number;\n  ordinal: number;\n}\n\n/** Advance a (year, month, day) by one axis-unit period; returns next period start. */\nfunction advancePeriod(year: number, month: number, day: number, unit: AxisUnit): [number, number, number] {\n  switch (unit) {\n    case 'day':  return ordinalToDate(dateToOrdinal(year, month, day) + 1);\n    case 'week': return ordinalToDate(dateToOrdinal(year, month, day) + 7);\n    case 'month': {\n      let m = month + 1, y = year;\n      if (m > 12) { m = 1; y += 1; }\n      return [y, m, 1];\n    }\n    case 'quarter': {\n      let m = month + 3, y = year;\n      if (m > 12) { m = m - 12; y += 1; }\n      return [y, m, 1];\n    }\n    case 'half': {\n      let m = month + 6, y = year;\n      if (m > 12) { m = m - 12; y += 1; }\n      return [y, m, 1];\n    }\n    case 'year': return [year + 1, 1, 1];\n  }\n}\n\n/** Snap a date to the start of its containing axis-unit period. */\nfunction snapToPeriodStart(year: number, month: number, _day: number, unit: AxisUnit): [number, number, number] {\n  switch (unit) {\n    case 'day': return [year, month, _day];\n    case 'week': {\n      const o = dateToOrdinal(year, month, _day);\n      const jsEpoch = 946684800000; // 2000-01-01 UTC ms\n      const ms = jsEpoch + o * 86400000;\n      const jsDay = new Date(ms).getUTCDay(); // 0=Sun..6=Sat\n      const daysToMonday = jsDay === 0 ? 6 : jsDay - 1;\n      return ordinalToDate(o - daysToMonday);\n    }\n    case 'month': return [year, month, 1];\n    case 'quarter': {\n      const q = Math.floor((month - 1) / 3);\n      return [year, q * 3 + 1, 1];\n    }\n    case 'half': return [year, month <= 6 ? 1 : 7, 1];\n    case 'year': return [year, 1, 1];\n  }\n}\n\n/** Enumerate all period-start tick dates within [tsOrd, teOrd] (inclusive). */\nexport function enumTicks(tsOrd: number, teOrd: number, unit: AxisUnit): TickDate[] {\n  const ticks: TickDate[] = [];\n  const [sy, sm, sd] = ordinalToDate(tsOrd);\n  let [cy, cm, cd] = snapToPeriodStart(sy, sm, sd, unit);\n  let curOrd = dateToOrdinal(cy, cm, cd);\n\n  if (curOrd < tsOrd) {\n    [cy, cm, cd] = advancePeriod(cy, cm, cd, unit);\n    curOrd = dateToOrdinal(cy, cm, cd);\n  }\n\n  let safety = 0;\n  while (curOrd <= teOrd && safety < 2000) {\n    ticks.push({ year: cy, month: cm, day: cd, ordinal: curOrd });\n    [cy, cm, cd] = advancePeriod(cy, cm, cd, unit);\n    curOrd = dateToOrdinal(cy, cm, cd);\n    safety += 1;\n  }\n  return ticks;\n}\n\n// \u2500\u2500\u2500 Date label formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst MONTH_ABBR = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst MONTH_FULL = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\nfunction ordinalSuffix(n: number): string {\n  const abs = Math.abs(n);\n  const mod100 = abs % 100;\n  if (mod100 >= 11 && mod100 <= 13) return `${n}th`;\n  switch (abs % 10) {\n    case 1: return `${n}st`;\n    case 2: return `${n}nd`;\n    case 3: return `${n}rd`;\n    default: return `${n}th`;\n  }\n}\n\n/** Format an axis tick label according to the axis unit. */\nexport function formatTickLabel(tick: TickDate, unit: AxisUnit, tickIndex: number): string {\n  switch (unit) {\n    case 'day':\n      if (tickIndex % 7 === 0) return MONTH_ABBR[tick.month - 1] ?? '';\n      return String(tick.day);\n    case 'week':\n      if (tickIndex % 4 === 0) return MONTH_ABBR[tick.month - 1] ?? '';\n      return String(tick.day);\n    case 'month':\n      if (tick.month === 1 || tickIndex === 0) return String(tick.year);\n      return MONTH_ABBR[tick.month - 1] ?? '';\n    case 'quarter': {\n      const q = Math.ceil(tick.month / 3);\n      if (q === 1 || tickIndex === 0) return `Q${q} ${tick.year}`;\n      return `Q${q}`;\n    }\n    case 'half': {\n      const h = tick.month <= 6 ? 1 : 2;\n      if (h === 1 || tickIndex === 0) return `H${h} ${tick.year}`;\n      return `H${h}`;\n    }\n    case 'year':\n      return String(tick.year);\n  }\n}\n\n/** Format a concrete day date as the milestone label style: \"15th May 2021\". */\nexport function formatMilestoneDate(year: number, month: number, day: number): string {\n  return `${ordinalSuffix(day)} ${MONTH_FULL[month - 1] ?? ''} ${year}`;\n}\n\n// \u2500\u2500\u2500 Entry-date convenience helpers (shared by timeline layouts) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Day-ordinal of a date's period START (e.g. \"2026-Q2\" \u2192 1 Apr 2026). 0 on parse error. */\nexport function startOrdinal(date: IRDate): number {\n  try { const [y, m, d] = coerceLeft(parseIRDate(date)); return dateToOrdinal(y, m, d); }\n  catch { return 0; }\n}\n\n/** Day-ordinal of a date's period END (e.g. \"2026-Q2\" \u2192 1 Jul 2026). 0 on parse error. */\nexport function endOrdinal(date: IRDate): number {\n  try { const [y, m, d] = coerceRight(parseIRDate(date)); return dateToOrdinal(y, m, d); }\n  catch { return 0; }\n}\n\n/** Label style for {@link formatDate}. 'axis' shows \"Jun 9\" for days; 'full' shows \"9th June 2026\". */\nexport type DateLabelStyle = 'axis' | 'full';\n\n/**\n * Precision-aware human label for an IR date. Consolidates the per-layout\n * formatters: months \u2192 \"Jun 2026\", quarters \u2192 \"Q2 2026\", halves \u2192 \"H1 2026\",\n * years \u2192 \"2026\"; days depend on {@link DateLabelStyle}.\n */\nexport function formatDate(date: IRDate, style: DateLabelStyle = 'axis'): string {\n  try {\n    const p = parseIRDate(date);\n    switch (p.precision) {\n      case 'day':\n        return style === 'full'\n          ? formatMilestoneDate(p.year, p.month ?? 1, p.day ?? 1)\n          : `${MONTH_ABBR[(p.month ?? 1) - 1] ?? ''} ${p.day ?? 1}`;\n      case 'month':   return `${MONTH_ABBR[(p.month ?? 1) - 1] ?? ''} ${p.year}`;\n      case 'quarter': return `Q${p.quarter ?? ''} ${p.year}`;\n      case 'half':    return `H${p.half ?? ''} ${p.year}`;\n      case 'year':    return String(p.year);\n    }\n  } catch { /* fall through to raw */ }\n  return date;\n}\n", "/**\n * @file util/round.ts \u2014 Deterministic round-half-up helpers.\n *\n * Layout coordinates round half up (toward +\u221E) so output is locale- and\n * platform-stable. Shared by every layout engine; never use Math.round (which\n * rounds half to even in some runtimes) for scene geometry.\n */\n\n/** Round half up to the nearest integer. */\nexport function rhuInt(v: number): number {\n  return Math.floor(v + 0.5);\n}\n\n/** Round half up to `decimals` places (default 2) \u2014 for sub-pixel path data. */\nexport function rhu(v: number, decimals = 2): number {\n  const f = 10 ** decimals;\n  return Math.floor(v * f + 0.5) / f;\n}\n", "/**\n * @file text/metrics.ts \u2014 Deterministic text-width measurement.\n *\n * General utility (any diagram). Uses a hardcoded per-character advance-width\n * table derived from DejaVu Sans (fraction of the em square), so measurements\n * are byte-identical across platforms \u2014 no font parser, no system locale.\n *\n * Ported from packages/core/src/fonts/metrics.ts.\n */\n\n/**\n * Advance widths as a fraction of the em square for DejaVu Sans Regular.\n * Key is the Unicode code point (decimal). ASCII printable range plus a few\n * extras; everything else uses DEFAULT_ADVANCE.\n */\nconst ADVANCE: Record<number, number> = {\n  32:  0.2793,\n  33:  0.2793, 34:  0.3574, 35:  0.5576, 36:  0.5576, 37:  0.8906,\n  38:  0.6699, 39:  0.1914, 40:  0.3340, 41:  0.3340, 42:  0.3906,\n  43:  0.5859, 44:  0.2793, 45:  0.3340, 46:  0.2793, 47:  0.3125,\n  48:  0.5576, 49:  0.5576, 50:  0.5576, 51:  0.5576, 52:  0.5576,\n  53:  0.5576, 54:  0.5576, 55:  0.5576, 56:  0.5576, 57:  0.5576,\n  58:  0.2793, 59:  0.2793, 60:  0.5859, 61:  0.5859, 62:  0.5859,\n  63:  0.5576, 64:  1.0186,\n  65:  0.6699, 66:  0.6699, 67:  0.7227, 68:  0.7227, 69:  0.6699,\n  70:  0.6133, 71:  0.7793, 72:  0.7227, 73:  0.2783, 74:  0.5000,\n  75:  0.6699, 76:  0.5576, 77:  0.8359, 78:  0.7227, 79:  0.7793,\n  80:  0.6133, 81:  0.7793, 82:  0.7227, 83:  0.6133, 84:  0.6133,\n  85:  0.7227, 86:  0.6699, 87:  0.9453, 88:  0.6699, 89:  0.6699,\n  90:  0.6133,\n  91:  0.2793, 92:  0.3125, 93:  0.2793, 94:  0.5859, 95:  0.5576,\n  96:  0.3340,\n  97:  0.5576,  98:  0.5576,  99:  0.5000, 100:  0.5576, 101:  0.5576,\n  102:  0.2793, 103:  0.5576, 104:  0.5576, 105:  0.2217, 106:  0.2217,\n  107:  0.5000, 108:  0.2217, 109:  0.8359, 110:  0.5576, 111:  0.5576,\n  112:  0.5576, 113:  0.5576, 114:  0.3340, 115:  0.5000, 116:  0.3340,\n  117:  0.5576, 118:  0.5000, 119:  0.7227, 120:  0.5000, 121:  0.5000,\n  122:  0.5000,\n  123:  0.3340, 124:  0.2598, 125:  0.3340, 126:  0.5859,\n};\n\n/** Fallback advance width for characters not in the table (em fraction). */\nconst DEFAULT_ADVANCE = 0.5576;\n\n/** Line-height multiplier (leading). */\nconst LINE_HEIGHT_FACTOR = 1.2;\n\n/**\n * Measure the rendered width/height of `text` at `fontSizePx` pixels.\n */\nexport function measureText(text: string, fontSizePx: number): { width: number; height: number } {\n  let totalEm = 0;\n  for (let i = 0; i < text.length; i++) {\n    const cp = text.codePointAt(i) ?? 32;\n    totalEm += ADVANCE[cp] ?? DEFAULT_ADVANCE;\n  }\n  return {\n    width:  totalEm * fontSizePx,\n    height: fontSizePx * LINE_HEIGHT_FACTOR,\n  };\n}\n\n/** Convert point size to CSS pixels (at 96 dpi; 1pt = 96/72 px). */\nexport function ptToPx(pt: number): number {\n  return pt * (96 / 72);\n}\n", "/**\n * @file text/wrap.ts \u2014 Deterministic text wrapping and truncation.\n *\n * General utility (any diagram). Uses the embedded font metrics from\n * ./metrics.js. Same input always yields same output.\n *\n * Ported from packages/core/src/text-wrap.ts.\n */\n\nimport { measureText } from './metrics.js';\n\nconst ELLIPSIS = '\u2026';\n\nexport interface WrappedText {\n  lines: string[];\n}\n\n/**\n * Wrap text to fit maxWidth (px) at fontSizePx, with at most maxLines lines.\n * Breaks at word boundaries; truncates the last visible line with an ellipsis.\n */\nexport function wrapText(\n  text: string,\n  fontSizePx: number,\n  maxWidth: number,\n  maxLines: number,\n): WrappedText {\n  if (!text || maxLines <= 0 || maxWidth <= 0) return { lines: [] };\n\n  const words = text.split(/\\s+/).filter(Boolean);\n  if (words.length === 0) return { lines: [] };\n\n  const lines: string[] = [];\n  let current = '';\n\n  for (let wi = 0; wi < words.length; wi++) {\n    const word = words[wi]!;\n    const candidate = current ? `${current} ${word}` : word;\n\n    if (measureText(candidate, fontSizePx).width <= maxWidth) {\n      current = candidate;\n    } else {\n      if (current) {\n        if (lines.length === maxLines - 1) {\n          const remaining = words.slice(wi).join(' ');\n          const full = current ? `${current} ${remaining}` : remaining;\n          lines.push(truncateText(full, fontSizePx, maxWidth));\n          return { lines };\n        }\n        lines.push(current);\n        current = word;\n      } else {\n        if (lines.length === maxLines - 1) {\n          lines.push(truncateText(word, fontSizePx, maxWidth));\n          return { lines };\n        }\n        lines.push(truncateText(word, fontSizePx, maxWidth));\n        current = '';\n      }\n    }\n  }\n\n  if (current) {\n    if (lines.length < maxLines) {\n      lines.push(current);\n    } else {\n      const last = lines[lines.length - 1] ?? '';\n      lines[lines.length - 1] = truncateText(`${last} ${current}`, fontSizePx, maxWidth);\n    }\n  }\n\n  return { lines };\n}\n\n/**\n * Truncate text to fit maxWidth (px) at fontSizePx, appending an ellipsis if cut.\n */\nexport function truncateText(\n  text: string,\n  fontSizePx: number,\n  maxWidth: number,\n): string {\n  if (measureText(text, fontSizePx).width <= maxWidth) return text;\n\n  const ellipsisWidth = measureText(ELLIPSIS, fontSizePx).width;\n  const budget = maxWidth - ellipsisWidth;\n  if (budget <= 0) return ELLIPSIS;\n\n  let lo = 0;\n  let hi = text.length;\n  while (lo < hi) {\n    const mid = Math.floor((lo + hi + 1) / 2);\n    if (measureText(text.slice(0, mid), fontSizePx).width <= budget) {\n      lo = mid;\n    } else {\n      hi = mid - 1;\n    }\n  }\n\n  return text.slice(0, lo) + ELLIPSIS;\n}\n", "/**\n * @file palette/categorical.ts \u2014 Shared categorical hue cycle.\n *\n * A fixed, deterministic sequence of visually-separable hues for diagrams that\n * colour items by index rather than by semantic status (narrative spines,\n * section bands, pie/chart slices). Index wraps with modulo so any count works.\n *\n * This is intentionally NOT a theme token: it is decorative, diagram-driven\n * colour, independent of the active theme's semantic palette.\n */\n\n/** Eight distinct hues, ordered for maximum adjacent contrast. */\nexport const CATEGORICAL_HUES: readonly string[] = [\n  '#7C3AED', '#0EA5A8', '#D97706', '#5B4FCF',\n  '#DB2777', '#2563EB', '#16A34A', '#CA8A04',\n];\n\n/** Hue at `index`, wrapping the cycle. */\nexport function categoricalHue(index: number): string {\n  const n = CATEGORICAL_HUES.length;\n  return CATEGORICAL_HUES[((index % n) + n) % n]!;\n}\n", "/**\n * @file diagrams/timeline/shared.ts \u2014 Helpers shared across timeline layouts.\n *\n * These are specific to the timeline diagram family (vertical-spine, serpentine,\n * roadmap, columns, horizontal) but common to all of them \u2014 so they live here\n * rather than being copy-pasted per layout. Cross-diagram utilities (rounding,\n * dates, text metrics) live in the top-level general modules instead.\n */\n\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { TimelineDocument } from './ir.js';\nimport { startOrdinal } from '../../../time/dates.js';\n\n/**\n * Map a timeline activity status to the theme's semantic palette.\n *   done \u2192 success, active \u2192 primary, blocked \u2192 error, else \u2192 secondary.\n * Reads only shared palette tokens so every theme restyles consistently.\n */\nexport function statusColor(palette: ResolvedTheme['palette'], status?: string): string {\n  switch (status) {\n    case 'done':    return palette.success;\n    case 'active':  return palette.primary;\n    case 'blocked': return palette.error;\n    default:        return palette.secondary;\n  }\n}\n\n/** A milestone or activity, normalized for layouts that treat both uniformly. */\nexport interface TimelineEntry {\n  readonly id: string;\n  readonly label: string;\n  readonly kind: 'milestone' | 'activity';\n  /** Period-start date string (milestone.date or activity.start). */\n  readonly date: string;\n  /** Activity end date, when present. */\n  readonly end?: string;\n  /** Day-ordinal of the start date, for ordering. */\n  readonly ord: number;\n  readonly status?: string;\n  readonly description?: string;\n}\n\n/**\n * Merge milestones + activities into one list keyed by start date, sorted by\n * (ordinal, id) for stable, deterministic placement. Used by the layouts that\n * lay both kinds along a single track (spine, serpentine).\n */\nexport function collectEntries(ir: TimelineDocument): TimelineEntry[] {\n  const entries: TimelineEntry[] = [];\n  for (const m of ir.milestones) {\n    entries.push({\n      id: m.id, label: m.label, kind: 'milestone', date: m.date, ord: startOrdinal(m.date),\n      ...(m.description ? { description: m.description } : {}),\n    });\n  }\n  for (const a of ir.activities) {\n    entries.push({\n      id: a.id, label: a.label, kind: 'activity', date: a.start, ord: startOrdinal(a.start),\n      ...(a.end ? { end: a.end } : {}),\n      ...(a.status ? { status: a.status } : {}),\n      ...(a.description ? { description: a.description } : {}),\n    });\n  }\n  entries.sort((p, q) => (p.ord - q.ord) || (p.id < q.id ? -1 : p.id > q.id ? 1 : 0));\n  return entries;\n}\n", "/**\n * @file diagrams/timeline/vertical-spine.ts \u2014 Vertical central-spine layout.\n *\n * Time axis runs TOP (earliest) \u2192 BOTTOM (latest). A central vertical spine\n * line sits at canvas mid-x. Entries (milestones + activities, keyed by their\n * start date) are sorted by (ordinal, id) and placed down the spine, alternating\n * RIGHT (even index) / LEFT (odd index). Each entry draws a node marker on the\n * spine, a horizontal connector, and a content card (date + title + description).\n *\n * Uses the GENERAL utilities: time/dates (ordinals, parsing, formatting) and\n * text/metrics + text/wrap (card sizing). Styling reads only the shared theme\n * tokens (palette/typography/spacing) \u2014 status maps to the semantic palette\n * (done\u2192success, active\u2192primary, blocked\u2192error, default\u2192secondary).\n *\n * Determinism: round-half-up coordinates, stable (ordinal, id) sort, no clock.\n */\n\nimport type { TimelineDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { formatDate } from '../../../time/dates.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { collectEntries } from './shared.js';\n\ninterface SpineEntry {\n  id: string;\n  label: string;\n  dateStr: string;\n  ord: number;\n  description?: string;\n  type: 'milestone' | 'activity';\n  statusHint?: string;\n  dotColor: string;\n}\n\n/** Human date string, precision-aware (milestone style: full day dates). */\nconst formatEntryDate = (date: string): string => formatDate(date, 'full');\n\nexport function layoutVerticalSpine(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Build unified entry list (sorted by ordinal, id) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const entries: SpineEntry[] = collectEntries(ir).map(e => ({\n    id: e.id, label: e.label, dateStr: formatEntryDate(e.date), ord: e.ord,\n    ...(e.description ? { description: e.description } : {}),\n    type: e.kind,\n    ...(e.status ? { statusHint: e.status } : {}),\n    dotColor: palette.primary,\n  }));\n\n  // Assign colours after ordering: active/blocked keep semantic colour,\n  // everything else cycles a categorical palette so each entry is distinct.\n  entries.forEach((e, i) => {\n    e.dotColor = e.statusHint === 'active'  ? palette.primary\n               : e.statusHint === 'blocked' ? palette.error\n               : categoricalHue(i);\n  });\n\n  // \u2500\u2500 Geometry constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const cardW       = 260;\n  const cardPad     = 12;\n  const spineGap    = 48;             // gap between spine and nearest card edge\n  const rowGap      = 22;\n  const dotR        = 7;\n  const innerW      = cardW - 2 * cardPad;\n  const titleSize   = typography.baseFontSize;\n  const dateSize    = typography.smallFontSize;\n  const descSize    = typography.smallFontSize;\n  const titleLH     = rhuInt(titleSize * 1.3);\n  const lineLH      = rhuInt(descSize * 1.35);\n\n  const spineX      = rhuInt(margin + cardW + spineGap);\n  const leftCardR   = spineX - spineGap;            // right edge of left-column cards\n  const rightCardL  = spineX + spineGap;            // left edge of right-column cards\n  const totalW      = rhuInt(rightCardL + cardW + margin);\n\n  const subtitle    = typeof ir.metadata.subtitle === 'string' ? ir.metadata.subtitle : undefined;\n  const headerH     = ir.metadata.title\n    ? typography.titleFontSize + (subtitle ? typography.baseFontSize + 10 : 0) + 24\n    : 0;\n  let y             = margin + headerH + 8;\n  const startY      = y;\n  // Pre-compute each entry's wrapped text + card height\n  interface Placed extends SpineEntry {\n    titleLines: string[]; descLines: string[]; cardH: number;\n  }\n  const placed: Placed[] = entries.map(e => {\n    const titleLines = wrapText(e.label, titleSize, innerW, 3).lines;\n    const descLines  = e.description ? wrapText(e.description, descSize, innerW, 3).lines : [];\n    const cardH = rhuInt(\n      cardPad + (dateSize * 1.3) + 4\n      + titleLines.length * titleLH\n      + (descLines.length ? 4 + descLines.length * lineLH : 0)\n      + cardPad,\n    );\n    return { ...e, titleLines, descLines, cardH };\n  });\n\n  const elements: SceneElement[] = [];\n  const p = pen(theme);\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, rhuInt(totalW / 2), margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n    if (subtitle) {\n      elements.push(p.text(subtitle, rhuInt(totalW / 2), margin + typography.titleFontSize + typography.baseFontSize + 8, typography.baseFontSize, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  // \u2500\u2500 Place entries down the spine \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let lastNodeY = startY;\n  placed.forEach((e, i) => {\n    const onRight = i % 2 === 0;\n    const nodeY   = rhuInt(y + e.cardH / 2);\n    const cardX   = onRight ? rightCardL : leftCardR - cardW;\n    const cardY   = rhuInt(y);\n\n    // Connector (spine \u2192 card)\n    const connX2 = onRight ? rightCardL : leftCardR;\n    elements.push(p.path(`M ${spineX} ${nodeY} L ${connX2} ${nodeY}`, palette.border, 1.5));\n\n    // Card background\n    elements.push(p.rect({ x: cardX, y: cardY, width: cardW, height: e.cardH }, palette.surface, palette.border, 1, { rx: 8 }));\n    // Status accent stripe on the spine-facing edge\n    const stripeX = onRight ? cardX : cardX + cardW - 3;\n    elements.push(p.rect({ x: stripeX, y: cardY, width: 3, height: e.cardH }, e.dotColor, e.dotColor, 0));\n\n    // Card text\n    const textX = cardX + cardPad;\n    let ty = cardY + cardPad + dateSize;\n    elements.push(p.text(e.dateStr, textX, ty, dateSize, e.dotColor, { weight: 'bold', anchor: 'start' }));\n    ty += 4 + titleLH - (titleLH - titleSize);\n    for (const line of e.titleLines) {\n      elements.push(p.text(line, textX, ty, titleSize, palette.text, { weight: 'bold', anchor: 'start' }));\n      ty += titleLH;\n    }\n    if (e.descLines.length) {\n      ty += 2;\n      for (const line of e.descLines) {\n        elements.push(p.text(line, textX, ty, descSize, palette.textMuted, { anchor: 'start' }));\n        ty += lineLH;\n      }\n    }\n\n    // Node marker on spine (diamond for milestone, circle for activity)\n    if (e.type === 'milestone') {\n      const r = dotR + 1;\n      elements.push(p.path(`M ${spineX} ${nodeY - r} L ${spineX + r} ${nodeY} L ${spineX} ${nodeY + r} L ${spineX - r} ${nodeY} Z`, palette.background, 2, { fill: e.dotColor }));\n    } else {\n      elements.push(p.circle({ x: spineX, y: nodeY }, dotR, e.dotColor, palette.background, 2));\n    }\n\n    lastNodeY = nodeY;\n    y += e.cardH + rowGap;\n  });\n\n  // \u2500\u2500 Spine line (drawn under everything via unshift) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.unshift(p.path(`M ${spineX} ${startY} L ${spineX} ${lastNodeY}`, palette.border, 2.5));\n\n  const totalH = rhuInt(y - rowGap + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/serpentine.ts \u2014 Serpentine (boustrophedon) layout.\n *\n * A single winding track runs left\u2192right, U-turns down, right\u2192left, U-turns, \u2026\n * Entries (milestones + activities, by start date) are placed at uniform\n * arc-length positions t_i = (i + 0.5) / n along the path. A play cap marks the\n * start, a target/bullseye cap the end. Labels sit above/below each node by row\n * parity.\n *\n * Built on the GENERAL time/dates module. Uses only shared theme tokens.\n * v3 fidelity notes vs core: solid track (v3 scene has no stroke gradients) and\n * inline play/target caps (no icon registry yet).\n *\n * Determinism: round-half-up, stable (ordinal, id) sort, no clock.\n */\n\nimport type { TimelineDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { statusColor, collectEntries } from './shared.js';\n\ninterface Geo {\n  xl: number; xr: number; pathStartY: number;\n  nRows: number; rowSpacing: number; turnRadius: number; rowWidth: number; totalLength: number;\n}\n\n/** Point (x,y) at arc-length s along the boustrophedon path. */\nfunction pathPointAtS(s: number, geo: Geo): { x: number; y: number } {\n  const { xl, xr, pathStartY, nRows, rowSpacing, turnRadius: r, rowWidth } = geo;\n  const L_turn = Math.PI * r;\n  let remaining = Math.max(0, Math.min(s, geo.totalLength));\n\n  for (let row = 0; row < nRows; row++) {\n    const y_row = pathStartY + row * rowSpacing;\n    if (remaining <= rowWidth + 1e-9) {\n      const t = Math.min(remaining, rowWidth);\n      return row % 2 === 0 ? { x: rhu(xl + t), y: rhu(y_row) } : { x: rhu(xr - t), y: rhu(y_row) };\n    }\n    remaining -= rowWidth;\n    if (row < nRows - 1) {\n      if (remaining <= L_turn + 1e-9) {\n        const alpha = Math.min(remaining, L_turn) / r;\n        return row % 2 === 0\n          ? { x: rhu(xr + r * Math.sin(alpha)), y: rhu(y_row + r * (1 - Math.cos(alpha))) }\n          : { x: rhu(xl - r * Math.sin(alpha)), y: rhu(y_row + r * (1 - Math.cos(alpha))) };\n      }\n      remaining -= L_turn;\n    }\n  }\n  const lastRow = nRows - 1;\n  const y_last = rhu(pathStartY + lastRow * rowSpacing);\n  return lastRow % 2 === 0 ? { x: rhu(xr), y: y_last } : { x: rhu(xl), y: y_last };\n}\n\n/** SVG path d for the full boustrophedon, smooth arc U-turns. */\nfunction buildPathD(geo: Geo): string {\n  const { xl, xr, pathStartY, nRows, rowSpacing, turnRadius: r } = geo;\n  const parts: string[] = [];\n  for (let row = 0; row < nRows; row++) {\n    const y = rhu(pathStartY + row * rowSpacing);\n    const y_next = rhu(pathStartY + (row + 1) * rowSpacing);\n    if (row === 0) parts.push(`M ${xl} ${y}`);\n    if (row % 2 === 0) {\n      parts.push(`L ${xr} ${y}`);\n      if (row < nRows - 1) parts.push(`A ${r} ${r} 0 1 1 ${xr} ${y_next}`);\n    } else {\n      parts.push(`L ${xl} ${y}`);\n      if (row < nRows - 1) parts.push(`A ${r} ${r} 0 1 0 ${xl} ${y_next}`);\n    }\n  }\n  return parts.join(' ');\n}\n\ninterface SerpEntry { id: string; label: string; ord: number; color: string; }\n\nexport function layoutSerpentine(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography } = theme;\n  const p = pen(theme);\n\n  // \u2500\u2500 Entries \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const entries: SerpEntry[] = collectEntries(ir).map(e => ({\n    id: e.id, label: e.label, ord: e.ord,\n    color: e.kind === 'milestone' ? palette.primary : statusColor(palette, e.status),\n  }));\n  const n = entries.length;\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const W           = 1040;\n  const turnRadius  = 80;\n  const rowSpacing  = 160;\n  const trackWidth  = 14;\n  const nodeR       = 10;\n  const badgeR      = 22;\n  const PATH_XL     = rhu(turnRadius + 10);\n  const PATH_XR     = rhu(W - turnRadius - 10);\n  const ROW_W       = rhu(PATH_XR - PATH_XL);\n\n  const nRows       = Math.max(2, Math.ceil(n / 3));\n  const headerH     = ir.metadata.title ? typography.titleFontSize + 28 : 0;\n  const TOP_PAD     = 64;\n  const BOTTOM_PAD  = 64;\n  const pathStartY  = rhu(headerH + TOP_PAD);\n  const L_turn      = rhu(Math.PI * turnRadius);\n  const totalLength = rhu(nRows * ROW_W + (nRows - 1) * L_turn);\n  const pathEndY    = rhu(pathStartY + (nRows - 1) * rowSpacing);\n  const canvasH     = rhuInt(pathEndY + BOTTOM_PAD);\n\n  const geo: Geo = { xl: PATH_XL, xr: PATH_XR, pathStartY, nRows, rowSpacing, turnRadius, rowWidth: ROW_W, totalLength };\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, rhu(W / 2), rhuInt(typography.titleFontSize + 8), typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Track \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const pathD     = buildPathD(geo);\n  const pathStart = pathPointAtS(0, geo);\n  const pathEnd   = pathPointAtS(totalLength, geo);\n\n  elements.push(p.path(pathD, palette.primary, trackWidth, { fill: 'none' }));\n\n  // \u2500\u2500 Nodes + labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function rowForS(s: number): number {\n    let remaining = Math.max(0, s);\n    for (let row = 0; row < nRows; row++) {\n      if (remaining <= ROW_W + 1e-9) return row;\n      remaining -= ROW_W;\n      if (row < nRows - 1) { if (remaining <= L_turn + 1e-9) return row; remaining -= L_turn; }\n    }\n    return nRows - 1;\n  }\n\n  const labelFontSize = typography.smallFontSize;\n  for (let i = 0; i < n; i++) {\n    const s  = rhu(((i + 0.5) / n) * totalLength);\n    const pt = pathPointAtS(s, geo);\n    const e  = entries[i]!;\n\n    elements.push(p.circle({ x: pt.x, y: pt.y }, nodeR, palette.background, e.color, 3));\n\n    const isEvenRow = rowForS(s) % 2 === 0;\n    const labelY = isEvenRow\n      ? rhu(pt.y + nodeR + 6 + labelFontSize * 0.9)\n      : rhu(pt.y - nodeR - 8);\n    const labelText = e.label.length > 18 ? `${e.label.slice(0, 16)}\u2026` : e.label;\n    elements.push(p.text(labelText, pt.x, labelY, labelFontSize, palette.text, { anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Start cap (play triangle) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.circle({ x: pathStart.x, y: pathStart.y }, badgeR, palette.primary, palette.primary, 2));\n  {\n    const cx = pathStart.x, cy = pathStart.y, t = badgeR * 0.5;\n    elements.push(p.path(\n      `M ${rhu(cx - t * 0.5)} ${rhu(cy - t)} L ${rhu(cx + t)} ${rhu(cy)} L ${rhu(cx - t * 0.5)} ${rhu(cy + t)} Z`,\n      palette.background, 0, { fill: palette.background },\n    ));\n  }\n\n  // \u2500\u2500 End cap (target / bullseye) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.circle({ x: pathEnd.x, y: pathEnd.y }, badgeR, palette.primary, palette.primary, 2));\n  elements.push(p.circle({ x: pathEnd.x, y: pathEnd.y }, rhu(badgeR * 0.62), 'none', palette.background, 2.5));\n  elements.push(p.circle({ x: pathEnd.x, y: pathEnd.y }, rhu(badgeR * 0.28), palette.background, palette.background, 0));\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: W, height: canvasH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/roadmap.ts \u2014 Roadmap infographic layout.\n *\n * Four horizontal zones (top\u2192bottom):\n *   1. Header     \u2014 title.\n *   2. Callouts   \u2014 milestone labels + (date), leader line + dot down to band.\n *   3. Phase band \u2014 activity pills from dateX(start)\u2192dateX(end), status-coloured,\n *                   lane-packed so overlapping ranges stack instead of collide.\n *   4. Date axis  \u2014 baseline with date labels at milestone x positions.\n *\n * Built on the GENERAL time/dates + text/metrics modules. Linear date mapping\n * (no axis breaks in v1). Uses only shared theme tokens.\n */\n\nimport type { TimelineDocument, Activity, Milestone } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { truncateText } from '../../../text/wrap.js';\nimport { startOrdinal, endOrdinal, formatDate } from '../../../time/dates.js';\nimport { statusColor } from './shared.js';\n\nconst leftOrd = startOrdinal;\nconst rightOrd = endOrdinal;\nconst fmtDate = (date: string): string => formatDate(date, 'axis');\n\ninterface Pill { label: string; startOrd: number; endOrd: number; color: string; lane: number; }\n\nexport function layoutRoadmap(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const draw = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Time range \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const acts = ir.activities as readonly Activity[];\n  const miles = ir.milestones as readonly Milestone[];\n  const allOrds: number[] = [];\n  for (const a of acts) { allOrds.push(leftOrd(a.start), rightOrd(a.end ?? a.start)); }\n  for (const m of miles) allOrds.push(leftOrd(m.date));\n  if (allOrds.length === 0) allOrds.push(0, 1);\n  const minOrd = Math.min(...allOrds);\n  const maxOrd = Math.max(...allOrds);\n  const span = Math.max(1, maxOrd - minOrd);\n\n  // \u2500\u2500 Canvas + axis geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const W         = 1040;\n  const axisLeft  = margin + 10;\n  const axisRight = W - margin - 10;\n  const axisW     = axisRight - axisLeft;\n  const dateX = (ord: number): number => rhuInt(axisLeft + ((ord - minOrd) / span) * axisW);\n\n  // \u2500\u2500 Lane-pack activities (avoid overlap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const sorted = [...acts].sort((a, b) => leftOrd(a.start) - leftOrd(b.start));\n  const laneEnds: number[] = [];\n  const pills: Pill[] = sorted.map(a => {\n    const s = leftOrd(a.start);\n    const e = Math.max(rightOrd(a.end ?? a.start), s + Math.round(span / 30)); // min visible width\n    let lane = laneEnds.findIndex(end => s >= end);\n    if (lane === -1) { lane = laneEnds.length; laneEnds.push(e); }\n    else laneEnds[lane] = e;\n    return { label: a.label, startOrd: s, endOrd: e, color: statusColor(palette, a.status), lane };\n  });\n  const numLanes = Math.max(1, laneEnds.length);\n\n  // \u2500\u2500 Vertical zones \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const headerH   = ir.metadata.title ? typography.titleFontSize + 20 : 8;\n  const calloutH  = miles.length ? 56 : 12;\n  const laneH     = 34;\n  const lanePad   = 6;\n  const bandTop   = margin + headerH + calloutH;\n  const bandH     = numLanes * laneH + (numLanes - 1) * lanePad;\n  const bandBot   = bandTop + bandH;\n  const axisY     = bandBot + 26;\n  const totalH    = rhuInt(axisY + typography.smallFontSize + margin);\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(draw.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'start' }));\n  }\n\n  // \u2500\u2500 Band background \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(draw.rect({ x: axisLeft, y: bandTop, width: axisW, height: bandH }, palette.surface, palette.border, 1, { rx: 6 }));\n\n  // \u2500\u2500 Activity pills \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const pillFont = typography.smallFontSize;\n  for (const p of pills) {\n    const x1 = dateX(p.startOrd), x2 = dateX(p.endOrd);\n    const px = x1, pw = Math.max(14, x2 - x1);\n    const py = bandTop + p.lane * (laneH + lanePad);\n    elements.push(draw.rect({ x: px, y: py, width: pw, height: laneH }, p.color, p.color, 0, { rx: 6 }));\n    const label = truncateText(p.label, pillFont, pw - 12);\n    if (label && measureText(label, pillFont).width <= pw - 8) {\n      elements.push(draw.text(label, px + pw / 2, py + laneH / 2 + pillFont * 0.35, pillFont, palette.background, { weight: 'bold', anchor: 'middle' }));\n    }\n  }\n\n  // \u2500\u2500 Milestone callouts (above band) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const m of miles) {\n    const mx = dateX(leftOrd(m.date));\n    const labelY = margin + headerH + typography.baseFontSize;\n    elements.push(draw.text(m.label, mx, labelY, typography.baseFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n    elements.push(draw.text(`(${fmtDate(m.date)})`, mx, labelY + typography.smallFontSize + 2, typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n    // leader line down to band top + dot\n    elements.push(draw.path(`M ${mx} ${labelY + typography.smallFontSize + 6} L ${mx} ${bandTop}`, palette.border, 1));\n    elements.push(draw.circle({ x: mx, y: bandTop }, 4, palette.primary, palette.background, 1.5));\n  }\n\n  // \u2500\u2500 Date axis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(draw.path(`M ${axisLeft} ${axisY} L ${axisRight} ${axisY}`, palette.border, 1.5));\n  const axisDates = new Set<string>();\n  for (const m of miles) axisDates.add(m.date);\n  for (const a of acts) { axisDates.add(a.start); if (a.end) axisDates.add(a.end); }\n  for (const d of axisDates) {\n    const x = dateX(leftOrd(d));\n    elements.push(draw.path(`M ${x} ${axisY - 3} L ${x} ${axisY + 3}`, palette.border, 1));\n    elements.push(draw.text(fmtDate(d), x, axisY + typography.smallFontSize + 2, typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n  }\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: W, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/timeline-columns.ts \u2014 Mermaid-faithful section columns.\n *\n * Colored SECTION header bands across the top; under each, PERIOD columns (one\n * per distinct date) tinted to the section colour; under each period, EVENT\n * boxes stacked vertically. A horizontal axis line separates headers from events.\n *\n * v3 data model note: core links events\u2192sections via track===sectionId, but v3\n * keeps sections separate (with date ranges). We reconstruct membership by\n * date-containment: each entry joins the latest section whose start \u2264 entry date.\n *\n * Self-contained 8-hue palette (the Mermaid look) \u2014 a layout-local constant,\n * not a theme token. Built on GENERAL time/dates + text/wrap modules.\n */\n\nimport type { TimelineDocument, Activity, Milestone, Section } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { startOrdinal, formatDate } from '../../../time/dates.js';\n\ninterface SectionColors {\n  header: string; period: string; event: string;\n  headerText: string; eventText: string; eventBorder: string;\n}\n\nconst SECTION_PALETTE: SectionColors[] = [\n  { header: '#5368D4', period: '#3F52B5', event: '#EEF0FC', headerText: '#FFFFFF', eventText: '#1E2D8A', eventBorder: '#BBBFEA' },\n  { header: '#E07825', period: '#C46010', event: '#FEF1E4', headerText: '#FFFFFF', eventText: '#7A3A00', eventBorder: '#E8C09A' },\n  { header: '#27A565', period: '#1A8A50', event: '#E4F7EF', headerText: '#FFFFFF', eventText: '#0B4D2C', eventBorder: '#A8DFC5' },\n  { header: '#9B3A9A', period: '#7E2480', event: '#F6E8F6', headerText: '#FFFFFF', eventText: '#520050', eventBorder: '#D8A8D8' },\n  { header: '#1FA8C0', period: '#1288A0', event: '#E0F4F8', headerText: '#FFFFFF', eventText: '#084E60', eventBorder: '#A0D8E4' },\n  { header: '#B03068', period: '#901848', event: '#F8E0EA', headerText: '#FFFFFF', eventText: '#580028', eventBorder: '#E0A8C0' },\n  { header: '#7A8000', period: '#606400', event: '#F0F0D0', headerText: '#FFFFFF', eventText: '#3A3C00', eventBorder: '#C8C880' },\n  { header: '#2E6098', period: '#1E4878', event: '#D8E8F5', headerText: '#FFFFFF', eventText: '#102840', eventBorder: '#90B8D8' },\n];\n\nconst SECTION_HDR_H = 38;\nconst PERIOD_HDR_H  = 30;\nconst EVENT_BOX_H   = 38;\nconst EVENT_BOX_GAP = 4;\nconst EVENT_AREA_PAD = 8;\nconst COL_PAD_H     = 5;\nconst MIN_COL_W     = 120;\nconst MARGIN        = 32;\n\nconst leftOrd = startOrdinal;\nconst fmtPeriod = (date: string): string => formatDate(date, 'axis');\n\ninterface Period { date: string; ord: number; events: string[]; }\ninterface Sec    { label: string; startOrd: number; periods: Period[]; }\n\nexport function layoutTimelineColumns(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography } = theme;\n\n  // \u2500\u2500 Reconstruct section \u2192 period \u2192 event tree \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const irSections = (ir.sections ?? []) as readonly Section[];\n  const baseSecs: Sec[] = (irSections.length\n    ? irSections.map(s => ({ label: s.label, startOrd: leftOrd(s.start), periods: [] as Period[] }))\n    : [{ label: ir.metadata.title ?? 'Timeline', startOrd: -Infinity, periods: [] as Period[] }]\n  ).sort((a, b) => a.startOrd - b.startOrd);\n\n  const assignSection = (ord: number): Sec => {\n    let chosen = baseSecs[0]!;\n    for (const s of baseSecs) if (s.startOrd <= ord) chosen = s;\n    return chosen;\n  };\n\n  // entries (milestones + activities) keyed by their start date\n  interface Entry { date: string; label: string; }\n  const entries: Entry[] = [];\n  for (const m of ir.milestones as readonly Milestone[]) entries.push({ date: m.date, label: m.label });\n  for (const a of ir.activities as readonly Activity[]) entries.push({ date: a.start, label: a.label });\n\n  for (const e of entries) {\n    const ord = leftOrd(e.date);\n    const sec = assignSection(ord);\n    let period = sec.periods.find(p => p.date === e.date);\n    if (!period) { period = { date: e.date, ord, events: [] }; sec.periods.push(period); }\n    period.events.push(e.label);\n  }\n  // sort periods within each section by ordinal; drop empty sections\n  const sections = baseSecs.filter(s => s.periods.length > 0);\n  for (const s of sections) s.periods.sort((a, b) => a.ord - b.ord);\n\n  const totalPeriods = sections.reduce((n, s) => n + s.periods.length, 0);\n  const maxEvents = sections.reduce((m, s) => Math.max(m, s.periods.reduce((p, per) => Math.max(p, per.events.length), 0)), 0);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const colW    = MIN_COL_W;\n  const canvasW = rhuInt(Math.max(totalPeriods, 1) * colW + MARGIN * 2);\n  const titleH  = ir.metadata.title ? typography.titleFontSize + 18 : 8;\n  const eventAreaH = rhuInt(EVENT_AREA_PAD + maxEvents * EVENT_BOX_H + Math.max(0, maxEvents - 1) * EVENT_BOX_GAP + EVENT_AREA_PAD);\n\n  const sectionBandTopY = MARGIN + titleH;\n  const periodHdrTopY   = sectionBandTopY + SECTION_HDR_H;\n  const periodHdrBotY   = periodHdrTopY + PERIOD_HDR_H;\n  const AXIS_GAP        = 16;                       // clear space between headers and axis line\n  const axisLineY       = periodHdrBotY + AXIS_GAP;\n  const eventsTopY      = axisLineY + EVENT_AREA_PAD;\n  const canvasH         = rhuInt(axisLineY + eventAreaH + MARGIN);\n\n  const elements: SceneElement[] = [];\n  const p = pen(theme);\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, rhuInt(canvasW / 2), MARGIN + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Section bands + period columns + events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const eventFont = typography.smallFontSize;\n  let cursorX = MARGIN;\n  sections.forEach((section, si) => {\n    const colors   = SECTION_PALETTE[si % SECTION_PALETTE.length]!;\n    const sectionW = rhuInt(colW * section.periods.length);\n\n    // Section header band\n    elements.push(p.rect({ x: cursorX, y: sectionBandTopY, width: sectionW, height: SECTION_HDR_H }, colors.header, colors.header, 0));\n    elements.push(p.text(section.label, cursorX + sectionW / 2, sectionBandTopY + SECTION_HDR_H / 2 + eventFont * 0.35, typography.baseFontSize, colors.headerText, { weight: 'bold', anchor: 'middle' }));\n\n    // Period columns\n    section.periods.forEach((period, pi) => {\n      const px = cursorX + pi * colW;\n\n      // Period header box (touches neighbours; thin divider drawn between columns)\n      elements.push(p.rect({ x: px, y: periodHdrTopY, width: colW, height: PERIOD_HDR_H }, colors.period, colors.period, 0));\n      if (pi > 0) {\n        elements.push(p.path(`M ${px} ${periodHdrTopY} L ${px} ${periodHdrTopY + PERIOD_HDR_H}`, colors.header, 1));\n      }\n      elements.push(p.text(fmtPeriod(period.date), px + colW / 2, periodHdrTopY + PERIOD_HDR_H / 2 + eventFont * 0.35, eventFont, colors.headerText, { weight: 'bold', anchor: 'middle' }));\n\n      // Event boxes\n      period.events.forEach((label, ei) => {\n        const ey = eventsTopY + ei * (EVENT_BOX_H + EVENT_BOX_GAP);\n        elements.push(p.rect({ x: px + COL_PAD_H, y: ey, width: colW - 2 * COL_PAD_H, height: EVENT_BOX_H }, colors.event, colors.eventBorder, 1, { rx: 5 }));\n        const lines = wrapText(label, eventFont, colW - 2 * COL_PAD_H - 8, 2).lines;\n        const lineH = rhuInt(eventFont * 1.25);\n        const startY = ey + EVENT_BOX_H / 2 - ((lines.length - 1) * lineH) / 2 + eventFont * 0.35;\n        lines.forEach((ln, li) => {\n          elements.push(p.text(ln, px + colW / 2, startY + li * lineH, eventFont, colors.eventText, { anchor: 'middle' }));\n        });\n      });\n    });\n\n    cursorX += sectionW;\n  });\n\n  // \u2500\u2500 Axis line with arrowhead \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const axisEndX = cursorX;\n  elements.push(p.path(`M ${MARGIN} ${axisLineY} L ${axisEndX} ${axisLineY}`, palette.textMuted, 2));\n  elements.push(p.path(`M ${axisEndX} ${axisLineY} L ${axisEndX - 8} ${axisLineY - 4} L ${axisEndX - 8} ${axisLineY + 4} Z`, palette.textMuted, 0, { fill: palette.textMuted }));\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: canvasW, height: canvasH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/numbered.ts \u2014 Horizontal numbered-circle infographic.\n *\n * The \"our-timeline\" T1 look: a straight horizontal axis through evenly spaced\n * large numbered circles (01, 02, 03\u2026). Each node's date + title callout\n * alternates ABOVE / BELOW the axis, connected by a short vertical edging line.\n * Highlighted (active) nodes are filled; the rest are hollow rings.\n *\n * Built on the shared kernel (collectEntries, formatDate, pen, util/round).\n * Deterministic; no clock.\n */\n\nimport type { TimelineDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { formatDate } from '../../../time/dates.js';\nimport { collectEntries } from './shared.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutNumbered(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const entries = collectEntries(ir);\n  const n = Math.max(entries.length, 1);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const circleR   = 34;\n  const numFont   = rhuInt(typography.titleFontSize + 2);\n  const dateFont  = typography.smallFontSize;\n  const titleFont = typography.baseFontSize;\n  const innerW    = 150;                        // max wrapped title width\n  const titleLH   = rhuInt(titleFont * 1.3);\n  const dateGap   = 6;\n  const calloutGap = circleR + 14;              // clearance from circle to first callout line\n\n  // Pre-wrap titles to size the callout stacks.\n  const placed = entries.map(e => ({\n    ...e,\n    dateStr: formatDate(e.date, 'full'),\n    titleLines: wrapText(e.label, titleFont, innerW, 2).lines,\n  }));\n  const maxTitleLines = Math.max(1, ...placed.map(e => e.titleLines.length));\n  const calloutH = calloutGap + dateFont + dateGap + maxTitleLines * titleLH + 10;\n\n  const subtitle = typeof ir.metadata.subtitle === 'string' ? ir.metadata.subtitle : undefined;\n  const headerH  = ir.metadata.title\n    ? typography.titleFontSize + (subtitle ? typography.baseFontSize + 10 : 0) + 22\n    : 0;\n\n  const axisY    = margin + headerH + calloutH + circleR;\n  const pitch    = Math.max(innerW + 30, circleR * 2 + 60);\n  const leftX    = margin + 24;\n  const nodeX    = (i: number): number => leftX + i * pitch + circleR;\n  const totalW   = rhuInt(nodeX(n - 1) + circleR + 24 + margin);\n  const totalH   = rhuInt(axisY + circleR + calloutH + margin);\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Document title (centered) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, rhuInt(totalW / 2), margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n    if (subtitle) {\n      elements.push(p.text(subtitle, rhuInt(totalW / 2), margin + typography.titleFontSize + typography.baseFontSize + 8, typography.baseFontSize, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  // \u2500\u2500 Weaving spine: a continuous horizontal line that arcs AROUND each node, \u2500\n  //    alternating over/under (opposite the callout side) \u2014 the \"edging line\".\n  const arcR = circleR + 5;\n  let spine = `M ${rhu(margin)} ${rhu(axisY)}`;\n  const apexes: Array<{ x: number; y: number }> = [];\n  placed.forEach((_e, i) => {\n    const x = nodeX(i);\n    const lineAbove = i % 2 === 0;              // weave starts ABOVE on the first node\n    const sweep = lineAbove ? 1 : 0;            // 1 = arc up/over, 0 = arc down/under\n    spine += ` L ${rhu(x - arcR)} ${rhu(axisY)} A ${arcR} ${arcR} 0 0 ${sweep} ${rhu(x + arcR)} ${rhu(axisY)}`;\n    apexes.push({ x, y: lineAbove ? axisY - arcR : axisY + arcR });\n  });\n  spine += ` L ${rhu(totalW - margin)} ${rhu(axisY)}`;\n  elements.push(p.path(spine, palette.border, 2));\n\n  // Dot at each arc apex (the spine's min/max around each node).\n  for (const a of apexes) elements.push(p.circle({ x: rhu(a.x), y: rhu(a.y) }, 4, palette.primary, palette.background, 1.5));\n\n  // \u2500\u2500 Nodes + alternating callouts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  placed.forEach((e, i) => {\n    const x = nodeX(i);\n    const above = i % 2 === 1;                  // node 2 (index 1) callout goes up, like the reference\n    const filled = e.status === 'active';\n    const numColor  = filled ? '#FFFFFF' : palette.primary;\n\n    // Circle node (drawn over the spine).\n    elements.push(p.circle({ x: rhu(x), y: rhu(axisY) }, circleR, filled ? palette.primary : palette.background, palette.primary, 3));\n    elements.push(p.text(String(i + 1).padStart(2, '0'), rhu(x), rhu(axisY + numFont * 0.35), numFont, numColor, { weight: 'bold', anchor: 'middle' }));\n\n    // Callout: date (near) + title (far), stacked away from the axis.\n    if (above) {\n      const dateY = axisY - calloutGap;\n      elements.push(p.text(e.dateStr, rhu(x), rhu(dateY), dateFont, palette.textMuted, { anchor: 'middle' }));\n      let ty = dateY - dateFont - dateGap;\n      for (let li = e.titleLines.length - 1; li >= 0; li--) {\n        elements.push(p.text(e.titleLines[li]!, rhu(x), rhu(ty), titleFont, palette.primary, { weight: 'bold', anchor: 'middle' }));\n        ty -= titleLH;\n      }\n    } else {\n      const dateY = axisY + calloutGap;\n      elements.push(p.text(e.dateStr, rhu(x), rhu(dateY), dateFont, palette.textMuted, { anchor: 'middle' }));\n      let ty = dateY + titleLH;\n      for (const ln of e.titleLines) {\n        elements.push(p.text(ln, rhu(x), rhu(ty), titleFont, palette.primary, { weight: 'bold', anchor: 'middle' }));\n        ty += titleLH;\n      }\n    }\n  });\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "import type { TimelineDocument, Activity, Milestone, Section, Track } from './ir.js';\nimport type { Scene, SceneElement, Rect, Point, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { pen } from '../../../scene/build.js';\nimport { parseIRDate, coerceLeft, dateToOrdinal } from '../../../time/dates.js';\nimport { layoutVerticalSpine } from './vertical-spine.js';\nimport { layoutSerpentine } from './serpentine.js';\nimport { layoutRoadmap } from './roadmap.js';\nimport { layoutTimelineColumns } from './timeline-columns.js';\nimport { layoutNumbered } from './numbered.js';\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutTimeline(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  switch (ir.layout) {\n    case 'vertical-spine':\n      return layoutVerticalSpine(ir, theme);\n    case 'serpentine':\n      return layoutSerpentine(ir, theme);\n    case 'roadmap':\n      return layoutRoadmap(ir, theme);\n    case 'timeline-columns':\n      return layoutTimelineColumns(ir, theme);\n    case 'numbered':\n      return layoutNumbered(ir, theme);\n    case 'horizontal':\n    default:\n      return layoutHorizontal(ir, theme);\n  }\n}\n\n// \u2500\u2500\u2500 Horizontal Layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction layoutHorizontal(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const elements: SceneElement[] = [];\n\n  const charWidth    = typography.smallFontSize * 0.6;\n  const minBarW      = 60;\n  const barPadding   = 16;\n  const slotGap      = 24;   // minimum gap between date slots\n  const staggerGap   = 8;    // gap between staggered bars at same date\n  const trackHeight  = 36;\n  const trackPad     = 8;\n  const milestoneR   = 8;\n\n  const trackOrder   = ir.tracks.map(t => t.id);\n  const trackIndex   = new Map(trackOrder.map((id, i) => [id, i]));\n\n  // \u2500\u2500 Pass 1: Measure \u2014 how much width does each date slot need? \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  // Collect all unique dates sorted by numeric value\n  const dateMap = buildDateMap([\n    ...ir.milestones.map(m => m.date),\n    ...ir.activities.flatMap(a => [a.start, ...(a.end ? [a.end] : [])]),\n    ...(ir.sections?.flatMap(s => [s.start, s.end]) ?? []),\n  ]);\n\n  const sortedDates = [...new Set([\n    ...ir.milestones.map(m => m.date),\n    ...ir.activities.map(a => a.start),\n    ...(ir.activities.filter(a => a.end).map(a => a.end!)),\n    ...(ir.sections?.flatMap(s => [s.start, s.end]) ?? []),\n  ])].sort((a, b) => dateMap.toNum(a) - dateMap.toNum(b));\n\n  // Compute bar width for a single activity\n  function actBarWidth(act: Activity): number {\n    const textW = act.label.length * charWidth + barPadding;\n    return Math.max(textW, minBarW);\n  }\n\n  // Group activities by start date (across all tracks at each date)\n  const activitiesAtDate = new Map<string, Activity[]>();\n  for (const act of ir.activities) {\n    if (!activitiesAtDate.has(act.start)) activitiesAtDate.set(act.start, []);\n    activitiesAtDate.get(act.start)!.push(act);\n  }\n\n  // For each date, compute total width needed (widest track group)\n  const slotWidth = new Map<string, number>();\n  for (const date of sortedDates) {\n    const acts = activitiesAtDate.get(date);\n    if (!acts || acts.length === 0) {\n      slotWidth.set(date, 0);\n      continue;\n    }\n\n    // Group by track within this date \u2014 bars on different tracks don't compete horizontally\n    const byTrack = new Map<string, Activity[]>();\n    for (const a of acts) {\n      if (!byTrack.has(a.track)) byTrack.set(a.track, []);\n      byTrack.get(a.track)!.push(a);\n    }\n\n    // The widest track group determines the slot width\n    let widest = 0;\n    for (const [, trackActs] of byTrack) {\n      let w = 0;\n      for (let i = 0; i < trackActs.length; i++) {\n        if (i > 0) w += staggerGap;\n        w += actBarWidth(trackActs[i]!);\n      }\n      widest = Math.max(widest, w);\n    }\n    slotWidth.set(date, widest);\n  }\n\n  // \u2500\u2500 Pass 2: Position \u2014 assign x coordinates respecting content widths \u2500\u2500\u2500\u2500\u2500\n\n  const axisLeft  = margin + 20;\n  const dateX     = new Map<string, number>();\n\n  // Walk left to right: each date gets x = max(proportional, previous + previous_width + gap)\n  // range is in day-ordinals; ~80px per year keeps the prior visual density.\n  const totalProportionalW = Math.max(400, (dateMap.range / 365) * 80);\n  let cursor = axisLeft;\n\n  for (let i = 0; i < sortedDates.length; i++) {\n    const date = sortedDates[i]!;\n    const proportionalX = axisLeft + ((dateMap.toNum(date) - dateMap.min) / (dateMap.range || 1)) * totalProportionalW;\n    const x = Math.max(proportionalX, cursor);\n    dateX.set(date, x);\n    cursor = x + (slotWidth.get(date) ?? 0) + slotGap;\n  }\n\n  const axisRight = cursor - slotGap + margin;\n  const axisY     = margin + (ir.metadata.title ? typography.titleFontSize + 16 : 0) + 60;\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Section backgrounds (positioned from child date extents) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.sections) {\n    const bgHeight = 50 + trackOrder.length * (trackHeight + trackPad) + 40;\n    for (const sec of ir.sections) {\n      const sx = dateX.get(sec.start) ?? axisLeft;\n      const endDateX = dateX.get(sec.end) ?? sx;\n      const endSlotW = slotWidth.get(sec.end) ?? 0;\n      const ex = endDateX + Math.max(endSlotW, 20);\n      elements.push(p.rect({ x: sx - 8, y: axisY - 50, width: ex - sx + 16, height: bgHeight }, palette.primary + '0A', palette.primary + '33', 1, { rx: 4 }));\n      elements.push(p.text(sec.label, sx - 2, axisY - 36, typography.smallFontSize, palette.primary, { weight: 'bold' }));\n    }\n  }\n\n  // \u2500\u2500 Axis line \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.path(`M ${axisLeft} ${axisY} L ${axisRight} ${axisY}`, palette.border, 2));\n\n  // \u2500\u2500 Track labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Suppress the label for an implicit single \"default\" track \u2014 it's noise, not\n  // an authored lane name.\n  const showTrackLabels = !(trackOrder.length === 1 && trackOrder[0] === 'default');\n  if (showTrackLabels) {\n    for (let i = 0; i < trackOrder.length; i++) {\n      const track = ir.tracks.find(t => t.id === trackOrder[i]);\n      if (!track) continue;\n      const laneY = axisY + milestoneR + trackPad + i * (trackHeight + trackPad);\n      elements.push(p.text(track.label, margin, laneY + trackHeight / 2 + typography.smallFontSize * 0.4, typography.smallFontSize, palette.textMuted));\n    }\n  }\n\n  // \u2500\u2500 Activities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Track the running offset within each (track, date) group\n  const slotCursor = new Map<string, number>();\n\n  for (const act of ir.activities) {\n    const tIdx  = trackIndex.get(act.track) ?? 0;\n    const laneY = axisY + milestoneR + trackPad + tIdx * (trackHeight + trackPad);\n    const sx    = dateX.get(act.start) ?? axisLeft;\n\n    const barW  = act.end\n      ? Math.max((dateX.get(act.end) ?? sx) - sx, actBarWidth(act))\n      : actBarWidth(act);\n\n    // Stagger: accumulate previous bars' widths within this (track, date)\n    const groupKey = `${act.track}:${act.start}`;\n    const offset = slotCursor.get(groupKey) ?? 0;\n    slotCursor.set(groupKey, offset + barW + staggerGap);\n\n    const barX  = sx + offset;\n    const barH  = trackHeight - 4;\n    const barY  = laneY + 2;\n\n    const fill = activityFill(act, palette);\n    elements.push(p.rect({ x: barX, y: barY, width: barW, height: barH }, fill, palette.border, 1, { rx: 4 }));\n    elements.push(p.text(act.label, barX + barW / 2, barY + barH / 2 + typography.smallFontSize * 0.4, typography.smallFontSize, palette.text, { anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Milestones \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const ms of ir.milestones) {\n    const mx = dateX.get(ms.date) ?? axisLeft;\n    const my = axisY;\n    const r  = milestoneR;\n\n    elements.push(p.path(`M ${mx} ${my - r} L ${mx + r} ${my} L ${mx} ${my + r} L ${mx - r} ${my} Z`, palette.background, 1, { fill: palette.primary }));\n    elements.push(p.text(ms.date, mx, my - r - 6, typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n    elements.push(p.text(ms.label, mx, my + r + typography.baseFontSize + 2, typography.baseFontSize, palette.text, { anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 ViewBox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const numTracks = Math.max(trackOrder.length, 1);\n  const totalH = axisY + milestoneR + trackPad + numTracks * (trackHeight + trackPad) + typography.baseFontSize + 20 + margin;\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: axisRight + margin, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n\n// \u2500\u2500\u2500 Date Mapping \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface DateMapping {\n  toNum: (date: string) => number;\n  min: number;\n  max: number;\n  range: number;\n}\n\n/** Day-ordinal of a date's period start, or NaN when it isn't a real date. */\nfunction tryOrdinal(date: string): number {\n  try { const [y, m, d] = coerceLeft(parseIRDate(date)); return dateToOrdinal(y, m, d); }\n  catch { return NaN; }\n}\n\n/**\n * Map IR dates to the shared day-ordinal axis (days since 2000-01-01). When no\n * value parses as a date, fall back to a sequential index so plain-label\n * timelines still lay out left\u2192right.\n */\nfunction buildDateMap(dates: string[]): DateMapping {\n  const unique = [...new Set(dates)];\n  const ords   = unique.map(tryOrdinal);\n  const valid  = ords.filter(n => !isNaN(n));\n\n  if (valid.length > 0) {\n    const min = Math.min(...valid);\n    const max = Math.max(...valid);\n    const range = max - min || 1;\n    return {\n      toNum: (d) => { const n = tryOrdinal(d); return isNaN(n) ? min : n; },\n      min, max, range,\n    };\n  }\n\n  // Sequential fallback: map to index\n  const order = new Map(unique.map((d, i) => [d, i]));\n  return {\n    toNum: (d) => order.get(d) ?? 0,\n    min: 0,\n    max: unique.length - 1,\n    range: unique.length,\n  };\n}\n\nfunction activityFill(act: Activity, palette: ResolvedTheme['palette']): string {\n  switch (act.status) {\n    case 'active':  return palette.primary  + '33';\n    case 'done':    return palette.success  + '33';\n    case 'blocked': return palette.error    + '33';\n    default:        return palette.surface;\n  }\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function slugify(text) {\n    return text\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-|-$/g, '') || '';\n  }\n\n  const tracks     = new Map();\n  const activities = [];\n  const milestones = [];\n  const sections   = [];\n  const overlays   = [];\n  let actCounter  = 0;\n  let msCounter   = 0;\n  let secCounter  = 0;\n  let currentSec  = null;\n\n  function ensureTrack(id) {\n    if (!id) id = 'default';\n    if (!tracks.has(id)) tracks.set(id, { id, label: id.charAt(0).toUpperCase() + id.slice(1) });\n    return id;\n  }\n\n  function addActivity(start, end, label, status, trackId, description) {\n    actCounter++;\n    activities.push({\n      id: slugify(label) || `activity-${actCounter}`,\n      label, track: ensureTrack(trackId),\n      start, end: end || undefined,\n      status: status || 'default',\n      ...(description ? { description } : {}),\n    });\n  }\n\n  function addMilestone(date, label, trackId, description) {\n    msCounter++;\n    milestones.push({\n      id: slugify(label) || `milestone-${msCounter}`,\n      label, date,\n      track: trackId ? ensureTrack(trackId) : undefined,\n      ...(description ? { description } : {}),\n    });\n  }\n\n  function openSection(label) {\n    secCounter++;\n    currentSec = { id: slugify(label) || `section-${secCounter}`, label, start: null, end: null };\n  }\n\n  function updateSectionDate(date) {\n    if (currentSec) {\n      if (!currentSec.start) currentSec.start = date;\n      currentSec.end = date;\n    }\n  }\n\n  function closeSection() {\n    if (currentSec && currentSec.start) {\n      sections.push(currentSec);\n    }\n    currentSec = null;\n  }\n\n  function reset() {\n    tracks.clear();\n    activities.length = 0;\n    milestones.length = 0;\n    sections.length   = 0;\n    overlays.length   = 0;\n    actCounter  = 0;\n    msCounter   = 0;\n    secCounter  = 0;\n    currentSec  = null;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"timeline\";\n  var peg$c1 = \"title\";\n  var peg$c2 = \"subtitle\";\n  var peg$c3 = \"theme\";\n  var peg$c4 = \"layout\";\n  var peg$c5 = \"axisUnit\";\n  var peg$c6 = \"---\";\n  var peg$c7 = \"section\";\n  var peg$c8 = \":\";\n  var peg$c9 = \"--\";\n  var peg$c10 = \"@\";\n  var peg$c11 = \"|\";\n  var peg$c12 = \"milestone\";\n  var peg$c13 = \"active\";\n  var peg$c14 = \"done\";\n  var peg$c15 = \"blocked\";\n  var peg$c16 = \"default\";\n  var peg$c17 = \"note\";\n  var peg$c18 = \"\\\"\";\n  var peg$c19 = \"at\";\n  var peg$c20 = \"offset\";\n  var peg$c21 = \",\";\n  var peg$c22 = \"-\";\n  var peg$c23 = \"legend\";\n  var peg$c24 = \"end\";\n  var peg$c25 = \"bottom-right\";\n  var peg$c26 = \"bottom-left\";\n  var peg$c27 = \"top-right\";\n  var peg$c28 = \"top-left\";\n  var peg$c29 = \"%%\";\n  var peg$c30 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^:\\n@|]/;\n  var peg$r2 = /^[a-zA-Z0-9_\\-\\/.]/;\n  var peg$r3 = /^[a-zA-Z_]/;\n  var peg$r4 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r5 = /^[^\"]/;\n  var peg$r6 = /^[0-9]/;\n  var peg$r7 = /^[a-zA-Z0-9_]/;\n  var peg$r8 = /^[^:\\n]/;\n  var peg$r9 = /^[ \\t]/;\n  var peg$r10 = /^[\\n\\r]/;\n\n  var peg$e0 = peg$literalExpectation(\"timeline\", false);\n  var peg$e1 = peg$literalExpectation(\"title\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"subtitle\", false);\n  var peg$e4 = peg$literalExpectation(\"theme\", false);\n  var peg$e5 = peg$literalExpectation(\"layout\", false);\n  var peg$e6 = peg$literalExpectation(\"axisUnit\", false);\n  var peg$e7 = peg$literalExpectation(\"---\", false);\n  var peg$e8 = peg$literalExpectation(\"section\", false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$literalExpectation(\"--\", false);\n  var peg$e11 = peg$literalExpectation(\"@\", false);\n  var peg$e12 = peg$literalExpectation(\"|\", false);\n  var peg$e13 = peg$classExpectation([\":\", \"\\n\", \"@\", \"|\"], true, false);\n  var peg$e14 = peg$literalExpectation(\"milestone\", false);\n  var peg$e15 = peg$literalExpectation(\"active\", false);\n  var peg$e16 = peg$literalExpectation(\"done\", false);\n  var peg$e17 = peg$literalExpectation(\"blocked\", false);\n  var peg$e18 = peg$literalExpectation(\"default\", false);\n  var peg$e19 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\", \"/\", \".\"], false, false);\n  var peg$e20 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"_\"], false, false);\n  var peg$e21 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e22 = peg$literalExpectation(\"note\", false);\n  var peg$e23 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e24 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e25 = peg$literalExpectation(\"at\", false);\n  var peg$e26 = peg$literalExpectation(\"offset\", false);\n  var peg$e27 = peg$literalExpectation(\",\", false);\n  var peg$e28 = peg$literalExpectation(\"-\", false);\n  var peg$e29 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e30 = peg$literalExpectation(\"legend\", false);\n  var peg$e31 = peg$literalExpectation(\"end\", false);\n  var peg$e32 = peg$literalExpectation(\"bottom-right\", false);\n  var peg$e33 = peg$literalExpectation(\"bottom-left\", false);\n  var peg$e34 = peg$literalExpectation(\"top-right\", false);\n  var peg$e35 = peg$literalExpectation(\"top-left\", false);\n  var peg$e36 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e37 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e38 = peg$literalExpectation(\"%%\", false);\n  var peg$e39 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e40 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e41 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n\n  var peg$f0 = function(fm, header, directives, body) {\n      closeSection();\n      const titleDir = directives.find(d => d && d.key === 'title');\n      const subtitleDir = directives.find(d => d && d.key === 'subtitle');\n      const themeDir = directives.find(d => d && d.key === 'theme');\n      const layoutDir = directives.find(d => d && d.key === 'layout');\n      return {\n        version:  '1.0',\n        metadata: {\n          ...(fm || {}),\n          ...(titleDir ? { title: titleDir.value } : {}),\n          ...(subtitleDir ? { subtitle: subtitleDir.value } : {}),\n          ...(themeDir ? { theme: themeDir.value } : {}),\n        },\n        layout:   layoutDir ? layoutDir.value : 'horizontal',\n        tracks:   tracks.size > 0 ? [...tracks.values()] : [{ id: 'default', label: 'Default' }],\n        activities, milestones,\n        sections: sections.length > 0 ? sections : undefined,\n        overlays,\n      };\n    };\n  var peg$f1 = function() { return 'timeline'; };\n  var peg$f2 = function(value) { return { key: 'title', value: value.trim() }; };\n  var peg$f3 = function(value) { return { key: 'subtitle', value: value.trim() }; };\n  var peg$f4 = function(value) { return { key: 'theme', value: value.trim() }; };\n  var peg$f5 = function() { return ext; };\n  var peg$f6 = function(key, value) { return { key, value: value.trim() }; };\n  var peg$f7 = function() { return ext; };\n  var peg$f8 = function(line) { return line; };\n  var peg$f9 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f10 = function(items) { return items.filter(Boolean); };\n  var peg$f11 = function(label) {\n      closeSection();\n      openSection(label.trim());\n      return null;\n    };\n  var peg$f12 = function(entry) { return entry; };\n  var peg$f13 = function(date, label) {\n      addActivity(date, null, label, 'default', null);\n      updateSectionDate(date);\n      return { type: 'activity', label };\n    };\n  var peg$f14 = function(text) { return text.trim(); };\n  var peg$f15 = function() { return ext; };\n  var peg$f16 = function(entry) { return entry; };\n  var peg$f17 = function(start, end, label, s) { return s; };\n  var peg$f18 = function(start, end, label, status, id) { return id; };\n  var peg$f19 = function(start, end, label, status, track, d) { return d; };\n  var peg$f20 = function(start, end, label, status, track, desc) {\n      addActivity(start, end, label, status, track, desc);\n      updateSectionDate(start);\n      updateSectionDate(end);\n      return { type: 'activity', label };\n    };\n  var peg$f21 = function(date, label, kind, id) { return id; };\n  var peg$f22 = function(date, label, kind, track, d) { return d; };\n  var peg$f23 = function(date, label, kind, track, desc) {\n      if (kind === 'milestone') addMilestone(date, label, track, desc);\n      else addActivity(date, null, label, kind, track, desc);\n      updateSectionDate(date);\n      return { type: kind === 'milestone' ? 'milestone' : 'activity', label };\n    };\n  var peg$f24 = function(text) { return text.trim(); };\n  var peg$f25 = function(text) { return text.trim(); };\n  var peg$f26 = function(text, target, offset) {\n      const note = { type: 'note', text, target, offset: offset || undefined };\n      overlays.push(note);\n      return note;\n    };\n  var peg$f27 = function(dx, dy) { return { dx, dy }; };\n  var peg$f28 = function(sign, digits) { return parseInt((sign || '') + digits, 10); };\n  var peg$f29 = function(corner, t) { return t; };\n  var peg$f30 = function(corner, title, entries) {\n      const legend = { type: 'legend', corner, title: title || undefined, entries };\n      overlays.push(legend);\n      return legend;\n    };\n  var peg$f31 = function(key, value) { return { key: key.trim(), value: value.trim() }; };\n  var peg$f32 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseExtFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parseHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parse_();\n      s5 = [];\n      s6 = peg$parseDirective();\n      while (s6 !== peg$FAILED) {\n        s5.push(s6);\n        s6 = peg$parseDirective();\n      }\n      s6 = peg$parse_();\n      s7 = peg$parseBody();\n      s8 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s5, s7);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHeader() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f1();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirective() {\n    var s0;\n\n    s0 = peg$parseExtDirective();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseMermaidDirective();\n    }\n\n    return s0;\n  }\n\n  function peg$parseMermaidDirective() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 5) === peg$c1) {\n      s2 = peg$c1;\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          s6 = peg$parseNL();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.substr(peg$currPos, 8) === peg$c2) {\n        s2 = peg$c2;\n        peg$currPos += 8;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = [];\n          s6 = input.charAt(peg$currPos);\n          if (peg$r0.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s6 !== peg$FAILED) {\n            while (s6 !== peg$FAILED) {\n              s5.push(s6);\n              s6 = input.charAt(peg$currPos);\n              if (peg$r0.test(s6)) {\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n          } else {\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = input.substring(s4, peg$currPos);\n          } else {\n            s4 = s5;\n          }\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            s6 = peg$parseNL();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f3(s4);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parse_();\n        if (input.substr(peg$currPos, 5) === peg$c3) {\n          s2 = peg$c3;\n          peg$currPos += 5;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parse__();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$currPos;\n            s5 = [];\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            if (s6 !== peg$FAILED) {\n              while (s6 !== peg$FAILED) {\n                s5.push(s6);\n                s6 = input.charAt(peg$currPos);\n                if (peg$r0.test(s6)) {\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                }\n              }\n            } else {\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s4 = input.substring(s4, peg$currPos);\n            } else {\n              s4 = s5;\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parse_();\n              s6 = peg$parseNL();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f4(s4);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtDirective() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    peg$savedPos = peg$currPos;\n    s1 = peg$f5();\n    if (s1) {\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.substr(peg$currPos, 6) === peg$c4) {\n        s3 = peg$c4;\n        peg$currPos += 6;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s3 === peg$FAILED) {\n        if (input.substr(peg$currPos, 8) === peg$c5) {\n          s3 = peg$c5;\n          peg$currPos += 8;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse__();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parse_();\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f6(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    peg$savedPos = peg$currPos;\n    s1 = peg$f7();\n    if (s1) {\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c6) {\n        s2 = peg$c6;\n        peg$currPos += 3;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseNL();\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          s5 = peg$currPos;\n          s6 = peg$currPos;\n          peg$silentFails++;\n          s7 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c6) {\n            s8 = peg$c6;\n            peg$currPos += 3;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parseNL();\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s7 === peg$FAILED) {\n            s6 = undefined;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$currPos;\n            s8 = [];\n            s9 = input.charAt(peg$currPos);\n            if (peg$r0.test(s9)) {\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = input.charAt(peg$currPos);\n              if (peg$r0.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s7 = input.substring(s7, peg$currPos);\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              peg$savedPos = s5;\n              s5 = peg$f8(s7);\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$currPos;\n            s6 = peg$currPos;\n            peg$silentFails++;\n            s7 = peg$currPos;\n            if (input.substr(peg$currPos, 3) === peg$c6) {\n              s8 = peg$c6;\n              peg$currPos += 3;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parseNL();\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            peg$silentFails--;\n            if (s7 === peg$FAILED) {\n              s6 = undefined;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$currPos;\n              s8 = [];\n              s9 = input.charAt(peg$currPos);\n              if (peg$r0.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n              while (s9 !== peg$FAILED) {\n                s8.push(s9);\n                s9 = input.charAt(peg$currPos);\n                if (peg$r0.test(s9)) {\n                  peg$currPos++;\n                } else {\n                  s9 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                }\n              }\n              s7 = input.substring(s7, peg$currPos);\n              s8 = peg$parseNL();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s5;\n                s5 = peg$f8(s7);\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          }\n          if (input.substr(peg$currPos, 3) === peg$c6) {\n            s5 = peg$c6;\n            peg$currPos += 3;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNL();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f9(s4);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBody() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseNoteDirective();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseLegendBlock();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseSectionHeader();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseEntry();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseNoteDirective();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseLegendBlock();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseSectionHeader();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseEntry();\n            if (s2 === peg$FAILED) {\n              s2 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f10(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseSectionHeader() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 7) === peg$c7) {\n      s2 = peg$c7;\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f11(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseExtEntry();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseMermaidEntry();\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseComment();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f12(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMermaidEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseDateToken();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c8;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseMermaidLabel();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f13(s1, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMermaidLabel() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r0.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseExtEntry() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    peg$savedPos = peg$currPos;\n    s1 = peg$f15();\n    if (s1) {\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseExtRangeActivity();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseExtPointEntry();\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f16(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtRangeActivity() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n    s0 = peg$currPos;\n    s1 = peg$parseDateToken();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.substr(peg$currPos, 2) === peg$c9) {\n        s3 = peg$c9;\n        peg$currPos += 2;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseDateToken();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s7 = peg$c8;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseExtLabel();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s12 = peg$c8;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e9); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseExtStatus();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f17(s1, s5, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = peg$currPos;\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s13 = peg$c10;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e11); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parseIdentifier();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s11;\n                  s11 = peg$f18(s1, s5, s9, s10, s14);\n                } else {\n                  peg$currPos = s11;\n                  s11 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n              if (s11 === peg$FAILED) {\n                s11 = null;\n              }\n              s12 = peg$currPos;\n              s13 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 124) {\n                s14 = peg$c11;\n                peg$currPos++;\n              } else {\n                s14 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e12); }\n              }\n              if (s14 !== peg$FAILED) {\n                s15 = peg$parse_();\n                s16 = peg$parseDescText();\n                if (s16 !== peg$FAILED) {\n                  peg$savedPos = s12;\n                  s12 = peg$f19(s1, s5, s9, s10, s11, s16);\n                } else {\n                  peg$currPos = s12;\n                  s12 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s12;\n                s12 = peg$FAILED;\n              }\n              if (s12 === peg$FAILED) {\n                s12 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f20(s1, s5, s9, s10, s11, s12);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtPointEntry() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;\n\n    s0 = peg$currPos;\n    s1 = peg$parseDateToken();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c8;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseExtLabel();\n        if (s5 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s6 = peg$c8;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            s8 = peg$parseExtEntryKind();\n            if (s8 !== peg$FAILED) {\n              s9 = peg$currPos;\n              s10 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s11 = peg$c10;\n                peg$currPos++;\n              } else {\n                s11 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e11); }\n              }\n              if (s11 !== peg$FAILED) {\n                s12 = peg$parseIdentifier();\n                if (s12 !== peg$FAILED) {\n                  peg$savedPos = s9;\n                  s9 = peg$f21(s1, s5, s8, s12);\n                } else {\n                  peg$currPos = s9;\n                  s9 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n              if (s9 === peg$FAILED) {\n                s9 = null;\n              }\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 124) {\n                s12 = peg$c11;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e12); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseDescText();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f22(s1, s5, s8, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f23(s1, s5, s8, s9, s10);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtLabel() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r1.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f24(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseDescText() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r0.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f25(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseExtEntryKind() {\n    var s0;\n\n    if (input.substr(peg$currPos, 9) === peg$c12) {\n      s0 = peg$c12;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseExtStatus();\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtStatus() {\n    var s0;\n\n    if (input.substr(peg$currPos, 6) === peg$c13) {\n      s0 = peg$c13;\n      peg$currPos += 6;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c14) {\n        s0 = peg$c14;\n        peg$currPos += 4;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 7) === peg$c15) {\n          s0 = peg$c15;\n          peg$currPos += 7;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 7) === peg$c16) {\n            s0 = peg$c16;\n            peg$currPos += 7;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e18); }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseDateToken() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e19); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdentifier() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r4.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r4.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteDirective() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c17) {\n      s2 = peg$c17;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 34) {\n          s4 = peg$c18;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r5.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e24); }\n          }\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r5.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e24); }\n            }\n          }\n          s5 = input.substring(s5, peg$currPos);\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s6 = peg$c18;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e23); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse__();\n            if (s7 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c19) {\n                s8 = peg$c19;\n                peg$currPos += 2;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e25); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parse__();\n                if (s9 !== peg$FAILED) {\n                  s10 = peg$currPos;\n                  s11 = [];\n                  s12 = input.charAt(peg$currPos);\n                  if (peg$r2.test(s12)) {\n                    peg$currPos++;\n                  } else {\n                    s12 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                  }\n                  if (s12 !== peg$FAILED) {\n                    while (s12 !== peg$FAILED) {\n                      s11.push(s12);\n                      s12 = input.charAt(peg$currPos);\n                      if (peg$r2.test(s12)) {\n                        peg$currPos++;\n                      } else {\n                        s12 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                      }\n                    }\n                  } else {\n                    s11 = peg$FAILED;\n                  }\n                  if (s11 !== peg$FAILED) {\n                    s10 = input.substring(s10, peg$currPos);\n                  } else {\n                    s10 = s11;\n                  }\n                  if (s10 !== peg$FAILED) {\n                    s11 = peg$parseNoteOffset();\n                    if (s11 === peg$FAILED) {\n                      s11 = null;\n                    }\n                    s12 = peg$parse_();\n                    s13 = peg$parseComment();\n                    if (s13 === peg$FAILED) {\n                      s13 = null;\n                    }\n                    s14 = peg$parseNL();\n                    if (s14 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f26(s5, s10, s11);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteOffset() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c20) {\n        s2 = peg$c20;\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseSignedInt();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s6 = peg$c21;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e27); }\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              s8 = peg$parseSignedInt();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f27(s4, s8);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSignedInt() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s1 = peg$c22;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r6.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r6.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e29); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f28(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 6) === peg$c23) {\n      s2 = peg$c23;\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e30); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseLegendCornerToken();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s7 = peg$c18;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e23); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$currPos;\n            s9 = [];\n            s10 = input.charAt(peg$currPos);\n            if (peg$r5.test(s10)) {\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e24); }\n            }\n            while (s10 !== peg$FAILED) {\n              s9.push(s10);\n              s10 = input.charAt(peg$currPos);\n              if (peg$r5.test(s10)) {\n                peg$currPos++;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e24); }\n              }\n            }\n            s8 = input.substring(s8, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 34) {\n              s9 = peg$c18;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e23); }\n            }\n            if (s9 !== peg$FAILED) {\n              peg$savedPos = s5;\n              s5 = peg$f29(s4, s8);\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parse_();\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            s8 = [];\n            s9 = peg$parseLegendEntryLine();\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = peg$parseLegendEntryLine();\n            }\n            s9 = peg$parse_();\n            if (input.substr(peg$currPos, 3) === peg$c24) {\n              s10 = peg$c24;\n              peg$currPos += 3;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e31); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseNL();\n              if (s12 === peg$FAILED) {\n                s12 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f30(s4, s5, s8);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendCornerToken() {\n    var s0;\n\n    if (input.substr(peg$currPos, 12) === peg$c25) {\n      s0 = peg$c25;\n      peg$currPos += 12;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 11) === peg$c26) {\n        s0 = peg$c26;\n        peg$currPos += 11;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e33); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 9) === peg$c27) {\n          s0 = peg$c27;\n          peg$currPos += 9;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e34); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 8) === peg$c28) {\n            s0 = peg$c28;\n            peg$currPos += 8;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e35); }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendEntryLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    s3 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c24) {\n      s4 = peg$c24;\n      peg$currPos += 3;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = input.charAt(peg$currPos);\n      if (peg$r7.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e36); }\n      }\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r8.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e37); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r8.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e37); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c8;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNL();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f31(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f32();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c29) {\n      s1 = peg$c29;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e38); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r9.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r9.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e39); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r9.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r9.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c30) {\n      s0 = peg$c30;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e40); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r10.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e41); }\n      }\n    }\n\n    return s0;\n  }\n\n\n  reset();\n  const ext = options.extensions !== false;\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult, LayoutOptions } from '../../../contracts/index.js';\nimport type { TimelineDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutTimeline } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { TimelineDocument, Track, Activity, Milestone, Section, TimelineLayout, ActivityStatus } from './ir.js';\n\n/** Parse in strict Mermaid-compatible mode \u2014 extension syntax throws. */\nexport function parseMermaidStrict(input: string): TimelineDocument {\n  return parser.parse(input, { extensions: false }) as TimelineDocument;\n}\n\nexport const timeline: DiagramModule<TimelineDocument> = {\n  parseMermaid(input: string): TimelineDocument {\n    const raw = parser.parse(input, { extensions: true }) as any;\n    return {\n      ...raw,\n      overlays: raw.overlays?.length > 0 ? raw.overlays : undefined,\n    };\n  },\n\n  parseYaml(input: string): TimelineDocument {\n    // TODO: replace with schema validation\n    return JSON.parse(input) as TimelineDocument;\n  },\n\n  layout(ir: TimelineDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutTimeline(ir, theme);\n  },\n};\n", "/**\n * Cross-Link Rendering\n *\n * Converts resolved cross-links into SceneElements (paths + labels)\n * that are layered on top of the poster's cell elements.\n *\n * Routes use the orthogonal router with port-direction hints from the\n * resolved link's fromSide/toSide.\n */\n\nimport type { SceneElement } from '../contracts/scene.js';\nimport { isRenderedConnectorAnimation, type ResolvedCrossLink, type CrossLinkEdgeStyle, type RenderedConnectorAnimation } from '../contracts/crosslink.js';\nimport type { CardinalSide, NodeAnchorRegistry } from '../contracts/anchors.js';\nimport type { PortDirection, RouteStyle } from '../contracts/routing.js';\nimport type { Point, Rect } from '../contracts/primitives.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { getRouter } from '../routing/registry.js';\nimport { defaultRouter, createRouter } from '../routing/router.js';\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CrossLinkRenderResult {\n  /** SVG defs needed (e.g. arrowhead markers for cross-links). */\n  readonly defs: string[];\n  /** Scene elements: paths, labels, grouped per link. */\n  readonly elements: SceneElement[];\n}\n\nconst CROSSLINK_ARROW_ID = 'triton-crosslink-arrow';\nconst CROSSLINK_ARROW_BOTH_ID = 'triton-crosslink-arrow-both';\n\n/**\n * Render resolved cross-links into scene elements.\n *\n * @param resolved \u2014 links with resolved port positions in poster space\n * @param theme   \u2014 for styling (colours, fonts, stroke widths)\n * @param anchors \u2014 full anchor registry for obstacle avoidance\n * @param occupiedRects \u2014 bounding boxes of existing text/elements that labels must avoid\n * @param routingObstacles \u2014 additional thin obstacles (cell borders) for the router to avoid\n */\n/**\n * Amount (px) by which intermediate-cell rectangles are shrunk on each side\n * before being used as routing obstacles. Must match the router\u2019s padding\n * so that effective corridor width (gap + 2\u00D7SHRINK \u2212 2\u00D7padding) leaves room.\n */\nconst CELL_SHRINK = 12;\n\nexport function renderCrossLinks(\n  resolved: readonly ResolvedCrossLink[],\n  theme: ResolvedTheme,\n  anchors?: NodeAnchorRegistry,\n  occupiedRects?: readonly Rect[],\n  routingObstacles?: readonly Rect[],\n  cellRects?: ReadonlyMap<string, Rect>,\n): CrossLinkRenderResult {\n  const { palette, typography, edges: edgeTheme } = theme;\n  const elements: SceneElement[] = [];\n  const defs: string[] = [];\n  let needsArrow = false;\n  let needsBiArrow = false;\n\n  // Extract obstacles from the anchor registry (all node bounds)\n  // Note: cell borders are handled separately in post-route nudging, not as generic obstacles\n  const obstacles: Rect[] = [];\n  if (anchors) {\n    for (const anchor of Object.values(anchors)) {\n      obstacles.push(anchor.bounds);\n    }\n  }\n\n  // Assign distinct colours to explicit links\n  const categoricalPalette = [\n    '#E11D48', '#16A34A', '#9333EA', '#0891B2',\n    '#CA8A04', '#DC2626', '#2563EB', '#7C3AED',\n  ];\n  let explicitColorIdx = 0;\n\n  // Collect labels for de-collision pass after all routes are computed\n  const pendingLabels: Array<{\n    content: string; x: number; y: number;\n    fontSize: number; fontFamily: string; fill: string;\n    anchor: 'middle'; fontWeight: 'bold';\n  }> = [];\n\n  // Phase 1: Compute all routes\n  const pendingRoutes: PendingRoute[] = [];\n\n  for (const rLink of resolved) {\n    const { link, fromPort, toPort, fromSide, toSide } = rLink;\n\n    let color: string;\n    {\n      color = categoricalPalette[explicitColorIdx % categoricalPalette.length]!;\n      explicitColorIdx++;\n    }\n\n    const fromDir = sideToPortDir(fromSide);\n    const toDir   = sideToPortDir(toSide);\n    const routeStyle: RouteStyle = link.routing ?? 'orthogonal';\n    const router  = getRouter(routeStyle) ?? createRouter(routeStyle);\n    const tension = link.props?.tension as number | undefined;\n\n    // Build per-link obstacles: all node bounds + shrunken intermediate-cell\n    // rects. Intermediate cells (neither source nor target) are shrunk inward\n    // by CELL_SHRINK so routes travel through inter-cell corridors instead of\n    // cutting through other cells\u2019 content areas. Source/target cells are\n    // excluded so routes can freely exit/enter through their own cell\u2019s space.\n    let linkObstacles: Rect[] = obstacles;\n    if (cellRects) {\n      const srcId = link.from.cellPath.join('.');\n      const dstId = link.to.cellPath.join('.');\n      const extra: Rect[] = [];\n      for (const [cellId, r] of cellRects) {\n        if (cellId === srcId || cellId === dstId) continue;\n        const sw = r.width  - 2 * CELL_SHRINK;\n        const sh = r.height - 2 * CELL_SHRINK;\n        if (sw > 0 && sh > 0) {\n          extra.push({ x: r.x + CELL_SHRINK, y: r.y + CELL_SHRINK, width: sw, height: sh });\n        }\n      }\n      if (extra.length > 0) linkObstacles = [...obstacles, ...extra];\n    }\n\n    const route   = router.route({\n      from: fromPort,\n      to: toPort,\n      style: routeStyle,\n      obstacles: linkObstacles,\n      padding: 12,\n      fromDir,\n      toDir,\n      ...(tension != null ? { tension } : {}),\n    });\n\n    const dash = edgeStyleToDash(link.style);\n    // Animation: explicit DSL value only. All styles are STATIC by default.\n    // Motion requires explicit @anim:<name> or { anim: <name> }.\n    const animation: RenderedConnectorAnimation | undefined =\n      link.animation === 'none'     ? undefined :\n      isRenderedConnectorAnimation(link.animation) ? link.animation :\n      undefined;\n    let markerEnd: string | undefined;\n    let markerStart: string | undefined;\n    if (link.direction === 'directed') {\n      markerEnd = CROSSLINK_ARROW_ID;\n      needsArrow = true;\n    } else if (link.direction === 'bidirectional') {\n      markerEnd = CROSSLINK_ARROW_ID;\n      markerStart = CROSSLINK_ARROW_BOTH_ID;\n      needsArrow = true;\n      needsBiArrow = true;\n    }\n\n    const strokeWidth = link.style === 'thick'\n      ? (edgeTheme.strokeWidth + 0.5) * 2\n      : (edgeTheme.strokeWidth + 0.5);\n    const isWavy = link.style === 'wavy';\n    const wavyAmplitude  = (link.props?.amplitude  as number | undefined) ?? 3;\n    const wavyWavelength = (link.props?.wavelength as number | undefined) ?? 12;\n\n    pendingRoutes.push({\n      points: route.points,\n      routePath: routeStyle !== 'orthogonal' ? route.path : undefined,\n      routing: routeStyle,\n      fromDir,\n      toDir,\n      color,\n      dash,\n      strokeWidth,\n      isWavy,\n      wavyAmplitude,\n      wavyWavelength,\n      animation,\n      markerEnd,\n      markerStart,\n      label: link.label,\n    });\n  }\n\n  // Phase 2: Deflect straight routes that cross other routes\n  deflectCrossingStraightRoutes(pendingRoutes, obstacles);\n\n  // Phase 3: Nudge segments away from cell borders (orthogonal routes only)\n  if (routingObstacles && routingObstacles.length > 0) {\n    const orthoRoutes = pendingRoutes.filter(r => r.routing === 'orthogonal');\n    nudgeOffBorders(orthoRoutes, routingObstacles);\n  }\n\n  // Phase 4a: Bezier separation \u2014 fan apart or fall back crossing beziers to orthogonal\n  // Runs BEFORE channel separation so any new orthogonal routes get included.\n  const CHANNEL_GAP = 12;\n  separateBezierCurves(pendingRoutes.filter(r => r.routing === 'bezier'), CHANNEL_GAP, obstacles, pendingRoutes);\n\n  // Phase 4b: Channel separation \u2014 offset overlapping parallel segments (all orthogonal, including fallbacks)\n  separateOverlappingChannels(pendingRoutes.filter(r => r.routing === 'orthogonal'), CHANNEL_GAP);\n\n  // \u2500\u2500\u2500 Label position staggering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Routes sharing the same corridor (same dominant-segment axis + close coord)\n  // would all land their labels at the same midpoint.  Distribute positions\n  // evenly along the route: 1/(n+1), 2/(n+1), \u2026, n/(n+1).\n  const CORRIDOR_TOL = 20; // px \u2014 routes within this band share a corridor\n  const labelFractions = new Array<number>(pendingRoutes.length).fill(0.5);\n  const labeledIndices = pendingRoutes.map((pr, i) => pr.label ? i : -1).filter(i => i >= 0);\n  const staggerAssigned = new Set<number>();\n\n  for (const i of labeledIndices) {\n    if (staggerAssigned.has(i)) continue;\n    const infoI = dominantSegmentInfo(pendingRoutes[i]!.points);\n    const group = [i];\n    for (const j of labeledIndices) {\n      if (j === i || staggerAssigned.has(j)) continue;\n      const infoJ = dominantSegmentInfo(pendingRoutes[j]!.points);\n      if (infoI.axis === infoJ.axis && Math.abs(infoI.coord - infoJ.coord) < CORRIDOR_TOL) {\n        group.push(j);\n      }\n    }\n    if (group.length > 1) {\n      group.sort((a, b) => a - b); // consistent ordering by route index\n      const n = group.length;\n      group.forEach((idx, k) => { labelFractions[idx] = (k + 1) / (n + 1); });\n      group.forEach(idx => staggerAssigned.add(idx));\n    }\n  }\n\n  // Phase 5: Emit path elements and collect labels\n  for (let prIdx = 0; prIdx < pendingRoutes.length; prIdx++) {\n    const pr = pendingRoutes[prIdx]!;\n    // Bezier/straight routes use the router's SVG path; orthogonal rebuilds from points\n    let path = pr.routePath ?? pr.points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n\n    // Wavy style: displace path geometry with a sine wave\n    if (pr.isWavy) {\n      path = wavifyPath([...pr.points], pr.wavyAmplitude, pr.wavyWavelength);\n    }\n\n    const pathEl: SceneElement = {\n      type: 'path',\n      d: path,\n      stroke: pr.color,\n      strokeWidth: pr.strokeWidth,\n      ...(pr.dash      ? { strokeDasharray: pr.dash }     : {}),\n      ...(pr.animation ? { animated: pr.animation }       : {}),\n      ...(pr.markerEnd   ? { markerEnd: pr.markerEnd }   : {}),\n      ...(pr.markerStart ? { markerStart: pr.markerStart } : {}),\n    };\n    elements.push(pathEl);\n\n    if (pr.label) {\n      const labelPos = pointAtFraction(pr.points, labelFractions[prIdx] ?? 0.5);\n      pendingLabels.push({\n        content: pr.label,\n        x: labelPos.x,\n        y: labelPos.y - 6,\n        fontSize: edgeTheme.labelFontSize,\n        fontFamily: typography.fontFamily,\n        fill: pr.color,\n        anchor: 'middle' as const,\n        fontWeight: 'bold' as const,\n      });\n    }\n  }\n\n  // \u2500\u2500\u2500 Label de-collision pass \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Estimate label bounding boxes, resolve overlaps against fixed rects + siblings\n  const CHAR_WIDTH_FACTOR = 0.65; // approximate character width / font size\n  const LABEL_PAD = 4;\n\n  // Fixed obstacles: node bounds + caller-provided occupied rects (cell titles, poster title)\n  const fixedRects: Rect[] = [...obstacles, ...(occupiedRects ?? [])];\n\n  // Estimate bounding rect for each label (centered at anchor='middle')\n  const labelRects: Rect[] = pendingLabels.map(l => {\n    const w = l.content.length * l.fontSize * CHAR_WIDTH_FACTOR + LABEL_PAD * 2;\n    const h = l.fontSize + LABEL_PAD * 2;\n    return { x: l.x - w / 2, y: l.y - h + LABEL_PAD, width: w, height: h };\n  });\n\n  // Iteratively push overlapping labels vertically\n  deCollideLabels(labelRects, fixedRects);\n\n  // Emit labels at de-collided positions\n  for (let i = 0; i < pendingLabels.length; i++) {\n    const l = pendingLabels[i]!;\n    const r = labelRects[i]!;\n    // Recover center position from adjusted rect\n    const finalX = r.x + r.width / 2;\n    const finalY = r.y + r.height - LABEL_PAD;\n    elements.push({\n      type: 'text',\n      content: l.content,\n      position: { x: finalX, y: finalY },\n      fontSize: l.fontSize,\n      fontFamily: l.fontFamily,\n      fill: l.fill,\n      anchor: l.anchor,\n      fontWeight: l.fontWeight,\n    });\n  }\n\n  // Build defs\n  if (needsArrow) {\n    const s = edgeTheme.arrowSize;\n    defs.push(\n      `<marker id=\"${CROSSLINK_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${s * 0.7}\" refX=\"${s - 1}\" refY=\"${s * 0.35}\" orient=\"auto\"><polygon points=\"0 0, ${s} ${s * 0.35}, 0 ${s * 0.7}\" fill=\"currentColor\" /></marker>`,\n    );\n  }\n  if (needsBiArrow) {\n    const s = edgeTheme.arrowSize;\n    defs.push(\n      `<marker id=\"${CROSSLINK_ARROW_BOTH_ID}\" markerWidth=\"${s}\" markerHeight=\"${s * 0.7}\" refX=\"1\" refY=\"${s * 0.35}\" orient=\"auto\"><polygon points=\"${s} 0, 0 ${s * 0.35}, ${s} ${s * 0.7}\" fill=\"currentColor\" /></marker>`,\n    );\n  }\n\n  return { defs, elements };\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction sideToPortDir(side: CardinalSide): PortDirection {\n  return side; // CardinalSide and PortDirection use same values\n}\n\nfunction edgeStyleToDash(style: CrossLinkEdgeStyle): string | undefined {\n  switch (style) {\n    case 'dotted': return '4 3';\n    case 'dashed': return '8 4';\n    case 'solid':  return undefined;\n    case 'thick':  return undefined;  // thick uses stroke-width bump, not dasharray\n    case 'wavy':   return undefined;  // wavy uses path displacement, not dasharray\n  }\n}\n\n/** Find the midpoint of the longest segment in a polyline. */\nfunction longestSegmentMidpoint(points: readonly Point[]): Point {\n  let bestLen = 0;\n  let bestMid: Point = points[0]!;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!, b = points[i + 1]!;\n    const len = Math.abs(b.x - a.x) + Math.abs(b.y - a.y); // Manhattan length for ortho\n    if (len > bestLen) {\n      bestLen = len;\n      bestMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n  }\n  return bestMid;\n}\n\n/**\n * Returns the axis ('h'|'v') and fixed coordinate of the longest segment\n * in a polyline \u2014 used to group routes sharing the same corridor.\n */\nfunction dominantSegmentInfo(points: readonly Point[]): { axis: 'h' | 'v'; coord: number } {\n  let bestLen = 0, axis: 'h' | 'v' = 'h', coord = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!, b = points[i + 1]!;\n    const dx = Math.abs(b.x - a.x), dy = Math.abs(b.y - a.y);\n    const len = dx + dy;\n    if (len > bestLen) {\n      bestLen = len;\n      if (dy > dx) { axis = 'v'; coord = (a.x + b.x) / 2; }\n      else          { axis = 'h'; coord = (a.y + b.y) / 2; }\n    }\n  }\n  return { axis, coord };\n}\n\n/**\n * Returns the point at fraction t (0..1) of total Euclidean path length.\n */\nfunction pointAtFraction(points: readonly Point[], t: number): Point {\n  if (points.length === 0) return { x: 0, y: 0 };\n  if (points.length === 1) return points[0]!;\n  const lengths: number[] = [];\n  let total = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!, b = points[i + 1]!;\n    const len = Math.hypot(b.x - a.x, b.y - a.y);\n    lengths.push(len);\n    total += len;\n  }\n  if (total === 0) return points[0]!;\n  const target = total * Math.min(Math.max(t, 0), 1);\n  let acc = 0;\n  for (let i = 0; i < lengths.length; i++) {\n    const l = lengths[i]!;\n    if (acc + l >= target) {\n      const frac = l > 0 ? (target - acc) / l : 0;\n      const a = points[i]!, b = points[i + 1]!;\n      return { x: a.x + (b.x - a.x) * frac, y: a.y + (b.y - a.y) * frac };\n    }\n    acc += l;\n  }\n  return points[points.length - 1]!;\n}\n\n/**\n * De-collide label rectangles by pushing them away from fixed obstacles and\n * from each other in the direction of minimum overlap (MTV approach).\n * Horizontal push is used when horizontal overlap is smaller than vertical \u2014\n * this avoids vertical stacking when labels share the same route corridor.\n * Mutates labelRects in place.\n */\nfunction deCollideLabels(labelRects: Array<{ x: number; y: number; width: number; height: number }>, fixedRects: readonly Rect[]): void {\n  const MAX_PASSES = 20;\n  const NUDGE = 2;\n\n  for (let pass = 0; pass < MAX_PASSES; pass++) {\n    let moved = false;\n\n    // Push labels away from fixed rects\n    for (const lr of labelRects) {\n      for (const fr of fixedRects) {\n        if (!rectsOverlap(lr, fr)) continue;\n        const ox = Math.min(lr.x + lr.width, fr.x + fr.width) - Math.max(lr.x, fr.x);\n        const oy = Math.min(lr.y + lr.height, fr.y + fr.height) - Math.max(lr.y, fr.y);\n        if (ox <= oy) {\n          // Horizontal push \u2014 less movement\n          const lCX = lr.x + lr.width / 2;\n          const fCX = fr.x + fr.width / 2;\n          lr.x = lCX <= fCX ? fr.x - lr.width - NUDGE : fr.x + fr.width + NUDGE;\n        } else {\n          // Vertical push\n          const lCY = lr.y + lr.height / 2;\n          const fCY = fr.y + fr.height / 2;\n          lr.y = lCY <= fCY ? fr.y - lr.height - NUDGE : fr.y + fr.height + NUDGE;\n        }\n        moved = true;\n      }\n    }\n\n    // Push labels away from each other\n    for (let i = 0; i < labelRects.length; i++) {\n      for (let j = i + 1; j < labelRects.length; j++) {\n        const a = labelRects[i]!, b = labelRects[j]!;\n        if (!rectsOverlap(a, b)) continue;\n        const ox = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);\n        const oy = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n        if (ox <= oy) {\n          // Push horizontally \u2014 shared-corridor case\n          const aCX = a.x + a.width / 2;\n          const bCX = b.x + b.width / 2;\n          if (aCX <= bCX) { a.x -= ox / 2; b.x += ox / 2; }\n          else             { a.x += ox / 2; b.x -= ox / 2; }\n        } else {\n          // Push vertically\n          const aCY = a.y + a.height / 2;\n          const bCY = b.y + b.height / 2;\n          if (aCY <= bCY) {\n            const overlap = (a.y + a.height) - b.y;\n            a.y -= (overlap + NUDGE) / 2;\n            b.y += (overlap + NUDGE) / 2;\n          } else {\n            const overlap = (b.y + b.height) - a.y;\n            b.y -= (overlap + NUDGE) / 2;\n            a.y += (overlap + NUDGE) / 2;\n          }\n        }\n        moved = true;\n      }\n    }\n\n    if (!moved) break;\n  }\n}\n\nfunction rectsOverlap(a: Rect, b: Rect): boolean {\n  return a.x < b.x + b.width && a.x + a.width > b.x &&\n         a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n// \u2500\u2500\u2500 Straight Route Crossing Deflection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Post-route pass: detect straight routes whose segments cross other routes,\n * and deflect them by inserting a perpendicular waypoint.\n *\n * This handles the case where a straight line doesn't hit any node bounding box\n * but still visually crosses other connector paths.\n */\nfunction deflectCrossingStraightRoutes(routes: PendingRoute[], obstacles: readonly Rect[]): void {\n  const straightRoutes = routes.filter(r => r.routing === 'straight');\n  if (straightRoutes.length === 0) return;\n\n  // Collect all segments from OTHER routes for crossing checks.\n  // For bezier routes, sample the curve into a polyline (control points aren't line segments).\n  const BEZIER_SAMPLES = 16;\n  const otherSegments: Array<[Point, Point]> = [];\n  for (const r of routes) {\n    if (r.routing === 'bezier') {\n      const pts = r.points;\n      if (pts.length >= 4) {\n        const samples = sampleBezierToPolyline(pts[0]!, pts[1]!, pts[2]!, pts[3]!, BEZIER_SAMPLES);\n        for (let i = 0; i < samples.length - 1; i++) {\n          otherSegments.push([samples[i]!, samples[i + 1]!]);\n        }\n      }\n    } else {\n      const pts = r.points;\n      for (let i = 0; i < pts.length - 1; i++) {\n        otherSegments.push([pts[i]!, pts[i + 1]!]);\n      }\n    }\n  }\n\n  for (const sr of straightRoutes) {\n    const pts = sr.points as Point[];\n    if (pts.length !== 2) continue;\n\n    const from = pts[0]!, to = pts[1]!;\n    const dx = to.x - from.x, dy = to.y - from.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    if (len < 30) continue;\n\n    // Check if this straight line crosses any other route segment\n    const segsExcludingSelf = otherSegments.filter(\n      ([a, b]) => !(a === from && b === to),\n    );\n    const originalCrossings = segsExcludingSelf.filter(\n      ([a, b]) => straightSegmentsIntersect(from, to, a, b),\n    ).length;\n    if (originalCrossings === 0) continue;\n\n    // Try perpendicular waypoints at increasing offsets\n    const perpX = -dy / len, perpY = dx / len;\n    const mid: Point = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n\n    let bestWp: Point | null = null;\n    let bestCrossings = Infinity;\n\n    for (let offset = len * 0.08; offset <= len * 0.5; offset += len * 0.06) {\n      for (const sign of [1, -1]) {\n        const wp: Point = { x: mid.x + perpX * offset * sign, y: mid.y + perpY * offset * sign };\n\n        let hitsNode = false;\n        for (const obs of obstacles) {\n          if (segIntersectsRectInterior(from, wp, obs) || segIntersectsRectInterior(wp, to, obs)) {\n            hitsNode = true;\n            break;\n          }\n        }\n        if (hitsNode) continue;\n\n        let crossings = 0;\n        for (const [a, b] of segsExcludingSelf) {\n          if (straightSegmentsIntersect(from, wp, a, b)) crossings++;\n          if (straightSegmentsIntersect(wp, to, a, b)) crossings++;\n        }\n        if (crossings < bestCrossings) {\n          bestCrossings = crossings;\n          bestWp = wp;\n          if (crossings === 0) break;\n        }\n      }\n      if (bestCrossings === 0) break;\n    }\n\n    if (bestWp && bestCrossings < originalCrossings) {\n      (sr.points as Point[]).splice(1, 0, bestWp);\n      sr.routePath = sr.points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n    } else {\n      // Deflection failed \u2014 fall back to orthogonal routing for this link.\n      // This prevents ugly diagonal lines that cross everything.\n      const orthoRouter = createRouter('orthogonal');\n      const route = orthoRouter.route({\n        from, to,\n        style: 'orthogonal',\n        obstacles,\n        padding: 12,\n        ...(sr.fromDir ? { fromDir: sr.fromDir } : {}),\n        ...(sr.toDir ? { toDir: sr.toDir } : {}),\n      });\n      (sr as any).points = [...route.points];\n      sr.routePath = undefined; // let Phase 5 rebuild from points\n      sr.routing = 'orthogonal' as RouteStyle; // so post-route passes treat it correctly\n    }\n  }\n}\n\n/** Sample a cubic bezier [from, cp1, cp2, to] into a polyline of n+1 points. */\nfunction sampleBezierToPolyline(p0: Point, p1: Point, p2: Point, p3: Point, n: number): Point[] {\n  const pts: Point[] = [];\n  for (let i = 0; i <= n; i++) {\n    const t = i / n;\n    const u = 1 - t;\n    pts.push({\n      x: u*u*u*p0.x + 3*u*u*t*p1.x + 3*u*t*t*p2.x + t*t*t*p3.x,\n      y: u*u*u*p0.y + 3*u*u*t*p1.y + 3*u*t*t*p2.y + t*t*t*p3.y,\n    });\n  }\n  return pts;\n}\n\n/** Check if two segments properly cross (not just touch). */\nfunction straightSegmentsIntersect(p1: Point, p2: Point, p3: Point, p4: Point): boolean {\n  const d1 = crossProduct(p3, p4, p1);\n  const d2 = crossProduct(p3, p4, p2);\n  const d3 = crossProduct(p1, p2, p3);\n  const d4 = crossProduct(p1, p2, p4);\n  return ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&\n         ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0));\n}\n\nfunction crossProduct(a: Point, b: Point, c: Point): number {\n  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/** Check if a line segment crosses the interior of a rectangle (Liang-Barsky). */\nfunction segIntersectsRectInterior(p1: Point, p2: Point, r: Rect): boolean {\n  const dx = p2.x - p1.x, dy = p2.y - p1.y;\n  let tmin = 0, tmax = 1;\n  const edges = [\n    { p: -dx, q: p1.x - r.x },\n    { p: dx, q: r.x + r.width - p1.x },\n    { p: -dy, q: p1.y - r.y },\n    { p: dy, q: r.y + r.height - p1.y },\n  ];\n  for (const { p, q } of edges) {\n    if (Math.abs(p) < 1e-10) { if (q <= 0) return false; }\n    else {\n      const t = q / p;\n      if (p < 0) tmin = Math.max(tmin, t);\n      else tmax = Math.min(tmax, t);\n      if (tmin >= tmax) return false;\n    }\n  }\n  return tmin < tmax;\n}\n\n// \u2500\u2500\u2500 Bezier Separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Fan apart bezier curves that share endpoints or cross each other.\n *\n * The BezierRouter stores points as [from, cp1, cp2, to].\n *\n * Phase A: Shared-endpoint fan-out \u2014 when multiple curves converge on\n *   the same endpoint, offset each curve's nearby control point perpendicular\n *   to the from\u2192to axis so they fan apart.\n *\n * Phase B: Crossing resolution \u2014 for every pair of bezier curves, sample both\n *   and detect segment crossings. If they cross, offset both curves' control\n *   points to opposite sides of their respective from\u2192to axes.\n */\nfunction separateBezierCurves(routes: PendingRoute[], gap: number, obstacles: readonly Rect[], allRoutes: PendingRoute[]): void {\n  if (routes.length < 2) return;\n\n  const PROXIMITY = 20;\n\n  // \u2500\u2500 Phase A: shared-endpoint fan-out \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  type EndGroup = { routes: PendingRoute[]; end: 'from' | 'to' };\n  const groups: EndGroup[] = [];\n\n  const fromGroups = clusterByEndpoint(routes, 'from', PROXIMITY);\n  for (const cluster of fromGroups) {\n    if (cluster.length > 1) groups.push({ routes: cluster, end: 'from' });\n  }\n\n  const toGroups = clusterByEndpoint(routes, 'to', PROXIMITY);\n  for (const cluster of toGroups) {\n    if (cluster.length > 1) groups.push({ routes: cluster, end: 'to' });\n  }\n\n  for (const group of groups) {\n    const n = group.routes.length;\n    for (let i = 0; i < n; i++) {\n      const pr = group.routes[i]!;\n      const pts = pr.points as Point[];\n      if (pts.length < 4) continue;\n\n      const from = pts[0]!, to = pts[pts.length - 1]!;\n      const dx = to.x - from.x, dy = to.y - from.y;\n      const len = Math.sqrt(dx * dx + dy * dy);\n      if (len < 1) continue;\n\n      const perpX = -dy / len, perpY = dx / len;\n      const offset = (i - (n - 1) / 2) * gap;\n\n      if (group.end === 'from') {\n        pts[1] = { x: pts[1]!.x + perpX * offset, y: pts[1]!.y + perpY * offset };\n      } else {\n        pts[pts.length - 2] = {\n          x: pts[pts.length - 2]!.x + perpX * offset,\n          y: pts[pts.length - 2]!.y + perpY * offset,\n        };\n      }\n\n      rebuildBezierPath(pr);\n    }\n  }\n\n  // \u2500\u2500 Phase B: crossing resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // When two beziers cross, try offsetting one curve perpendicular to\n  // separate them. If no offset resolves the crossing (e.g. endpoints form\n  // an X pattern), fall back one curve to orthogonal routing.\n\n  const SAMPLES = 40;\n\n  for (let i = 0; i < routes.length; i++) {\n    for (let j = i + 1; j < routes.length; j++) {\n      const ri = routes[i]!, rj = routes[j]!;\n      const ptsI = ri.points as Point[];\n      const ptsJ = rj.points as Point[];\n      if (ptsI.length < 4 || ptsJ.length < 4) continue;\n\n      const sampI = sampleBezierCurve(ptsI[0]!, ptsI[1]!, ptsI[2]!, ptsI[3]!, SAMPLES);\n      const sampJ = sampleBezierCurve(ptsJ[0]!, ptsJ[1]!, ptsJ[2]!, ptsJ[3]!, SAMPLES);\n      if (!polylinesIntersect(sampI, sampJ)) continue;\n\n      // Compute perpendicular for each curve\n      const perpOf = (pts: Point[]) => {\n        const dx = pts[3]!.x - pts[0]!.x, dy = pts[3]!.y - pts[0]!.y;\n        const len = Math.sqrt(dx * dx + dy * dy);\n        return len < 1 ? null : { px: -dy / len, py: dx / len, len };\n      };\n      const pI = perpOf(ptsI), pJ = perpOf(ptsJ);\n      if (!pI || !pJ) continue;\n\n      const origI1 = { ...ptsI[1]! }, origI2 = { ...ptsI[2]! };\n      const origJ1 = { ...ptsJ[1]! }, origJ2 = { ...ptsJ[2]! };\n\n      // Try offsetting one curve at a time, in both directions\n      type Solution = { moveRoute: 'I' | 'J'; off: number; px: number; py: number };\n      let best: Solution | null = null;\n      const stepSize = Math.max(gap * 3, 15);\n\n      for (const moveRoute of ['I', 'J'] as const) {\n        const p = moveRoute === 'I' ? pI : pJ;\n        const pts = moveRoute === 'I' ? ptsI : ptsJ;\n        const orig1 = moveRoute === 'I' ? origI1 : origJ1;\n        const orig2 = moveRoute === 'I' ? origI2 : origJ2;\n        const otherPts = moveRoute === 'I' ? ptsJ : ptsI;\n\n        for (const sign of [1, -1]) {\n          for (let step = 1; step <= 8; step++) {\n            const off = sign * step * stepSize;\n            pts[1] = { x: orig1.x + p.px * off, y: orig1.y + p.py * off };\n            pts[2] = { x: orig2.x + p.px * off, y: orig2.y + p.py * off };\n\n            const sA = sampleBezierCurve(pts[0]!, pts[1]!, pts[2]!, pts[3]!, SAMPLES);\n            const sB = sampleBezierCurve(otherPts[0]!, otherPts[1]!, otherPts[2]!, otherPts[3]!, SAMPLES);\n\n            if (!polylinesIntersect(sA, sB)) {\n              if (!best || Math.abs(off) < Math.abs(best.off)) {\n                best = { moveRoute, off, px: p.px, py: p.py };\n              }\n              break;\n            }\n          }\n          // Reset\n          pts[1] = { ...orig1 }; pts[2] = { ...orig2 };\n        }\n      }\n\n      if (best) {\n        // Apply smallest offset that resolves\n        const pts = best.moveRoute === 'I' ? ptsI : ptsJ;\n        const orig1 = best.moveRoute === 'I' ? origI1 : origJ1;\n        const orig2 = best.moveRoute === 'I' ? origI2 : origJ2;\n        pts[1] = { x: orig1.x + best.px * best.off, y: orig1.y + best.py * best.off };\n        pts[2] = { x: orig2.x + best.px * best.off, y: orig2.y + best.py * best.off };\n        rebuildBezierPath(ri);\n        rebuildBezierPath(rj);\n      } else {\n        // No offset resolves \u2014 endpoints form an X pattern (interleaved on\n        // parallel lines). Swap the ports on the shared node so both routes\n        // stay on the same side, then re-route as orthogonal.\n        swapInterleavedPortsAndReroute(ri, rj, obstacles);\n      }\n    }\n  }\n}\n\n/**\n * Detect interleaved endpoints and swap ports on the shared line to\n * un-interleave them. Then re-route both as orthogonal.\n *\n * Before: A.from(399,388) A.to(471,597)  B.from(367,597) B.to(439,388)\n *   y=388: A=399(left) B=439(right)  y=597: B=367(left) A=471(right) \u2192 interleaved\n * After swap on y=388: A.from\u2194B.to \u2192 A(439,388) B(399,388)\n *   y=388: B=399(left) A=439(right)  y=597: B=367(left) A=471(right) \u2192 consistent\n */\nfunction swapInterleavedPortsAndReroute(\n  ri: PendingRoute, rj: PendingRoute, obstacles: readonly Rect[],\n): void {\n  const fromI = ri.points[0]!, toI = ri.points[ri.points.length - 1]!;\n  const fromJ = rj.points[0]!, toJ = rj.points[rj.points.length - 1]!;\n\n  const TOLERANCE = 15;\n\n  // Check all pairings of endpoints that share a horizontal or vertical line\n  // and swap to un-interleave.\n  const pairs: Array<{\n    endI: 'from' | 'to'; ptI: Point;\n    endJ: 'from' | 'to'; ptJ: Point;\n    axis: 'x' | 'y';\n  }> = [];\n\n  // fromI near toJ? (same horizontal/vertical line)\n  if (Math.abs(fromI.y - toJ.y) < TOLERANCE) pairs.push({ endI: 'from', ptI: fromI, endJ: 'to', ptJ: toJ, axis: 'x' });\n  if (Math.abs(fromI.x - toJ.x) < TOLERANCE) pairs.push({ endI: 'from', ptI: fromI, endJ: 'to', ptJ: toJ, axis: 'y' });\n  // toI near fromJ?\n  if (Math.abs(toI.y - fromJ.y) < TOLERANCE) pairs.push({ endI: 'to', ptI: toI, endJ: 'from', ptJ: fromJ, axis: 'x' });\n  if (Math.abs(toI.x - fromJ.x) < TOLERANCE) pairs.push({ endI: 'to', ptI: toI, endJ: 'from', ptJ: fromJ, axis: 'y' });\n\n  // For each pair on a shared line, check if swapping un-interleaves\n  for (const pair of pairs) {\n    // Get the OTHER endpoints (the ones NOT on this shared line)\n    const otherI = pair.endI === 'from' ? toI : fromI;\n    const otherJ = pair.endJ === 'from' ? toJ : fromJ;\n\n    // Check interleaving on the shared axis\n    const coord = pair.axis; // 'x' means compare x-values on a shared y-line\n    const iOnShared = pair.ptI[coord];\n    const jOnShared = pair.ptJ[coord];\n    const iOther = otherI[coord];\n    const jOther = otherJ[coord];\n\n    // Interleaved = one is left/above on shared line but right/below on the other\n    const iLeftOnShared = iOnShared < jOnShared;\n    const iLeftOnOther = iOther < jOther;\n    if (iLeftOnShared === iLeftOnOther) continue; // Not interleaved, skip\n\n    // SWAP: exchange the positions on the shared line\n    const newPtI = { ...pair.ptJ }; // I takes J's position\n    const newPtJ = { ...pair.ptI }; // J takes I's position\n    // Keep the shared-line coordinate averaged (same y for horizontal line)\n    if (pair.axis === 'x') {\n      const avgY = (pair.ptI.y + pair.ptJ.y) / 2;\n      newPtI.y = avgY;\n      newPtJ.y = avgY;\n    } else {\n      const avgX = (pair.ptI.x + pair.ptJ.x) / 2;\n      newPtI.x = avgX;\n      newPtJ.x = avgX;\n    }\n\n    // Build new from/to for each route\n    const newFromI = pair.endI === 'from' ? newPtI : fromI;\n    const newToI = pair.endI === 'to' ? newPtI : toI;\n    const newFromJ = pair.endJ === 'from' ? newPtJ : fromJ;\n    const newToJ = pair.endJ === 'to' ? newPtJ : toJ;\n\n    // Re-route both as orthogonal and check crossing\n    const orthoRouter = createRouter('orthogonal');\n    const routeI = orthoRouter.route({ from: newFromI, to: newToI, style: 'orthogonal', obstacles, padding: 12 });\n    const routeJ = orthoRouter.route({ from: newFromJ, to: newToJ, style: 'orthogonal', obstacles, padding: 12 });\n\n    const polyI = routeI.points as Point[];\n    const polyJ = routeJ.points as Point[];\n    let crosses = false;\n    for (let a = 0; a < polyI.length - 1 && !crosses; a++)\n      for (let b = 0; b < polyJ.length - 1 && !crosses; b++)\n        if (straightSegmentsIntersect(polyI[a]!, polyI[a + 1]!, polyJ[b]!, polyJ[b + 1]!))\n          crosses = true;\n\n    if (!crosses) {\n      // Apply\n      (ri as any).points = [...routeI.points];\n      ri.routePath = undefined;\n      ri.routing = 'orthogonal' as RouteStyle;\n\n      (rj as any).points = [...routeJ.points];\n      rj.routePath = undefined;\n      rj.routing = 'orthogonal' as RouteStyle;\n      return;\n    }\n  }\n\n  // Fallback: just convert both to orthogonal with natural ports\n  convertToOrthogonal(ri, obstacles);\n  convertToOrthogonal(rj, obstacles);\n}\n\n/** Convert a PendingRoute to orthogonal routing. */\nfunction convertToOrthogonal(target: PendingRoute, obstacles: readonly Rect[]): void {\n  const from = target.points[0]!, to = target.points[target.points.length - 1]!;\n  const orthoRouter = createRouter('orthogonal');\n  const route = orthoRouter.route({\n    from, to,\n    style: 'orthogonal',\n    obstacles,\n    padding: 12,\n  });\n  (target as any).points = [...route.points];\n  target.routePath = undefined;\n  target.routing = 'orthogonal' as RouteStyle;\n}\n\n/** Rebuild the routePath string from [from, cp1, cp2, to] points. */\nfunction rebuildBezierPath(pr: PendingRoute): void {\n  const pts = pr.points;\n  pr.routePath = `M ${pts[0]!.x} ${pts[0]!.y} C ${pts[1]!.x} ${pts[1]!.y} ${pts[2]!.x} ${pts[2]!.y} ${pts[3]!.x} ${pts[3]!.y}`;\n}\n\n/** Offset both control points of a bezier curve perpendicular to its from\u2192to axis. */\nfunction offsetBezierPerp(pts: Point[], offset: number): void {\n  const from = pts[0]!, to = pts[3]!;\n  const dx = to.x - from.x, dy = to.y - from.y;\n  const len = Math.sqrt(dx * dx + dy * dy);\n  if (len < 1) return;\n\n  const perpX = -dy / len, perpY = dx / len;\n  pts[1] = { x: pts[1]!.x + perpX * offset, y: pts[1]!.y + perpY * offset };\n  pts[2] = { x: pts[2]!.x + perpX * offset, y: pts[2]!.y + perpY * offset };\n}\n\n/** Sample a cubic bezier into a polyline of N+1 points. */\nfunction sampleBezierCurve(p0: Point, p1: Point, p2: Point, p3: Point, n: number): Point[] {\n  const pts: Point[] = [];\n  for (let i = 0; i <= n; i++) {\n    const t = i / n;\n    const u = 1 - t;\n    pts.push({\n      x: u*u*u*p0.x + 3*u*u*t*p1.x + 3*u*t*t*p2.x + t*t*t*p3.x,\n      y: u*u*u*p0.y + 3*u*u*t*p1.y + 3*u*t*t*p2.y + t*t*t*p3.y,\n    });\n  }\n  return pts;\n}\n\n/** Check if two polylines have any crossing segments. */\nfunction polylinesIntersect(a: Point[], b: Point[]): boolean {\n  for (let i = 0; i < a.length - 1; i++) {\n    for (let j = 0; j < b.length - 1; j++) {\n      if (segmentsIntersect(a[i]!, a[i+1]!, b[j]!, b[j+1]!)) return true;\n    }\n  }\n  return false;\n}\n\n/** Check if two line segments p1-p2 and p3-p4 intersect (proper crossing only). */\nfunction segmentsIntersect(p1: Point, p2: Point, p3: Point, p4: Point): boolean {\n  const d1 = cross(p3, p4, p1);\n  const d2 = cross(p3, p4, p2);\n  const d3 = cross(p1, p2, p3);\n  const d4 = cross(p1, p2, p4);\n  if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&\n      ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {\n    return true;\n  }\n  return false;\n}\n\nfunction cross(a: Point, b: Point, c: Point): number {\n  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/** Cluster bezier routes by proximity of their from or to endpoint. */\nfunction clusterByEndpoint(\n  routes: PendingRoute[],\n  end: 'from' | 'to',\n  proximity: number,\n): PendingRoute[][] {\n  const clusters: PendingRoute[][] = [];\n  const assigned = new Set<PendingRoute>();\n\n  for (let i = 0; i < routes.length; i++) {\n    const ri = routes[i]!;\n    if (assigned.has(ri)) continue;\n\n    const pi = end === 'from' ? ri.points[0]! : ri.points[ri.points.length - 1]!;\n    const cluster: PendingRoute[] = [ri];\n    assigned.add(ri);\n\n    for (let j = i + 1; j < routes.length; j++) {\n      const rj = routes[j]!;\n      if (assigned.has(rj)) continue;\n\n      const pj = end === 'from' ? rj.points[0]! : rj.points[rj.points.length - 1]!;\n      const dx = pi.x - pj.x, dy = pi.y - pj.y;\n      if (Math.sqrt(dx * dx + dy * dy) < proximity) {\n        cluster.push(rj);\n        assigned.add(rj);\n      }\n    }\n\n    clusters.push(cluster);\n  }\n\n  return clusters;\n}\n\n// \u2500\u2500\u2500 Border Nudging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Nudge segments that run parallel along cell borders (walls) away from them.\n * A horizontal segment at y \u2248 border.y is shifted vertically.\n * A vertical segment at x \u2248 border.x is shifted horizontally.\n * Only affects \"running along\" \u2014 perpendicular crossings are fine.\n */\nfunction nudgeOffBorders(routes: PendingRoute[], borders: readonly Rect[]): void {\n  const TOLERANCE = 3; // within 3px of a border edge\n  const NUDGE = 8;     // push 8px away\n\n  // Extract unique horizontal border Y values and vertical border X values\n  const hBorderYs: number[] = []; // horizontal borders (wide, thin height)\n  const vBorderXs: number[] = []; // vertical borders (tall, thin width)\n\n  for (const b of borders) {\n    if (b.width > b.height) {\n      // Horizontal border \u2014 center Y\n      hBorderYs.push(b.y + b.height / 2);\n    } else {\n      // Vertical border \u2014 center X\n      vBorderXs.push(b.x + b.width / 2);\n    }\n  }\n\n  for (const route of routes) {\n    const pts = route.points as Point[];\n    for (let i = 0; i < pts.length - 1; i++) {\n      const a = pts[i]!, b = pts[i + 1]!;\n      const dx = Math.abs(b.x - a.x), dy = Math.abs(b.y - a.y);\n\n      if (dy < 1 && dx > 1) {\n        // Horizontal segment \u2014 check against horizontal borders\n        for (const borderY of hBorderYs) {\n          if (Math.abs(a.y - borderY) < TOLERANCE) {\n            // Nudge toward the midpoint between from/to Y of the full route\n            const routeMinY = Math.min(...pts.map(p => p.y));\n            const routeMaxY = Math.max(...pts.map(p => p.y));\n            const routeMidY = (routeMinY + routeMaxY) / 2;\n            const nudgeDir = a.y < routeMidY ? -NUDGE : NUDGE;\n            pts[i] = { x: a.x, y: a.y + nudgeDir };\n            pts[i + 1] = { x: b.x, y: b.y + nudgeDir };\n            // Also adjust adjacent vertical segment endpoints\n            if (i > 0 && Math.abs(pts[i - 1]!.x - a.x) < 1) {\n              pts[i - 1] = { ...pts[i - 1]!, y: pts[i - 1]!.y }; // keep as-is, the vertex moved\n            }\n            break;\n          }\n        }\n      } else if (dx < 1 && dy > 1) {\n        // Vertical segment \u2014 check against vertical borders\n        for (const borderX of vBorderXs) {\n          if (Math.abs(a.x - borderX) < TOLERANCE) {\n            const routeMinX = Math.min(...pts.map(p => p.x));\n            const routeMaxX = Math.max(...pts.map(p => p.x));\n            const routeMidX = (routeMinX + routeMaxX) / 2;\n            const nudgeDir = a.x < routeMidX ? -NUDGE : NUDGE;\n            pts[i] = { x: a.x + nudgeDir, y: a.y };\n            pts[i + 1] = { x: b.x + nudgeDir, y: b.y };\n            break;\n          }\n        }\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Channel Separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PendingRoute {\n  points: readonly Point[];\n  routePath: string | undefined;\n  routing: RouteStyle;\n  fromDir: PortDirection | undefined;\n  toDir: PortDirection | undefined;\n  color: string;\n  dash: string | undefined;\n  strokeWidth: number;\n  isWavy: boolean;\n  wavyAmplitude: number;\n  wavyWavelength: number;\n  animation: RenderedConnectorAnimation | undefined;\n  markerEnd: string | undefined;\n  markerStart: string | undefined;\n  label: string | undefined;\n}\n\n/**\n * Detect overlapping parallel segments across all routes and offset them\n * so they don't visually merge. Mutates route points in place.\n */\nfunction separateOverlappingChannels(routes: PendingRoute[], gap: number): void {\n  // Collect all segments tagged by route index and segment index\n  interface Segment { routeIdx: number; segIdx: number; isVertical: boolean; coord: number; min: number; max: number; }\n  const segments: Segment[] = [];\n\n  for (let r = 0; r < routes.length; r++) {\n    const pts = routes[r]!.points;\n    for (let s = 0; s < pts.length - 1; s++) {\n      const a = pts[s]!, b = pts[s + 1]!;\n      const dx = Math.abs(b.x - a.x), dy = Math.abs(b.y - a.y);\n      if (dx < 1 && dy > 1) {\n        // Vertical segment\n        segments.push({ routeIdx: r, segIdx: s, isVertical: true, coord: a.x, min: Math.min(a.y, b.y), max: Math.max(a.y, b.y) });\n      } else if (dy < 1 && dx > 1) {\n        // Horizontal segment\n        segments.push({ routeIdx: r, segIdx: s, isVertical: false, coord: a.y, min: Math.min(a.x, b.x), max: Math.max(a.x, b.x) });\n      }\n    }\n  }\n\n  // Group segments that share the same axis, similar coord, and overlapping range\n  const COORD_TOLERANCE = 10;\n  const processed = new Set<number>();\n\n  for (let i = 0; i < segments.length; i++) {\n    if (processed.has(i)) continue;\n    const group = [i];\n    const si = segments[i]!;\n\n    for (let j = i + 1; j < segments.length; j++) {\n      if (processed.has(j)) continue;\n      const sj = segments[j]!;\n      if (si.isVertical !== sj.isVertical) continue;\n      if (Math.abs(si.coord - sj.coord) > COORD_TOLERANCE) continue;\n      // Check range overlap\n      if (si.max <= sj.min || sj.max <= si.min) continue;\n      group.push(j);\n    }\n\n    if (group.length < 2) continue;\n\n    // Offset each segment in the group\n    const n = group.length;\n    for (let k = 0; k < n; k++) {\n      const offset = (k - (n - 1) / 2) * gap;\n      const seg = segments[group[k]!]!;\n      processed.add(group[k]!);\n\n      // Mutate the points in the route\n      const pts = routes[seg.routeIdx]!.points as Point[];\n      if (seg.isVertical) {\n        // Offset x coordinate of both endpoints of this segment\n        pts[seg.segIdx] = { x: pts[seg.segIdx]!.x + offset, y: pts[seg.segIdx]!.y };\n        pts[seg.segIdx + 1] = { x: pts[seg.segIdx + 1]!.x + offset, y: pts[seg.segIdx + 1]!.y };\n      } else {\n        // Offset y coordinate\n        pts[seg.segIdx] = { x: pts[seg.segIdx]!.x, y: pts[seg.segIdx]!.y + offset };\n        pts[seg.segIdx + 1] = { x: pts[seg.segIdx + 1]!.x, y: pts[seg.segIdx + 1]!.y + offset };\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Wavy Path Generation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Replace a polyline route with a sine-wave displaced version.\n *\n * Algorithm (fully deterministic):\n * 1. Compute cumulative arc-length at each original vertex.\n * 2. Re-sample the polyline at uniform intervals of \u03BB/4.\n * 3. At each sample, compute the local tangent and its perpendicular normal.\n * 4. Displace the sample along the normal by A\u00B7sin(2\u03C0\u00B7s/\u03BB) where s is the\n *    cumulative arc-length.  At 90\u00B0 corners the amplitude ramps linearly from\n *    0 to A over one wavelength so kinks stay clean.\n * 5. Fit smooth cubic B\u00E9ziers through displaced samples (Catmull-Rom-to-B\u00E9zier).\n *\n * Returns an SVG path `d` string.  Same input \u2192 same output (no randomness).\n */\nexport function wavifyPath(\n  points: readonly Point[],\n  amplitude: number,\n  wavelength: number,\n): string {\n  if (points.length < 2) {\n    return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n  }\n\n  const sampleInterval = wavelength / 4;\n\n  // \u2500\u2500 Step 1: cumulative arc-lengths at original vertices \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const arcLen: number[] = [0];\n  for (let i = 1; i < points.length; i++) {\n    const a = points[i - 1]!, b = points[i]!;\n    const dx = b.x - a.x, dy = b.y - a.y;\n    arcLen.push(arcLen[i - 1]! + Math.sqrt(dx * dx + dy * dy));\n  }\n  const totalLen = arcLen[arcLen.length - 1]!;\n  if (totalLen < 1) {\n    return `M ${points[0]!.x} ${points[0]!.y}`;\n  }\n\n  // \u2500\u2500 Step 2: re-sample at uniform intervals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Include start and end explicitly.\n  const sampleCount = Math.max(2, Math.ceil(totalLen / sampleInterval) + 1);\n  const samples: Point[] = [];\n  const sampleArcLens: number[] = [];\n\n  // Find polyline point at given arc-length parameter\n  function polylineAt(s: number): { pt: Point; tangentX: number; tangentY: number } {\n    s = Math.max(0, Math.min(s, totalLen));\n    for (let i = 1; i < points.length; i++) {\n      if (arcLen[i]! >= s - 1e-9) {\n        const segStart = arcLen[i - 1]!;\n        const segEnd   = arcLen[i]!;\n        const segLen   = segEnd - segStart;\n        const t = segLen < 1e-9 ? 0 : (s - segStart) / segLen;\n        const a = points[i - 1]!, b = points[i]!;\n        const pt = { x: a.x + t * (b.x - a.x), y: a.y + t * (b.y - a.y) };\n        const dx = b.x - a.x, dy = b.y - a.y;\n        const len = Math.sqrt(dx * dx + dy * dy);\n        const tx = len > 1e-9 ? dx / len : 1;\n        const ty = len > 1e-9 ? dy / len : 0;\n        return { pt, tangentX: tx, tangentY: ty };\n      }\n    }\n    const last = points[points.length - 1]!, prev = points[points.length - 2]!;\n    const dx = last.x - prev.x, dy = last.y - prev.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    return { pt: last, tangentX: len > 1e-9 ? dx / len : 1, tangentY: len > 1e-9 ? dy / len : 0 };\n  }\n\n  // Build corner-proximity map: ramp amplitude to 0 at each 90\u00B0 bend\n  // A \"corner\" is any vertex where the turning angle > 45\u00B0.\n  const cornerArcLens: number[] = [];\n  for (let i = 1; i < points.length - 1; i++) {\n    const a = points[i - 1]!, b = points[i]!, c = points[i + 1]!;\n    const d1x = b.x - a.x, d1y = b.y - a.y;\n    const d2x = c.x - b.x, d2y = c.y - b.y;\n    const len1 = Math.sqrt(d1x * d1x + d1y * d1y);\n    const len2 = Math.sqrt(d2x * d2x + d2y * d2y);\n    if (len1 < 1e-9 || len2 < 1e-9) continue;\n    const dot = (d1x / len1) * (d2x / len2) + (d1y / len1) * (d2y / len2);\n    if (dot < 0.7) { // angle > ~45\u00B0\n      cornerArcLens.push(arcLen[i]!);\n    }\n  }\n\n  function cornerAmplitudeFactor(s: number): number {\n    let minDist = Infinity;\n    for (const cs of cornerArcLens) {\n      minDist = Math.min(minDist, Math.abs(s - cs));\n    }\n    if (minDist >= wavelength) return 1;\n    return minDist / wavelength; // ramp 0..1 over one wavelength from corner\n  }\n\n  for (let k = 0; k < sampleCount; k++) {\n    const s = (k / (sampleCount - 1)) * totalLen;\n    const { pt, tangentX, tangentY } = polylineAt(s);\n    // Normal: perpendicular to tangent (rotate 90\u00B0)\n    const nx = -tangentY;\n    const ny = tangentX;\n    const phase = (2 * Math.PI * s) / wavelength;\n    const cornerFactor = cornerAmplitudeFactor(s);\n    const displacement = amplitude * cornerFactor * Math.sin(phase);\n    samples.push({ x: pt.x + nx * displacement, y: pt.y + ny * displacement });\n    sampleArcLens.push(s);\n  }\n\n  // \u2500\u2500 Step 5: Catmull-Rom to cubic B\u00E9zier \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // For each interior sample i, compute Catmull-Rom tangents and emit a\n  // cubic B\u00E9zier from samples[i-1] to samples[i].\n  const tension = 0.5; // standard Catmull-Rom tension\n  let d = `M ${f(samples[0]!.x)} ${f(samples[0]!.y)}`;\n\n  for (let i = 1; i < samples.length; i++) {\n    const p0 = samples[Math.max(0, i - 2)]!;\n    const p1 = samples[i - 1]!;\n    const p2 = samples[i]!;\n    const p3 = samples[Math.min(samples.length - 1, i + 1)]!;\n\n    const cp1x = p1.x + (p2.x - p0.x) * tension / 3;\n    const cp1y = p1.y + (p2.y - p0.y) * tension / 3;\n    const cp2x = p2.x - (p3.x - p1.x) * tension / 3;\n    const cp2y = p2.y - (p3.y - p1.y) * tension / 3;\n\n    d += ` C ${f(cp1x)} ${f(cp1y)} ${f(cp2x)} ${f(cp2y)} ${f(p2.x)} ${f(p2.y)}`;\n  }\n\n  return d;\n}\n\n/** Format a number to 2 decimal places for SVG path output. */\nfunction f(n: number): string {\n  return Math.round(n * 100) / 100 + '';\n}\n", "/**\n * Cross-Link Engine v3 \u2014 Global Cost-Function Routing\n *\n * Passes:\n *   0. Port assign   Global: shared-endpoint t values sorted by angular order\n *   1. Sort          Axis-aligned first; longest within group\n *   2. Route         Greedy: search collapsed by phase-0 hints for shared ports\n *   3. Repair        Find crossing pairs, re-route lower-priority links\n *   4. Channel sep   Spread parallel overlapping segments\n *   5. Labels        Stagger + de-collision\n *   6. Emit          SVG path strings (L for orthogonal, C for bezier)\n *\n * Cost function:\n *   W_CROSS  \u00D7 crossings          \u2014 H/V decomposition for orthogonal pairs\n *   W_INTER  \u00D7 cross-link port conflict\n *   W_SIDE   \u00D7 wrong-side wall\n *   W_INTRA  \u00D7 intra-diagram port conflict (softer \u2014 can be overridden)\n *   W_BEND   \u00D7 excess bends\n *   W_LEN    \u00D7 path length\n *   W_ALIGN  \u00D7 short jog segments (orthogonal only)\n *\n * Crossing detection:\n *   Orthogonal \u2194 orthogonal: H/V decomposition, O(1) per segment pair\n *   Mixed/bezier: sampled polyline + AABB prefilter + segment intersection\n */\n\nimport type { SceneElement } from '../contracts/scene.js';\nimport { isRenderedConnectorAnimation, type CrossLink, type RenderedConnectorAnimation } from '../contracts/crosslink.js';\nimport type { CardinalSide, NodeAnchorRegistry, OccupiedPort } from '../contracts/anchors.js';\nimport type { PortDirection } from '../contracts/routing.js';\nimport type { Point, Rect } from '../contracts/primitives.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { createRouter } from '../routing/router.js';\nimport { wavifyPath } from './render.js';\n\nexport interface CrossLinkRenderResult {\n  readonly defs:     string[];\n  readonly elements: SceneElement[];\n}\n\n// \u2500\u2500\u2500 Cost weights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst W_CROSS = 10_000;   // per crossing with a committed route\nconst W_INTER  = 3_000;   // port conflict with another cross-link (same wall+pos)\nconst W_SIDE   =   800;   // wrong-side wall (not facing the target)\nconst W_INTRA  =   500;   // port conflict with an intra-diagram edge\nconst W_BEND   =    50;   // per excess bend\nconst W_LEN    =     1;   // per pixel of path length\nconst W_ALIGN  =   400;   // per short jog segment (orthogonal only)\n\nconst SNAP_THRESHOLD  = 14;   // snap near-aligned E/W (or N/S) port pairs\nconst CONFLICT_RADIUS = 28;   // pixel radius for port conflict detection\nconst CELL_SHRINK     = 12;   // px to shrink intermediate cell rects\nconst CHANNEL_GAP     = 12;   // gap between overlapping parallel segments\nconst ROUTE_PADDING   = 12;   // obstacle clearance during routing\n\n/** Fractional wall positions tried per candidate (0 = wall start, 1 = wall end). */\nconst WALL_TS: readonly number[] = [0.1, 0.25, 0.5, 0.75, 0.9];\n\n/**\n * Pre-assigned port constraints produced by Pass 0 (shared-endpoint ordering).\n * Any field present collapses the corresponding search dimension in findBestRoute.\n */\ninterface PortHint {\n  readonly srcWall?: CardinalSide;\n  readonly srcT?:    number;\n  readonly dstWall?: CardinalSide;\n  readonly dstT?:    number;\n}\n\nconst ARROW_ID    = 'triton-crosslink-arrow';\nconst BI_ARROW_ID = 'triton-crosslink-arrow-both';\n\n// \u2500\u2500\u2500 Internal geometry types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A horizontal segment for H/V crossing detection. */\ninterface HSegment { readonly y: number; readonly x1: number; readonly x2: number }\n/** A vertical segment for H/V crossing detection. */\ninterface VSegment { readonly x: number; readonly y1: number; readonly y2: number }\n\n// \u2500\u2500\u2500 Internal route types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface CommittedRoute {\n  readonly linkIdx:  number;\n  readonly srcKey:   string;\n  readonly dstKey:   string;\n  readonly srcWall:  CardinalSide;\n  readonly srcT:     number;\n  readonly srcPort:  Point;\n  readonly dstWall:  CardinalSide;\n  readonly dstT:     number;\n  readonly dstPort:  Point;\n  /** Actual curve points (sampled for bezier, vertices for orthogonal/straight). */\n  readonly points:   readonly Point[];\n  /** Raw router output \u2014 [from, cp1, cp2, to] for bezier, equals points otherwise. */\n  readonly rawPts:   readonly Point[];\n  readonly isBezier: boolean;\n  /** Pre-computed H/V decomposition (empty arrays for non-orthogonal). */\n  readonly hSegs:    readonly HSegment[];\n  readonly vSegs:    readonly VSegment[];\n}\n\ninterface WorkingRoute {\n  points:           Point[];\n  isBezier?:        true;\n  color:            string;\n  dash?:            string;\n  strokeWidth?:     number;\n  isWavy?:          boolean;\n  wavyAmplitude?:   number;\n  wavyWavelength?:  number;\n  animation?:       RenderedConnectorAnimation;\n  markerEnd?:       string;\n  markerStart?:     string;\n  label?:           string;\n  labelPlacement?:  'path-midpoint';\n}\n\n// \u2500\u2500\u2500 Entry point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function routeAndRenderCrossLinks3(\n  links:             readonly CrossLink[],\n  theme:             ResolvedTheme,\n  anchors:           NodeAnchorRegistry,\n  intraPorts?:       readonly OccupiedPort[],\n  occupiedRects?:    readonly Rect[],\n  routingObstacles?: readonly Rect[],\n  cellRects?:        ReadonlyMap<string, Rect>,\n): CrossLinkRenderResult {\n  const { palette, typography, edges: edgeTheme } = theme;\n  const elements: SceneElement[] = [];\n  const defs:     string[]       = [];\n\n  // \u2500\u2500 Colour assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const PALETTE = [\n    '#E11D48', '#16A34A', '#9333EA', '#0891B2',\n    '#CA8A04', '#DC2626', '#2563EB', '#7C3AED',\n  ];\n  let explicitColorIdx = 0;\n\n  const allNodeBounds: Rect[] = Object.values(anchors).map(a => a.bounds);\n\n  const addrKey = (addr: { cellPath: readonly string[]; nodeId: string }): string =>\n    [...addr.cellPath, addr.nodeId].join('.');\n\n  function centerOf(key: string): Point {\n    const a = anchors[key];\n    return a ? { x: a.bounds.x + a.bounds.width / 2, y: a.bounds.y + a.bounds.height / 2 } : { x: 0, y: 0 };\n  }\n\n  // \u2500\u2500 Pass 1: Sort links axis-aligned first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const resolvable = links.filter(l => anchors[addrKey(l.from)] && anchors[addrKey(l.to)]);\n\n  // \u2500\u2500 Pass 0: Pre-assign ports at shared endpoints \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // For every (node, wall) that has 2+ links, sort arrivals/departures by the\n  // angular position of the other endpoint and assign evenly-spaced t values.\n  // This guarantees a non-crossing fan at the shared node before routing starts.\n  const portHints = preAssignSharedPorts(resolvable, anchors);\n\n  const sortedLinks = [...resolvable].sort((a, b) => {\n    const ca = centerOf(addrKey(a.from)), cb = centerOf(addrKey(a.to));\n    const cc = centerOf(addrKey(b.from)), cd = centerOf(addrKey(b.to));\n    const axA = Math.abs(cb.x - ca.x), ayA = Math.abs(cb.y - ca.y);\n    const axB = Math.abs(cd.x - cc.x), ayB = Math.abs(cd.y - cc.y);\n    const sA = Math.min(axA, ayA) / (Math.max(axA, ayA) + 1);\n    const sB = Math.min(axB, ayB) / (Math.max(axB, ayB) + 1);\n    if (Math.abs(sA - sB) > 0.05) return sA - sB;\n    return Math.hypot(cb.x - ca.x, cb.y - ca.y) - Math.hypot(cd.x - cc.x, cd.y - cc.y);\n  }).reverse();\n\n  // \u2500\u2500 Pass 2: Greedy routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const committed: CommittedRoute[] = [];\n  const workingByOriginalIdx = new Map<number, WorkingRoute>();\n\n  for (let si = 0; si < sortedLinks.length; si++) {\n    const link   = sortedLinks[si]!;\n    const rIdx   = resolvable.indexOf(link);\n    const hint   = rIdx >= 0 ? portHints.get(rIdx) : undefined;\n    const best   = findBestRoute(si, link, anchors, allNodeBounds, cellRects, committed, intraPorts ?? [], hint);\n    if (!best) continue;\n    committed.push(best.committed);\n\n    let color: string;\n    const explicitColor = typeof link.props?.color === 'string' ? link.props.color : undefined;\n    if (explicitColor) {\n      color = explicitColor;\n    } else {\n      color = PALETTE[explicitColorIdx % PALETTE.length]!;\n      explicitColorIdx++;\n    }\n\n    const dash = edgeStyleToDash(link.style);\n    // Animation: explicit DSL value only. All styles are STATIC by default.\n    const animation: RenderedConnectorAnimation | undefined =\n      link.animation === 'none'     ? undefined :\n      isRenderedConnectorAnimation(link.animation) ? link.animation :\n      undefined;\n\n    let markerEnd:   string | undefined;\n    let markerStart: string | undefined;\n    if (link.direction === 'directed') {\n      markerEnd = ARROW_ID;\n    } else if (link.direction === 'bidirectional') {\n      markerEnd   = ARROW_ID;\n      markerStart = BI_ARROW_ID;\n    }\n\n    const strokeWidth = link.style === 'thick'\n      ? (edgeTheme.strokeWidth + 0.5) * 2\n      : undefined;\n    const isWavy      = link.style === 'wavy';\n    const wavyAmp     = (link.props?.amplitude  as number | undefined) ?? 3;\n    const wavyLambda  = (link.props?.wavelength as number | undefined) ?? 12;\n\n    const origIdx = links.indexOf(link);\n    workingByOriginalIdx.set(origIdx >= 0 ? origIdx : workingByOriginalIdx.size, {\n      points: [...best.rawPts],\n      ...(best.committed.isBezier ? { isBezier: true as const } : {}),\n      color,\n      ...(dash        ? { dash }        : {}),\n      ...(strokeWidth ? { strokeWidth } : {}),\n      ...(isWavy      ? { isWavy: true, wavyAmplitude: wavyAmp, wavyWavelength: wavyLambda } : {}),\n      ...(animation   ? { animation }   : {}),\n      ...(markerEnd   ? { markerEnd }   : {}),\n      ...(markerStart ? { markerStart } : {}),\n      ...(link.label  ? { label: link.label } : {}),\n      ...(link.props?.labelPlacement === 'path-midpoint' ? { labelPlacement: 'path-midpoint' as const } : {}),\n    });\n  }\n\n  // \u2500\u2500 Pass 3: Crossing repair \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  repairCrossings(committed, sortedLinks, anchors, allNodeBounds, cellRects, intraPorts ?? [], workingByOriginalIdx, links, portHints, resolvable);\n\n  // Reconstruct workingRoutes in original link order\n  const workingRoutes: WorkingRoute[] = [];\n  for (let i = 0; i < links.length; i++) {\n    const wr = workingByOriginalIdx.get(i);\n    if (wr) workingRoutes.push(wr);\n  }\n\n  // \u2500\u2500 Pass 4: Border nudging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (routingObstacles && routingObstacles.length > 0) {\n    nudgeOffBorders(workingRoutes, routingObstacles);\n  }\n\n  // \u2500\u2500 Pass 4b: Channel separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  separateChannels(workingRoutes);\n\n  // \u2500\u2500 Pass 5: Label staggering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const CORRIDOR_TOL  = 20;\n  const labelFractions = new Array<number>(workingRoutes.length).fill(0.5);\n  const labeledIdxs   = workingRoutes.map((r, i) => r.label ? i : -1).filter(i => i >= 0);\n  const staggered     = new Set<number>();\n\n  for (const i of labeledIdxs) {\n    if (staggered.has(i)) continue;\n    const wrI  = workingRoutes[i]!;\n    const ptsI = sampledPts(wrI);\n    const infoI = dominantSegment(ptsI);\n    const group = [i];\n    for (const j of labeledIdxs) {\n      if (j === i || staggered.has(j)) continue;\n      const wrJ  = workingRoutes[j]!;\n      const ptsJ = sampledPts(wrJ);\n      const infoJ = dominantSegment(ptsJ);\n      if (infoI.axis === infoJ.axis && Math.abs(infoI.coord - infoJ.coord) < CORRIDOR_TOL) {\n        group.push(j);\n      }\n    }\n    if (group.length > 1) {\n      group.sort((a, b) => a - b);\n      group.forEach((idx, k) => { labelFractions[idx] = (k + 1) / (group.length + 1); });\n      group.forEach(idx => staggered.add(idx));\n    }\n  }\n\n  // \u2500\u2500 Pass 6: Emit SVG elements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let needsArrow   = false;\n  let needsBiArrow = false;\n\n  const pendingLabels: Array<{\n    content:    string;\n    x:          number;\n    y:          number;\n    fontSize:   number;\n    fontFamily: string;\n    fill:       string;\n  }> = [];\n\n  for (let i = 0; i < workingRoutes.length; i++) {\n    const wr = workingRoutes[i]!;\n    let path = wr.isBezier\n      ? `M ${wr.points[0]!.x} ${wr.points[0]!.y} C ${wr.points[1]!.x} ${wr.points[1]!.y} ${wr.points[2]!.x} ${wr.points[2]!.y} ${wr.points[3]!.x} ${wr.points[3]!.y}`\n      : wr.points.map((p, pi) => `${pi === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n\n    if (wr.isWavy) {\n      path = wavifyPath([...wr.points], wr.wavyAmplitude ?? 3, wr.wavyWavelength ?? 12);\n    }\n\n    if (wr.markerEnd   === ARROW_ID)    needsArrow   = true;\n    if (wr.markerStart === BI_ARROW_ID) needsBiArrow = true;\n\n    elements.push({\n      type:        'path',\n      d:           path,\n      stroke:      wr.color,\n      strokeWidth: wr.strokeWidth ?? (edgeTheme.strokeWidth + 0.5),\n      ...(wr.dash        ? { strokeDasharray: wr.dash }    : {}),\n      ...(wr.animation   ? { animated: wr.animation }      : {}),\n      ...(wr.markerEnd   ? { markerEnd: wr.markerEnd }     : {}),\n      ...(wr.markerStart ? { markerStart: wr.markerStart } : {}),\n    });\n\n    if (wr.label) {\n      const pts    = sampledPts(wr);\n      // Staggered labels (parallel links sharing a corridor) keep their\n      // length-fraction offset so they don't stack. Otherwise anchor the label\n      // on the route's longest HORIZONTAL run \u2014 labels are horizontal text and\n      // read best along a horizontal segment, and this avoids parking them on a\n      // short/outboard vertical channel that may sit at the diagram edge.\n      const labelPos = staggered.has(i) || wr.isBezier || wr.labelPlacement === 'path-midpoint'\n        ? pointAtFrac(pts, labelFractions[i] ?? 0.5)\n        : labelAnchor(pts);\n      pendingLabels.push({\n        content:    wr.label,\n        x:          labelPos.x,\n        y:          labelPos.y - 6,\n        fontSize:   edgeTheme.labelFontSize,\n        fontFamily: typography.fontFamily,\n        fill:       wr.color,\n      });\n    }\n  }\n\n  // Label de-collision\n  const CHAR_W    = 0.65;\n  const LABEL_PAD = 4;\n  const fixedRects: Rect[] = [...allNodeBounds, ...(occupiedRects ?? [])];\n  const labelRects = pendingLabels.map(l => ({\n    x:      l.x - (l.content.length * l.fontSize * CHAR_W) / 2 - LABEL_PAD,\n    y:      l.y - l.fontSize,\n    width:  l.content.length * l.fontSize * CHAR_W + LABEL_PAD * 2,\n    height: l.fontSize + LABEL_PAD * 2,\n  }));\n  deCollideLabels(labelRects, fixedRects);\n\n  for (let i = 0; i < pendingLabels.length; i++) {\n    const l = pendingLabels[i]!;\n    const r = labelRects[i]!;\n    elements.push({\n      type:       'text',\n      content:    l.content,\n      position:   { x: r.x + r.width / 2, y: r.y + r.height - LABEL_PAD },\n      fontSize:   l.fontSize,\n      fontFamily: typography.fontFamily,\n      fill:       l.fill,\n      anchor:     'middle',\n      fontWeight: 'bold',\n    });\n  }\n\n  if (needsArrow) {\n    const s = edgeTheme.arrowSize;\n    defs.push(\n      `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${s * 0.7}\" refX=\"${s - 1}\" refY=\"${s * 0.35}\" orient=\"auto\">` +\n      `<polygon points=\"0 0, ${s} ${s * 0.35}, 0 ${s * 0.7}\" fill=\"currentColor\" /></marker>`,\n    );\n  }\n  if (needsBiArrow) {\n    const s = edgeTheme.arrowSize;\n    defs.push(\n      `<marker id=\"${BI_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${s * 0.7}\" refX=\"1\" refY=\"${s * 0.35}\" orient=\"auto\">` +\n      `<polygon points=\"${s} 0, 0 ${s * 0.35}, ${s} ${s * 0.7}\" fill=\"currentColor\" /></marker>`,\n    );\n  }\n\n  return { defs, elements };\n}\n\n// \u2500\u2500\u2500 Route finding (shared by greedy pass and repair pass) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction findBestRoute(\n  linkIdx:    number,\n  link:       CrossLink,\n  anchors:    NodeAnchorRegistry,\n  allNodeBounds: Rect[],\n  cellRects:  ReadonlyMap<string, Rect> | undefined,\n  committed:  readonly CommittedRoute[],\n  intraPorts: readonly OccupiedPort[],\n  portHint?:  PortHint,\n): { committed: CommittedRoute; rawPts: readonly Point[] } | null {\n  const addrKey = (addr: { cellPath: readonly string[]; nodeId: string }): string =>\n    [...addr.cellPath, addr.nodeId].join('.');\n\n  const srcKey    = addrKey(link.from);\n  const dstKey    = addrKey(link.to);\n  const srcAnchor = anchors[srcKey];\n  const dstAnchor = anchors[dstKey];\n  if (!srcAnchor || !dstAnchor) return null;\n\n  const srcCenter: Point = {\n    x: srcAnchor.bounds.x + srcAnchor.bounds.width  / 2,\n    y: srcAnchor.bounds.y + srcAnchor.bounds.height / 2,\n  };\n  const dstCenter: Point = {\n    x: dstAnchor.bounds.x + dstAnchor.bounds.width  / 2,\n    y: dstAnchor.bounds.y + dstAnchor.bounds.height / 2,\n  };\n\n  // Build per-link obstacle list.\n  // Nodes inside the source/dest cells must NOT be obstacles \u2014 they are the\n  // \"interior terrain\" of the endpoint cells.  Without this exclusion the\n  // router sees sibling nodes (e.g. Gateway next to the target Order Service)\n  // as hard obstacles and produces large detours to reach the destination port.\n  const srcCellId = link.from.cellPath.join('.');\n  const dstCellId = link.to.cellPath.join('.');\n  const sameSourceCell = (key: string): boolean => srcCellId.length > 0 && key.startsWith(srcCellId + '.');\n  const sameTargetCell = (key: string): boolean => dstCellId.length > 0 && key.startsWith(dstCellId + '.');\n  const linkObstacles: Rect[] = Object.entries(anchors)\n    .filter(([key]) =>\n      !sameSourceCell(key) &&\n      !sameTargetCell(key) &&\n      key !== srcKey && key !== dstKey,\n    )\n    .map(([, a]) => a.bounds);\n  if (cellRects) {\n    for (const [cellId, r] of cellRects) {\n      if (cellId === srcCellId || cellId === dstCellId) continue;\n      const sw = r.width  - 2 * CELL_SHRINK;\n      const sh = r.height - 2 * CELL_SHRINK;\n      if (sw > 0 && sh > 0) {\n        linkObstacles.push({ x: r.x + CELL_SHRINK, y: r.y + CELL_SHRINK, width: sw, height: sh });\n      }\n    }\n  }\n\n  const routeStyle  = link.routing ?? 'orthogonal';\n  const sides: CardinalSide[] = ['N', 'S', 'E', 'W'];\n  // Collapse search dimensions. Precedence: explicit user exit/entry walls win,\n  // then phase-0 shared-port fan hints, then full 4-wall search.\n  const srcWalls: CardinalSide[] = link.exitWall  ? [link.exitWall]  : portHint?.srcWall ? [portHint.srcWall] : sides;\n  const dstWalls: CardinalSide[] = link.entryWall ? [link.entryWall] : portHint?.dstWall ? [portHint.dstWall] : sides;\n  // Honor a phase-0 fan t whenever one was assigned. Pinned walls always get a\n  // fan slot (centre when alone, evenly spread when several share the wall), so\n  // this is what centres the port on the wall.\n  const srcTs: readonly number[] = portHint?.srcT !== undefined ? [portHint.srcT] : WALL_TS;\n  const dstTs: readonly number[] = portHint?.dstT !== undefined ? [portHint.dstT] : WALL_TS;\n\n  let bestScore        = Infinity;\n  let bestCommitted!:  CommittedRoute;\n  let bestRawPts!:     readonly Point[];\n\n  for (const ss of srcWalls) {\n    for (const ds of dstWalls) {\n      for (const srcT of srcTs) {\n        for (const dstT of dstTs) {\n          let sp = wallPoint(srcAnchor.bounds, ss, srcT);\n          let dp = wallPoint(dstAnchor.bounds, ds, dstT);\n\n          // Snap near-aligned pairs to exact alignment (eliminates jog segments)\n          const snapped = snapAlignment(ss, sp, ds, dp);\n          sp = snapped.srcPort;\n          dp = snapped.dstPort;\n\n          const router = createRouter(routeStyle);\n          const routePadding = typeof link.props?.routePadding === 'number' ? link.props.routePadding : ROUTE_PADDING;\n          const routeObstacles = [\n            ...linkObstacles,\n            ...forcedAwayEndpointObstacles(\n              link, ss, ds, srcCenter, dstCenter, anchors, cellRects,\n              srcKey, dstKey, srcCellId, dstCellId, sameSourceCell, sameTargetCell,\n            ),\n          ];\n          const route  = router.route({\n            from:    sp,\n            to:      dp,\n            style:   routeStyle,\n            obstacles: routeObstacles,\n            padding: routePadding,\n            fromDir: ss as PortDirection,\n            toDir:   ds as PortDirection,\n          });\n          const rawPts = route.points as Point[];\n\n          const isBez = routeStyle === 'bezier' && rawPts.length === 4;\n          const pts: readonly Point[] = isBez\n            ? sampleCubicBezier(rawPts[0]!, rawPts[1]!, rawPts[2]!, rawPts[3]!, 12)\n            : rawPts;\n\n          const { hSegs, vSegs } = decomposeHV(pts, routeStyle);\n\n          // \u2500\u2500 Unified cost function \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n          const score =\n            sidePenalty(ss, ds, srcCenter, dstCenter)                    +\n            crossingScore(pts, hSegs, vSegs, isBez, committed)           +\n            portConflictScore(\n              srcKey, ss, sp, srcT,\n              dstKey, ds, dp, dstT,\n              committed, intraPorts, anchors,\n            )                                                             +\n            (isBez ? 0 : Math.max(0, rawPts.length - 2) * W_BEND)       +\n            pathLen(pts) * W_LEN                                          +\n            (isBez ? 0 : alignPenalty(rawPts));\n\n          if (score < bestScore) {\n            bestScore = score;\n            bestRawPts = rawPts;\n            bestCommitted = {\n              linkIdx,\n              srcKey, dstKey,\n              srcWall: ss, srcT, srcPort: sp,\n              dstWall: ds, dstT, dstPort: dp,\n              points: pts,\n              rawPts,\n              isBezier: isBez,\n              hSegs,\n              vSegs,\n            };\n          }\n        }\n      }\n    }\n  }\n\n  return bestScore < Infinity ? { committed: bestCommitted, rawPts: bestRawPts } : null;\n}\n\nfunction forcedAwayEndpointObstacles(\n  link: CrossLink,\n  srcWall: CardinalSide,\n  dstWall: CardinalSide,\n  srcCenter: Point,\n  dstCenter: Point,\n  anchors: NodeAnchorRegistry,\n  cellRects: ReadonlyMap<string, Rect> | undefined,\n  srcKey: string,\n  dstKey: string,\n  srcCellId: string,\n  dstCellId: string,\n  sameSourceCell: (key: string) => boolean,\n  sameTargetCell: (key: string) => boolean,\n): Rect[] {\n  const exitAway = link.exitWall !== undefined && wallFacesAway(srcWall, srcCenter, dstCenter);\n  const entryAway = link.entryWall !== undefined && wallFacesAway(dstWall, dstCenter, srcCenter);\n  const rects: Rect[] = [anchors[srcKey]?.bounds, anchors[dstKey]?.bounds].filter((r): r is Rect => r !== undefined);\n\n  if (exitAway || entryAway) {\n    for (const [key, anchor] of Object.entries(anchors)) {\n      if (sameSourceCell(key) || sameTargetCell(key)) rects.push(anchor.bounds);\n    }\n    const srcCell = cellRects?.get(srcCellId);\n    const dstCell = cellRects?.get(dstCellId);\n    if (srcCell) rects.push(srcCell);\n    if (dstCell) rects.push(dstCell);\n  }\n\n  return rects;\n}\n\nfunction wallFacesAway(wall: CardinalSide, fromCenter: Point, toCenter: Point): boolean {\n  const nx = wall === 'E' ? 1 : wall === 'W' ? -1 : 0;\n  const ny = wall === 'S' ? 1 : wall === 'N' ? -1 : 0;\n  const vx = toCenter.x - fromCenter.x;\n  const vy = toCenter.y - fromCenter.y;\n  return vx * nx + vy * ny < 0;\n}\n\n// \u2500\u2500\u2500 Pass 3: Crossing repair \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction repairCrossings(\n  committed:         CommittedRoute[],\n  sortedLinks:       readonly CrossLink[],\n  anchors:           NodeAnchorRegistry,\n  allNodeBounds:     Rect[],\n  cellRects:         ReadonlyMap<string, Rect> | undefined,\n  intraPorts:        readonly OccupiedPort[],\n  workingByOrigIdx:  Map<number, WorkingRoute>,\n  links:             readonly CrossLink[],\n  portHints:         ReadonlyMap<number, PortHint>,\n  resolvable:        readonly CrossLink[],\n): void {\n  // One repair pass: for each crossing pair (i committed before j), try re-routing j\n  for (let j = 1; j < committed.length; j++) {\n    const crJ = committed[j]!;\n\n    // Count crossings between j and any earlier route\n    let jCrossings = 0;\n    for (let i = 0; i < j; i++) {\n      jCrossings += countCrossingsBetween(committed[i]!, crJ);\n    }\n    if (jCrossings === 0) continue;\n\n    // Attempt re-route of j with all other routes committed except j itself\n    const committedWithoutJ = committed.filter((_, k) => k !== j);\n    const link = sortedLinks[crJ.linkIdx];\n    if (!link) continue;\n\n    const rIdx  = resolvable.indexOf(link);\n    const hint   = rIdx >= 0 ? portHints.get(rIdx) : undefined;\n    const result = findBestRoute(\n      crJ.linkIdx, link, anchors, allNodeBounds, cellRects,\n      committedWithoutJ, intraPorts, hint,\n    );\n    if (!result) continue;\n\n    // Accept only if new route has fewer crossings with earlier routes\n    let newCrossings = 0;\n    for (let i = 0; i < j; i++) {\n      newCrossings += countCrossingsBetween(committed[i]!, result.committed);\n    }\n    if (newCrossings >= jCrossings) continue;\n\n    committed[j] = result.committed;\n    const origIdx = links.indexOf(link);\n    const wr = workingByOrigIdx.get(origIdx >= 0 ? origIdx : -1);\n    if (wr) {\n      wr.points = [...result.rawPts];\n      if (result.committed.isBezier) {\n        (wr as { isBezier?: true }).isBezier = true;\n      } else {\n        delete (wr as { isBezier?: true }).isBezier;\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 H/V crossing detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Decompose a polyline into horizontal and vertical segments for fast\n * crossing detection. Only meaningful for orthogonal routes.\n */\nfunction decomposeHV(pts: readonly Point[], style: string): { hSegs: HSegment[]; vSegs: VSegment[] } {\n  const hSegs: HSegment[] = [];\n  const vSegs: VSegment[] = [];\n  if (style !== 'orthogonal') return { hSegs, vSegs };\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!, b = pts[i + 1]!;\n    if (Math.abs(b.y - a.y) < 0.5 && Math.abs(b.x - a.x) > 0.5) {\n      hSegs.push({ y: (a.y + b.y) / 2, x1: Math.min(a.x, b.x), x2: Math.max(a.x, b.x) });\n    } else if (Math.abs(b.x - a.x) < 0.5 && Math.abs(b.y - a.y) > 0.5) {\n      vSegs.push({ x: (a.x + b.x) / 2, y1: Math.min(a.y, b.y), y2: Math.max(a.y, b.y) });\n    }\n  }\n  return { hSegs, vSegs };\n}\n\n/** Count H/V crossings between two sets of decomposed segments. */\nfunction countHVCrossings(\n  aH: readonly HSegment[], aV: readonly VSegment[],\n  bH: readonly HSegment[], bV: readonly VSegment[],\n): number {\n  let n = 0;\n  for (const h of aH) for (const v of bV) if (hvCross(h, v)) n++;\n  for (const v of aV) for (const h of bH) if (hvCross(h, v)) n++;\n  return n;\n}\n\n/** True iff a horizontal and a vertical segment properly intersect (not touch). */\nfunction hvCross(h: HSegment, v: VSegment): boolean {\n  return v.x > h.x1 && v.x < h.x2 && h.y > v.y1 && h.y < v.y2;\n}\n\n/** Count crossings between two polylines using AABB prefilter + proper intersection. */\nfunction countPolylineCrossings(a: readonly Point[], b: readonly Point[]): number {\n  let n = 0;\n  for (let i = 0; i < a.length - 1; i++) {\n    const a1 = a[i]!, a2 = a[i + 1]!;\n    const axMin = Math.min(a1.x, a2.x), axMax = Math.max(a1.x, a2.x);\n    const ayMin = Math.min(a1.y, a2.y), ayMax = Math.max(a1.y, a2.y);\n    for (let j = 0; j < b.length - 1; j++) {\n      const b1 = b[j]!, b2 = b[j + 1]!;\n      // AABB prefilter\n      if (axMax < Math.min(b1.x, b2.x) || axMin > Math.max(b1.x, b2.x)) continue;\n      if (ayMax < Math.min(b1.y, b2.y) || ayMin > Math.max(b1.y, b2.y)) continue;\n      if (properlyCross(a1, a2, b1, b2)) n++;\n    }\n  }\n  return n;\n}\n\n/** Count crossings between a candidate and a single committed route. */\nfunction countCrossingsBetween(a: CommittedRoute, b: CommittedRoute): number {\n  if (!a.isBezier && !b.isBezier) {\n    return countHVCrossings(a.hSegs, a.vSegs, b.hSegs, b.vSegs);\n  }\n  return countPolylineCrossings(a.points, b.points);\n}\n\n/** Total crossing score for a candidate against all committed routes. */\nfunction crossingScore(\n  pts:       readonly Point[],\n  hSegs:     readonly HSegment[],\n  vSegs:     readonly VSegment[],\n  isBezier:  boolean,\n  committed: readonly CommittedRoute[],\n): number {\n  let crossings = 0;\n  for (const cr of committed) {\n    if (!isBezier && !cr.isBezier) {\n      crossings += countHVCrossings(hSegs, vSegs, cr.hSegs, cr.vSegs);\n    } else {\n      crossings += countPolylineCrossings(pts, cr.points);\n    }\n  }\n  return crossings * W_CROSS;\n}\n\n// \u2500\u2500\u2500 Cost function components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Side preference penalty.\n * Ideal source wall faces the target; ideal destination wall faces back.\n * Each step away from ideal costs W_SIDE.\n */\nfunction sidePenalty(\n  srcWall:   CardinalSide,\n  dstWall:   CardinalSide,\n  srcCenter: Point,\n  dstCenter: Point,\n): number {\n  const dx   = dstCenter.x - srcCenter.x;\n  const dy   = dstCenter.y - srcCenter.y;\n  const absX = Math.abs(dx), absY = Math.abs(dy);\n\n  const idealSrc: CardinalSide =\n    absX >= absY ? (dx >= 0 ? 'E' : 'W') : (dy >= 0 ? 'S' : 'N');\n  const idealDst: CardinalSide =\n    absX >= absY ? (dx >= 0 ? 'W' : 'E') : (dy >= 0 ? 'N' : 'S');\n\n  return sideSteps(srcWall, idealSrc) * W_SIDE +\n         sideSteps(dstWall, idealDst) * W_SIDE;\n}\n\nfunction sideSteps(wall: CardinalSide, ideal: CardinalSide): number {\n  if (wall === ideal) return 0;\n  const opp: Record<CardinalSide, CardinalSide> = { N: 'S', S: 'N', E: 'W', W: 'E' };\n  return opp[wall] === ideal ? 2 : 1;\n}\n\n/**\n * Two-tier port conflict penalty.\n * W_INTER for cross-link vs cross-link conflicts (strongly discouraged).\n * W_INTRA for cross-link vs intra-diagram edge (softer, can be overridden).\n */\nfunction portConflictScore(\n  srcKey:   string, srcWall: CardinalSide, srcPt: Point, _srcT: number,\n  dstKey:   string, dstWall: CardinalSide, dstPt: Point, _dstT: number,\n  committed: readonly CommittedRoute[],\n  intraPorts: readonly OccupiedPort[],\n  anchors:    NodeAnchorRegistry,\n): number {\n  let penalty = 0;\n\n  // Cross-link vs cross-link (W_INTER)\n  for (const cr of committed) {\n    for (const [key, wall, pt] of [\n      [cr.srcKey, cr.srcWall, cr.srcPort] as const,\n      [cr.dstKey, cr.dstWall, cr.dstPort] as const,\n    ]) {\n      if (key === srcKey && wall === srcWall) {\n        const d = Math.hypot(srcPt.x - pt.x, srcPt.y - pt.y);\n        if (d < CONFLICT_RADIUS) penalty += W_INTER * (1 - d / CONFLICT_RADIUS);\n      }\n      if (key === dstKey && wall === dstWall) {\n        const d = Math.hypot(dstPt.x - pt.x, dstPt.y - pt.y);\n        if (d < CONFLICT_RADIUS) penalty += W_INTER * (1 - d / CONFLICT_RADIUS);\n      }\n    }\n  }\n\n  // Cross-link vs intra-diagram (W_INTRA)\n  for (const ip of intraPorts) {\n    const anchor = anchors[ip.nodeKey];\n    if (!anchor) continue;\n    const ipPt = wallPoint(anchor.bounds, ip.wall, ip.t);\n    if (ip.nodeKey === srcKey && ip.wall === srcWall) {\n      const d = Math.hypot(srcPt.x - ipPt.x, srcPt.y - ipPt.y);\n      if (d < CONFLICT_RADIUS) penalty += W_INTRA * (1 - d / CONFLICT_RADIUS);\n    }\n    if (ip.nodeKey === dstKey && ip.wall === dstWall) {\n      const d = Math.hypot(dstPt.x - ipPt.x, dstPt.y - ipPt.y);\n      if (d < CONFLICT_RADIUS) penalty += W_INTRA * (1 - d / CONFLICT_RADIUS);\n    }\n  }\n\n  return penalty;\n}\n\n/** Flat penalty per short jog segment (orthogonal only). */\nfunction alignPenalty(pts: readonly Point[]): number {\n  let p = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!, b = pts[i + 1]!;\n    if (Math.hypot(b.x - a.x, b.y - a.y) < SNAP_THRESHOLD) p += W_ALIGN;\n  }\n  return p;\n}\n\n// \u2500\u2500\u2500 Port alignment snap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction snapAlignment(\n  ss: CardinalSide, sp: Point,\n  ds: CardinalSide, dp: Point,\n): { srcPort: Point; dstPort: Point } {\n  const sH = ss === 'E' || ss === 'W', dH = ds === 'E' || ds === 'W';\n  if (sH && dH && Math.abs(sp.y - dp.y) < SNAP_THRESHOLD) {\n    const avgY = (sp.y + dp.y) / 2;\n    return { srcPort: { x: sp.x, y: avgY }, dstPort: { x: dp.x, y: avgY } };\n  }\n  const sV = ss === 'N' || ss === 'S', dV = ds === 'N' || ds === 'S';\n  if (sV && dV && Math.abs(sp.x - dp.x) < SNAP_THRESHOLD) {\n    const avgX = (sp.x + dp.x) / 2;\n    return { srcPort: { x: avgX, y: sp.y }, dstPort: { x: avgX, y: dp.y } };\n  }\n  return { srcPort: sp, dstPort: dp };\n}\n\n// \u2500\u2500\u2500 Pass 0: Shared-endpoint port pre-assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * For every (node, wall) pair that has 2+ cross-links touching it, assign\n * evenly-spaced t values sorted by the angular position of the OTHER endpoint\n * along the wall's tangent direction.\n *\n * Invariant: if two routes share a node wall, their t values are ordered the\n * same way as the spatial positions of their other endpoints \u2014 so the routes\n * form a non-crossing fan at the shared node, eliminating the need for repair.\n */\nfunction preAssignSharedPorts(\n  links:   readonly CrossLink[],\n  anchors: NodeAnchorRegistry,\n): Map<number, PortHint> {\n  const key = (addr: { cellPath: readonly string[]; nodeId: string }) =>\n    [...addr.cellPath, addr.nodeId].join('.');\n\n  // Step 1: determine ideal wall for each endpoint\n  const walls: Array<{ srcWall: CardinalSide; dstWall: CardinalSide }> = links.map(link => {\n    const sa = anchors[key(link.from)];\n    const da = anchors[key(link.to)];\n    if (!sa || !da) return { srcWall: 'E' as CardinalSide, dstWall: 'W' as CardinalSide };\n    const sc = rectCenter(sa.bounds), dc = rectCenter(da.bounds);\n    return {\n      srcWall: link.exitWall  ?? idealSrcWall(sc, dc),\n      dstWall: link.entryWall ?? idealDstWall(sc, dc),\n    };\n  });\n\n  // Step 2: group by (nodeKey, wall)\n  type Entry = { linkIdx: number; isSource: boolean; tangentKey: number };\n  const groups = new Map<string, Entry[]>();\n\n  for (let i = 0; i < links.length; i++) {\n    const link    = links[i]!;\n    const srcKey  = key(link.from);\n    const dstKey  = key(link.to);\n    const sa      = anchors[srcKey];\n    const da      = anchors[dstKey];\n    if (!sa || !da) continue;\n\n    const { srcWall, dstWall } = walls[i]!;\n    const sc = rectCenter(sa.bounds), dc = rectCenter(da.bounds);\n\n    // tangent key = position of the OTHER endpoint along the wall's tangent axis\n    // N/S walls run horizontally \u2192 sort by x; E/W walls run vertically \u2192 sort by y\n    const srcTK = (srcWall === 'N' || srcWall === 'S') ? dc.x : dc.y;\n    const dstTK = (dstWall === 'N' || dstWall === 'S') ? sc.x : sc.y;\n\n    const sg = `${srcKey}:${srcWall}`;\n    const dg = `${dstKey}:${dstWall}`;\n    if (!groups.has(sg)) groups.set(sg, []);\n    if (!groups.has(dg)) groups.set(dg, []);\n    groups.get(sg)!.push({ linkIdx: i, isSource: true,  tangentKey: srcTK });\n    groups.get(dg)!.push({ linkIdx: i, isSource: false, tangentKey: dstTK });\n  }\n\n  // Step 3: assign evenly-spaced t values along each wall.\n  //   - Groups with 2+ members always fan (non-crossing arrival/departure order).\n  //   - A single link that is USER-PINNED to a wall still gets a slot so it\n  //     lands at the wall midpoint (1/(1+1)); this is the fan formula degenerating\n  //     to centre, NOT a hardcoded 0.5. Two pinned links \u2192 1/3, 2/3, and so on.\n  //   - A single AUTO link keeps its cost-search freedom (no hint emitted).\n  const result = new Map<number, PortHint>();\n\n  for (const [groupKey, members] of groups) {\n    const wall = groupKey.split(':').at(-1) as CardinalSide;\n    const pinnedHere = members.filter(m => {\n      const l = links[m.linkIdx]!;\n      return m.isSource ? l.exitWall === wall : l.entryWall === wall;\n    });\n\n    // Which members actually get fanned on this wall.\n    // If any link is pinned here, only the pinned links share the wall slots\n    // (auto links keep searching). Otherwise fan the whole group when 2+.\n    const fanned = pinnedHere.length > 0 ? pinnedHere : members;\n    if (fanned.length < 2 && pinnedHere.length === 0) continue;\n\n    fanned.sort((a, b) => a.tangentKey - b.tangentKey);\n    const n = fanned.length;\n\n    for (let k = 0; k < n; k++) {\n      const { linkIdx, isSource } = fanned[k]!;\n      const t = (k + 1) / (n + 1);\n      const ex = result.get(linkIdx) ?? {};\n      result.set(linkIdx, isSource\n        ? { ...ex, srcWall: wall, srcT: t }\n        : { ...ex, dstWall: wall, dstT: t },\n      );\n    }\n  }\n\n  return result;\n}\n\n/** Centre of a bounding rect. */\nfunction rectCenter(r: Rect): Point {\n  return { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n}\n\n/** Ideal exit wall on the source node when routing toward dst. */\nfunction idealSrcWall(sc: Point, dc: Point): CardinalSide {\n  const dx = dc.x - sc.x, dy = dc.y - sc.y;\n  return Math.abs(dx) >= Math.abs(dy) ? (dx >= 0 ? 'E' : 'W') : (dy >= 0 ? 'S' : 'N');\n}\n\n/** Ideal entry wall on the destination node (opposite of idealSrcWall). */\nfunction idealDstWall(sc: Point, dc: Point): CardinalSide {\n  const opp: Record<CardinalSide, CardinalSide> = { N: 'S', S: 'N', E: 'W', W: 'E' };\n  return opp[idealSrcWall(sc, dc)];\n}\n\n// \u2500\u2500\u2500 Geometry helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Point at fraction t (0=wall start, 1=wall end) along a node wall.\n * N/S: t=0 is left edge, t=1 is right edge.\n * E/W: t=0 is top edge, t=1 is bottom edge.\n */\nfunction wallPoint(bounds: Rect, wall: CardinalSide, t: number): Point {\n  const { x, y, width: w, height: h } = bounds;\n  switch (wall) {\n    case 'N': return { x: x + w * t, y };\n    case 'S': return { x: x + w * t, y: y + h };\n    case 'W': return { x, y: y + h * t };\n    case 'E': return { x: x + w, y: y + h * t };\n  }\n}\n\n/** Sample n+1 points along a cubic bezier. */\nfunction sampleCubicBezier(p0: Point, p1: Point, p2: Point, p3: Point, n: number): Point[] {\n  const pts: Point[] = [];\n  for (let i = 0; i <= n; i++) {\n    const t = i / n, t2 = t * t, t3 = t2 * t;\n    const mt = 1 - t, mt2 = mt * mt, mt3 = mt2 * mt;\n    pts.push({\n      x: mt3 * p0.x + 3 * mt2 * t * p1.x + 3 * mt * t2 * p2.x + t3 * p3.x,\n      y: mt3 * p0.y + 3 * mt2 * t * p1.y + 3 * mt * t2 * p2.y + t3 * p3.y,\n    });\n  }\n  return pts;\n}\n\n/** For bezier WorkingRoute: return sampled curve pts; otherwise return raw pts. */\nfunction sampledPts(wr: WorkingRoute): Point[] {\n  if (wr.isBezier && wr.points.length === 4) {\n    return sampleCubicBezier(wr.points[0]!, wr.points[1]!, wr.points[2]!, wr.points[3]!, 12);\n  }\n  return wr.points;\n}\n\n/** True iff two line segments properly cross (not merely touch). */\nfunction properlyCross(p1: Point, p2: Point, p3: Point, p4: Point): boolean {\n  const d1 = cross2(p3, p4, p1), d2 = cross2(p3, p4, p2);\n  const d3 = cross2(p1, p2, p3), d4 = cross2(p1, p2, p4);\n  return ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) &&\n         ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0));\n}\n\nfunction cross2(a: Point, b: Point, c: Point): number {\n  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\nfunction pathLen(pts: readonly Point[]): number {\n  let len = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!, b = pts[i + 1]!;\n    len += Math.hypot(b.x - a.x, b.y - a.y);\n  }\n  return len;\n}\n\nfunction pointAtFrac(pts: readonly Point[], t: number): Point {\n  if (pts.length === 0) return { x: 0, y: 0 };\n  if (pts.length === 1) return pts[0]!;\n  const lens: number[] = [];\n  let total = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const l = Math.hypot(pts[i + 1]!.x - pts[i]!.x, pts[i + 1]!.y - pts[i]!.y);\n    lens.push(l); total += l;\n  }\n  if (total === 0) return pts[0]!;\n  let acc = 0;\n  const target = total * Math.min(Math.max(t, 0), 1);\n  for (let i = 0; i < lens.length; i++) {\n    const l = lens[i]!;\n    if (acc + l >= target) {\n      const frac = l > 0 ? (target - acc) / l : 0;\n      const a = pts[i]!, b = pts[i + 1]!;\n      return { x: a.x + (b.x - a.x) * frac, y: a.y + (b.y - a.y) * frac };\n    }\n    acc += l;\n  }\n  return pts[pts.length - 1]!;\n}\n\nfunction dominantSegment(pts: readonly Point[]): { axis: 'h' | 'v'; coord: number } {\n  let bestLen = 0, axis: 'h' | 'v' = 'h', coord = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!, b = pts[i + 1]!;\n    const dx = Math.abs(b.x - a.x), dy = Math.abs(b.y - a.y);\n    const len = dx + dy;\n    if (len > bestLen) {\n      bestLen = len;\n      if (dy > dx) { axis = 'v'; coord = (a.x + b.x) / 2; }\n      else          { axis = 'h'; coord = (a.y + b.y) / 2; }\n    }\n  }\n  return { axis, coord };\n}\n\n/**\n * Pick the anchor point for an edge label. Prefers the midpoint of the longest\n * HORIZONTAL segment (labels are horizontal text and read best along a\n * horizontal run), and only falls back to the longest segment overall when the\n * route has no meaningful horizontal segment (e.g. a pure vertical link).\n */\nfunction labelAnchor(pts: readonly Point[]): Point {\n  if (pts.length === 0) return { x: 0, y: 0 };\n  if (pts.length === 1) return pts[0]!;\n  let bestH = -1;\n  let hMid: Point | null = null;\n  let bestAny = -1;\n  let anyMid: Point = pts[0]!;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!, b = pts[i + 1]!;\n    const dx = Math.abs(b.x - a.x), dy = Math.abs(b.y - a.y);\n    const len = Math.hypot(dx, dy);\n    if (len > bestAny) {\n      bestAny = len;\n      anyMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n    if (dx > dy && dx > bestH) {\n      bestH = dx;\n      hMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n  }\n  return hMid ?? anyMid;\n}\n\nfunction edgeStyleToDash(style: string | undefined): string | undefined {\n  if (style === 'dotted') return '4 3';\n  if (style === 'dashed') return '8 4';\n  // 'solid', 'thick', 'wavy', undefined \u2192 no dasharray\n  return undefined;\n}\n\n// \u2500\u2500\u2500 Post-route: border nudging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction nudgeOffBorders(routes: WorkingRoute[], borders: readonly Rect[]): void {\n  const TOLERANCE = 3, NUDGE = 8;\n  const hBorderYs = borders.filter(b => b.width > b.height).map(b => b.y + b.height / 2);\n  const vBorderXs = borders.filter(b => b.height >= b.width).map(b => b.x + b.width / 2);\n\n  for (const route of routes) {\n    if (route.isBezier) continue;\n    const pts = route.points;\n    for (let i = 0; i < pts.length - 1; i++) {\n      const a = pts[i]!, b = pts[i + 1]!;\n      if (Math.abs(b.y - a.y) < 1 && Math.abs(b.x - a.x) > 1) {\n        for (const borderY of hBorderYs) {\n          if (Math.abs(a.y - borderY) < TOLERANCE) {\n            const midY = (Math.min(...pts.map(p => p.y)) + Math.max(...pts.map(p => p.y))) / 2;\n            const nd = a.y < midY ? -NUDGE : NUDGE;\n            pts[i] = { x: a.x, y: a.y + nd }; pts[i + 1] = { x: b.x, y: b.y + nd }; break;\n          }\n        }\n      } else if (Math.abs(b.x - a.x) < 1 && Math.abs(b.y - a.y) > 1) {\n        for (const borderX of vBorderXs) {\n          if (Math.abs(a.x - borderX) < TOLERANCE) {\n            const midX = (Math.min(...pts.map(p => p.x)) + Math.max(...pts.map(p => p.x))) / 2;\n            const nd = a.x < midX ? -NUDGE : NUDGE;\n            pts[i] = { x: a.x + nd, y: a.y }; pts[i + 1] = { x: b.x + nd, y: b.y }; break;\n          }\n        }\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Post-route: channel separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction separateChannels(routes: WorkingRoute[]): void {\n  interface Seg {\n    ri: number; si: number; isV: boolean; coord: number; lo: number; hi: number;\n  }\n  const segs: Seg[] = [];\n  for (let ri = 0; ri < routes.length; ri++) {\n    if (routes[ri]!.isBezier) continue;\n    const pts = routes[ri]!.points;\n    for (let si = 0; si < pts.length - 1; si++) {\n      const a = pts[si]!, b = pts[si + 1]!;\n      const dx = Math.abs(b.x - a.x), dy = Math.abs(b.y - a.y);\n      if (dx < 1 && dy > 1) {\n        segs.push({ ri, si, isV: true,  coord: (a.x + b.x) / 2, lo: Math.min(a.y, b.y), hi: Math.max(a.y, b.y) });\n      } else if (dy < 1 && dx > 1) {\n        segs.push({ ri, si, isV: false, coord: (a.y + b.y) / 2, lo: Math.min(a.x, b.x), hi: Math.max(a.x, b.x) });\n      }\n    }\n  }\n\n  const COORD_TOL = 10;\n  const used = new Set<number>();\n  for (let i = 0; i < segs.length; i++) {\n    if (used.has(i)) continue;\n    const si = segs[i]!;\n    const group = [i];\n    for (let j = i + 1; j < segs.length; j++) {\n      if (used.has(j)) continue;\n      const sj = segs[j]!;\n      if (sj.isV !== si.isV) continue;\n      if (Math.abs(sj.coord - si.coord) > COORD_TOL) continue;\n      if (sj.hi - si.lo > 8 && si.hi - sj.lo > 8) { group.push(j); used.add(j); }\n    }\n    used.add(i);\n    if (group.length < 2) continue;\n    const n = group.length;\n    for (let k = 0; k < n; k++) {\n      const seg = segs[group[k]!]!;\n      const offset = (k - (n - 1) / 2) * CHANNEL_GAP;\n      const pts = routes[seg.ri]!.points;\n      if (seg.isV) {\n        pts[seg.si]     = { x: pts[seg.si]!.x     + offset, y: pts[seg.si]!.y };\n        pts[seg.si + 1] = { x: pts[seg.si + 1]!.x + offset, y: pts[seg.si + 1]!.y };\n      } else {\n        pts[seg.si]     = { x: pts[seg.si]!.x,     y: pts[seg.si]!.y     + offset };\n        pts[seg.si + 1] = { x: pts[seg.si + 1]!.x, y: pts[seg.si + 1]!.y + offset };\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Label de-collision \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction deCollideLabels(\n  labelRects: Array<{ x: number; y: number; width: number; height: number }>,\n  fixedRects: readonly Rect[],\n): void {\n  const MAX_PASSES = 20, NUDGE = 2;\n  for (let pass = 0; pass < MAX_PASSES; pass++) {\n    let moved = false;\n    for (const lr of labelRects) {\n      for (const fr of fixedRects) {\n        if (!rectsOverlap(lr, fr)) continue;\n        const ox = Math.min(lr.x + lr.width,  fr.x + fr.width)  - Math.max(lr.x, fr.x);\n        const oy = Math.min(lr.y + lr.height, fr.y + fr.height) - Math.max(lr.y, fr.y);\n        if (ox <= oy) {\n          lr.x = (lr.x + lr.width / 2) <= (fr.x + fr.width / 2) ? fr.x - lr.width - NUDGE : fr.x + fr.width + NUDGE;\n        } else {\n          lr.y = (lr.y + lr.height / 2) <= (fr.y + fr.height / 2) ? fr.y - lr.height - NUDGE : fr.y + fr.height + NUDGE;\n        }\n        moved = true;\n      }\n    }\n    for (let i = 0; i < labelRects.length; i++) {\n      for (let j = i + 1; j < labelRects.length; j++) {\n        const a = labelRects[i]!, b = labelRects[j]!;\n        if (!rectsOverlap(a, b)) continue;\n        const oy = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n        if (a.y + a.height / 2 <= b.y + b.height / 2) {\n          a.y -= oy / 2 + NUDGE; b.y += oy / 2 + NUDGE;\n        } else {\n          a.y += oy / 2 + NUDGE; b.y -= oy / 2 + NUDGE;\n        }\n        moved = true;\n      }\n    }\n    if (!moved) break;\n  }\n}\n\nfunction rectsOverlap(a: Rect, b: Rect): boolean {\n  return a.x < b.x + b.width  && a.x + a.width  > b.x &&\n         a.y < b.y + b.height && a.y + a.height > b.y;\n}\n", "/**\n * Diagram-agnostic post-layout connector stage.\n *\n * This is the neutral seam over the existing cross-link routing/rendering\n * engine. Callers lower their own semantics to local endpoint keys; poster uses\n * its NodeAddress adapter, while single diagrams can use plain keys like `c3`.\n */\n\nimport type { SceneElement } from '../contracts/scene.js';\nimport type { CardinalSide, NodeAnchorRegistry, OccupiedPort } from '../contracts/anchors.js';\nimport type { CrossLink, CrossLinkAnimation, CrossLinkDirection, CrossLinkEdgeStyle, NodeAddress } from '../contracts/crosslink.js';\nimport type { Rect } from '../contracts/primitives.js';\nimport type { CurveStyle, RouteStyle } from '../contracts/routing.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { routeAndRenderCrossLinks3 } from './engine3.js';\n\nexport interface NormalizedConnectorSpec {\n  readonly fromKey: string;\n  readonly toKey: string;\n  readonly direction: CrossLinkDirection;\n  readonly style: CrossLinkEdgeStyle;\n  readonly label?: string;\n  readonly routing?: RouteStyle;\n  readonly curveStyle?: CurveStyle;\n  readonly exitWall?: CardinalSide;\n  readonly entryWall?: CardinalSide;\n  readonly animation?: CrossLinkAnimation;\n  readonly props?: Readonly<Record<string, string | number>>;\n  /**\n   * Optional blocked-container IDs for endpoint-aware obstacle exclusion.\n   * Poster passes cell paths here; local DS diagrams normally omit them.\n   */\n  readonly fromContainerKey?: string;\n  readonly toContainerKey?: string;\n}\n\nexport interface ConnectorDiagnostic {\n  readonly connectorIndex: number;\n  readonly message: string;\n}\n\nexport interface ConnectorExtents {\n  readonly minX: number;\n  readonly minY: number;\n  readonly maxX: number;\n  readonly maxY: number;\n}\n\nexport interface ConnectorStageInput {\n  readonly elements?: readonly SceneElement[];\n  readonly layerBuckets?: Readonly<Record<string, readonly SceneElement[]>>;\n  readonly anchors: NodeAnchorRegistry;\n  readonly connectors: readonly NormalizedConnectorSpec[];\n  readonly theme: ResolvedTheme;\n  readonly occupiedPorts?: readonly OccupiedPort[];\n  readonly occupiedTextRects?: readonly Rect[];\n  readonly routingObstacles?: readonly Rect[];\n  readonly containerObstacles?: ReadonlyMap<string, Rect>;\n}\n\nexport interface ConnectorStageResult {\n  readonly pathElements: SceneElement[];\n  readonly labelElements: SceneElement[];\n  readonly elements: SceneElement[];\n  readonly defs: string[];\n  readonly diagnostics: ConnectorDiagnostic[];\n  readonly extents: ConnectorExtents;\n}\n\nexport function routeConnectors(input: ConnectorStageInput): ConnectorStageResult {\n  const diagnostics = connectorDiagnostics(input.connectors, input.anchors);\n  const resolvable = input.connectors.filter(spec =>\n    input.anchors[spec.fromKey] !== undefined && input.anchors[spec.toKey] !== undefined,\n  );\n\n  const links = resolvable.map(specToCrossLink);\n  const rendered = links.length > 0\n    ? routeAndRenderCrossLinks3(\n      links,\n      input.theme,\n      input.anchors,\n      input.occupiedPorts,\n      input.occupiedTextRects,\n      input.routingObstacles,\n      input.containerObstacles,\n    )\n    : { defs: [], elements: [] };\n\n  const pathElements = rendered.elements.filter(e => e.type !== 'text');\n  const labelElements = rendered.elements.filter(e => e.type === 'text');\n\n  return {\n    pathElements,\n    labelElements,\n    elements: rendered.elements,\n    defs: rendered.defs,\n    diagnostics,\n    extents: connectorExtents(rendered.elements),\n  };\n}\n\nexport function crossLinksToConnectorSpecs(\n  links: readonly CrossLink[],\n  defaults?: { curveStyle?: CurveStyle },\n): NormalizedConnectorSpec[] {\n  return links.map(link => {\n    const fromKey = addressToKey(link.from);\n    const toKey = addressToKey(link.to);\n    const curveStyle = link.curveStyle ?? defaults?.curveStyle;\n    return {\n      fromKey,\n      toKey,\n      direction: link.direction,\n      style: link.style,\n      ...(link.label !== undefined ? { label: link.label } : {}),\n      ...(link.routing !== undefined ? { routing: link.routing } : {}),\n      ...(curveStyle !== undefined ? { curveStyle } : {}),\n      ...(link.exitWall !== undefined ? { exitWall: link.exitWall } : {}),\n      ...(link.entryWall !== undefined ? { entryWall: link.entryWall } : {}),\n      ...(link.animation !== undefined ? { animation: link.animation } : {}),\n      ...(link.props !== undefined ? { props: link.props } : {}),\n      ...(link.from.cellPath.length > 0 ? { fromContainerKey: link.from.cellPath.join('.') } : {}),\n      ...(link.to.cellPath.length > 0 ? { toContainerKey: link.to.cellPath.join('.') } : {}),\n    };\n  });\n}\n\nfunction connectorDiagnostics(\n  connectors: readonly NormalizedConnectorSpec[],\n  anchors: NodeAnchorRegistry,\n): ConnectorDiagnostic[] {\n  const diagnostics: ConnectorDiagnostic[] = [];\n  for (let i = 0; i < connectors.length; i++) {\n    const spec = connectors[i]!;\n    if (!anchors[spec.fromKey]) {\n      diagnostics.push({ connectorIndex: i, message: `Cannot resolve source: \"${spec.fromKey}\" not found in anchor registry` });\n    }\n    if (!anchors[spec.toKey]) {\n      diagnostics.push({ connectorIndex: i, message: `Cannot resolve target: \"${spec.toKey}\" not found in anchor registry` });\n    }\n  }\n  return diagnostics;\n}\n\nfunction specToCrossLink(spec: NormalizedConnectorSpec): CrossLink {\n  return {\n    from: keyToAddress(spec.fromKey, spec.fromContainerKey),\n    to: keyToAddress(spec.toKey, spec.toContainerKey),\n    direction: spec.direction,\n    style: spec.style,\n    ...(spec.label !== undefined ? { label: spec.label } : {}),\n    ...(spec.routing !== undefined ? { routing: spec.routing } : {}),\n    ...(spec.curveStyle !== undefined ? { curveStyle: spec.curveStyle } : {}),\n    ...(spec.exitWall !== undefined ? { exitWall: spec.exitWall } : {}),\n    ...(spec.entryWall !== undefined ? { entryWall: spec.entryWall } : {}),\n    ...(spec.animation !== undefined ? { animation: spec.animation } : {}),\n    ...(spec.props !== undefined ? { props: spec.props } : {}),\n  };\n}\n\nfunction keyToAddress(key: string, containerKey?: string): NodeAddress {\n  if (containerKey && key.startsWith(`${containerKey}.`)) {\n    return {\n      cellPath: containerKey.split('.'),\n      nodeId: key.slice(containerKey.length + 1),\n    };\n  }\n  return { cellPath: [], nodeId: key };\n}\n\nfunction addressToKey(addr: NodeAddress): string {\n  return [...addr.cellPath, addr.nodeId].join('.');\n}\n\nfunction connectorExtents(elements: readonly SceneElement[]): ConnectorExtents {\n  if (elements.length === 0) {\n    return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n  }\n\n  let minX = Infinity;\n  let minY = Infinity;\n  let maxX = -Infinity;\n  let maxY = -Infinity;\n\n  for (const el of elements) {\n    if (el.type === 'path') {\n      const nums: number[] = [];\n      for (const m of el.d.matchAll(/-?\\d+(?:\\.\\d+)?/g)) {\n        const n = parseFloat(m[0]);\n        if (!Number.isNaN(n)) nums.push(n);\n      }\n      for (let i = 0; i + 1 < nums.length; i += 2) {\n        minX = Math.min(minX, nums[i]!);\n        minY = Math.min(minY, nums[i + 1]!);\n        maxX = Math.max(maxX, nums[i]!);\n        maxY = Math.max(maxY, nums[i + 1]!);\n      }\n    } else if (el.type === 'text') {\n      const approxW = el.content.length * (el.fontSize ?? 12) * 0.65;\n      const left = el.anchor === 'middle'\n        ? el.position.x - approxW / 2\n        : el.anchor === 'end'\n          ? el.position.x - approxW\n          : el.position.x;\n      const top = el.position.y - (el.fontSize ?? 12);\n      minX = Math.min(minX, left);\n      minY = Math.min(minY, top);\n      maxX = Math.max(maxX, left + approxW);\n      maxY = Math.max(maxY, el.position.y + (el.fontSize ?? 12));\n    }\n  }\n\n  if (!Number.isFinite(minX)) return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n  return { minX, minY, maxX, maxY };\n}\n", "/**\n * @file diagrams/struct/shared.ts \u2014 Shared helpers for the strip/memory family.\n */\n\nexport const ARROW_ID = 'struct-arrow';\n\n/** A small filled arrowhead marker def in the given colour.\n *\n * markerUnits=\"userSpaceOnUse\" keeps the arrowhead a CONSTANT pixel size\n * regardless of the edge's strokeWidth. Dimensions are scaled to match the\n * visual size of the old strokeWidth-relative marker on a 1.5-width edge\n * (8 sw-units \u00D7 1.5 = 12 px). Active edges (sw=2.5) now get the same\n * arrowhead size instead of the previous ~1.67\u00D7 balloon.\n */\nexport function arrowDef(color: string): string {\n  return `<marker id=\"${ARROW_ID}\" markerWidth=\"12\" markerHeight=\"12\" refX=\"10\" refY=\"6\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><path d=\"M0 0 L12 6 L0 12 z\" fill=\"${color}\" /></marker>`;\n}\n\n/** Tokens on the keyword line and directive lines, trimmed and split. */\nexport function lines(input: string): string[] {\n  return input.split(/\\r?\\n/).map(l => l.trim()).filter(Boolean);\n}\n\n/**\n * Split a directive line into bare tokens and double-quoted tokens.\n *\n * Quoted tokens support only `\\\"` and `\\\\` escapes and cannot span lines.\n * Full-line comment handling remains centralized before diagram parsers run;\n * this tokenizer intentionally does not strip inline `%%` text.\n */\nexport function tokenizeDirective(line: string): string[] {\n  const tokens: string[] = [];\n  let i = 0;\n\n  while (i < line.length) {\n    while (i < line.length && /\\s/.test(line[i]!)) i++;\n    if (i >= line.length) break;\n\n    if (line[i] === '\"') {\n      i++;\n      let value = '';\n      while (i < line.length) {\n        const ch = line[i]!;\n        if (ch === '\"') {\n          i++;\n          break;\n        }\n        if (ch === '\\\\') {\n          const next = line[i + 1];\n          if (next === '\"' || next === '\\\\') {\n            value += next;\n            i += 2;\n            continue;\n          }\n        }\n        value += ch;\n        i++;\n      }\n      if (line[i - 1] !== '\"') throw new Error(`Unterminated quoted string: ${line}`);\n      tokens.push(value);\n      continue;\n    }\n\n    const start = i;\n    while (i < line.length && !/\\s/.test(line[i]!)) i++;\n    tokens.push(line.slice(start, i));\n  }\n\n  return tokens;\n}\n", "/**\n * @file diagrams/struct/array.ts \u2014 Contiguous array (cell strip + pointers).\n *\n * Value-driven mini-syntax:\n *   array 5 8 13 21 34        // cells on the header line, or:\n *   array\n *     title nums\n *     cells 5 8 ... 34\n *     axis vertical\n *     index bottom reverse\n *     ptr i -> 2 \"slow pointer\"\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry, Rect, TextAnchor,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\nexport type ArrayAxis = 'horizontal' | 'vertical';\nexport type ArrayIndexSide = 'before' | 'after';\nexport type ArrayIndexOrder = 'normal' | 'reverse';\n\nexport interface ArrayValueCell {\n  readonly kind: 'value';\n  readonly value: string;\n}\n\nexport interface ArrayGapCell {\n  readonly kind: 'gap';\n}\n\nexport type ArrayCell = ArrayValueCell | ArrayGapCell;\n\nexport interface ArrayPointerTarget {\n  readonly raw: string;\n  readonly value?: number;\n  readonly anchor?: string;\n}\n\nexport interface ArrayPointer {\n  readonly id: string;\n  readonly label?: string;\n  readonly target: ArrayPointerTarget;\n}\n\nexport interface ArrayDoc {\n  readonly title?: string;\n  readonly axis: ArrayAxis;\n  readonly index: {\n    readonly show: boolean;\n    readonly side: ArrayIndexSide;\n    readonly order: ArrayIndexOrder;\n  };\n  readonly cells: readonly ArrayCell[];\n  readonly ptrs: readonly ArrayPointer[];\n  /** Logical indices of cells to render with an accent highlight fill. */\n  readonly highlights?: readonly number[];\n  /** Contiguous range [start, end] (inclusive logical indices) to highlight. */\n  readonly window?: { readonly start: number; readonly end: number };\n}\n\ninterface ArrayIndexMetadata {\n  readonly physicalToLogical: readonly (number | null)[];\n  readonly indexToPhysical: ReadonlyMap<number, number>;\n  readonly nonGapPhysicals: readonly number[];\n  readonly gapPhysical?: number;\n}\n\ninterface ResolvedPointer {\n  readonly ptr: ArrayPointer;\n  readonly physical: number;\n}\n\ninterface LabelLaneInput {\n  readonly ptrIndex: number;\n  readonly start: number;\n  readonly end: number;\n}\n\nfunction parse(input: string): ArrayDoc {\n  let title: string | undefined;\n  let cells: ArrayCell[] = [];\n  let axis: ArrayAxis = 'horizontal';\n  let indexShow = false;\n  let indexSide: ArrayIndexSide = 'before';\n  let indexOrder: ArrayIndexOrder = 'normal';\n  const ptrs: ArrayPointer[] = [];\n  let highlights: number[] | undefined;\n  let win: { start: number; end: number } | undefined;\n\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t.length === 0) continue;\n\n    if (t[0] === 'array') {\n      if (t.length > 1) cells = parseCells(t.slice(1));\n      continue;\n    }\n\n    if (t[0] === 'title') {\n      title = t.slice(1).join(' ');\n      continue;\n    }\n\n    if (t[0] === 'cells') {\n      cells = parseCells(t.slice(1));\n      continue;\n    }\n\n    if (t[0] === 'axis') {\n      if (t[1] === 'vertical' || t[1] === 'horizontal') axis = t[1];\n      continue;\n    }\n\n    if (t[0] === 'index') {\n      indexShow = true;\n      for (const mod of t.slice(1)) {\n        if (mod === 'bottom') indexSide = 'after';\n        if (mod === 'top') indexSide = 'before';\n        if (mod === 'reverse') indexOrder = 'reverse';\n      }\n      continue;\n    }\n\n    if (t[0] === 'highlight') {\n      highlights = t.slice(1).map(Number).filter(n => !isNaN(n) && Number.isInteger(n));\n      continue;\n    }\n\n    if (t[0] === 'window' && t[1]) {\n      const m = t[1].match(/^(\\d+)-(\\d+)$/);\n      if (m) win = { start: Number(m[1]), end: Number(m[2]) };\n      continue;\n    }\n\n    if (t[0] === 'ptr' && t.length >= 4 && t[2] === '->') {\n      ptrs.push({ id: t[1]!, target: parsePointerTarget(t[3]!), ...(t[4] !== undefined ? { label: t[4] } : {}) });\n    }\n  }\n\n  return {\n    ...(title !== undefined ? { title } : {}),\n    axis,\n    index: { show: indexShow, side: indexSide, order: indexOrder },\n    cells,\n    ptrs,\n    ...(highlights !== undefined && highlights.length > 0 ? { highlights } : {}),\n    ...(win !== undefined ? { window: win } : {}),\n  };\n}\n\nfunction parseCells(tokens: readonly string[]): ArrayCell[] {\n  const cells = tokens.map(token => token === '...' ? { kind: 'gap' } as const : { kind: 'value', value: token } as const);\n  const gapPositions = cells\n    .map((cell, i) => cell.kind === 'gap' ? i : -1)\n    .filter(i => i >= 0);\n\n  if (gapPositions.length > 1) throw new Error('Array cells may contain at most one ... gap');\n  if (gapPositions.length === 1) {\n    const gap = gapPositions[0]!;\n    if (gap === 0 || gap === cells.length - 1) throw new Error('Array ... gap must be between concrete cells');\n  }\n\n  return cells;\n}\n\nfunction parsePointerTarget(raw: string): ArrayPointerTarget {\n  if (/^\\d+$/.test(raw)) return { raw, value: Number(raw) };\n  if (/^c\\d+$/.test(raw) || raw === 'cfirst' || raw === 'clast' || raw === 'cgap') return { raw, anchor: raw };\n  return { raw, anchor: raw };\n}\n\nfunction metadataFor(doc: ArrayDoc): ArrayIndexMetadata {\n  const physicalToLogical = new Array<number | null>(doc.cells.length).fill(null);\n  const indexToPhysical = new Map<number, number>();\n  const nonGapPhysicals: number[] = [];\n  let gapPhysical: number | undefined;\n\n  doc.cells.forEach((cell, physical) => {\n    if (cell.kind === 'gap') {\n      gapPhysical = physical;\n    } else {\n      nonGapPhysicals.push(physical);\n    }\n  });\n\n  const logicalCount = nonGapPhysicals.length;\n  nonGapPhysicals.forEach((physical, rank) => {\n    const logical = doc.index.order === 'reverse' ? logicalCount - 1 - rank : rank;\n    physicalToLogical[physical] = logical;\n    indexToPhysical.set(logical, physical);\n  });\n\n  return {\n    physicalToLogical,\n    indexToPhysical,\n    nonGapPhysicals,\n    ...(gapPhysical !== undefined ? { gapPhysical } : {}),\n  };\n}\n\nexport function resolveArrayElementAnchorId(doc: ArrayDoc, elementIndex: number): string | undefined {\n  const meta = metadataFor(normalizeArrayDoc(doc));\n  const logicalCount = meta.nonGapPhysicals.length;\n\n  if (elementIndex < 0) {\n    const fromEnd = Math.abs(elementIndex);\n    if (fromEnd < 1 || fromEnd > logicalCount) return undefined;\n    if (fromEnd === 1) return meta.nonGapPhysicals.length > 0 ? 'clast' : undefined;\n    return `c${logicalCount - fromEnd}`;\n  }\n\n  if (doc.cells[elementIndex]?.kind === 'gap') return 'cgap';\n  return meta.indexToPhysical.has(elementIndex) ? `c${elementIndex}` : undefined;\n}\n\nexport function layoutArray(inputDoc: ArrayDoc, theme: ResolvedTheme): LayoutResult {\n  const doc = normalizeArrayDoc(inputDoc);\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const cellH = 40;\n  const cellW = Math.max(40, ...doc.cells.map(c => measureText(c.kind === 'gap' ? '\u2026' : c.value, font).width + 24));\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const indexBand = doc.index.show ? smallFont + 12 : 0;\n  const arrowLen = 30;\n  const labelGap = 6;\n  const indexPad = 6;\n  const horizontal = doc.axis === 'horizontal';\n  const meta = metadataFor(doc);\n  const resolvedPtrs = doc.ptrs\n    .map((ptr): ResolvedPointer | null => {\n      const physical = resolvePointerPhysical(ptr.target, doc, meta);\n      return physical === undefined ? null : { ptr, physical };\n    })\n    .filter((ptr): ptr is ResolvedPointer => ptr !== null);\n\n  const labelFont = font;\n  const labelLaneGap = labelFont + 8;\n  const pointerSide: ArrayIndexSide = doc.index.side === 'before' ? 'after' : 'before';\n  const horizontalLanes = horizontal ? assignHorizontalPointerLanes(resolvedPtrs, doc, meta, cellW, labelFont) : [];\n  const pointerLaneCount = Math.max(0, ...horizontalLanes.map(l => l + 1));\n  const pointerBand = resolvedPtrs.length === 0\n    ? 0\n    : horizontal\n      ? arrowLen + labelGap + labelFont + Math.max(0, pointerLaneCount - 1) * labelLaneGap + 4\n      : arrowLen + labelGap + maxPointerLabelWidth(resolvedPtrs, labelFont) + 8;\n\n  const topBand = horizontal\n    ? (doc.index.show && doc.index.side === 'before' ? indexBand : 0)\n      + (pointerSide === 'before' ? pointerBand : 0)\n    : 0;\n  const leftBand = !horizontal\n    ? (doc.index.show && doc.index.side === 'before' ? smallFont * 2 + indexPad : 0)\n      + (pointerSide === 'before' ? pointerBand : 0)\n    : 0;\n  const origin = {\n    x: leftBand,\n    y: titleH + topBand,\n  };\n  const slots = buildSlots(doc.cells.length, origin, cellW, cellH, doc.axis);\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(p.text(doc.title, origin.x, typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  doc.cells.forEach((cell, physical) => {\n    const slot = slots[physical]!;\n    if (cell.kind === 'gap') {\n      elements.push(p.rect(slot, palette.surface, palette.border, 1.5, { rx: 3, opacity: 0.45 }));\n      elements.push(p.text('\u2026', slot.x + cellW / 2, slot.y + cellH / 2 + 5, font, palette.textMuted, { anchor: 'middle', weight: 'bold' }));\n      return;\n    }\n\n    const logicalMaybe = meta.physicalToLogical[physical];\n    const logical: number | null = logicalMaybe ?? null;\n    const isHighlit = logical !== null && (\n      (doc.highlights?.includes(logical) ?? false) ||\n      (doc.window !== undefined && logical >= doc.window.start && logical <= doc.window.end)\n    );\n\n    if (isHighlit) {\n      elements.push(p.rect(slot, palette.primary, palette.primary, 2, { rx: 3, fillOpacity: 0.22 }));\n    } else {\n      elements.push(p.rect(slot, palette.surface, palette.border, 1.5, { rx: 3 }));\n    }\n    elements.push(p.text(cell.value, slot.x + cellW / 2, slot.y + cellH / 2 + 5, font, isHighlit ? palette.primary : palette.text, { anchor: 'middle', weight: 'bold' }));\n\n    if (doc.index.show && logical !== null) {\n      elements.push(renderIndexText(p, theme, String(logical), slot, cellW, cellH, doc.axis, doc.index.side, indexPad));\n    }\n  });\n\n  if (horizontal) {\n    renderHorizontalPointers(elements, p, theme, resolvedPtrs, slots, pointerSide, horizontalLanes, arrowLen, labelGap, labelLaneGap);\n  } else {\n    renderVerticalPointers(elements, p, theme, resolvedPtrs, slots, doc.index.side, arrowLen, labelGap);\n  }\n\n  const anchors: Record<string, { bounds: Rect }> = {};\n  meta.indexToPhysical.forEach((physical, logical) => {\n    anchors[`c${logical}`] = { bounds: slots[physical]! };\n  });\n  if (meta.nonGapPhysicals.length > 0) {\n    anchors.cfirst = { bounds: slots[meta.nonGapPhysicals[0]!]! };\n    anchors.clast = { bounds: slots[meta.nonGapPhysicals[meta.nonGapPhysicals.length - 1]!]! };\n  }\n  if (meta.gapPhysical !== undefined) {\n    anchors.cgap = { bounds: slots[meta.gapPhysical]! };\n  }\n\n  const contentBounds = boundsForElements(elements);\n  const dx = margin - contentBounds.x;\n  const dy = margin - contentBounds.y;\n  const shiftedElements = translateElements(elements, dx, dy);\n  const shiftedAnchors = translateAnchors(anchors, dx, dy);\n  const scene: Scene = {\n    viewBox: {\n      x: 0,\n      y: 0,\n      width: rhu(contentBounds.width + margin * 2),\n      height: rhu(contentBounds.height + margin * 2),\n    },\n    background: palette.background,\n    elements: shiftedElements,\n    defs: [arrowDef(palette.primary)],\n  };\n  return { scene, anchors: shiftedAnchors as NodeAnchorRegistry };\n}\n\nfunction normalizeArrayDoc(doc: ArrayDoc | any): ArrayDoc {\n  const cells: ArrayCell[] = (doc.cells ?? []).map((cell: string | ArrayCell) =>\n    typeof cell === 'string' ? (cell === '...' ? { kind: 'gap' } : { kind: 'value', value: cell }) : cell,\n  );\n  const index = typeof doc.index === 'boolean'\n    ? { show: doc.index, side: 'before' as const, order: 'normal' as const }\n    : {\n        show: Boolean(doc.index?.show),\n        side: doc.index?.side === 'after' ? 'after' as const : 'before' as const,\n        order: doc.index?.order === 'reverse' ? 'reverse' as const : 'normal' as const,\n      };\n  return {\n    ...(doc.title !== undefined ? { title: doc.title } : {}),\n    axis: doc.axis === 'vertical' ? 'vertical' : 'horizontal',\n    index,\n    cells,\n    ptrs: (doc.ptrs ?? []).map((ptr: any) => {\n      if ('idx' in ptr) return { id: ptr.name ?? ptr.id, target: { raw: String(ptr.idx), value: Number(ptr.idx) } };\n      return ptr;\n    }),\n    ...(Array.isArray(doc.highlights) && doc.highlights.length > 0 ? { highlights: doc.highlights as number[] } : {}),\n    ...(doc.window !== undefined ? { window: doc.window as { start: number; end: number } } : {}),\n  };\n}\n\nfunction buildSlots(count: number, origin: { x: number; y: number }, cellW: number, cellH: number, axis: ArrayAxis): Rect[] {\n  return Array.from({ length: count }, (_, i) => ({\n    x: origin.x + (axis === 'horizontal' ? i * cellW : 0),\n    y: origin.y + (axis === 'horizontal' ? 0 : i * cellH),\n    width: cellW,\n    height: cellH,\n  }));\n}\n\nfunction resolvePointerPhysical(target: ArrayPointerTarget, doc: ArrayDoc, meta: ArrayIndexMetadata): number | undefined {\n  if (target.value !== undefined) {\n    const physical = meta.indexToPhysical.get(target.value);\n    if (physical !== undefined) return physical;\n    if (doc.cells[target.value]?.kind === 'gap') return meta.gapPhysical;\n    return undefined;\n  }\n\n  if (!target.anchor) return undefined;\n  if (target.anchor === 'cfirst') return meta.nonGapPhysicals[0];\n  if (target.anchor === 'clast') return meta.nonGapPhysicals[meta.nonGapPhysicals.length - 1];\n  if (target.anchor === 'cgap') return meta.gapPhysical;\n  const cMatch = target.anchor.match(/^c(\\d+)$/);\n  if (cMatch) return meta.indexToPhysical.get(Number(cMatch[1]));\n  return undefined;\n}\n\nfunction renderIndexText(\n  p: ReturnType<typeof pen>,\n  theme: ResolvedTheme,\n  value: string,\n  slot: Rect,\n  cellW: number,\n  cellH: number,\n  axis: ArrayAxis,\n  side: ArrayIndexSide,\n  indexPad: number,\n): SceneElement {\n  const { palette, typography } = theme;\n  if (axis === 'horizontal') {\n    const x = slot.x + cellW / 2;\n    const y = side === 'before' ? slot.y - 6 : slot.y + cellH + typography.smallFontSize + 4;\n    return p.text(value, x, y, typography.smallFontSize, palette.textMuted, { anchor: 'middle' });\n  }\n\n  const centerY = slot.y + cellH / 2;\n  const x = side === 'before' ? slot.x - indexPad : slot.x + cellW + indexPad;\n  const anchor: TextAnchor = side === 'before' ? 'end' : 'start';\n  return p.text(value, x, centerY + 4, typography.smallFontSize, palette.textMuted, { anchor });\n}\n\nfunction assignHorizontalPointerLanes(\n  ptrs: readonly ResolvedPointer[],\n  doc: ArrayDoc,\n  meta: ArrayIndexMetadata,\n  cellW: number,\n  font: number,\n): number[] {\n  const intervals: LabelLaneInput[] = ptrs.map((ptr, ptrIndex) => {\n    const cx = slotCenterX(ptr.physical, cellW);\n    const text = pointerLabel(ptr.ptr);\n    const width = measureText(text, font).width + 8;\n    return { ptrIndex, start: cx - width / 2, end: cx + width / 2 };\n  });\n  void doc;\n  void meta;\n  return colorIntervals(intervals);\n}\n\nfunction colorIntervals(intervals: readonly LabelLaneInput[]): number[] {\n  const lanes: number[] = new Array(intervals.length).fill(0);\n  const laneEnds: number[] = [];\n  const sorted = [...intervals].sort((a, b) => a.start - b.start || a.end - b.end);\n\n  for (const interval of sorted) {\n    let lane = 0;\n    while (laneEnds[lane] !== undefined && interval.start < laneEnds[lane]!) lane++;\n    lanes[interval.ptrIndex] = lane;\n    laneEnds[lane] = interval.end;\n  }\n\n  return lanes;\n}\n\nfunction slotCenterX(physical: number, cellW: number): number {\n  return physical * cellW + cellW / 2;\n}\n\nfunction renderHorizontalPointers(\n  elements: SceneElement[],\n  p: ReturnType<typeof pen>,\n  theme: ResolvedTheme,\n  ptrs: readonly ResolvedPointer[],\n  slots: readonly Rect[],\n  side: ArrayIndexSide,\n  lanes: readonly number[],\n  arrowLen: number,\n  labelGap: number,\n  laneGap: number,\n): void {\n  const s = side === 'after' ? 1 : -1;\n  const { palette, typography } = theme;\n  const targetCounts = countByPointerPhysical(ptrs);\n  const seen = new Map<number, number>();\n\n  ptrs.forEach((ptr, i) => {\n    const slot = slots[ptr.physical]!;\n    const count = targetCounts.get(ptr.physical) ?? 1;\n    const ordinal = seen.get(ptr.physical) ?? 0;\n    seen.set(ptr.physical, ordinal + 1);\n    const attachX = slot.x + slot.width / 2 + centeredLaneOffset(ordinal, count, slot.width);\n    const edgeY = s > 0 ? slot.y + slot.height : slot.y;\n    const lane = lanes[i] ?? 0;\n    const tipY = edgeY;\n    const tailY = edgeY + s * (arrowLen + lane * laneGap);\n    const labelY = tailY + s * (labelGap + (s > 0 ? typography.baseFontSize : 0));\n\n    elements.push(p.path(`M ${rhu(attachX)} ${rhu(tailY)} L ${rhu(attachX)} ${rhu(tipY)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n    elements.push(p.text(pointerLabel(ptr.ptr), attachX, labelY, typography.baseFontSize, palette.primary, { anchor: 'middle', weight: 'bold' }));\n  });\n}\n\nfunction renderVerticalPointers(\n  elements: SceneElement[],\n  p: ReturnType<typeof pen>,\n  theme: ResolvedTheme,\n  ptrs: readonly ResolvedPointer[],\n  slots: readonly Rect[],\n  indexSide: ArrayIndexSide,\n  arrowLen: number,\n  labelGap: number,\n): void {\n  const s = indexSide === 'before' ? 1 : -1;\n  const { palette, typography } = theme;\n  const columnGap = labelGap + 6;\n  const groups = new Map<string, number[]>();\n\n  for (const ptr of ptrs) {\n    const key = `${ptr.physical}:${s}`;\n    const widths = groups.get(key) ?? [];\n    widths.push(measureText(pointerLabel(ptr.ptr), typography.baseFontSize).width);\n    groups.set(key, widths);\n  }\n\n  const seen = new Map<string, number>();\n  ptrs.forEach(ptr => {\n    const slot = slots[ptr.physical]!;\n    const key = `${ptr.physical}:${s}`;\n    const widths = groups.get(key) ?? [];\n    const lane = seen.get(key) ?? 0;\n    seen.set(key, lane + 1);\n    const attachY = slot.y + slot.height / 2 + centeredLaneOffset(lane, widths.length, slot.height);\n    const edgeX = s > 0 ? slot.x + slot.width : slot.x;\n    const outward = precedingLaneWidth(widths, lane, columnGap);\n    const tailX = edgeX + s * (arrowLen + outward);\n    const labelX = tailX + s * labelGap;\n    const anchor: TextAnchor = s > 0 ? 'start' : 'end';\n\n    elements.push(p.path(`M ${rhu(tailX)} ${rhu(attachY)} L ${rhu(edgeX)} ${rhu(attachY)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n    elements.push(p.text(pointerLabel(ptr.ptr), labelX, attachY + 4, typography.baseFontSize, palette.primary, { anchor, weight: 'bold' }));\n  });\n}\n\nfunction maxPointerLabelWidth(ptrs: readonly ResolvedPointer[], font: number): number {\n  return Math.max(0, ...ptrs.map(ptr => measureText(pointerLabel(ptr.ptr), font).width));\n}\n\n\nfunction countByPointerPhysical(ptrs: readonly ResolvedPointer[]): Map<number, number> {\n  const counts = new Map<number, number>();\n  for (const ptr of ptrs) counts.set(ptr.physical, (counts.get(ptr.physical) ?? 0) + 1);\n  return counts;\n}\n\nfunction centeredLaneOffset(lane: number, count: number, span: number): number {\n  if (count <= 1) return 0;\n  const gap = Math.min(12, span / Math.max(2, count + 1));\n  return (lane - (count - 1) / 2) * gap;\n}\n\nfunction precedingLaneWidth(widths: readonly number[], lane: number, gap: number): number {\n  let offset = 0;\n  for (let i = 0; i < lane; i++) offset += (widths[i] ?? 0) + gap;\n  return offset;\n}\n\nfunction boundsForElements(elements: readonly SceneElement[]): Rect {\n  const bounds = elements.map(boundsForElement).filter((b): b is Rect => b !== undefined);\n  if (bounds.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n  const minX = Math.min(...bounds.map(b => b.x));\n  const minY = Math.min(...bounds.map(b => b.y));\n  const maxX = Math.max(...bounds.map(b => b.x + b.width));\n  const maxY = Math.max(...bounds.map(b => b.y + b.height));\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction boundsForElement(element: SceneElement): Rect | undefined {\n  switch (element.type) {\n    case 'rect':\n      return element.bounds;\n    case 'circle':\n      return {\n        x: element.center.x - element.radius,\n        y: element.center.y - element.radius,\n        width: element.radius * 2,\n        height: element.radius * 2,\n      };\n    case 'path':\n      return boundsForPath(element.d, element.strokeWidth);\n    case 'text':\n      return boundsForText(element);\n    case 'group':\n      return boundsForElements(element.children);\n  }\n}\n\nfunction boundsForText(text: Extract<SceneElement, { type: 'text' }>): Rect {\n  const measured = measureText(text.content, text.fontSize);\n  const x = text.anchor === 'middle'\n    ? text.position.x - measured.width / 2\n    : text.anchor === 'end'\n      ? text.position.x - measured.width\n      : text.position.x;\n  return {\n    x,\n    y: text.position.y - text.fontSize,\n    width: measured.width,\n    height: text.fontSize * 1.25,\n  };\n}\n\nfunction boundsForPath(d: string, strokeWidth: number): Rect {\n  const nums = [...d.matchAll(/-?\\d+(?:\\.\\d+)?/g)].map(match => Number(match[0]));\n  if (nums.length < 2) return { x: 0, y: 0, width: 0, height: 0 };\n  const xs = nums.filter((_, i) => i % 2 === 0);\n  const ys = nums.filter((_, i) => i % 2 === 1);\n  const pad = strokeWidth / 2;\n  const minX = Math.min(...xs) - pad;\n  const minY = Math.min(...ys) - pad;\n  const maxX = Math.max(...xs) + pad;\n  const maxY = Math.max(...ys) + pad;\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction translateElements(elements: readonly SceneElement[], dx: number, dy: number): SceneElement[] {\n  return elements.map(element => translateElement(element, dx, dy));\n}\n\nfunction translateElement(element: SceneElement, dx: number, dy: number): SceneElement {\n  switch (element.type) {\n    case 'rect':\n      return { ...element, bounds: translateRect(element.bounds, dx, dy) };\n    case 'circle':\n      return { ...element, center: { x: rhu(element.center.x + dx), y: rhu(element.center.y + dy) } };\n    case 'path':\n      return { ...element, d: translatePathD(element.d, dx, dy) };\n    case 'text':\n      return { ...element, position: { x: rhu(element.position.x + dx), y: rhu(element.position.y + dy) } };\n    case 'group':\n      return { ...element, children: translateElements(element.children, dx, dy) };\n  }\n}\n\nfunction translateAnchors(anchors: Record<string, { bounds: Rect }>, dx: number, dy: number): Record<string, { bounds: Rect }> {\n  return Object.fromEntries(\n    Object.entries(anchors).map(([key, anchor]) => [key, { bounds: translateRect(anchor.bounds, dx, dy) }]),\n  );\n}\n\nfunction translateRect(rect: Rect, dx: number, dy: number): Rect {\n  return { x: rhu(rect.x + dx), y: rhu(rect.y + dy), width: rect.width, height: rect.height };\n}\n\nfunction translatePathD(d: string, dx: number, dy: number): string {\n  let i = 0;\n  return d.replace(/-?\\d+(?:\\.\\d+)?/g, value => {\n    const delta = i++ % 2 === 0 ? dx : dy;\n    return String(rhu(Number(value) + delta));\n  });\n}\n\nfunction pointerLabel(ptr: ArrayPointer): string {\n  return ptr.label ?? ptr.id;\n}\n\nexport const array: DiagramModule<ArrayDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    const parsed = JSON.parse(input);\n    return { version: parsed.version ?? '1.0', metadata: parsed.metadata ?? {}, ...normalizeArrayDoc(parsed) };\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutArray(ir, theme);\n  },\n};\n", "import type { PosterDocument, PosterCell, CellContent, PosterNote, NotePosition } from './ir.js';\nimport type { Scene, SceneElement, Rect, LayoutResult, NodeAnchor, NodeAnchorRegistry, OccupiedPort } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { getModule } from '../../../frontend/registry.js';\nimport { getThemePreset } from '../../../theme/preset.js';\nimport { crossLinksToConnectorSpecs, routeConnectors } from '../../../crosslink/connectors.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { resolveArrayElementAnchorId } from '../ds/struct/array.js';\nimport type { NodeAddress, CrossLink } from '../../../contracts/crosslink.js';\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutPoster(ir: PosterDocument, theme: ResolvedTheme): LayoutResult {\n  const { spacing, palette, typography } = theme;\n  const { grid, cells } = ir;\n\n  const unit       = spacing.unit;\n  const gap        = spacing.nodeGap / 2;\n  const padding    = spacing.diagramMargin;\n  const headerH    = ir.metadata.title ? typography.titleFontSize + unit * 2 : 0;\n  const MIN_CELL_W = unit * 20;\n  const MIN_CELL_H = unit * 15;\n  const MAX_CELL_W = unit * 42;\n  const MIN_EMBED_SCALE = 0.65;   // minimum scale \u2014 cells expand to ensure readability\n\n  // \u2500\u2500 Assign row/col to cells that don't specify them \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const positioned = assignPositions(cells, grid.columns);\n\n  // \u2500\u2500 Layout each child into a LayoutResult (per-cell theme) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Child layouts are synchronous (every Triton layout engine is), so a plain\n  // map suffices \u2014 no Promise.all needed.\n  const cellResults = positioned.map(cell => {\n    const cellTheme = cell.theme ? getThemePreset(cell.theme) : theme;\n    return { cell, cellTheme, result: layoutCellContent(cell.content, cellTheme) };\n  });\n  const cellResultById = new Map(cellResults.map(({ cell, result }) => [cell.id ?? '', { cell, result }]));\n\n  const numRows = grid.rows ??\n    Math.max(...positioned.map(c => (c.row ?? 0) + (c.rowSpan ?? 1)));\n\n  // Column widths: ensure child content is readable at MIN_EMBED_SCALE\n  // Readability takes priority over MAX_CELL_W\n  const colWidths = new Array<number>(grid.columns).fill(MIN_CELL_W);\n  for (const { cell, result } of cellResults) {\n    if ((cell.colSpan ?? 1) === 1) {\n      const col = cell.col ?? 0;\n      const inset = unit / 2;\n      // Cell must be wide enough that child fits at MIN_EMBED_SCALE\n      const needed = result.scene.viewBox.width * MIN_EMBED_SCALE + inset * 2;\n      colWidths[col] = Math.max(colWidths[col]!, needed);\n    }\n  }\n\n  // Row heights: proportional to column width, respecting MIN_EMBED_SCALE\n  const rowHeights = new Array<number>(numRows).fill(MIN_CELL_H);\n  for (const { cell, cellTheme, result } of cellResults) {\n    if ((cell.rowSpan ?? 1) === 1) {\n      const row = cell.row ?? 0;\n      const col = cell.col ?? 0;\n      const cellTitleH = cell.title ? reservedTitleHeight(cellTheme) : 0;\n      const inset = unit / 2;\n      const colW = colWidths[col] ?? MIN_CELL_W;\n      const contentW = colW - inset * 2;\n      const scale = Math.min(contentW / Math.max(result.scene.viewBox.width, 1), 1);\n      // If scale < MIN_EMBED_SCALE, the column already expanded; recompute\n      const effectiveScale = Math.max(scale, MIN_EMBED_SCALE);\n      const captionH = cell.caption ? reservedCaptionHeight(cellTheme) : 0;\n      const neededH = result.scene.viewBox.height * effectiveScale + cellTitleH + captionH + inset * 2;\n      rowHeights[row] = Math.max(rowHeights[row]!, neededH);\n    }\n  }\n\n  // \u2500\u2500 Build elements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Layers assembled in painter's order (back\u2192front):\n  //   headerElements \u2014 poster title text\n  //   cellBg         \u2014 cell chrome rects\n  //   linkPaths      \u2014 cross-link routes (behind node content so routes that\n  //                    pass through a cell render behind its nodes)\n  //   cellContent    \u2014 cell titles + embedded node scenes\n  //   linkLabels     \u2014 cross-link label text (topmost, always readable)\n  const headerElements: SceneElement[] = [];\n  const cellBg: SceneElement[] = [];\n  const cellContent: SceneElement[] = [];\n  // Track text bounding rects so cross-link labels can avoid them\n  const textOccupied: Array<{ x: number; y: number; width: number; height: number }> = [];\n  // Track cell border edges as thin obstacles so connectors don't run along cell walls\n  const cellBorders: Array<{ x: number; y: number; width: number; height: number }> = [];\n  // Full cell bounding boxes keyed by cell ID \u2014 used by the cross-link router\n  // to treat intermediate cells as blocked zones (routes must use corridors).\n  const cellRects = new Map<string, { x: number; y: number; width: number; height: number }>();\n  // Occupied ports from all child diagram layout passes (intra-diagram edges).\n  const allOccupiedPorts: OccupiedPort[] = [];\n\n  if (ir.metadata.title) {\n    headerElements.push({ type: 'text', content: ir.metadata.title, position: { x: padding, y: padding + typography.titleFontSize }, fontSize: typography.titleFontSize + 2, fontFamily: typography.fontFamily, fontWeight: 'bold', fill: palette.text });\n    // Estimate title bounding rect\n    const titleW = ir.metadata.title.length * (typography.titleFontSize + 2) * 0.6;\n    const titleH = typography.titleFontSize + 2;\n    textOccupied.push({ x: padding, y: padding, width: titleW, height: titleH + 4 });\n  }\n\n  // \u2500\u2500 Build anchor registry (hierarchical, path-prefixed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const mergedAnchors: Record<string, NodeAnchor> = {};\n\n  for (const { cell, cellTheme, result } of cellResults) {\n    const cellPalette = cellTheme.palette;\n    const col     = cell.col ?? 0;\n    const row     = cell.row ?? 0;\n    const colSpan = cell.colSpan ?? 1;\n    const rowSpan = cell.rowSpan ?? 1;\n    const cellId  = cell.id ?? cellAddressFromPosition(row, col);\n\n    const cellX = padding + sumWithGaps(colWidths, 0, col, gap);\n    const cellY = padding + headerH + sumWithGaps(rowHeights, 0, row, gap);\n    const cellW = sumWithGaps(colWidths,  col, col + colSpan, gap) - gap;\n    const cellH = sumWithGaps(rowHeights, row, row + rowSpan, gap) - gap;\n\n    // Cell chrome \u2014 background layer (connectors route behind this).\n    // Uses the CELL's theme so a dark-themed cell shows a dark panel.\n    cellBg.push({ type: 'rect', bounds: { x: cellX, y: cellY, width: cellW, height: cellH }, fill: cellPalette.background, stroke: cellPalette.border, strokeWidth: 1, rx: 6 });\n\n    // Record cell edges as thin obstacles (4px) so connectors avoid running along borders\n    const borderThick = 4;\n    cellBorders.push(\n      { x: cellX, y: cellY - borderThick / 2, width: cellW, height: borderThick },              // top edge\n      { x: cellX, y: cellY + cellH - borderThick / 2, width: cellW, height: borderThick },      // bottom edge\n      { x: cellX - borderThick / 2, y: cellY, width: borderThick, height: cellH },              // left edge\n      { x: cellX + cellW - borderThick / 2, y: cellY, width: borderThick, height: cellH },      // right edge\n    );\n    // Record the full cell bounding box for corridor-based cross-link routing.\n    cellRects.set(cellId, { x: cellX, y: cellY, width: cellW, height: cellH });\n\n    const reservedTop = cell.title ? reservedTitleHeight(cellTheme) : 0;\n    if (cell.title) {\n      const t = buildCellTitle(cell.title, cellX, cellY, cellW, cellTheme);\n      cellContent.push(...t.elements);\n      textOccupied.push(t.occupied);\n    }\n\n    // Embed child scene \u2014 content layer (above cross-link paths)\n    const inset = unit / 2;\n    const captionH = cell.caption ? reservedCaptionHeight(cellTheme) : 0;\n    const contentRect: Rect = {\n      x: cellX + inset,\n      y: cellY + reservedTop + inset,\n      width: cellW - inset * 2,\n      height: cellH - reservedTop - captionH - inset * 2,\n    };\n    cellContent.push(embedScene(result.scene, contentRect));\n\n    // Caption \u2014 muted text below the sub-diagram\n    if (cell.caption) {\n      const captionY = cellY + cellH - inset / 2;\n      cellContent.push({ type: 'text', content: cell.caption, position: { x: cellX + cellW / 2, y: captionY }, fontSize: cellTheme.typography.smallFontSize, fontFamily: cellTheme.typography.fontFamily, fill: cellTheme.palette.textMuted, anchor: 'middle' });\n    }\n\n    // Notes \u2014 freeform annotation overlays on top of the sub-diagram\n    if (cell.notes && cell.notes.length > 0) {\n      for (const note of cell.notes) {\n        cellContent.push(...buildNoteOverlay(note, contentRect, cellTheme));\n      }\n    }\n\n    // Transform child anchors to poster coordinates and merge\n    const scaleX = contentRect.width  / Math.max(result.scene.viewBox.width,  1);\n    const scaleY = contentRect.height / Math.max(result.scene.viewBox.height, 1);\n    const scale  = Math.min(scaleX, scaleY, 1);\n    const offsetX = contentRect.x + (contentRect.width  - result.scene.viewBox.width  * scale) / 2;\n    const offsetY = contentRect.y + (contentRect.height - result.scene.viewBox.height * scale) / 2;\n\n    for (const [nodeId, anchor] of Object.entries(result.anchors)) {\n      const prefixedId = `${cellId}.${nodeId}`;\n      const transformed: NodeAnchor = {\n        bounds: {\n          x:      anchor.bounds.x * scale + offsetX,\n          y:      anchor.bounds.y * scale + offsetY,\n          width:  anchor.bounds.width * scale,\n          height: anchor.bounds.height * scale,\n        },\n        ...(anchor.ports ? {\n          ports: Object.fromEntries(\n            Object.entries(anchor.ports).map(([side, pt]) => [\n              side,\n              { x: pt!.x * scale + offsetX, y: pt!.y * scale + offsetY },\n            ]),\n          ),\n        } : {}),\n      };\n      mergedAnchors[prefixedId] = transformed;\n    }\n\n    // Collect occupied ports from child layout (t values are coordinate-invariant).\n    for (const op of (result.occupiedPorts ?? [])) {\n      allOccupiedPorts.push({ ...op, nodeKey: `${cellId}.${op.nodeKey}` });\n    }\n\n    // Collect chrome rects (e.g. internal header bars) and transform them to\n    // poster coordinates so the cross-link label de-collision pass can avoid them.\n    for (const cr of (result.chromeRects ?? [])) {\n      textOccupied.push({\n        x:      cr.x * scale + offsetX,\n        y:      cr.y * scale + offsetY,\n        width:  cr.width  * scale,\n        height: cr.height * scale,\n      });\n    }\n  }\n\n  const totalW = padding * 2 + sumWithGaps(colWidths,  0, grid.columns, gap) - gap;\n  const totalH = padding * 2 + headerH + sumWithGaps(rowHeights, 0, numRows, gap) - gap;\n\n  // Collect defs from all child scenes (e.g. arrow markers)\n  const allDefs: string[] = [];\n  const seenDefs = new Set<string>();\n  for (const { result } of cellResults) {\n    if (result.scene.defs) {\n      for (const def of result.scene.defs) {\n        if (!seenDefs.has(def)) {\n          seenDefs.add(def);\n          allDefs.push(def);\n        }\n      }\n    }\n  }\n\n  // \u2500\u2500\u2500 Cross-Link Resolution & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const links  = normalizeElementIndexLinks(ir.links ?? [], cellResultById);\n\n  // Start with the grid dimensions; cross-link rendering may expand these.\n  let finalW = totalW;\n  let finalH = totalH;\n\n  if (links.length > 0) {\n    const connectorSpecs = crossLinksToConnectorSpecs(links.map(link => {\n      const explicitCurve = link.curveStyle ?? (typeof link.props?.curveStyle === 'string' ? link.props.curveStyle as import('../../../contracts/routing.js').CurveStyle : undefined);\n      return explicitCurve ? link : { ...link, curveStyle: 'cardinal' as const };\n    }));\n    const connectorResult = routeConnectors({\n      anchors: mergedAnchors,\n      connectors: connectorSpecs,\n      theme,\n      occupiedPorts: allOccupiedPorts,\n      occupiedTextRects: textOccupied,\n      routingObstacles: cellBorders,\n      containerObstacles: cellRects,\n    });\n    const linkDefs = connectorResult.defs;\n    const linkElements = connectorResult.elements;\n\n      // Add link defs\n      for (const def of linkDefs) {\n        if (!seenDefs.has(def)) {\n          seenDefs.add(def);\n          allDefs.push(def);\n        }\n      }\n\n      // Split link elements: paths go behind cell content, labels go on top.\n      const linkPaths  = linkElements.filter(e => e.type !== 'text');\n      const linkLabels = linkElements.filter(e => e.type === 'text');\n\n      // Expand the viewBox to include all cross-link route and label extents.\n      const ext = connectorResult.extents;\n      if (ext.maxX > finalW) finalW = ext.maxX + padding;\n      if (ext.maxY > finalH) finalH = ext.maxY + padding;\n\n      // Assemble in painter's order (back \u2192 front):\n      //   header \u2192 cell backgrounds \u2192 link routes \u2192 cell content \u2192 link labels\n      const elements: SceneElement[] = [\n        ...headerElements,\n        ...cellBg,\n        ...linkPaths,\n        ...cellContent,\n        ...linkLabels,\n      ];\n\n      return {\n        scene: {\n          viewBox: { x: 0, y: 0, width: finalW, height: finalH },\n          background: palette.background,\n          elements,\n          ...(allDefs.length > 0 ? { defs: allDefs } : {}),\n        },\n        anchors: mergedAnchors,\n      };\n  }\n\n  // No cross-links (or none resolved): flat assembly without link layers.\n  const elements: SceneElement[] = [...headerElements, ...cellBg, ...cellContent];\n\n  return {\n    scene: {\n      viewBox: { x: 0, y: 0, width: finalW, height: finalH },\n      background: palette.background,\n      elements,\n      ...(allDefs.length > 0 ? { defs: allDefs } : {}),\n    },\n    anchors: mergedAnchors,\n  };\n}\n\nfunction normalizeElementIndexLinks(\n  links: readonly CrossLink[],\n  cellResultById: ReadonlyMap<string, { cell: PosterCell; result: LayoutResult }>,\n): CrossLink[] {\n  return links.map(link => ({\n    ...link,\n    from: normalizeElementIndexAddress(link.from, cellResultById),\n    to: normalizeElementIndexAddress(link.to, cellResultById),\n  }));\n}\n\nfunction normalizeElementIndexAddress(\n  address: NodeAddress,\n  cellResultById: ReadonlyMap<string, { cell: PosterCell; result: LayoutResult }>,\n): NodeAddress {\n  if (address.elementIndex === undefined) return address;\n\n  const cellId = address.cellPath.join('.');\n  const cellResult = cellResultById.get(cellId);\n  const content = cellResult?.cell.content;\n  const arrayNodeId = content?.kind === 'diagram' && content.diagramKind === 'array'\n    ? resolveArrayElementAnchorId(content.doc as any, address.elementIndex)\n    : fallbackElementAnchorId(cellResult?.result.anchors ?? {}, address.elementIndex);\n\n  return {\n    ...address,\n    nodeId: arrayNodeId ?? `__missing_element_${address.elementIndex}`,\n  };\n}\n\nfunction fallbackElementAnchorId(anchors: NodeAnchorRegistry, elementIndex: number): string | undefined {\n  if (elementIndex < 0) {\n    if (elementIndex === -1 && anchors.clast) return 'clast';\n    return undefined;\n  }\n  return anchors[`c${elementIndex}`] ? `c${elementIndex}` : undefined;\n}\n\n/**\n * Compute the rightmost and bottommost extents across all cross-link\n * scene elements (paths and text labels).\n *\n * For paths: extract all numeric coordinates from the SVG path `d` string.\n *   Taking the max of all numbers over-approximates bezier control-point\n *   extents, but that is safe (never under-estimates) and keeps the logic\n *   simple without a full bezier bounding-box solver.\n *\n * For text: use the anchor position plus an estimated character-width.\n */\nfunction crossLinkExtents(elements: readonly SceneElement[]): { maxX: number; maxY: number } {\n  let maxX = 0;\n  let maxY = 0;\n\n  for (const el of elements) {\n    if (el.type === 'path') {\n      // Extract all numbers from the path d string in adjacent x,y pairs.\n      // This works exactly for M/L commands and safely over-approximates C.\n      const nums: number[] = [];\n      for (const m of el.d.matchAll(/[-\\d.]+/g)) {\n        const n = parseFloat(m[0]);\n        if (!isNaN(n)) nums.push(n);\n      }\n      for (let i = 0; i + 1 < nums.length; i += 2) {\n        maxX = Math.max(maxX, nums[i]!);\n        maxY = Math.max(maxY, nums[i + 1]!);\n      }\n    } else if (el.type === 'text') {\n      const approxW = el.content.length * (el.fontSize ?? 12) * 0.65;\n      const right = el.anchor === 'middle'\n        ? el.position.x + approxW / 2\n        : el.position.x + approxW;\n      maxX = Math.max(maxX, right);\n      maxY = Math.max(maxY, el.position.y + (el.fontSize ?? 12));\n    }\n  }\n\n  return { maxX, maxY };\n}\n\n// \u2500\u2500\u2500 Cell Content Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n\nfunction layoutCellContent(content: CellContent, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const unit = spacing.unit;\n  const pad  = spacing.nodePadding;\n\n  switch (content.kind) {\n    case 'diagram': {\n      const module = getModule(content.diagramKind);\n      if (!module) {\n        const w = unit * 20;\n        const h = typography.baseFontSize + pad * 2;\n        return {\n          scene: {\n            viewBox: { x: 0, y: 0, width: w, height: h },\n            elements: [{ type: 'text', content: `[${content.diagramKind}]`, position: { x: pad, y: pad + typography.baseFontSize * 0.8 }, fontSize: typography.baseFontSize, fontFamily: typography.fontFamily, fill: palette.textMuted }],\n          },\n          anchors: {},\n        };\n      }\n      return module.layout(content.doc, theme);\n    }\n    case 'text': {\n      // Approximate width: ~8px per character at baseFontSize, with min/max\n      const estCharW = typography.baseFontSize * 0.6;\n      const textW    = Math.max(unit * 10, Math.min(unit * 30, content.text.length * estCharW + pad * 2));\n      const textH    = typography.baseFontSize * typography.lineHeight + pad * 2;\n      return {\n        scene: {\n          viewBox: { x: 0, y: 0, width: textW, height: textH },\n          elements: [{ type: 'text', content: content.text, position: { x: pad, y: pad + typography.baseFontSize * 0.8 }, fontSize: typography.baseFontSize, fontFamily: typography.fontFamily, fill: palette.text }],\n        },\n        anchors: {},\n      };\n    }\n    case 'stat': {\n      const valueFontSize = typography.titleFontSize * 1.5;\n      const cellW = Math.max(unit * 10, valueFontSize * 3);\n      const centerX = cellW / 2;\n\n      const valueY = pad + valueFontSize * 0.8;\n      const labelGap = unit;\n      const labelY = valueY + labelGap + typography.smallFontSize * 0.8;\n      const cellH  = content.label\n        ? valueY + labelGap + typography.smallFontSize + pad\n        : valueY + pad;\n\n      const els: SceneElement[] = [\n        { type: 'text', content: content.value, position: { x: centerX, y: valueY }, fontSize: valueFontSize, fontFamily: typography.fontFamily, fontWeight: 'bold', fill: palette.primary, anchor: 'middle' },\n      ];\n      if (content.label) {\n        els.push({ type: 'text', content: content.label, position: { x: centerX, y: labelY }, fontSize: typography.smallFontSize, fontFamily: typography.fontFamily, fill: palette.textMuted, anchor: 'middle' });\n      }\n      return {\n        scene: { viewBox: { x: 0, y: 0, width: cellW, height: cellH }, elements: els },\n        anchors: {},\n      };\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Scene Embedding \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction embedScene(scene: Scene, into: Rect): SceneElement {\n  const scaleX = into.width  / Math.max(scene.viewBox.width,  1);\n  const scaleY = into.height / Math.max(scene.viewBox.height, 1);\n  const scale  = Math.min(scaleX, scaleY, 1);\n\n  // Centre within the cell\n  const offsetX = into.x + (into.width  - scene.viewBox.width  * scale) / 2;\n  const offsetY = into.y + (into.height - scene.viewBox.height * scale) / 2;\n\n  return {\n    type:      'group',\n    transform: `translate(${offsetX}, ${offsetY}) scale(${scale})`,\n    children:  scene.elements as SceneElement[],\n  };\n}\n\n// \u2500\u2500\u2500 Cell Title (theme.panel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Interior height a cell must reserve at its top for the title, given the\n * theme's panel placement. 'above' titles live outside the frame (0 reserved);\n * 'on-border' titles straddle the edge (half reserved); 'inside' titles sit\n * fully within the frame (full reserved).\n */\nfunction reservedTitleHeight(theme: ResolvedTheme): number {\n  const { typography, spacing, panel } = theme;\n  const fs = typography.baseFontSize;\n  const boxH = titleBoxHeight(theme);\n  switch (panel.titlePosition) {\n    case 'above':     return 0;\n    case 'on-border': return boxH / 2 + spacing.unit * 0.5;\n    case 'inside':\n    default:          return fs + spacing.unit;\n  }\n}\n\nfunction titleBoxHeight(theme: ResolvedTheme): number {\n  const fs = theme.typography.baseFontSize;\n  const padY = theme.panel.titleChrome === 'none' ? 0 : theme.spacing.unit * 0.4;\n  return fs + padY * 2;\n}\n\n/** Height reserved at the bottom of a cell for a caption line. */\nfunction reservedCaptionHeight(theme: ResolvedTheme): number {\n  return theme.typography.smallFontSize + theme.spacing.unit;\n}\n\n/**\n * Build a freeform note overlay anchored to a content rect.\n * Positions: top-left/right, bottom-left/right, center.\n * Renders as a semi-transparent pill behind the text.\n */\nfunction buildNoteOverlay(note: PosterNote, rect: Rect, theme: ResolvedTheme): SceneElement[] {\n  const { palette, typography, spacing } = theme;\n  const fs = typography.smallFontSize;\n  const pad = spacing.unit * 0.5;\n  const textW = note.text.length * fs * 0.62 + pad * 2;\n  const boxH = fs + pad * 2;\n  const pos = note.position ?? 'top-right';\n\n  let bx: number, by: number;\n  switch (pos) {\n    case 'top-left':     bx = rect.x + spacing.unit * 0.5; by = rect.y + spacing.unit * 0.5; break;\n    case 'top-right':    bx = rect.x + rect.width - textW - spacing.unit * 0.5; by = rect.y + spacing.unit * 0.5; break;\n    case 'bottom-left':  bx = rect.x + spacing.unit * 0.5; by = rect.y + rect.height - boxH - spacing.unit * 0.5; break;\n    case 'bottom-right': bx = rect.x + rect.width - textW - spacing.unit * 0.5; by = rect.y + rect.height - boxH - spacing.unit * 0.5; break;\n    case 'center':       bx = rect.x + (rect.width - textW) / 2; by = rect.y + (rect.height - boxH) / 2; break;\n    default:             bx = rect.x + rect.width - textW - spacing.unit * 0.5; by = rect.y + spacing.unit * 0.5;\n  }\n\n  return [\n    { type: 'rect', bounds: { x: bx, y: by, width: textW, height: boxH }, fill: palette.surface, stroke: palette.primary, strokeWidth: 1, rx: boxH / 2, fillOpacity: 0.88 },\n    { type: 'text', content: note.text, position: { x: bx + textW / 2, y: by + pad + fs * 0.8 }, fontSize: fs, fontFamily: typography.fontFamily, fontWeight: 'bold', fill: palette.primary, anchor: 'middle' },\n  ];\n}\n\n/**\n * Build the SceneElements for a cell title (optional chrome rect + text),\n * honouring the theme's panel alignment / vertical position / chrome. Returns\n * the elements plus an occupied rect used for cross-link label de-collision.\n */\nfunction buildCellTitle(\n  title: string,\n  cellX: number,\n  cellY: number,\n  cellW: number,\n  theme: ResolvedTheme,\n): { elements: SceneElement[]; occupied: Rect } {\n  const { palette, typography, panel, spacing } = theme;\n  const unit = spacing.unit;\n  const fs   = typography.baseFontSize;\n\n  const padX  = panel.titleChrome === 'none' ? 0 : unit * 0.75;\n  const padY  = panel.titleChrome === 'none' ? 0 : unit * 0.4;\n  const tw    = measureText(title, fs).width;\n  const boxW  = tw + padX * 2;\n  const boxH  = fs + padY * 2;\n  const wall  = unit; // inset of the title from the left/right wall\n\n  // Horizontal: box origin + text anchor point.\n  let boxX: number;\n  let anchorX: number;\n  let anchor: 'start' | 'middle' | 'end';\n  if (panel.titleAlign === 'center') {\n    boxX    = cellX + cellW / 2 - boxW / 2;\n    anchorX = cellX + cellW / 2;\n    anchor  = 'middle';\n  } else if (panel.titleAlign === 'right') {\n    boxX    = cellX + cellW - wall - boxW;\n    anchorX = boxX + boxW - padX;\n    anchor  = 'end';\n  } else {\n    boxX    = cellX + wall;\n    anchorX = boxX + padX;\n    anchor  = 'start';\n  }\n\n  // Vertical: top of the chrome box relative to the cell's top edge.\n  let boxTop: number;\n  if (panel.titlePosition === 'on-border') {\n    boxTop = cellY - boxH / 2;\n  } else if (panel.titlePosition === 'above') {\n    boxTop = cellY - boxH - unit * 0.25;\n  } else {\n    boxTop = cellY + unit * 0.5;\n  }\n  const baselineY = boxTop + padY + fs * 0.8;\n\n  const elements: SceneElement[] = [];\n  if (panel.titleChrome !== 'none') {\n    const rx = panel.titleChrome === 'pill' ? boxH / 2 : Math.min(6, boxH / 3);\n    elements.push({ type: 'rect', bounds: { x: boxX, y: boxTop, width: boxW, height: boxH }, fill: palette.surface, stroke: palette.border, strokeWidth: 1, rx });\n  }\n  elements.push({ type: 'text', content: title, position: { x: anchorX, y: baselineY }, fontSize: fs, fontFamily: typography.fontFamily, fontWeight: 'bold', fill: palette.text, anchor });\n\n  return { elements, occupied: { x: boxX, y: boxTop, width: boxW, height: boxH } };\n}\n\n// \u2500\u2500\u2500 Grid Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Grid placement: assigns row/col to each cell, reserving spanned cells so\n *  later cells skip slots already covered by a colSpan/rowSpan. Exported for tests. */\nexport function assignPositions(cells: readonly PosterCell[], columns: number): PosterCell[] {\n  const occupied = new Set<string>();\n  const key = (r: number, c: number): string => `${r},${c}`;\n  const mark = (r: number, c: number, rs: number, cs: number): void => {\n    for (let rr = r; rr < r + rs; rr++) for (let cc = c; cc < c + cs; cc++) occupied.add(key(rr, cc));\n  };\n  const fits = (r: number, c: number, rs: number, cs: number): boolean => {\n    if (c + cs > columns) return false;\n    for (let rr = r; rr < r + rs; rr++) for (let cc = c; cc < c + cs; cc++) if (occupied.has(key(rr, cc))) return false;\n    return true;\n  };\n\n  let row = 0, col = 0;\n  return cells.map(cell => {\n    const cs = Math.min(cell.colSpan ?? 1, columns);\n    const rs = cell.rowSpan ?? 1;\n    // Explicitly placed cells are honoured as-is, but still reserve their footprint.\n    if (cell.row !== undefined && cell.col !== undefined) {\n      mark(cell.row, cell.col, rs, cs);\n      return cell;\n    }\n    // Scan row-major for the first free slot whose full span fits.\n    while (!fits(row, col, rs, cs)) {\n      col++;\n      if (col >= columns) { col = 0; row++; }\n    }\n    const assigned = { ...cell, row, col };\n    mark(row, col, rs, cs);\n    col += cs;\n    if (col >= columns) { col = 0; row++; }\n    return assigned;\n  });\n}\n\n/** Sum widths/heights from index `start` (inclusive) to `end` (exclusive) with gaps. */\nfunction sumWithGaps(sizes: number[], start: number, end: number, gap: number): number {\n  let total = 0;\n  for (let i = start; i < end; i++) total += (sizes[i] ?? 0) + gap;\n  return total;\n}\n\n/**\n * Generate an Excel-style cell address from row/col indices.\n * col 0 \u2192 \"A\", col 1 \u2192 \"B\", ..., col 25 \u2192 \"Z\", col 26 \u2192 \"AA\"\n * Row is 1-indexed in the output: row 0 \u2192 \"1\".\n */\nfunction cellAddressFromPosition(row: number, col: number): string {\n  let addr = '';\n  let c = col;\n  do {\n    addr = String.fromCharCode(65 + (c % 26)) + addr;\n    c = Math.floor(c / 26) - 1;\n  } while (c >= 0);\n  return `${addr}${row + 1}`;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  const cells = [];\n  const links = [];\n  let cellCounter = 0;\n\n  function slugify(text) {\n    if (!text) return '';\n    return text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || '';\n  }\n\n  function addCell(explicitId, title, kind, rawContent, span, theme) {\n    cellCounter++;\n    const id = explicitId || slugify(title) || `cell-${cellCounter}`;\n    cells.push({ id, title: title || undefined, kind, rawContent: rawContent.trim(), span, theme: theme || undefined });\n  }\n\n  function addLink(from, arrow, to, label, props) {\n    links.push({ from, ...arrow, to, label: label || undefined, ...(props ? props : {}) });\n  }\n\n  function reset() {\n    cells.length = 0;\n    links.length = 0;\n    cellCounter = 0;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"---\";\n  var peg$c1 = \"poster\";\n  var peg$c2 = \"columns\";\n  var peg$c3 = \"rows\";\n  var peg$c4 = \"gap\";\n  var peg$c5 = \"cell\";\n  var peg$c6 = \"::\";\n  var peg$c7 = \"@theme\";\n  var peg$c8 = \"end\";\n  var peg$c9 = \"[\";\n  var peg$c10 = \"x\";\n  var peg$c11 = \"]\";\n  var peg$c12 = \"flowchart\";\n  var peg$c13 = \"flow\";\n  var peg$c14 = \"timeline\";\n  var peg$c15 = \"stat\";\n  var peg$c16 = \"text\";\n  var peg$c17 = \"link\";\n  var peg$c18 = \"@\";\n  var peg$c19 = \"anim:\";\n  var peg$c20 = \":\";\n  var peg$c21 = \"march\";\n  var peg$c22 = \"particle\";\n  var peg$c23 = \"draw\";\n  var peg$c24 = \"pulse\";\n  var peg$c25 = \"glow\";\n  var peg$c26 = \"comet\";\n  var peg$c27 = \"stream\";\n  var peg$c28 = \"colorcycle\";\n  var peg$c29 = \"none\";\n  var peg$c30 = \"straight\";\n  var peg$c31 = \"orthogonal\";\n  var peg$c32 = \"bezier\";\n  var peg$c33 = \"polyline\";\n  var peg$c34 = \"{\";\n  var peg$c35 = \",\";\n  var peg$c36 = \"}\";\n  var peg$c37 = \".\";\n  var peg$c38 = \"<-~->\";\n  var peg$c39 = \"<-_->\";\n  var peg$c40 = \"<-.->\";\n  var peg$c41 = \"<==>\";\n  var peg$c42 = \"<-->\";\n  var peg$c43 = \"-~->\";\n  var peg$c44 = \"-_->\";\n  var peg$c45 = \"-..->\";\n  var peg$c46 = \"-.->\";\n  var peg$c47 = \"===>\";\n  var peg$c48 = \"==>\";\n  var peg$c49 = \"--->\";\n  var peg$c50 = \"-->\";\n  var peg$c51 = \"-~-\";\n  var peg$c52 = \"-_-\";\n  var peg$c53 = \"-.-\";\n  var peg$c54 = \"===\";\n  var peg$c55 = \"\\\"\";\n  var peg$c56 = \"%%\";\n  var peg$c57 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[ENSW]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[a-zA-Z_]/;\n  var peg$r4 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r5 = /^[^\"]/;\n  var peg$r6 = /^[+\\-]/;\n  var peg$r7 = /^[ \\t]/;\n  var peg$r8 = /^[\\n\\r]/;\n\n  var peg$e0 = peg$literalExpectation(\"---\", false);\n  var peg$e1 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e2 = peg$literalExpectation(\"poster\", false);\n  var peg$e3 = peg$literalExpectation(\"columns\", false);\n  var peg$e4 = peg$literalExpectation(\"rows\", false);\n  var peg$e5 = peg$literalExpectation(\"gap\", false);\n  var peg$e6 = peg$literalExpectation(\"cell\", false);\n  var peg$e7 = peg$literalExpectation(\"::\", false);\n  var peg$e8 = peg$literalExpectation(\"@theme\", false);\n  var peg$e9 = peg$literalExpectation(\"end\", false);\n  var peg$e10 = peg$literalExpectation(\"[\", false);\n  var peg$e11 = peg$literalExpectation(\"x\", false);\n  var peg$e12 = peg$literalExpectation(\"]\", false);\n  var peg$e13 = peg$literalExpectation(\"flowchart\", false);\n  var peg$e14 = peg$literalExpectation(\"flow\", false);\n  var peg$e15 = peg$literalExpectation(\"timeline\", false);\n  var peg$e16 = peg$literalExpectation(\"stat\", false);\n  var peg$e17 = peg$literalExpectation(\"text\", false);\n  var peg$e18 = peg$literalExpectation(\"link\", false);\n  var peg$e19 = peg$literalExpectation(\"@\", false);\n  var peg$e20 = peg$literalExpectation(\"anim:\", false);\n  var peg$e21 = peg$literalExpectation(\":\", false);\n  var peg$e22 = peg$literalExpectation(\"march\", false);\n  var peg$e23 = peg$literalExpectation(\"particle\", false);\n  var peg$e24 = peg$literalExpectation(\"draw\", false);\n  var peg$e25 = peg$literalExpectation(\"pulse\", false);\n  var peg$e26 = peg$literalExpectation(\"glow\", false);\n  var peg$e27 = peg$literalExpectation(\"comet\", false);\n  var peg$e28 = peg$literalExpectation(\"stream\", false);\n  var peg$e29 = peg$literalExpectation(\"colorcycle\", false);\n  var peg$e30 = peg$literalExpectation(\"none\", false);\n  var peg$e31 = peg$literalExpectation(\"straight\", false);\n  var peg$e32 = peg$literalExpectation(\"orthogonal\", false);\n  var peg$e33 = peg$literalExpectation(\"bezier\", false);\n  var peg$e34 = peg$literalExpectation(\"polyline\", false);\n  var peg$e35 = peg$classExpectation([\"E\", \"N\", \"S\", \"W\"], false, false);\n  var peg$e36 = peg$literalExpectation(\"{\", false);\n  var peg$e37 = peg$literalExpectation(\",\", false);\n  var peg$e38 = peg$literalExpectation(\"}\", false);\n  var peg$e39 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e40 = peg$literalExpectation(\".\", false);\n  var peg$e41 = peg$literalExpectation(\"<-~->\", false);\n  var peg$e42 = peg$literalExpectation(\"<-_->\", false);\n  var peg$e43 = peg$literalExpectation(\"<-.->\", false);\n  var peg$e44 = peg$literalExpectation(\"<==>\", false);\n  var peg$e45 = peg$literalExpectation(\"<-->\", false);\n  var peg$e46 = peg$literalExpectation(\"-~->\", false);\n  var peg$e47 = peg$literalExpectation(\"-_->\", false);\n  var peg$e48 = peg$literalExpectation(\"-..->\", false);\n  var peg$e49 = peg$literalExpectation(\"-.->\", false);\n  var peg$e50 = peg$literalExpectation(\"===>\", false);\n  var peg$e51 = peg$literalExpectation(\"==>\", false);\n  var peg$e52 = peg$literalExpectation(\"--->\", false);\n  var peg$e53 = peg$literalExpectation(\"-->\", false);\n  var peg$e54 = peg$literalExpectation(\"-~-\", false);\n  var peg$e55 = peg$literalExpectation(\"-_-\", false);\n  var peg$e56 = peg$literalExpectation(\"-.-\", false);\n  var peg$e57 = peg$literalExpectation(\"===\", false);\n  var peg$e58 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"_\"], false, false);\n  var peg$e59 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e60 = peg$anyExpectation();\n  var peg$e61 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e62 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e63 = peg$classExpectation([\"+\", \"-\"], false, false);\n  var peg$e64 = peg$literalExpectation(\"%%\", false);\n  var peg$e65 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e66 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e67 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n\n  var peg$f0 = function(frontmatter, header, directives, body) {\n      const columns = (directives.find(d => d.key === 'columns') || {}).value || 2;\n      return {\n        version: '1.0',\n        metadata: { ...(frontmatter || {}), title: header.title || undefined },\n        grid: { columns: parseInt(columns, 10) },\n        cells,\n        ...(links.length > 0 ? { links } : {}),\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f3 = function(title) { return { title: title ? title[1] : null }; };\n  var peg$f4 = function(key, value) { return { key, value: value.trim() }; };\n  var peg$f5 = function(items) { return items.filter(Boolean); };\n  var peg$f6 = function(ids, span, kind) { return kind; };\n  var peg$f7 = function(ids, span, explicitKind, t) { return t; };\n  var peg$f8 = function(ids, span, explicitKind, theme, content) {\n      addCell(ids.id, ids.title, explicitKind || null, content, span || undefined, theme || undefined);\n      return { type: 'cell' };\n    };\n  var peg$f9 = function(id, title) { return { id, title }; };\n  var peg$f10 = function(id) { return { id, title: null }; };\n  var peg$f11 = function(title) { return { id: null, title }; };\n  var peg$f12 = function() { return { id: null, title: null }; };\n  var peg$f13 = function(cols, rows) { return { colSpan: cols, rowSpan: rows }; };\n  var peg$f14 = function(cols) { return { colSpan: cols, rowSpan: 1   }; };\n  var peg$f15 = function(from, arrow, to, label, anns, block) {\n      // Start with props from { } block (lower precedence)\n      const result = {};\n      if (block) {\n        const b = block[1];\n        if (b.route) { result.routing = b.route; delete b.route; }\n        if (b.anim)  { result.animation = b.anim;  delete b.anim;  }\n        if (b.curveStyle) { result.curveStyle = b.curveStyle; delete b.curveStyle; }\n        if (b.curve)      { result.curveStyle = b.curve;      delete b.curve;      }\n        if (Object.keys(b).length > 0) result.props = b;\n      }\n      // Apply @ annotations last \u2014 @ WINS on conflict (superset rule \u00A74.3)\n      for (const ann of anns) {\n        Object.assign(result, ann[2]);\n      }\n      addLink(from, arrow, to, label ? label[1] : null, Object.keys(result).length > 0 ? result : null);\n      return { type: 'link' };\n    };\n  var peg$f16 = function(value) { return { animation: value }; };\n  var peg$f17 = function(route, walls) {\n      return { routing: route, ...(walls ? walls[1] : {}) };\n    };\n  var peg$f18 = function(walls) { return walls; };\n  var peg$f19 = function(route, walls) {\n      return { routing: route, ...(walls ? walls[1] : {}) };\n    };\n  var peg$f20 = function(walls) { return walls; };\n  var peg$f21 = function() { return 'straight'; };\n  var peg$f22 = function() { return 'orthogonal'; };\n  var peg$f23 = function() { return 'bezier'; };\n  var peg$f24 = function() { return 'polyline'; };\n  var peg$f25 = function(exit, entry) { return { exitWall: exit, entryWall: entry }; };\n  var peg$f26 = function(exit) { return { exitWall: exit }; };\n  var peg$f27 = function(w) { return w; };\n  var peg$f28 = function(first, rest) {\n      const result = {};\n      result[first.key] = first.value;\n      for (const r of rest) { result[r[3].key] = r[3].value; }\n      return result;\n    };\n  var peg$f29 = function(key, value) { return { key, value }; };\n  var peg$f30 = function(num) { return parseFloat(num); };\n  var peg$f31 = function() { return { direction: 'bidirectional', style: 'wavy'   }; };\n  var peg$f32 = function() { return { direction: 'bidirectional', style: 'dashed' }; };\n  var peg$f33 = function() { return { direction: 'bidirectional', style: 'dotted' }; };\n  var peg$f34 = function() { return { direction: 'bidirectional', style: 'thick'  }; };\n  var peg$f35 = function() { return { direction: 'bidirectional', style: 'solid'  }; };\n  var peg$f36 = function() { return { direction: 'directed', style: 'wavy'   }; };\n  var peg$f37 = function() { return { direction: 'directed', style: 'dashed' }; };\n  var peg$f38 = function() { return { direction: 'directed', style: 'dotted' }; };\n  var peg$f39 = function() { return { direction: 'directed', style: 'dotted' }; };\n  var peg$f40 = function() { return { direction: 'directed', style: 'thick'  }; };\n  var peg$f41 = function() { return { direction: 'directed', style: 'thick'  }; };\n  var peg$f42 = function() { return { direction: 'directed', style: 'solid'  }; };\n  var peg$f43 = function() { return { direction: 'directed', style: 'solid'  }; };\n  var peg$f44 = function() { return { direction: 'undirected', style: 'wavy'   }; };\n  var peg$f45 = function() { return { direction: 'undirected', style: 'dashed' }; };\n  var peg$f46 = function() { return { direction: 'undirected', style: 'dotted' }; };\n  var peg$f47 = function() { return { direction: 'undirected', style: 'thick'  }; };\n  var peg$f48 = function() { return { direction: 'undirected', style: 'solid'  }; };\n  var peg$f49 = function(cell, index) { return { cellPath: [cell], nodeId: \"\", elementIndex: index }; };\n  var peg$f50 = function(cell, node) { return { cellPath: [cell], nodeId: node }; };\n  var peg$f51 = function(line) { return line; };\n  var peg$f52 = function(lines) { return lines.join('\\n'); };\n  var peg$f53 = function(text) { return text; };\n  var peg$f54 = function(digits) { return parseInt(digits, 10); };\n  var peg$f55 = function(sign, digits) { return parseInt((sign || \"\") + digits, 10); };\n  var peg$f56 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parsePosterHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parse_();\n      s5 = [];\n      s6 = peg$parseGridDirective();\n      while (s6 !== peg$FAILED) {\n        s5.push(s6);\n        s6 = peg$parseGridDirective();\n      }\n      s6 = peg$parse_();\n      s7 = peg$parseBodyItems();\n      s8 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s5, s7);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s7 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c0) {\n            s7 = peg$c0;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s4 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePosterHeader() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 6) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 6;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      s4 = peg$parseQuotedString();\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$parse_();\n      s4 = peg$parseNL();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseGridDirective() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 7) === peg$c2) {\n      s2 = peg$c2;\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c3) {\n        s2 = peg$c3;\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 === peg$FAILED) {\n        if (input.substr(peg$currPos, 3) === peg$c4) {\n          s2 = peg$c4;\n          peg$currPos += 3;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBodyItems() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseCellBlock();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseLinkDecl();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseBlankLine();\n      }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseCellBlock();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseLinkDecl();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseBlankLine();\n        }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f5(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCellBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c5) {\n      s2 = peg$c5;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseCellIdTitle();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseCellSpan();\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.substr(peg$currPos, 2) === peg$c6) {\n          s7 = peg$c6;\n          peg$currPos += 2;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseCellKind();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f6(s3, s4, s9);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$currPos;\n        s7 = peg$parse_();\n        if (input.substr(peg$currPos, 6) === peg$c7) {\n          s8 = peg$c7;\n          peg$currPos += 6;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parse__();\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parseIdentifier();\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s6;\n              s6 = peg$f7(s3, s4, s5, s10);\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        s7 = peg$parse_();\n        s8 = peg$parseNL();\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parseCellContent();\n          s10 = peg$parse_();\n          if (input.substr(peg$currPos, 3) === peg$c8) {\n            s11 = peg$c8;\n            peg$currPos += 3;\n          } else {\n            s11 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s11 !== peg$FAILED) {\n            s12 = peg$parse_();\n            s13 = peg$parseNL();\n            if (s13 === peg$FAILED) {\n              s13 = null;\n            }\n            peg$savedPos = s0;\n            s0 = peg$f8(s3, s4, s5, s6, s9);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellIdTitle() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseIdentifier();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseQuotedString();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f9(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse__();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseIdentifier();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f10(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parse__();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$parseQuotedString();\n          if (s2 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f11(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = '';\n          peg$savedPos = s0;\n          s1 = peg$f12();\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellSpan() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s2 = peg$c9;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseInteger();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 120) {\n          s6 = peg$c10;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          s8 = peg$parseInteger();\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 93) {\n              s10 = peg$c11;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e12); }\n            }\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f13(s4, s8);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s2 = peg$c9;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse_();\n        s4 = peg$parseInteger();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s6 = peg$c11;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f14(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellKind() {\n    var s0;\n\n    if (input.substr(peg$currPos, 9) === peg$c12) {\n      s0 = peg$c12;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c13) {\n        s0 = peg$c13;\n        peg$currPos += 4;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 8) === peg$c14) {\n          s0 = peg$c14;\n          peg$currPos += 8;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c15) {\n            s0 = peg$c15;\n            peg$currPos += 4;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c16) {\n              s0 = peg$c16;\n              peg$currPos += 4;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e17); }\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseIdentifier();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLinkDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c17) {\n      s2 = peg$c17;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseNodeRef();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseArrow();\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse__();\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parseNodeRef();\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$currPos;\n                  s10 = peg$parse_();\n                  s11 = peg$parseQuotedString();\n                  if (s11 !== peg$FAILED) {\n                    s10 = [s10, s11];\n                    s9 = s10;\n                  } else {\n                    peg$currPos = s9;\n                    s9 = peg$FAILED;\n                  }\n                  if (s9 === peg$FAILED) {\n                    s9 = null;\n                  }\n                  s10 = [];\n                  s11 = peg$currPos;\n                  s12 = peg$parse_();\n                  if (input.charCodeAt(peg$currPos) === 64) {\n                    s13 = peg$c18;\n                    peg$currPos++;\n                  } else {\n                    s13 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                  }\n                  if (s13 !== peg$FAILED) {\n                    s14 = peg$parseAnnotation();\n                    if (s14 !== peg$FAILED) {\n                      s12 = [s12, s13, s14];\n                      s11 = s12;\n                    } else {\n                      peg$currPos = s11;\n                      s11 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s11;\n                    s11 = peg$FAILED;\n                  }\n                  while (s11 !== peg$FAILED) {\n                    s10.push(s11);\n                    s11 = peg$currPos;\n                    s12 = peg$parse_();\n                    if (input.charCodeAt(peg$currPos) === 64) {\n                      s13 = peg$c18;\n                      peg$currPos++;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                    }\n                    if (s13 !== peg$FAILED) {\n                      s14 = peg$parseAnnotation();\n                      if (s14 !== peg$FAILED) {\n                        s12 = [s12, s13, s14];\n                        s11 = s12;\n                      } else {\n                        peg$currPos = s11;\n                        s11 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s11;\n                      s11 = peg$FAILED;\n                    }\n                  }\n                  s11 = peg$currPos;\n                  s12 = peg$parse_();\n                  s13 = peg$parsePropBlock();\n                  if (s13 !== peg$FAILED) {\n                    s12 = [s12, s13];\n                    s11 = s12;\n                  } else {\n                    peg$currPos = s11;\n                    s11 = peg$FAILED;\n                  }\n                  if (s11 === peg$FAILED) {\n                    s11 = null;\n                  }\n                  s12 = peg$parse_();\n                  s13 = peg$parseNL();\n                  if (s13 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f15(s4, s6, s8, s9, s10, s11);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnnotation() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c19) {\n      s1 = peg$c19;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseAnimValue();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f16(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseRouteWord();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s3 = peg$c20;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseWallPair();\n          if (s4 !== peg$FAILED) {\n            s3 = [s3, s4];\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f17(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseWallPair();\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f18(s1);\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnimValue() {\n    var s0;\n\n    if (input.substr(peg$currPos, 5) === peg$c21) {\n      s0 = peg$c21;\n      peg$currPos += 5;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 8) === peg$c22) {\n        s0 = peg$c22;\n        peg$currPos += 8;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c23) {\n          s0 = peg$c23;\n          peg$currPos += 4;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 5) === peg$c24) {\n            s0 = peg$c24;\n            peg$currPos += 5;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e25); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c25) {\n              s0 = peg$c25;\n              peg$currPos += 4;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e26); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 5) === peg$c26) {\n                s0 = peg$c26;\n                peg$currPos += 5;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e27); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 6) === peg$c27) {\n                  s0 = peg$c27;\n                  peg$currPos += 6;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e28); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c13) {\n                    s0 = peg$c13;\n                    peg$currPos += 4;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 10) === peg$c28) {\n                      s0 = peg$c28;\n                      peg$currPos += 10;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 4) === peg$c29) {\n                        s0 = peg$c29;\n                        peg$currPos += 4;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e30); }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteAnnotation() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseRouteWord();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c20;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWallPair();\n        if (s4 !== peg$FAILED) {\n          s3 = [s3, s4];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f19(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWallPair();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f20(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteWord() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c30) {\n      s1 = peg$c30;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f21();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 10) === peg$c31) {\n        s1 = peg$c31;\n        peg$currPos += 10;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f22();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 6) === peg$c32) {\n          s1 = peg$c32;\n          peg$currPos += 6;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f23();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 8) === peg$c33) {\n            s1 = peg$c33;\n            peg$currPos += 8;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e34); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f24();\n          }\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWallPair() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseWall();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseWall();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f25(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWall();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f26(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseWall() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f27(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsePropBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c34;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e36); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parsePropEntry();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s7 = peg$c35;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e37); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parsePropEntry();\n          if (s9 !== peg$FAILED) {\n            s6 = [s6, s7, s8, s9];\n            s5 = s6;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c35;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e37); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parsePropEntry();\n            if (s9 !== peg$FAILED) {\n              s6 = [s6, s7, s8, s9];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        }\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 125) {\n          s6 = peg$c36;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e38); }\n        }\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f28(s3, s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdentifier();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c20;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parsePropValue();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f29(s1, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropValue() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r2.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s5 = peg$c37;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e40); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = input.charAt(peg$currPos);\n        if (peg$r2.test(s7)) {\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n        if (s7 !== peg$FAILED) {\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r2.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e39); }\n            }\n          }\n        } else {\n          s6 = peg$FAILED;\n        }\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f30(s1);\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseQuotedString();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseIdentifier();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c38) {\n      s1 = peg$c38;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f31();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 5) === peg$c39) {\n        s1 = peg$c39;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f32();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 5) === peg$c40) {\n          s1 = peg$c40;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e43); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f33();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 4) === peg$c41) {\n            s1 = peg$c41;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e44); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f34();\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 4) === peg$c42) {\n              s1 = peg$c42;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e45); }\n            }\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$f35();\n            }\n            s0 = s1;\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 4) === peg$c43) {\n                s1 = peg$c43;\n                peg$currPos += 4;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e46); }\n              }\n              if (s1 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$f36();\n              }\n              s0 = s1;\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 4) === peg$c44) {\n                  s1 = peg$c44;\n                  peg$currPos += 4;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e47); }\n                }\n                if (s1 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s1 = peg$f37();\n                }\n                s0 = s1;\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.substr(peg$currPos, 5) === peg$c45) {\n                    s1 = peg$c45;\n                    peg$currPos += 5;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e48); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$f38();\n                  }\n                  s0 = s1;\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.substr(peg$currPos, 4) === peg$c46) {\n                      s1 = peg$c46;\n                      peg$currPos += 4;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e49); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$f39();\n                    }\n                    s0 = s1;\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.substr(peg$currPos, 4) === peg$c47) {\n                        s1 = peg$c47;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e50); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s1 = peg$f40();\n                      }\n                      s0 = s1;\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.substr(peg$currPos, 3) === peg$c48) {\n                          s1 = peg$c48;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e51); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$f41();\n                        }\n                        s0 = s1;\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          if (input.substr(peg$currPos, 4) === peg$c49) {\n                            s1 = peg$c49;\n                            peg$currPos += 4;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e52); }\n                          }\n                          if (s1 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$f42();\n                          }\n                          s0 = s1;\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            if (input.substr(peg$currPos, 3) === peg$c50) {\n                              s1 = peg$c50;\n                              peg$currPos += 3;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e53); }\n                            }\n                            if (s1 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$f43();\n                            }\n                            s0 = s1;\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              if (input.substr(peg$currPos, 3) === peg$c51) {\n                                s1 = peg$c51;\n                                peg$currPos += 3;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e54); }\n                              }\n                              if (s1 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s1 = peg$f44();\n                              }\n                              s0 = s1;\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                if (input.substr(peg$currPos, 3) === peg$c52) {\n                                  s1 = peg$c52;\n                                  peg$currPos += 3;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e55); }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                  peg$savedPos = s0;\n                                  s1 = peg$f45();\n                                }\n                                s0 = s1;\n                                if (s0 === peg$FAILED) {\n                                  s0 = peg$currPos;\n                                  if (input.substr(peg$currPos, 3) === peg$c53) {\n                                    s1 = peg$c53;\n                                    peg$currPos += 3;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e56); }\n                                  }\n                                  if (s1 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s1 = peg$f46();\n                                  }\n                                  s0 = s1;\n                                  if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos;\n                                    if (input.substr(peg$currPos, 3) === peg$c54) {\n                                      s1 = peg$c54;\n                                      peg$currPos += 3;\n                                    } else {\n                                      s1 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e57); }\n                                    }\n                                    if (s1 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s1 = peg$f47();\n                                    }\n                                    s0 = s1;\n                                    if (s0 === peg$FAILED) {\n                                      s0 = peg$currPos;\n                                      if (input.substr(peg$currPos, 3) === peg$c0) {\n                                        s1 = peg$c0;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s1 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                                      }\n                                      if (s1 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s1 = peg$f48();\n                                      }\n                                      s0 = s1;\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeRef() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdentifier();\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s2 = peg$c9;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseSignedInteger();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s4 = peg$c11;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f49(s1, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseIdentifier();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 46) {\n          s2 = peg$c37;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e40); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseIdentifier();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f50(s1, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdentifier() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e58); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r4.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e59); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r4.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e59); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellContent() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$currPos;\n    peg$silentFails++;\n    s4 = peg$currPos;\n    s5 = peg$parse_();\n    if (input.substr(peg$currPos, 3) === peg$c8) {\n      s6 = peg$c8;\n      peg$currPos += 3;\n    } else {\n      s6 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s6 !== peg$FAILED) {\n      s7 = peg$parse_();\n      s8 = peg$parseNL();\n      if (s8 === peg$FAILED) {\n        s8 = peg$currPos;\n        peg$silentFails++;\n        if (input.length > peg$currPos) {\n          s9 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s9 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e60); }\n        }\n        peg$silentFails--;\n        if (s9 === peg$FAILED) {\n          s8 = undefined;\n        } else {\n          peg$currPos = s8;\n          s8 = peg$FAILED;\n        }\n      }\n      if (s8 !== peg$FAILED) {\n        s5 = [s5, s6, s7, s8];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s4;\n      s4 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s4 === peg$FAILED) {\n      s3 = undefined;\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = [];\n      s6 = input.charAt(peg$currPos);\n      if (peg$r0.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s6 !== peg$FAILED) {\n        s5.push(s6);\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      s4 = input.substring(s4, peg$currPos);\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s2;\n        s2 = peg$f51(s4);\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      peg$silentFails++;\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      if (input.substr(peg$currPos, 3) === peg$c8) {\n        s6 = peg$c8;\n        peg$currPos += 3;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = peg$parse_();\n        s8 = peg$parseNL();\n        if (s8 === peg$FAILED) {\n          s8 = peg$currPos;\n          peg$silentFails++;\n          if (input.length > peg$currPos) {\n            s9 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e60); }\n          }\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n        }\n        if (s8 !== peg$FAILED) {\n          s5 = [s5, s6, s7, s8];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s4 === peg$FAILED) {\n        s3 = undefined;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = input.charAt(peg$currPos);\n          if (peg$r0.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n        }\n        s4 = input.substring(s4, peg$currPos);\n        s5 = peg$parseNL();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s2;\n          s2 = peg$f51(s4);\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f52(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseQuotedString() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c55;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e61); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r5.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e62); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r5.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e62); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c55;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e61); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f53(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInteger() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r2.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r2.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f54(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseSignedInteger() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r6.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e63); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r2.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f55(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f56();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c56) {\n      s1 = peg$c56;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r7.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e65); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r7.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e65); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r7.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e65); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r7.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e65); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c57) {\n      s0 = peg$c57;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e66); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r8.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e67); }\n      }\n    }\n\n    return s0;\n  }\n\n\n  reset();\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult, LayoutOptions, DiagramKind } from '../../../contracts/index.js';\nimport type { PosterNote, NotePosition } from './ir.js';\nimport type { PosterDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { CrossLink } from '../../../contracts/crosslink.js';\nimport { layoutPoster } from './layout.js';\nimport { getModule } from '../../../frontend/registry.js';\nimport * as parser from './parser.js';\n\nexport type { PosterDocument, PosterCell, PosterGrid, CellContent, DiagramCell, TextCell, StatCell } from './ir.js';\n\nexport const poster: DiagramModule<PosterDocument> = {\n  parseMermaid(input: string): PosterDocument {\n    const raw = parser.parse(input) as any;\n    const cells = raw.cells.map((c: any) => {\n      const { rawContent, caption, notes } = extractCellAnnotations(c.rawContent as string);\n      const content = parseCell({ ...c, rawContent });\n      return {\n        id: c.id, title: c.title, content,\n        colSpan: c.span?.colSpan, rowSpan: c.span?.rowSpan, theme: c.theme,\n        ...(caption ? { caption } : {}),\n        ...(notes.length > 0 ? { notes } : {}),\n      };\n    });\n\n    const explicitLinks: CrossLink[] = raw.links ?? [];\n\n    const allLinks = [...explicitLinks];\n\n    return {\n      version:  raw.version ?? '1.0',\n      metadata: { ...raw.metadata },\n      grid:     raw.grid,\n      cells,\n      ...(allLinks.length > 0 ? { links: allLinks } : {}),\n    };\n  },\n\n  parseYaml(input: string): PosterDocument {\n    return JSON.parse(input) as PosterDocument;\n  },\n\n  layout(ir: PosterDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutPoster(ir, theme);\n  },\n};\n\nfunction parseCell(raw: any): import('./ir.js').CellContent {\n  const kind: string | null | undefined = raw.kind;\n  const inferredKind = inferCellKind(raw.rawContent);\n  const resolvedKind = kind || inferredKind;\n\n  // Poster-specific primitives (no diagram module needed)\n  if (resolvedKind === 'stat') {\n    const [value, label] = raw.rawContent.split('|').map((s: string) => s.trim());\n    return { kind: 'stat', value: value ?? '', label };\n  }\n  if (resolvedKind === 'text') {\n    return { kind: 'text', text: raw.rawContent.trim() };\n  }\n\n  // Normalise aliases to canonical DiagramKind\n  const diagramKind: DiagramKind = resolvedKind === 'flow' ? 'flowchart' : resolvedKind as DiagramKind;\n\n  const module = getModule(diagramKind);\n  if (!module) {\n    // Unknown diagram kind \u2014 degrade to text\n    return { kind: 'text', text: raw.rawContent.trim() };\n  }\n\n  // Ensure trailing newline \u2014 sub-parsers (PEG grammars) require it\n  const content = raw.rawContent.endsWith('\\n') ? raw.rawContent : raw.rawContent + '\\n';\n  return { kind: 'diagram', diagramKind, doc: module.parseMermaid(content) };\n}\n\nfunction inferCellKind(rawContent: string): string | null {\n  const trimmed = rawContent.trim();\n  if (!trimmed) return 'text';\n\n  const firstLine = trimmed.split(/\\r?\\n/)[0]!.trim();\n  if (!firstLine) return 'text';\n\n  const keyword = firstLine.toLowerCase();\n  if (keyword.startsWith('array')) return 'array';\n  if (keyword.startsWith('stack')) return 'stack';\n  if (keyword.startsWith('queue')) return 'queue';\n  if (keyword.startsWith('unionfind')) return 'unionfind';\n  if (keyword.startsWith('hashmap')) return 'hashmap';\n  if (keyword.startsWith('matrix')) return 'matrix';\n  if (keyword.startsWith('heap')) return 'heap';\n  if (keyword.startsWith('trie')) return 'trie';\n  if (keyword.startsWith('nodegraph')) return 'nodegraph';\n  if (keyword.startsWith('plan')) return 'plan';\n  if (keyword.startsWith('btree')) return 'btree';\n  if (keyword.startsWith('tree')) return 'tree';\n  if (keyword.startsWith('page')) return 'page';\n  if (keyword.startsWith('memory')) return 'memory';\n  if (keyword.startsWith('linkedlist')) return 'linkedlist';\n  if (keyword.startsWith('avl')) return 'avl';\n  if (keyword.startsWith('flowchart') || keyword.startsWith('flow ')) return 'flowchart';\n  if (keyword.startsWith('timeline')) return 'timeline';\n  if (keyword.startsWith('sequence')) return 'sequence';\n  if (keyword.startsWith('gantt')) return 'gantt';\n  if (keyword.startsWith('state')) return 'state';\n  if (keyword.startsWith('class')) return 'class';\n  if (keyword.startsWith('er')) return 'er';\n  if (keyword.startsWith('journey')) return 'journey';\n  if (keyword.startsWith('gitgraph')) return 'gitgraph';\n  if (keyword.startsWith('mindmap')) return 'mindmap';\n  if (keyword.startsWith('sankey')) return 'sankey';\n  if (keyword.startsWith('pie')) return 'pie';\n  if (keyword.startsWith('requirement')) return 'requirement';\n  if (keyword.startsWith('kanban')) return 'kanban';\n  if (keyword.startsWith('quadrant')) return 'quadrant';\n  if (keyword.startsWith('xychart')) return 'xychart';\n  if (keyword.startsWith('radar')) return 'radar';\n  if (trimmed.includes('|')) return 'stat';\n  return 'text';\n}\n\n// \u2500\u2500\u2500 Cell Annotation Extraction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst CAPTION_RE = /^[ \\t]*caption[ \\t]+\"([^\"]*)\"[ \\t]*$/;\nconst NOTE_RE    = /^[ \\t]*note[ \\t]+\"([^\"]*)\"(?:[ \\t]+at[ \\t]+(top-left|top-right|bottom-left|bottom-right|center))?[ \\t]*$/;\n\n/**\n * Strip `caption \"...\"` and `note \"...\" [at position]` directives from\n * a cell's raw content and return them as structured fields.\n */\nfunction extractCellAnnotations(rawContent: string): {\n  rawContent: string;\n  caption: string | undefined;\n  notes: PosterNote[];\n} {\n  const inputLines = rawContent.split('\\n');\n  const outLines: string[] = [];\n  let caption: string | undefined;\n  const notes: PosterNote[] = [];\n\n  for (const line of inputLines) {\n    const cm = line.match(CAPTION_RE);\n    if (cm) { caption = cm[1]; continue; }\n    const nm = line.match(NOTE_RE);\n    if (nm) { notes.push({ text: nm[1]!, ...(nm[2] ? { position: nm[2] as NotePosition } : {}) }); continue; }\n    outLines.push(line);\n  }\n\n  return { rawContent: outLines.join('\\n'), caption, notes };\n}\n\n", "/**\n * @file diagrams/pie/layout.ts \u2014 Proportional pie chart.\n *\n * Sectors sized by value share, coloured from the shared categorical hue\n * cycle, with a value/percentage legend to the right. Reads only shared theme\n * tokens; geometry rounds half-up for deterministic output.\n */\n\nimport type { PieDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nfunction fmtNum(n: number): string {\n  return Number.isInteger(n) ? String(n) : String(Math.round(n * 100) / 100);\n}\n\nexport function layoutPie(ir: PieDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const slices = ir.slices.filter(s => s.value > 0);\n  const total = slices.reduce((sum, s) => sum + s.value, 0) || 1;\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n\n  const R  = 150;\n  const cx = margin + R;\n  const cy = margin + titleH + R;\n\n  const legendFont = typography.baseFontSize;\n  const swatch     = 13;\n  const legendGap  = 8;\n  const rowH       = legendFont + 12;\n  const legendLabels = slices.map(s => {\n    const pct = (s.value / total) * 100;\n    return ir.showData\n      ? `${s.label} \u2014 ${fmtNum(s.value)} (${pct.toFixed(1)}%)`\n      : `${s.label} \u2014 ${pct.toFixed(1)}%`;\n  });\n  const legendTextW = slices.length ? Math.max(...legendLabels.map(l => measureText(l, legendFont).width)) : 0;\n  const legendX     = cx + R + 48;\n  const legendTop   = rhuInt(cy - (slices.length * rowH) / 2);\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Sectors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let a0 = -Math.PI / 2;\n  slices.forEach((s, i) => {\n    const frac  = s.value / total;\n    const a1    = a0 + frac * Math.PI * 2;\n    const color = categoricalHue(i);\n\n    if (slices.length === 1) {\n      elements.push(p.circle({ x: cx, y: cy }, R, color, palette.background, 1));\n    } else {\n      const x0 = rhu(cx + R * Math.cos(a0)), y0 = rhu(cy + R * Math.sin(a0));\n      const x1 = rhu(cx + R * Math.cos(a1)), y1 = rhu(cy + R * Math.sin(a1));\n      const large = frac > 0.5 ? 1 : 0;\n      const d = `M ${rhu(cx)} ${rhu(cy)} L ${x0} ${y0} A ${R} ${R} 0 ${large} 1 ${x1} ${y1} Z`;\n      elements.push(p.path(d, palette.background, 1, { fill: color }));\n    }\n\n    // Percentage label inside the slice (skip slivers).\n    const pct = frac * 100;\n    if (pct >= 4) {\n      const am = (a0 + a1) / 2;\n      const lr = R * 0.62;\n      elements.push(p.text(`${pct.toFixed(0)}%`, rhu(cx + lr * Math.cos(am)), rhu(cy + lr * Math.sin(am) + typography.smallFontSize * 0.35), typography.smallFontSize, '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n    }\n    a0 = a1;\n  });\n\n  // \u2500\u2500 Legend \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  slices.forEach((s, i) => {\n    const ly = legendTop + i * rowH;\n    elements.push(p.rect({ x: legendX, y: ly, width: swatch, height: swatch }, categoricalHue(i), categoricalHue(i), 0, { rx: 2 }));\n    elements.push(p.text(legendLabels[i]!, legendX + swatch + legendGap, ly + swatch - 2, legendFont, palette.text));\n  });\n\n  const totalW = rhuInt(legendX + legendTextW + swatch + legendGap + margin);\n  const totalH = rhuInt(Math.max(cy + R, legendTop + slices.length * rowH) + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"pie\";\n  var peg$c1 = \"showdata\";\n  var peg$c2 = \"title\";\n  var peg$c3 = \":\";\n  var peg$c4 = \"\\r\";\n  var peg$c5 = \"\\n\";\n  var peg$c6 = \"\\\"\";\n  var peg$c7 = \"-\";\n  var peg$c8 = \".\";\n\n  var peg$r0 = /^[^\"]/;\n  var peg$r1 = /^[0-9]/;\n  var peg$r2 = /^[^\\n]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"pie\", true);\n  var peg$e1 = peg$literalExpectation(\"showData\", true);\n  var peg$e2 = peg$literalExpectation(\"title\", true);\n  var peg$e3 = peg$literalExpectation(\":\", false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e7 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e8 = peg$literalExpectation(\"-\", false);\n  var peg$e9 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e10 = peg$literalExpectation(\".\", false);\n  var peg$e11 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e12 = peg$anyExpectation();\n  var peg$e13 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(head, rows) {\n      const slices = rows.filter(Boolean);\n      return {\n        version: '1.0',\n        metadata: { ...(head.title ? { title: head.title } : {}) },\n        slices,\n        ...(head.showData ? { showData: true } : {}),\n      };\n    };\n  var peg$f1 = function(sd, r) { return r; };\n  var peg$f2 = function(sd, t) {\n      return { showData: !!sd, title: t ? t.trim() : null };\n    };\n  var peg$f3 = function(label, value) { return { label, value }; };\n  var peg$f4 = function() { return null; };\n  var peg$f5 = function(s) { return s; };\n  var peg$f6 = function(n) { return parseFloat(n); };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseHeader();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseRow();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseRow();\n      }\n      s4 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s2, s3);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHeader() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = input.substr(peg$currPos, 3);\n    if (s1.toLowerCase() === peg$c0) {\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      s4 = input.substr(peg$currPos, 8);\n      if (s4.toLowerCase() === peg$c1) {\n        peg$currPos += 8;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = input.substr(peg$currPos, 5);\n      if (s5.toLowerCase() === peg$c2) {\n        peg$currPos += 5;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseRestOfLine();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f1(s2, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f2(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseQuoted();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c3;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseNum();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          s8 = peg$parseLineEnd();\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c4;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c5;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f4();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c6;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r0.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r0.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c7;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r1.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r1.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c8;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r1.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r1.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e9); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f6(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { PieDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutPie } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { PieDocument, PieSlice } from './ir.js';\n\nexport const pie: DiagramModule<PieDocument> = {\n  parseMermaid(input: string): PieDocument {\n    return parser.parse(input) as PieDocument;\n  },\n\n  parseYaml(input: string): PieDocument {\n    return JSON.parse(input) as PieDocument;\n  },\n\n  layout(ir: PieDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutPie(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/xychart/layout.ts \u2014 Cartesian bar + line chart.\n *\n * Categorical x-axis, numeric y-axis with gridlines and ticks. Bar series are\n * grouped per category; line series are drawn as polylines with dots on top.\n * Series colours come from the shared categorical hue cycle.\n */\n\nimport type { XYChartDocument, XYSeries } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\n/** Pick ~5 \"nice\" tick values spanning [min, max]. */\nfunction niceTicks(min: number, max: number): number[] {\n  const span = max - min || 1;\n  const rawStep = span / 5;\n  const mag = Math.pow(10, Math.floor(Math.log10(rawStep)));\n  const norm = rawStep / mag;\n  const step = (norm >= 5 ? 5 : norm >= 2 ? 2 : 1) * mag;\n  const ticks: number[] = [];\n  for (let v = Math.ceil(min / step) * step; v <= max + 1e-9; v += step) ticks.push(Math.round(v * 1e6) / 1e6);\n  return ticks;\n}\n\nfunction fmtTick(n: number): string {\n  if (Math.abs(n) >= 1000) return `${n / 1000}k`;\n  return String(n);\n}\n\nexport function layoutXYChart(ir: XYChartDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const cats    = ir.categories;\n  const nCats   = Math.max(cats.length, 1);\n  const series  = ir.series;\n  const barSeries  = series.filter(s => s.kind === 'bar');\n  const lineSeries = series.filter(s => s.kind === 'line');\n\n  // \u2500\u2500 Y range \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allVals = series.flatMap(s => s.values as number[]);\n  const dataMin = allVals.length ? Math.min(...allVals) : 0;\n  const dataMax = allVals.length ? Math.max(...allVals) : 1;\n  const yMin = ir.yMin ?? Math.min(0, dataMin);\n  const yMax = ir.yMax ?? (dataMax > 0 ? dataMax * 1.1 : 1);\n  const ticks = niceTicks(yMin, yMax);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n  const tickFont = typography.smallFontSize;\n  const tickW  = Math.max(...ticks.map(t => measureText(fmtTick(t), tickFont).width), 0);\n  const yLabelW = ir.yLabel ? typography.baseFontSize + 6 : 0;\n\n  const plotLeft   = margin + yLabelW + tickW + 10;\n  const plotTop    = margin + titleH;\n  const plotH      = 360;\n  const plotBottom = plotTop + plotH;\n  const bandW      = 78;\n  const plotW      = bandW * nCats;\n  const plotRight  = plotLeft + plotW;\n\n  const yToPx = (v: number): number => rhu(plotBottom - ((v - yMin) / (yMax - yMin || 1)) * plotH);\n  const catX  = (i: number): number => plotLeft + (i + 0.5) * bandW;\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Gridlines + y ticks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const t of ticks) {\n    const y = yToPx(t);\n    elements.push(p.path(`M ${plotLeft} ${y} L ${plotRight} ${y}`, palette.border, 1, { opacity: 0.5 }));\n    elements.push(p.text(fmtTick(t), plotLeft - 8, y + tickFont * 0.35, tickFont, palette.textMuted, { anchor: 'end' }));\n  }\n\n  // \u2500\u2500 Axes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.path(`M ${plotLeft} ${plotTop} L ${plotLeft} ${plotBottom}`, palette.text, 1.5));\n  elements.push(p.path(`M ${plotLeft} ${plotBottom} L ${plotRight} ${plotBottom}`, palette.text, 1.5));\n\n  if (ir.yLabel) {\n    const ly = rhuInt(plotTop + plotH / 2);\n    const lx = margin + typography.baseFontSize;\n    elements.push(p.text(ir.yLabel, lx, ly, typography.baseFontSize, palette.textMuted, { anchor: 'middle', weight: 'bold' }));\n    // rotate via group transform\n    const last = elements.pop()!;\n    elements.push(p.group([last], { transform: `rotate(-90 ${lx} ${ly})` }));\n  }\n\n  // \u2500\u2500 Bars (grouped per category) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nBars = Math.max(barSeries.length, 1);\n  const groupW = bandW * 0.62;\n  const barW   = groupW / nBars;\n  barSeries.forEach((s, si) => {\n    const color = categoricalHue(si);\n    (s.values as number[]).forEach((v, i) => {\n      const x = catX(i) - groupW / 2 + si * barW;\n      const y = yToPx(v);\n      const h = yToPx(yMin) - y;\n      if (h > 0) elements.push(p.rect({ x: rhu(x), y, width: rhu(barW - 2), height: rhu(h) }, color, color, 0, { rx: 2 }));\n    });\n  });\n\n  // \u2500\u2500 Lines (drawn on top) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  lineSeries.forEach((s, si) => {\n    const color = categoricalHue(barSeries.length + si);\n    const pts = (s.values as number[]).map((v, i) => `${rhu(catX(i))} ${yToPx(v)}`);\n    if (pts.length) {\n      elements.push(p.path(`M ${pts.join(' L ')}`, color, 2.5));\n      (s.values as number[]).forEach((v, i) => {\n        elements.push(p.circle({ x: rhu(catX(i)), y: yToPx(v) }, 4, color, palette.background, 1.5));\n      });\n    }\n  });\n\n  // \u2500\u2500 X category labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  cats.forEach((c, i) => {\n    elements.push(p.text(c, rhu(catX(i)), plotBottom + tickFont + 8, tickFont, palette.textMuted, { anchor: 'middle' }));\n  });\n\n  const totalW = rhuInt(plotRight + margin);\n  const totalH = rhuInt(plotBottom + tickFont + 16 + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"xychart-beta\";\n  var peg$c1 = \"horizontal\";\n  var peg$c2 = \"vertical\";\n  var peg$c3 = \"title\";\n  var peg$c4 = \"x-axis\";\n  var peg$c5 = \"[\";\n  var peg$c6 = \",\";\n  var peg$c7 = \"]\";\n  var peg$c8 = \"y-axis\";\n  var peg$c9 = \"-->\";\n  var peg$c10 = \"bar\";\n  var peg$c11 = \"line\";\n  var peg$c12 = \"\\\"\";\n  var peg$c13 = \"-\";\n  var peg$c14 = \".\";\n  var peg$c15 = \"\\r\";\n  var peg$c16 = \"\\n\";\n\n  var peg$r0 = /^[^,\\]\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[^\\n]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"xychart-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"horizontal\", true);\n  var peg$e2 = peg$literalExpectation(\"vertical\", true);\n  var peg$e3 = peg$literalExpectation(\"title\", true);\n  var peg$e4 = peg$literalExpectation(\"x-axis\", true);\n  var peg$e5 = peg$literalExpectation(\"[\", false);\n  var peg$e6 = peg$literalExpectation(\",\", false);\n  var peg$e7 = peg$literalExpectation(\"]\", false);\n  var peg$e8 = peg$literalExpectation(\"y-axis\", true);\n  var peg$e9 = peg$literalExpectation(\"-->\", false);\n  var peg$e10 = peg$literalExpectation(\"bar\", true);\n  var peg$e11 = peg$literalExpectation(\"line\", true);\n  var peg$e12 = peg$classExpectation([\",\", \"]\", \"\\n\"], true, false);\n  var peg$e13 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e14 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e15 = peg$literalExpectation(\"-\", false);\n  var peg$e16 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e17 = peg$literalExpectation(\".\", false);\n  var peg$e18 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e19 = peg$literalExpectation(\"\\r\", false);\n  var peg$e20 = peg$literalExpectation(\"\\n\", false);\n  var peg$e21 = peg$anyExpectation();\n  var peg$e22 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      let title;\n      let categories = [];\n      let yLabel, yMin, yMax;\n      const series = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'x')     categories = s.cats;\n        else if (s.t === 'y')   { yLabel = s.label; yMin = s.min; yMax = s.max; }\n        else if (s.t === 'series') series.push({ kind: s.kind, values: s.values });\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(title ? { title } : {}) },\n        categories,\n        ...(yLabel !== undefined ? { yLabel } : {}),\n        ...(yMin !== undefined ? { yMin } : {}),\n        ...(yMax !== undefined ? { yMax } : {}),\n        series,\n      };\n    };\n  var peg$f1 = function(v) { return { t: 'title', v: typeof v === 'string' ? v.trim() : v }; };\n  var peg$f2 = function(first, i) { return i; };\n  var peg$f3 = function(first, rest) {\n      return { t: 'x', cats: [first, ...rest] };\n    };\n  var peg$f4 = function(q) { return q; };\n  var peg$f5 = function(label, a, b) { return { min: a, max: b }; };\n  var peg$f6 = function(label, range) {\n      return { t: 'y', label: label || undefined, min: range ? range.min : undefined, max: range ? range.max : undefined };\n    };\n  var peg$f7 = function(kind, first, n) { return n; };\n  var peg$f8 = function(kind, first, rest) {\n      return { t: 'series', kind: kind.toLowerCase(), values: [first, ...rest] };\n    };\n  var peg$f9 = function(s) { return s.trim(); };\n  var peg$f10 = function(n) { return parseFloat(n); };\n  var peg$f11 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 12);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 12;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = input.substr(peg$currPos, 10);\n      if (s5.toLowerCase() === peg$c1) {\n        peg$currPos += 10;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s5 === peg$FAILED) {\n        s5 = input.substr(peg$currPos, 8);\n        if (s5.toLowerCase() === peg$c2) {\n          peg$currPos += 8;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseXAxis();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseYAxis();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseSeries();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseQuoted();\n      if (s4 === peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f1(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseXAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s4 = peg$c5;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseAxisItem();\n        if (s6 !== peg$FAILED) {\n          s7 = [];\n          s8 = peg$currPos;\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s10 = peg$c6;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parse_();\n            s12 = peg$parseAxisItem();\n            if (s12 !== peg$FAILED) {\n              peg$savedPos = s8;\n              s8 = peg$f2(s6, s12);\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$currPos;\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s10 = peg$c6;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseAxisItem();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s8;\n                s8 = peg$f2(s6, s12);\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          }\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s9 = peg$c7;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseLineEnd();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f3(s6, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseYAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = peg$parseQuoted();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s3;\n        s3 = peg$f4(s5);\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      s6 = peg$parseNum();\n      if (s6 !== peg$FAILED) {\n        s7 = peg$parse_();\n        if (input.substr(peg$currPos, 3) === peg$c9) {\n          s8 = peg$c9;\n          peg$currPos += 3;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parse_();\n          s10 = peg$parseNum();\n          if (s10 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f5(s3, s6, s10);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parse_();\n      s6 = peg$parseLineEnd();\n      if (s6 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f6(s3, s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSeries() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c10) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 4);\n      if (s2.toLowerCase() === peg$c11) {\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s4 = peg$c5;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseNum();\n        if (s6 !== peg$FAILED) {\n          s7 = [];\n          s8 = peg$currPos;\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s10 = peg$c6;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parse_();\n            s12 = peg$parseNum();\n            if (s12 !== peg$FAILED) {\n              peg$savedPos = s8;\n              s8 = peg$f7(s2, s6, s12);\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$currPos;\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s10 = peg$c6;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseNum();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s8;\n                s8 = peg$f7(s2, s6, s12);\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          }\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s9 = peg$c7;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseLineEnd();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f8(s2, s6, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisItem() {\n    var s0, s1, s2;\n\n    s0 = peg$parseQuoted();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = input.charAt(peg$currPos);\n      if (peg$r0.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r0.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f9(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c13;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r2.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r2.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c14;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r2.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f10(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r3.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c15;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c16;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f11();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c15;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c16;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { XYChartDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutXYChart } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { XYChartDocument, XYSeries, XYSeriesKind } from './ir.js';\n\nexport const xychart: DiagramModule<XYChartDocument> = {\n  parseMermaid(input: string): XYChartDocument {\n    return parser.parse(input) as XYChartDocument;\n  },\n\n  parseYaml(input: string): XYChartDocument {\n    return JSON.parse(input) as XYChartDocument;\n  },\n\n  layout(ir: XYChartDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutXYChart(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/quadrant/layout.ts \u2014 Four-quadrant scatter.\n *\n * A square plot split into four tinted quadrants with crossed axes, quadrant\n * captions, edge axis labels, and positioned points (normalized 0..1). Quadrant\n * tints come from the shared categorical hue cycle at low opacity.\n */\n\nimport type { QuadrantDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutQuadrant(ir: QuadrantDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n\n  const side      = 460;\n  const axisPad   = 30;                         // room for edge axis labels\n  const plotLeft  = margin + axisPad;\n  const plotTop   = margin + titleH;\n  const plotRight = plotLeft + side;\n  const plotBot   = plotTop + side;\n  const midX      = rhuInt((plotLeft + plotRight) / 2);\n  const midY      = rhuInt((plotTop + plotBot) / 2);\n  const half      = side / 2;\n\n  const px = (x: number): number => rhu(plotLeft + x * side);\n  const py = (y: number): number => rhu(plotBot - y * side);\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, rhuInt((plotLeft + plotRight) / 2), margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Quadrant tints (q1 TR, q2 TL, q3 BL, q4 BR) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const quads: Array<{ x: number; y: number; hue: number }> = [\n    { x: midX,     y: plotTop, hue: 0 }, // q1 top-right\n    { x: plotLeft, y: plotTop, hue: 1 }, // q2 top-left\n    { x: plotLeft, y: midY,    hue: 2 }, // q3 bottom-left\n    { x: midX,     y: midY,    hue: 3 }, // q4 bottom-right\n  ];\n  quads.forEach((q, i) => {\n    elements.push(p.rect({ x: q.x, y: q.y, width: half, height: half }, categoricalHue(q.hue), categoricalHue(q.hue), 0, { opacity: 0.12 }));\n    const label = ir.quadrants[i];\n    if (label) {\n      elements.push(p.text(label, rhuInt(q.x + half / 2), q.y + typography.baseFontSize + 12, typography.baseFontSize, categoricalHue(q.hue), { weight: 'bold', anchor: 'middle' }));\n    }\n  });\n\n  // \u2500\u2500 Plot border + crossing axes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.rect({ x: plotLeft, y: plotTop, width: side, height: side }, 'none', palette.border, 1.5));\n  elements.push(p.path(`M ${midX} ${plotTop} L ${midX} ${plotBot}`, palette.border, 1, { dash: '4 4' }));\n  elements.push(p.path(`M ${plotLeft} ${midY} L ${plotRight} ${midY}`, palette.border, 1, { dash: '4 4' }));\n\n  // \u2500\u2500 Points \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const dotFont = typography.smallFontSize;\n  for (const pt of ir.points) {\n    const x = px(pt.x), y = py(pt.y);\n    elements.push(p.circle({ x, y }, 5, palette.primary, palette.background, 1.5));\n    elements.push(p.text(pt.label, x + 9, y + dotFont * 0.35, dotFont, palette.text));\n  }\n\n  // \u2500\u2500 Edge axis labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const axFont = typography.smallFontSize;\n  const xY = plotBot + axFont + 8;\n  if (ir.xAxisLeft)  elements.push(p.text(ir.xAxisLeft,  plotLeft,  xY, axFont, palette.textMuted, { anchor: 'start' }));\n  if (ir.xAxisRight) elements.push(p.text(ir.xAxisRight, plotRight, xY, axFont, palette.textMuted, { anchor: 'end' }));\n\n  const yLx = margin + axFont;\n  if (ir.yAxisBottom) {\n    const yy = plotBot;\n    elements.push(p.group([p.text(ir.yAxisBottom, yLx, yy, axFont, palette.textMuted, { anchor: 'start' })], { transform: `rotate(-90 ${yLx} ${yy})` }));\n  }\n  if (ir.yAxisTop) {\n    const yy = plotTop;\n    elements.push(p.group([p.text(ir.yAxisTop, yLx, yy, axFont, palette.textMuted, { anchor: 'end' })], { transform: `rotate(-90 ${yLx} ${yy})` }));\n  }\n\n  const totalW = rhuInt(plotRight + margin);\n  const totalH = rhuInt(plotBot + axFont + 16 + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"quadrantchart\";\n  var peg$c1 = \"title\";\n  var peg$c2 = \"x-axis\";\n  var peg$c3 = \"-->\";\n  var peg$c4 = \"y-axis\";\n  var peg$c5 = \"quadrant-\";\n  var peg$c6 = \":\";\n  var peg$c7 = \"[\";\n  var peg$c8 = \",\";\n  var peg$c9 = \"]\";\n  var peg$c10 = \"-\";\n  var peg$c11 = \".\";\n  var peg$c12 = \"\\r\";\n  var peg$c13 = \"\\n\";\n\n  var peg$r0 = /^[1-4]/;\n  var peg$r1 = /^[^:\\n]/;\n  var peg$r2 = /^[^\\n]/;\n  var peg$r3 = /^[0-9]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"quadrantChart\", true);\n  var peg$e1 = peg$literalExpectation(\"title\", true);\n  var peg$e2 = peg$literalExpectation(\"x-axis\", true);\n  var peg$e3 = peg$literalExpectation(\"-->\", false);\n  var peg$e4 = peg$literalExpectation(\"y-axis\", true);\n  var peg$e5 = peg$literalExpectation(\"quadrant-\", true);\n  var peg$e6 = peg$classExpectation([[\"1\", \"4\"]], false, false);\n  var peg$e7 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e8 = peg$literalExpectation(\":\", false);\n  var peg$e9 = peg$literalExpectation(\"[\", false);\n  var peg$e10 = peg$literalExpectation(\",\", false);\n  var peg$e11 = peg$literalExpectation(\"]\", false);\n  var peg$e12 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e13 = peg$literalExpectation(\"-\", false);\n  var peg$e14 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e15 = peg$literalExpectation(\".\", false);\n  var peg$e16 = peg$literalExpectation(\"\\r\", false);\n  var peg$e17 = peg$literalExpectation(\"\\n\", false);\n  var peg$e18 = peg$anyExpectation();\n  var peg$e19 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      let title, xl, xr, yb, yt;\n      const quadrants = [undefined, undefined, undefined, undefined];\n      const points = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'x') { xl = s.left; xr = s.right; }\n        else if (s.t === 'y') { yb = s.left; yt = s.right; }\n        else if (s.t === 'q') quadrants[s.n - 1] = s.label;\n        else if (s.t === 'p') points.push({ label: s.label, x: s.x, y: s.y });\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(title ? { title } : {}) },\n        ...(xl !== undefined ? { xAxisLeft: xl } : {}),\n        ...(xr !== undefined ? { xAxisRight: xr } : {}),\n        ...(yb !== undefined ? { yAxisBottom: yb } : {}),\n        ...(yt !== undefined ? { yAxisTop: yt } : {}),\n        quadrants,\n        points,\n      };\n    };\n  var peg$f1 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f2 = function(left, r) { return r.trim(); };\n  var peg$f3 = function(left, right) {\n      return { t: 'x', left: left.trim(), right: right || undefined };\n    };\n  var peg$f4 = function(left, r) { return r.trim(); };\n  var peg$f5 = function(left, right) {\n      return { t: 'y', left: left.trim(), right: right || undefined };\n    };\n  var peg$f6 = function(n, label) { return { t: 'q', n: parseInt(n, 10), label: label.trim() }; };\n  var peg$f7 = function(label, x, y) {\n      return { t: 'p', label: label.trim(), x, y };\n    };\n  var peg$f8 = function(n) { return parseFloat(n); };\n  var peg$f9 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 13);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 13;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseStatement();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseStatement();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseXAxis();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseYAxis();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseQuadrant();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parsePoint();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c1) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f1(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseXAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseAxisText();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.substr(peg$currPos, 3) === peg$c3) {\n          s7 = peg$c3;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseRestOfLine();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f2(s4, s9);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parseLineEnd();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s4, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseYAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseAxisText();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.substr(peg$currPos, 3) === peg$c3) {\n          s7 = peg$c3;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseRestOfLine();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f4(s4, s9);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parseLineEnd();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f5(s4, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuadrant() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 9);\n    if (s2.toLowerCase() === peg$c5) {\n      peg$currPos += 9;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseRestOfLine();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s3, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePoint() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r1.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c6;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 91) {\n          s6 = peg$c7;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          s8 = peg$parseNum();\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s10 = peg$c8;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseNum();\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 93) {\n                  s14 = peg$c9;\n                  peg$currPos++;\n                } else {\n                  s14 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e11); }\n                }\n                if (s14 !== peg$FAILED) {\n                  s15 = peg$parse_();\n                  s16 = peg$parseLineEnd();\n                  if (s16 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f7(s2, s8, s12);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisText() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$currPos;\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 3) === peg$c3) {\n      s4 = peg$c3;\n      peg$currPos += 3;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    peg$silentFails--;\n    if (s4 === peg$FAILED) {\n      s3 = undefined;\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$currPos;\n        s3 = peg$currPos;\n        peg$silentFails++;\n        if (input.substr(peg$currPos, 3) === peg$c3) {\n          s4 = peg$c3;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        peg$silentFails--;\n        if (s4 === peg$FAILED) {\n          s3 = undefined;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = input.charAt(peg$currPos);\n          if (peg$r2.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            s3 = [s3, s4];\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c10;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r3.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r3.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c11;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r3.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r3.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e14); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f8(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c12;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c13;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f9();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c13;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { QuadrantDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutQuadrant } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { QuadrantDocument, QuadrantPoint } from './ir.js';\n\nexport const quadrant: DiagramModule<QuadrantDocument> = {\n  parseMermaid(input: string): QuadrantDocument {\n    return parser.parse(input) as QuadrantDocument;\n  },\n\n  parseYaml(input: string): QuadrantDocument {\n    return JSON.parse(input) as QuadrantDocument;\n  },\n\n  layout(ir: QuadrantDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutQuadrant(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/radar/layout.ts \u2014 Multi-axis radar (spider) chart.\n *\n * Equiangular spokes (one per axis) from a shared centre, concentric grid\n * rings, and one filled polygon per curve. Curve colours come from the shared\n * categorical hue cycle; a legend lists each curve.\n */\n\nimport type { RadarDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutRadar(ir: RadarDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const axes = ir.axes;\n  const n    = Math.max(axes.length, 1);\n  const allVals = ir.curves.flatMap(c => c.values as number[]);\n  const min  = ir.min ?? 0;\n  const max  = ir.max ?? (allVals.length ? Math.max(...allVals) : 1);\n  const span = (max - min) || 1;\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n\n  const R    = 180;\n  const labelPad = 90;                         // room for axis labels around the ring\n  const cx   = margin + labelPad + R;\n  const cy   = margin + titleH + labelPad + R;\n\n  // Angle for axis i: start at top (-90\u00B0), clockwise.\n  const angle = (i: number): number => -Math.PI / 2 + (i / n) * Math.PI * 2;\n  const ptAt  = (i: number, frac: number): { x: number; y: number } => ({\n    x: cx + Math.cos(angle(i)) * R * frac,\n    y: cy + Math.sin(angle(i)) * R * frac,\n  });\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, rhuInt(cx), margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Grid rings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const rings = 4;\n  for (let r = 1; r <= rings; r++) {\n    const frac = r / rings;\n    const d = axes.map((_, i) => { const pt = ptAt(i, frac); return `${rhu(pt.x)} ${rhu(pt.y)}`; }).join(' L ');\n    elements.push(p.path(`M ${d} Z`, palette.border, 1, { opacity: 0.5 }));\n  }\n\n  // \u2500\u2500 Spokes + axis labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  axes.forEach((ax, i) => {\n    const outer = ptAt(i, 1);\n    elements.push(p.path(`M ${rhu(cx)} ${rhu(cy)} L ${rhu(outer.x)} ${rhu(outer.y)}`, palette.border, 1, { opacity: 0.6 }));\n    const lp = ptAt(i, 1.12);\n    const a  = angle(i);\n    const anchor = Math.abs(Math.cos(a)) < 0.3 ? 'middle' : (Math.cos(a) > 0 ? 'start' : 'end');\n    elements.push(p.text(ax.label, rhu(lp.x), rhu(lp.y + typography.smallFontSize * 0.35), typography.smallFontSize, palette.text, { anchor }));\n  });\n\n  // \u2500\u2500 Curves \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.curves.forEach((curve, ci) => {\n    const color = categoricalHue(ci);\n    const pts = axes.map((_, i) => {\n      const v = curve.values[i] ?? min;\n      const frac = Math.max(0, Math.min(1, (v - min) / span));\n      const pt = ptAt(i, frac);\n      return `${rhu(pt.x)} ${rhu(pt.y)}`;\n    });\n    if (pts.length) {\n      elements.push(p.path(`M ${pts.join(' L ')} Z`, color, 2, { fill: color, opacity: 0.18 }));\n      elements.push(p.path(`M ${pts.join(' L ')} Z`, color, 2));\n    }\n  });\n\n  // \u2500\u2500 Legend \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const legendFont = typography.baseFontSize;\n  const swatch = 12;\n  const legendX = cx + R + labelPad - 30;\n  const legendTop = margin + titleH;\n  let legendW = 0;\n  ir.curves.forEach((curve, ci) => {\n    const ly = legendTop + ci * (legendFont + 10);\n    elements.push(p.rect({ x: legendX, y: ly, width: swatch, height: swatch }, categoricalHue(ci), categoricalHue(ci), 0, { rx: 2 }));\n    elements.push(p.text(curve.label, legendX + swatch + 8, ly + swatch - 2, legendFont, palette.text));\n    legendW = Math.max(legendW, swatch + 8 + measureText(curve.label, legendFont).width);\n  });\n\n  const ringRight = cx + R + labelPad;\n  const totalW = rhuInt(Math.max(ringRight, legendX + legendW) + margin);\n  const totalH = rhuInt(cy + R + labelPad + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"radar-beta\";\n  var peg$c1 = \"title\";\n  var peg$c2 = \"axis\";\n  var peg$c3 = \",\";\n  var peg$c4 = \"curve\";\n  var peg$c5 = \"{\";\n  var peg$c6 = \"}\";\n  var peg$c7 = \"max\";\n  var peg$c8 = \"min\";\n  var peg$c9 = \"[\";\n  var peg$c10 = \"]\";\n  var peg$c11 = \"\\\"\";\n  var peg$c12 = \"-\";\n  var peg$c13 = \".\";\n  var peg$c14 = \"\\r\";\n  var peg$c15 = \"\\n\";\n\n  var peg$r0 = /^[^\\]\\n]/;\n  var peg$r1 = /^[a-zA-Z0-9_]/;\n  var peg$r2 = /^[^\"]/;\n  var peg$r3 = /^[0-9]/;\n  var peg$r4 = /^[^\\n]/;\n  var peg$r5 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"radar-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"title\", true);\n  var peg$e2 = peg$literalExpectation(\"axis\", true);\n  var peg$e3 = peg$literalExpectation(\",\", false);\n  var peg$e4 = peg$literalExpectation(\"curve\", true);\n  var peg$e5 = peg$literalExpectation(\"{\", false);\n  var peg$e6 = peg$literalExpectation(\"}\", false);\n  var peg$e7 = peg$literalExpectation(\"max\", true);\n  var peg$e8 = peg$literalExpectation(\"min\", true);\n  var peg$e9 = peg$literalExpectation(\"[\", false);\n  var peg$e10 = peg$literalExpectation(\"]\", false);\n  var peg$e11 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e12 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e13 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e14 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e15 = peg$literalExpectation(\"-\", false);\n  var peg$e16 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e17 = peg$literalExpectation(\".\", false);\n  var peg$e18 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e19 = peg$literalExpectation(\"\\r\", false);\n  var peg$e20 = peg$literalExpectation(\"\\n\", false);\n  var peg$e21 = peg$anyExpectation();\n  var peg$e22 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      let title, min, max;\n      const axes = [];\n      const curves = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'axis')  axes.push(...s.items);\n        else if (s.t === 'curve') curves.push({ id: s.id, label: s.label, values: s.values });\n        else if (s.t === 'max')   max = s.v;\n        else if (s.t === 'min')   min = s.v;\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(title ? { title } : {}) },\n        axes,\n        curves,\n        ...(min !== undefined ? { min } : {}),\n        ...(max !== undefined ? { max } : {}),\n      };\n    };\n  var peg$f1 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f2 = function(first, a) { return a; };\n  var peg$f3 = function(first, rest) {\n      return { t: 'axis', items: [first, ...rest] };\n    };\n  var peg$f4 = function(id, label, first, n) { return n; };\n  var peg$f5 = function(id, label, first, rest) {\n      return { t: 'curve', id, label: label != null ? label : id, values: [first, ...rest] };\n    };\n  var peg$f6 = function(n) { return { t: 'max', v: n }; };\n  var peg$f7 = function(n) { return { t: 'min', v: n }; };\n  var peg$f8 = function(id, label) { return { id, label: label != null ? label : id }; };\n  var peg$f9 = function(q) { return q; };\n  var peg$f10 = function(s) { return s.trim(); };\n  var peg$f11 = function(s) { return s; };\n  var peg$f12 = function(n) { return parseFloat(n); };\n  var peg$f13 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 10);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 10;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseStatement();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseStatement();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseAxisLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseCurveLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseMaxLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseMinLine();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c1) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f1(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseAxisDef();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$currPos;\n        s7 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s8 = peg$c3;\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parse_();\n          s10 = peg$parseAxisDef();\n          if (s10 !== peg$FAILED) {\n            peg$savedPos = s6;\n            s6 = peg$f2(s4, s10);\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$currPos;\n          s7 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s8 = peg$c3;\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            s10 = peg$parseAxisDef();\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s6;\n              s6 = peg$f2(s4, s10);\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        }\n        s6 = peg$parse_();\n        s7 = peg$parseLineEnd();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s4, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCurveLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseIdent();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLabelBracket();\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 123) {\n          s7 = peg$c5;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseNum();\n          if (s9 !== peg$FAILED) {\n            s10 = [];\n            s11 = peg$currPos;\n            s12 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s13 = peg$c3;\n              peg$currPos++;\n            } else {\n              s13 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            if (s13 !== peg$FAILED) {\n              s14 = peg$parse_();\n              s15 = peg$parseNum();\n              if (s15 !== peg$FAILED) {\n                peg$savedPos = s11;\n                s11 = peg$f4(s4, s5, s9, s15);\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s11;\n              s11 = peg$FAILED;\n            }\n            while (s11 !== peg$FAILED) {\n              s10.push(s11);\n              s11 = peg$currPos;\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s13 = peg$c3;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parse_();\n                s15 = peg$parseNum();\n                if (s15 !== peg$FAILED) {\n                  peg$savedPos = s11;\n                  s11 = peg$f4(s4, s5, s9, s15);\n                } else {\n                  peg$currPos = s11;\n                  s11 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n            }\n            s11 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 125) {\n              s12 = peg$c6;\n              peg$currPos++;\n            } else {\n              s12 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s12 !== peg$FAILED) {\n              s13 = peg$parse_();\n              s14 = peg$parseLineEnd();\n              if (s14 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f5(s4, s5, s9, s10);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMaxLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c7) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseNum();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f6(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMinLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseNum();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f7(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisDef() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseLabelBracket();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f8(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLabelBracket() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c9;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parseQuoted();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 93) {\n          s5 = peg$c10;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f9(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s1 = peg$c9;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r0.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e11); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e10); }\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f10(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r1.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c11;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c11;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f11(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c12;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r3.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r3.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c13;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r3.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r3.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f12(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r4.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r4.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c14;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c15;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f13();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c14;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c15;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r5.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { RadarDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutRadar } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { RadarDocument, RadarAxis, RadarCurve } from './ir.js';\n\nexport const radar: DiagramModule<RadarDocument> = {\n  parseMermaid(input: string): RadarDocument {\n    return parser.parse(input) as RadarDocument;\n  },\n\n  parseYaml(input: string): RadarDocument {\n    return JSON.parse(input) as RadarDocument;\n  },\n\n  layout(ir: RadarDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutRadar(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/gantt/layout.ts \u2014 Classic Gantt chart.\n *\n * One row per task, grouped under section bands, against a date grid. Bars span\n * start\u2192end on a day-ordinal axis (shared time/dates utilities); status maps to\n * the semantic palette; zero-duration tasks render as milestone diamonds.\n */\n\nimport type { GanttDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { statusColor } from '../timeline/shared.js';\nimport { startOrdinal, inferAxisUnit, enumTicks, formatTickLabel } from '../../../time/dates.js';\nimport { truncateText } from '../../../text/wrap.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutGantt(ir: GanttDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Date range \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const ords: number[] = [];\n  for (const sec of ir.sections) for (const t of sec.tasks) { ords.push(startOrdinal(t.start), startOrdinal(t.end)); }\n  if (ords.length === 0) ords.push(0, 30);\n  const minOrd = Math.min(...ords);\n  const maxOrd = Math.max(...ords);\n  const span   = Math.max(1, maxOrd - minOrd);\n  const unit   = inferAxisUnit(span);\n  const ticks  = enumTicks(minOrd, maxOrd, unit);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const title   = ir.metadata.title;\n  const titleH  = title ? typography.titleFontSize + 18 : 0;\n  const leftColW = 230;\n  const gridLeft = margin + leftColW;\n  const gridW    = 720;\n  const gridRight = gridLeft + gridW;\n  const axisH    = 26;\n  const rowH     = 26;\n  const rowGap   = 4;\n  const secHdrH  = 26;\n\n  const gridTop = margin + titleH + axisH;\n  const dateX = (ord: number): number => rhu(gridLeft + ((ord - minOrd) / span) * gridW);\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Compute total height first (for full-height gridlines) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let rowCount = 0;\n  for (const sec of ir.sections) rowCount += 1 + sec.tasks.length;\n  const bodyH = rowCount * (rowH + rowGap);\n  const gridBottom = gridTop + bodyH;\n\n  // \u2500\u2500 Date gridlines + axis labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ticks.forEach((t, i) => {\n    const x = dateX(t.ordinal);\n    elements.push(p.path(`M ${x} ${gridTop} L ${x} ${gridBottom}`, palette.border, 1, { opacity: 0.4 }));\n    elements.push(p.text(formatTickLabel(t, unit, i), x, margin + titleH + axisH - 8, typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n  });\n  // axis baseline\n  elements.push(p.path(`M ${gridLeft} ${gridTop} L ${gridRight} ${gridTop}`, palette.border, 1.5));\n\n  // \u2500\u2500 Rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let y = gridTop;\n  for (const sec of ir.sections) {\n    // Section header band\n    elements.push(p.rect({ x: margin, y, width: leftColW + gridW, height: secHdrH }, palette.surface, palette.surface, 0));\n    elements.push(p.text(sec.label, margin + 6, y + secHdrH / 2 + typography.baseFontSize * 0.35, typography.baseFontSize, palette.text, { weight: 'bold' }));\n    y += secHdrH + rowGap;\n\n    for (const task of sec.tasks) {\n      const x0 = dateX(startOrdinal(task.start));\n      const color = statusColor(palette, task.status === 'crit' ? 'blocked' : task.status);\n\n      // Task name (left column)\n      elements.push(p.text(truncateText(task.label, typography.smallFontSize, leftColW - 12), margin + 4, y + rowH / 2 + typography.smallFontSize * 0.35, typography.smallFontSize, palette.text));\n\n      if (task.isMilestone) {\n        const cx = x0, cy = y + rowH / 2, r = 8;\n        elements.push(p.path(`M ${cx} ${cy - r} L ${cx + r} ${cy} L ${cx} ${cy + r} L ${cx - r} ${cy} Z`, palette.background, 1.5, { fill: color }));\n      } else {\n        const x1 = dateX(startOrdinal(task.end));\n        const barW = Math.max(4, x1 - x0);\n        elements.push(p.rect({ x: x0, y: y + 4, width: rhu(barW), height: rowH - 8 }, color, color, 0, { rx: 3 }));\n      }\n      y += rowH + rowGap;\n    }\n  }\n\n  const totalW = rhuInt(gridRight + margin);\n  const totalH = rhuInt(gridBottom + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"gantt\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"title\";\n  var peg$c3 = \"dateformat\";\n  var peg$c4 = \"excludes\";\n  var peg$c5 = \"axisformat\";\n  var peg$c6 = \"todaymarker\";\n  var peg$c7 = \"tickinterval\";\n  var peg$c8 = \"section\";\n  var peg$c9 = \":\";\n  var peg$c10 = \"\\r\";\n  var peg$c11 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^:\\n]/;\n  var peg$r2 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"gantt\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"title\", true);\n  var peg$e4 = peg$literalExpectation(\"dateFormat\", true);\n  var peg$e5 = peg$literalExpectation(\"excludes\", true);\n  var peg$e6 = peg$literalExpectation(\"axisFormat\", true);\n  var peg$e7 = peg$literalExpectation(\"todayMarker\", true);\n  var peg$e8 = peg$literalExpectation(\"tickInterval\", true);\n  var peg$e9 = peg$literalExpectation(\"section\", true);\n  var peg$e10 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e11 = peg$literalExpectation(\":\", false);\n  var peg$e12 = peg$literalExpectation(\"\\r\", false);\n  var peg$e13 = peg$literalExpectation(\"\\n\", false);\n  var peg$e14 = peg$anyExpectation();\n  var peg$e15 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, lines) {\n      let title, dateFormat;\n      const sections = [];\n      for (const l of lines.filter(Boolean)) {\n        if      (l.t === 'title')      title = l.v;\n        else if (l.t === 'dateFormat') dateFormat = l.v;\n        else if (l.t === 'section')    sections.push({ label: l.label, tasks: [] });\n        else if (l.t === 'task') {\n          if (sections.length === 0) sections.push({ label: '', tasks: [] });\n          sections[sections.length - 1].tasks.push({ name: l.name, meta: l.meta });\n        }\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(fm || {}), ...(title ? { title } : {}) },\n        dateFormat: dateFormat || 'YYYY-MM-DD',\n        sections,\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(v) { return { t: 'dateFormat', v: v.trim() }; };\n  var peg$f5 = function() { return null; };\n  var peg$f6 = function(label) { return { t: 'section', label: label.trim() }; };\n  var peg$f7 = function(name, meta) { return { t: 'task', name: name.trim(), meta: meta.trim() }; };\n  var peg$f8 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 5);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 5;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseLine();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseLine();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    var s0;\n\n    s0 = peg$parseTitleLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseDateFormatLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseExcludesLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseSectionLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseTaskLine();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDateFormatLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 10);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 10;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExcludesLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 10);\n      if (s2.toLowerCase() === peg$c5) {\n        peg$currPos += 10;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 11);\n        if (s2.toLowerCase() === peg$c6) {\n          peg$currPos += 11;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 12);\n          if (s2.toLowerCase() === peg$c7) {\n            peg$currPos += 12;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSectionLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTaskLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r1.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c9;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f7(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c10;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c11;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f8();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r2.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r2.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r2.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r2.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { GanttDocument, GanttSection, GanttTask, GanttStatus } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutGantt } from './layout.js';\nimport { parseIRDate, coerceLeft, dateToOrdinal, ordinalToDate } from '../../../time/dates.js';\nimport * as parser from './parser.js';\n\nexport type { GanttDocument, GanttSection, GanttTask, GanttStatus } from './ir.js';\n\ninterface RawTask { name: string; meta: string }\ninterface RawSection { label: string; tasks: RawTask[] }\ninterface RawDoc { version: string; metadata: GanttDocument['metadata']; dateFormat: string; sections: RawSection[] }\n\nconst STATUS_FLAGS = new Set(['done', 'active', 'crit', 'milestone']);\n\nfunction isoFromOrdinal(ord: number): string {\n  const [y, m, d] = ordinalToDate(ord);\n  return `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`;\n}\n\nfunction durationDays(token: string): number {\n  const m = token.match(/^(\\d+(?:\\.\\d+)?)\\s*([dwhm]?)/i);\n  if (!m) return 1;\n  const n = parseFloat(m[1]!);\n  switch ((m[2] || 'd').toLowerCase()) {\n    case 'w': return n * 7;\n    case 'h': return Math.max(1, Math.round(n / 24));\n    default:  return n;            // days\n  }\n}\n\nfunction dateOrdinal(date: string): number {\n  try { const [y, m, d] = coerceLeft(parseIRDate(date)); return dateToOrdinal(y, m, d); }\n  catch { return 0; }\n}\n\n/** Resolve one raw task's metadata into a concrete GanttTask. */\nfunction resolveTask(raw: RawTask, endById: Map<string, number>): GanttTask {\n  const tokens = raw.meta.split(',').map(t => t.trim()).filter(Boolean);\n  const flags: string[] = [];\n  const rest: string[] = [];\n  for (const tok of tokens) {\n    if (STATUS_FLAGS.has(tok.toLowerCase())) flags.push(tok.toLowerCase());\n    else rest.push(tok);\n  }\n\n  // rest is [id?, start, duration]; id present when 3+ tokens remain.\n  let id: string | undefined;\n  let startTok: string;\n  let durTok: string;\n  if (rest.length >= 3) { id = rest[0]; startTok = rest[1]!; durTok = rest[2]!; }\n  else                  { startTok = rest[0] ?? ''; durTok = rest[1] ?? '0d'; }\n\n  const startOrd = /^after\\s+/i.test(startTok)\n    ? (endById.get(startTok.replace(/^after\\s+/i, '').trim()) ?? 0)\n    : dateOrdinal(startTok);\n\n  const isMilestone = flags.includes('milestone') || durationDays(durTok) === 0;\n  const endOrd = isMilestone ? startOrd : startOrd + durationDays(durTok);\n  if (id) endById.set(id, endOrd);\n\n  const status: GanttStatus =\n    flags.includes('done')   ? 'done' :\n    flags.includes('active') ? 'active' :\n    flags.includes('crit')   ? 'crit' : 'default';\n\n  return {\n    ...(id ? { id } : {}),\n    label: raw.name,\n    status,\n    start: isoFromOrdinal(startOrd),\n    end: isoFromOrdinal(endOrd),\n    isMilestone,\n  };\n}\n\nexport const gantt: DiagramModule<GanttDocument> = {\n  parseMermaid(input: string): GanttDocument {\n    const raw = parser.parse(input) as RawDoc;\n    const endById = new Map<string, number>();\n    const sections: GanttSection[] = raw.sections.map(sec => ({\n      label: sec.label,\n      tasks: sec.tasks.map(t => resolveTask(t, endById)),\n    }));\n    return { version: raw.version, metadata: raw.metadata, sections };\n  },\n\n  parseYaml(input: string): GanttDocument {\n    return JSON.parse(input) as GanttDocument;\n  },\n\n  layout(ir: GanttDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutGantt(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/journey/layout.ts \u2014 User-journey satisfaction map.\n *\n * Tasks are placed left\u2192right; vertical position encodes the satisfaction\n * score (1 low \u2026 5 high). A path connects consecutive task nodes; section\n * bands span their tasks. Node colour maps the score onto the semantic palette\n * (low \u2192 error, high \u2192 success).\n */\n\nimport type { JourneyDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst SCORE_MIN = 1;\nconst SCORE_MAX = 5;\n\nexport function layoutJourney(ir: JourneyDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const scoreColor = (s: number): string => {\n    if (s <= 1.5) return palette.error;\n    if (s <= 2.5) return palette.warning;\n    if (s <= 3.5) return palette.secondary;\n    if (s <= 4.5) return palette.primary;\n    return palette.success;\n  };\n\n  // Flatten tasks (keep section spans).\n  interface Flat { label: string; score: number; actors: readonly string[]; section: number; }\n  const flat: Flat[] = [];\n  ir.sections.forEach((sec, si) => sec.tasks.forEach(t => flat.push({ label: t.label, score: t.score, actors: t.actors, section: si })));\n  const n = Math.max(flat.length, 1);\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n\n  const sectionBandH = 30;\n  const plotLeft   = margin + 30;\n  const plotTop    = margin + titleH + sectionBandH + 16;\n  const plotH      = 240;\n  const plotBottom = plotTop + plotH;\n  const step       = 150;\n  const plotW      = step * n;\n  const plotRight  = plotLeft + plotW;\n\n  const taskX  = (i: number): number => plotLeft + (i + 0.5) * step;\n  const scoreY = (s: number): number => rhu(plotBottom - ((Math.max(SCORE_MIN, Math.min(SCORE_MAX, s)) - SCORE_MIN) / (SCORE_MAX - SCORE_MIN)) * plotH);\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Satisfaction gridlines (1..5) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (let s = SCORE_MIN; s <= SCORE_MAX; s++) {\n    const y = scoreY(s);\n    elements.push(p.path(`M ${plotLeft} ${y} L ${plotRight} ${y}`, palette.border, 1, { opacity: 0.4 }));\n    elements.push(p.text(String(s), plotLeft - 10, y + typography.smallFontSize * 0.35, typography.smallFontSize, palette.textMuted, { anchor: 'end' }));\n  }\n\n  // \u2500\u2500 Section bands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.sections.forEach((sec, si) => {\n    const idxs = flat.map((f, i) => ({ f, i })).filter(({ f }) => f.section === si).map(({ i }) => i);\n    if (idxs.length === 0) return;\n    const x0 = taskX(idxs[0]!) - step / 2;\n    const x1 = taskX(idxs[idxs.length - 1]!) + step / 2;\n    const hue = categoricalHue(si);\n    elements.push(p.rect({ x: rhu(x0), y: margin + titleH, width: rhu(x1 - x0 - 6), height: sectionBandH }, hue, hue, 0, { rx: 6 }));\n    elements.push(p.text(sec.label, rhuInt((x0 + x1) / 2 - 3), margin + titleH + sectionBandH / 2 + typography.baseFontSize * 0.35, typography.baseFontSize, '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n  });\n\n  // \u2500\u2500 Journey path \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nodePts = flat.map((f, i) => ({ x: rhu(taskX(i)), y: scoreY(f.score) }));\n  if (nodePts.length > 1) {\n    elements.push(p.path(`M ${nodePts.map(pt => `${pt.x} ${pt.y}`).join(' L ')}`, palette.textMuted, 2, { opacity: 0.6 }));\n  }\n\n  // \u2500\u2500 Task nodes + labels + actors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  flat.forEach((f, i) => {\n    const x = rhu(taskX(i)), y = scoreY(f.score);\n    const color = scoreColor(f.score);\n    elements.push(p.circle({ x, y }, 16, color, palette.background, 2));\n    elements.push(p.text(String(f.score), x, y + typography.baseFontSize * 0.35, typography.baseFontSize, '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n    elements.push(p.text(f.label, x, plotBottom + typography.smallFontSize + 10, typography.smallFontSize, palette.text, { anchor: 'middle', weight: 'bold' }));\n    f.actors.forEach((a, ai) => {\n      elements.push(p.text(a, x, plotBottom + typography.smallFontSize + 10 + (ai + 1) * (typography.smallFontSize + 4), typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n    });\n  });\n\n  const maxActors = Math.max(1, ...flat.map(f => f.actors.length));\n  const totalW = rhuInt(plotRight + margin);\n  const totalH = rhuInt(plotBottom + typography.smallFontSize + 10 + (maxActors + 1) * (typography.smallFontSize + 4) + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"journey\";\n  var peg$c1 = \"title\";\n  var peg$c2 = \"section\";\n  var peg$c3 = \":\";\n  var peg$c4 = \",\";\n  var peg$c5 = \"-\";\n  var peg$c6 = \".\";\n  var peg$c7 = \"\\r\";\n  var peg$c8 = \"\\n\";\n\n  var peg$r0 = /^[^:\\n]/;\n  var peg$r1 = /^[^,\\n]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[^\\n]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"journey\", true);\n  var peg$e1 = peg$literalExpectation(\"title\", true);\n  var peg$e2 = peg$literalExpectation(\"section\", true);\n  var peg$e3 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\":\", false);\n  var peg$e5 = peg$literalExpectation(\",\", false);\n  var peg$e6 = peg$classExpectation([\",\", \"\\n\"], true, false);\n  var peg$e7 = peg$literalExpectation(\"-\", false);\n  var peg$e8 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e9 = peg$literalExpectation(\".\", false);\n  var peg$e10 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e11 = peg$literalExpectation(\"\\r\", false);\n  var peg$e12 = peg$literalExpectation(\"\\n\", false);\n  var peg$e13 = peg$anyExpectation();\n  var peg$e14 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      let title;\n      const sections = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'section') sections.push({ label: s.label, tasks: [] });\n        else if (s.t === 'task') {\n          if (sections.length === 0) sections.push({ label: '', tasks: [] });\n          sections[sections.length - 1].tasks.push({ label: s.label, score: s.score, actors: s.actors });\n        }\n      }\n      return { version: '1.0', metadata: { ...(title ? { title } : {}) }, sections };\n    };\n  var peg$f1 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f2 = function(label) { return { t: 'section', label: label.trim() }; };\n  var peg$f3 = function(label, score, actors) {\n      return { t: 'task', label: label.trim(), score, actors };\n    };\n  var peg$f4 = function(first, a) { return a; };\n  var peg$f5 = function(first, rest) { return [first, ...rest].filter(Boolean); };\n  var peg$f6 = function(a) { return a.trim(); };\n  var peg$f7 = function(n) { return parseFloat(n); };\n  var peg$f8 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseStatement();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseStatement();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseSection();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseTask();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseBlankLine();\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c1) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f1(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSection() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f2(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTask() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r0.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r0.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c3;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseNum();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s7 = peg$c3;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e4); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseActors();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$parse_();\n              s11 = peg$parseLineEnd();\n              if (s11 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f3(s2, s5, s9);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseActors() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseActor();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 44) {\n        s5 = peg$c4;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseActor();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f4(s1, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s5 = peg$c4;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseActor();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s3 = peg$f4(s1, s7);\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f5(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseActor() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r1.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f6(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c5;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r2.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r2.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c6;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r2.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f7(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r3.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c7;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c8;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f8();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c7;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c8;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { JourneyDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutJourney } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { JourneyDocument, JourneySection, JourneyTask } from './ir.js';\n\nexport const journey: DiagramModule<JourneyDocument> = {\n  parseMermaid(input: string): JourneyDocument {\n    return parser.parse(input) as JourneyDocument;\n  },\n\n  parseYaml(input: string): JourneyDocument {\n    return JSON.parse(input) as JourneyDocument;\n  },\n\n  layout(ir: JourneyDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutJourney(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/kanban/layout.ts \u2014 Column-of-cards board.\n *\n * Each column is a coloured header (from the categorical hue cycle) above a\n * vertical stack of wrapped card tiles. Columns are laid left\u2192right at a fixed\n * width; the board height follows the tallest column.\n */\n\nimport type { KanbanDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { rhuInt } from '../../../util/round.js';\n\nexport function layoutKanban(ir: KanbanDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const colW       = 210;\n  const colGap     = 18;\n  const headerH    = 38;\n  const cardPad    = 10;\n  const cardGap    = 10;\n  const cardFont   = typography.baseFontSize;\n  const lineH      = rhuInt(cardFont * 1.3);\n  const cardInnerW = colW - cardPad * 2;\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const boardTop = margin + titleH;\n\n  // Pre-wrap cards to compute heights.\n  const columns = ir.columns.map(col => ({\n    label: col.label,\n    cards: col.cards.map(c => {\n      const lines = wrapText(c.text, cardFont, cardInnerW - 2, 3).lines;\n      const h = cardPad * 2 + lines.length * lineH;\n      return { lines, h };\n    }),\n  }));\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  let maxColH = 0;\n  columns.forEach((col, ci) => {\n    const x = margin + ci * (colW + colGap);\n    const hue = categoricalHue(ci);\n\n    // Column header\n    elements.push(p.rect({ x, y: boardTop, width: colW, height: headerH }, hue, hue, 0, { rx: 6 }));\n    elements.push(p.text(`${col.label}  (${col.cards.length})`, rhuInt(x + colW / 2), boardTop + headerH / 2 + cardFont * 0.35, typography.baseFontSize, '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n\n    // Cards\n    let cy = boardTop + headerH + cardGap;\n    for (const card of col.cards) {\n      elements.push(p.rect({ x, y: cy, width: colW, height: card.h }, palette.surface, hue, 1, { rx: 6 }));\n      card.lines.forEach((ln, li) => {\n        elements.push(p.text(ln, x + cardPad, cy + cardPad + (li + 1) * lineH - 4, cardFont, palette.text));\n      });\n      cy += card.h + cardGap;\n    }\n    maxColH = Math.max(maxColH, cy - boardTop);\n  });\n\n  const totalW = rhuInt(margin + columns.length * colW + (columns.length - 1) * colGap + margin);\n  const totalH = rhuInt(boardTop + maxColH + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"kanban\";\n  var peg$c1 = \"[\";\n  var peg$c2 = \"]\";\n  var peg$c3 = \"\\r\";\n  var peg$c4 = \"\\n\";\n\n  var peg$r0 = /^[^\\]\\n]/;\n  var peg$r1 = /^[^\\n]/;\n  var peg$r2 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"kanban\", true);\n  var peg$e1 = peg$literalExpectation(\"[\", false);\n  var peg$e2 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"]\", false);\n  var peg$e4 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e5 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e6 = peg$literalExpectation(\"\\r\", false);\n  var peg$e7 = peg$literalExpectation(\"\\n\", false);\n  var peg$e8 = peg$anyExpectation();\n  var peg$e9 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(rows) {\n      const columns = [];\n      for (const r of rows.filter(Boolean)) {\n        if (r.t === 'col') columns.push({ label: r.label, cards: [] });\n        else if (r.t === 'card') {\n          if (columns.length === 0) columns.push({ label: '', cards: [] });\n          columns[columns.length - 1].cards.push({ ...(r.id ? { id: r.id } : {}), text: r.text });\n        }\n      }\n      return { version: '1.0', metadata: {}, columns };\n    };\n  var peg$f1 = function(id, text) { return { t: 'card', id: id || undefined, text: text.trim() }; };\n  var peg$f2 = function(label) { return { t: 'col', label: label.trim() }; };\n  var peg$f3 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseRow();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseRow();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRow() {\n    var s0;\n\n    s0 = peg$parseCard();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseColumn();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCard() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s3 = peg$c1;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = [];\n      s6 = input.charAt(peg$currPos);\n      if (peg$r0.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s6 !== peg$FAILED) {\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = input.charAt(peg$currPos);\n          if (peg$r0.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n      } else {\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = input.substring(s4, peg$currPos);\n      } else {\n        s4 = s5;\n      }\n      if (s4 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 93) {\n          s5 = peg$c2;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r1.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e4); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r1.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f1(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseColumn() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r1.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f2(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c4;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f3();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { KanbanDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutKanban } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { KanbanDocument, KanbanColumn, KanbanCard } from './ir.js';\n\nexport const kanban: DiagramModule<KanbanDocument> = {\n  parseMermaid(input: string): KanbanDocument {\n    return parser.parse(input) as KanbanDocument;\n  },\n\n  parseYaml(input: string): KanbanDocument {\n    return JSON.parse(input) as KanbanDocument;\n  },\n\n  layout(ir: KanbanDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutKanban(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/sequence/layout.ts \u2014 UML sequence diagram.\n *\n * Participants become equally-spaced columns with dashed lifelines. Events are\n * walked top\u2192down assigning rows: messages draw arrows (with autonumber, self\n * loops, activation bars), fragments draw labeled boxes with else dividers, and\n * notes draw boxes over participants. Deterministic; no clock.\n */\n\nimport type { SequenceDocument, SeqMessage, SeqNote } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'seq-arrow';\nconst OPEN_ID  = 'seq-open';\n\nexport function layoutSequence(ir: SequenceDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const parts = ir.participants;\n  const idx = new Map(parts.map((pt, i) => [pt.id, i]));\n\n  // \u2500\u2500 Column geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const headFont = typography.baseFontSize;\n  const headPadX = 14;\n  const headH    = 34;\n  const colW = Math.max(110, ...parts.map(pt => measureText(pt.label, headFont).width + headPadX * 2 + (pt.isActor ? 8 : 0)));\n  const colGap = 60;\n  const colPitch = colW + colGap;\n  const colX = (i: number): number => margin + i * colPitch + colW / 2;\n  const partX = (id: string): number => colX(idx.get(id) ?? 0);\n\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const headTop = margin + titleH;\n  const bodyTop = headTop + headH + 26;\n  const rowGap  = 46;\n\n  const elements: SceneElement[] = [];\n  const lifelineEls: SceneElement[] = [];\n\n  if (ir.metadata.title) {\n    elements.push(p.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Walk events to assign rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  interface Frag { type: string; label: string; top: number; left: number; right: number; elses: Array<{ y: number; label: string }>; }\n  const fragStack: Frag[] = [];\n  const fragBoxes: Frag[] = [];\n  const activations = new Map<string, number[]>();  // id \u2192 stack of start-Y\n  const actBars: Array<{ x: number; y0: number; y1: number }> = [];\n\n  let y = bodyTop;\n  let msgNo = 0;\n  const minX = colX(0);\n  const maxX = colX(Math.max(parts.length - 1, 0));\n\n  const pushAct = (id: string): void => { (activations.get(id) ?? activations.set(id, []).get(id)!).push(y); };\n  const popAct  = (id: string): void => {\n    const st = activations.get(id);\n    if (st && st.length) { const y0 = st.pop()!; actBars.push({ x: partX(id), y0, y1: y }); }\n  };\n\n  for (const ev of ir.events) {\n    if (ev.kind === 'message') {\n      const m = ev as SeqMessage;\n      const x1 = partX(m.from), x2 = partX(m.to);\n      const self = m.from === m.to;\n      const label = ir.autonumber ? `${++msgNo}. ${m.text}` : m.text;\n      const dash = m.line === 'dashed' ? '5 4' : undefined;\n      const markerEnd = m.head === 'arrow' ? ARROW_ID : (m.head === 'open' || m.head === 'async') ? OPEN_ID : undefined;\n\n      if (m.activateTarget) pushAct(m.to);\n\n      if (self) {\n        const r = 26;\n        elements.push(p.text(label, x1 + 12, y - 6, typography.smallFontSize, palette.text));\n        elements.push(p.path(`M ${x1} ${rhu(y)} L ${x1 + r} ${rhu(y)} L ${x1 + r} ${rhu(y + 22)} L ${x1} ${rhu(y + 22)}`, palette.text, 1.3, { ...(dash ? { dash } : {}), ...(markerEnd ? { markerEnd } : {}) }));\n        y += 22 + rowGap;\n      } else {\n        const dir = x2 >= x1 ? 1 : -1;\n        elements.push(p.text(label, rhuInt((x1 + x2) / 2), y - 7, typography.smallFontSize, palette.text, { anchor: 'middle' }));\n        if (m.head === 'cross') {\n          elements.push(p.path(`M ${rhu(x1)} ${rhu(y)} L ${rhu(x2 - dir * 6)} ${rhu(y)}`, palette.text, 1.3, dash ? { dash } : {}));\n          const cxp = x2 - dir * 6;\n          elements.push(p.path(`M ${rhu(cxp - 5)} ${rhu(y - 5)} L ${rhu(cxp + 5)} ${rhu(y + 5)} M ${rhu(cxp - 5)} ${rhu(y + 5)} L ${rhu(cxp + 5)} ${rhu(y - 5)}`, palette.text, 1.5));\n        } else {\n          elements.push(p.path(`M ${rhu(x1)} ${rhu(y)} L ${rhu(x2)} ${rhu(y)}`, palette.text, 1.3, { ...(dash ? { dash } : {}), ...(markerEnd ? { markerEnd } : {}) }));\n        }\n        y += rowGap;\n      }\n\n      if (m.deactivateSource) popAct(m.from);\n    } else if (ev.kind === 'note') {\n      const note = ev as SeqNote;\n      const xs = note.participants.map(partX);\n      const c = xs.reduce((s, v) => s + v, 0) / xs.length;\n      const w = Math.max(measureText(note.text, typography.smallFontSize).width + 24, (Math.max(...xs) - Math.min(...xs)) + colW * 0.8);\n      const nx = rhu(c - w / 2);\n      elements.push(p.rect({ x: nx, y: rhu(y - 6), width: rhu(w), height: 30 }, palette.warning + '22', palette.warning, 1, { rx: 4 }));\n      elements.push(p.text(note.text, rhuInt(c), y + 13, typography.smallFontSize, palette.text, { anchor: 'middle' }));\n      y += 30 + rowGap - 10;\n    } else if (ev.kind === 'frag-start') {\n      fragStack.push({ type: ev.type, label: ev.label, top: y - 24, left: minX, right: maxX, elses: [] });\n      y += 14;\n    } else if (ev.kind === 'frag-else') {\n      const f = fragStack[fragStack.length - 1];\n      if (f) f.elses.push({ y: y - 18, label: ev.label });\n      y += 10;\n    } else if (ev.kind === 'frag-end') {\n      const f = fragStack.pop();\n      if (f) { f.right = maxX; fragBoxes.push({ ...f, top: f.top, left: minX - colW / 2 - 16, right: maxX + colW / 2 + 16 }); }\n      y += 6;\n    }\n  }\n  // Close any unclosed activations.\n  for (const [id, st] of activations) while (st.length) { const y0 = st.pop()!; actBars.push({ x: partX(id), y0, y1: y }); }\n\n  const bodyBottom = y + 6;\n\n  // \u2500\u2500 Fragment boxes (behind messages) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const fragEls: SceneElement[] = [];\n  for (const f of fragBoxes) {\n    const top = f.top, left = f.left, right = f.right;\n    fragEls.push(p.rect({ x: rhu(left), y: rhu(top), width: rhu(right - left), height: rhu(bodyBottom - top) }, 'none', palette.border, 1.2, { rx: 4 }));\n    // label tab\n    const tabW = measureText(f.type.toUpperCase(), typography.smallFontSize).width + 16;\n    fragEls.push(p.rect({ x: rhu(left), y: rhu(top), width: rhu(tabW), height: 18 }, palette.border, palette.border, 0));\n    fragEls.push(p.text(f.type.toUpperCase(), rhu(left + 8), rhu(top + 13), typography.smallFontSize, palette.background, { weight: 'bold' }));\n    if (f.label) fragEls.push(p.text(`[${f.label}]`, rhu(left + tabW + 8), rhu(top + 13), typography.smallFontSize, palette.text, { weight: 'bold' }));\n    for (const e of f.elses) {\n      fragEls.push(p.path(`M ${rhu(left)} ${rhu(e.y)} L ${rhu(right)} ${rhu(e.y)}`, palette.border, 1, { dash: '4 3' }));\n      if (e.label) fragEls.push(p.text(`[${e.label}]`, rhu(left + 8), rhu(e.y + 13), typography.smallFontSize, palette.text));\n    }\n  }\n\n  // \u2500\u2500 Activation bars \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const actEls: SceneElement[] = actBars.map(b =>\n    p.rect({ x: rhu(b.x - 5), y: rhu(b.y0), width: 10, height: rhu(Math.max(8, b.y1 - b.y0)) }, palette.surface, palette.primary, 1, { rx: 1 }));\n\n  // \u2500\u2500 Lifelines + participant headers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  parts.forEach((pt, i) => {\n    const x = colX(i);\n    lifelineEls.push(p.path(`M ${rhu(x)} ${rhu(headTop + headH)} L ${rhu(x)} ${rhu(bodyBottom)}`, palette.border, 1, { dash: '3 4' }));\n    const hx = rhu(x - colW / 2);\n    const fill = pt.isActor ? palette.primary : palette.surface;\n    const txtFill = pt.isActor ? '#FFFFFF' : palette.text;\n    elements.push(p.rect({ x: hx, y: rhu(headTop), width: rhu(colW), height: headH }, fill, palette.border, 1.2, { rx: 6 }));\n    elements.push(p.text(pt.label, rhuInt(x), headTop + headH / 2 + headFont * 0.35, headFont, txtFill, { weight: 'bold', anchor: 'middle' }));\n  });\n\n  // Paint order: lifelines, fragments, activation bars, then messages/headers (already in elements).\n  const ordered: SceneElement[] = [...lifelineEls, ...fragEls, ...actEls, ...elements];\n\n  const totalW = rhuInt(maxX + colW / 2 + margin);\n  const totalH = rhuInt(bodyBottom + margin);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><polygon points=\"0 0, 10 4, 0 8\" fill=\"${palette.text}\" /></marker>`,\n    `<marker id=\"${OPEN_ID}\" markerWidth=\"11\" markerHeight=\"9\" refX=\"9\" refY=\"4.5\" orient=\"auto\"><polyline points=\"0 0, 10 4.5, 0 9\" fill=\"none\" stroke=\"${palette.text}\" stroke-width=\"1.3\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements: ordered,\n    defs,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function arrowStyle(a) {\n    const line = a.startsWith('--') ? 'dashed' : 'solid';\n    let head = 'open';\n    if (a.endsWith('x')) head = 'cross';\n    else if (a.endsWith(')')) head = 'async';\n    else if (a.endsWith('>>')) head = 'arrow';\n    else if (a.endsWith('>')) head = 'open';\n    return { line, head };\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"sequencediagram\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"autonumber\";\n  var peg$c3 = \"participant\";\n  var peg$c4 = \"actor\";\n  var peg$c5 = \"as\";\n  var peg$c6 = \"note\";\n  var peg$c7 = \":\";\n  var peg$c8 = \"over\";\n  var peg$c9 = \"left of\";\n  var peg$c10 = \"right of\";\n  var peg$c11 = \",\";\n  var peg$c12 = \"alt\";\n  var peg$c13 = \"opt\";\n  var peg$c14 = \"loop\";\n  var peg$c15 = \"par\";\n  var peg$c16 = \"critical\";\n  var peg$c17 = \"break\";\n  var peg$c18 = \"else\";\n  var peg$c19 = \"and\";\n  var peg$c20 = \"end\";\n  var peg$c21 = \"activate\";\n  var peg$c22 = \"deactivate\";\n  var peg$c23 = \"-->>\";\n  var peg$c24 = \"->>\";\n  var peg$c25 = \"--x\";\n  var peg$c26 = \"-x\";\n  var peg$c27 = \"--)\";\n  var peg$c28 = \"-)\";\n  var peg$c29 = \"-->\";\n  var peg$c30 = \"->\";\n  var peg$c31 = \"\\r\";\n  var peg$c32 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[+\\-]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"sequenceDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"autonumber\", true);\n  var peg$e4 = peg$literalExpectation(\"participant\", true);\n  var peg$e5 = peg$literalExpectation(\"actor\", true);\n  var peg$e6 = peg$literalExpectation(\"as\", true);\n  var peg$e7 = peg$literalExpectation(\"Note\", true);\n  var peg$e8 = peg$literalExpectation(\":\", false);\n  var peg$e9 = peg$literalExpectation(\"over\", true);\n  var peg$e10 = peg$literalExpectation(\"left of\", true);\n  var peg$e11 = peg$literalExpectation(\"right of\", true);\n  var peg$e12 = peg$literalExpectation(\",\", false);\n  var peg$e13 = peg$literalExpectation(\"alt\", true);\n  var peg$e14 = peg$literalExpectation(\"opt\", true);\n  var peg$e15 = peg$literalExpectation(\"loop\", true);\n  var peg$e16 = peg$literalExpectation(\"par\", true);\n  var peg$e17 = peg$literalExpectation(\"critical\", true);\n  var peg$e18 = peg$literalExpectation(\"break\", true);\n  var peg$e19 = peg$literalExpectation(\"else\", true);\n  var peg$e20 = peg$literalExpectation(\"and\", true);\n  var peg$e21 = peg$literalExpectation(\"end\", true);\n  var peg$e22 = peg$literalExpectation(\"activate\", true);\n  var peg$e23 = peg$literalExpectation(\"deactivate\", true);\n  var peg$e24 = peg$classExpectation([\"+\", \"-\"], false, false);\n  var peg$e25 = peg$literalExpectation(\"-->>\", false);\n  var peg$e26 = peg$literalExpectation(\"->>\", false);\n  var peg$e27 = peg$literalExpectation(\"--x\", false);\n  var peg$e28 = peg$literalExpectation(\"-x\", false);\n  var peg$e29 = peg$literalExpectation(\"--)\", false);\n  var peg$e30 = peg$literalExpectation(\"-)\", false);\n  var peg$e31 = peg$literalExpectation(\"-->\", false);\n  var peg$e32 = peg$literalExpectation(\"->\", false);\n  var peg$e33 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e34 = peg$literalExpectation(\"\\r\", false);\n  var peg$e35 = peg$literalExpectation(\"\\n\", false);\n  var peg$e36 = peg$anyExpectation();\n  var peg$e37 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const participants = [];\n      const events = [];\n      let autonumber = false;\n      const ensure = (id, label, isActor) => {\n        let pp = participants.find(x => x.id === id);\n        if (!pp) { pp = { id, label: label || id, isActor: !!isActor }; participants.push(pp); }\n        else if (label) pp.label = label;\n        return pp;\n      };\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'autonumber') autonumber = true;\n        else if (s.t === 'participant') ensure(s.id, s.label, s.isActor);\n        else if (s.t === 'message') { ensure(s.from); ensure(s.to); events.push(s.ev); }\n        else if (s.t === 'note') { for (const id of s.ev.participants) ensure(id); events.push(s.ev); }\n        else if (s.t === 'event') events.push(s.ev);\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, participants, events, autonumber };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; }\n      return meta;\n    };\n  var peg$f3 = function() { return { t: 'autonumber' }; };\n  var peg$f4 = function(kw, id, l) { return l.trim(); };\n  var peg$f5 = function(kw, id, label) {\n      return { t: 'participant', id, label: label || undefined, isActor: kw.toLowerCase() === 'actor' };\n    };\n  var peg$f6 = function(placement, ids, text) {\n      return { t: 'note', ev: { kind: 'note', placement, participants: ids, text: text.trim() } };\n    };\n  var peg$f7 = function() { return 'over'; };\n  var peg$f8 = function() { return 'left'; };\n  var peg$f9 = function() { return 'right'; };\n  var peg$f10 = function(first, i) { return i; };\n  var peg$f11 = function(first, rest) { return [first, ...rest]; };\n  var peg$f12 = function(type, l) { return l.trim(); };\n  var peg$f13 = function(type, label) {\n      return { t: 'event', ev: { kind: 'frag-start', type: type.toLowerCase(), label: label || '' } };\n    };\n  var peg$f14 = function(l) { return l.trim(); };\n  var peg$f15 = function(label) {\n      return { t: 'event', ev: { kind: 'frag-else', label: label || '' } };\n    };\n  var peg$f16 = function() { return { t: 'event', ev: { kind: 'frag-end' } }; };\n  var peg$f17 = function() {\n      // Explicit activate/deactivate statements are ignored; inline +/- is used.\n      return { t: 'ignore' };\n    };\n  var peg$f18 = function(from, arrow, act, to, text) {\n      const { line, head } = arrowStyle(arrow);\n      return { t: 'message', from, to, ev: {\n        kind: 'message', from, to, text: text.trim(), line, head,\n        ...(act === '+' ? { activateTarget: true } : {}),\n        ...(act === '-' ? { deactivateSource: true } : {}),\n      } };\n    };\n  var peg$f19 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 15);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 15;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseAutoNumber();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseParticipantDecl();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseNoteStmt();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseFragEnd();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseFragElse();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseFragStart();\n              if (s0 === peg$FAILED) {\n                s0 = peg$parseActivateStmt();\n                if (s0 === peg$FAILED) {\n                  s0 = peg$parseMessage();\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$parseBlankLine();\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAutoNumber() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 10);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 10;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        s6 = [];\n        s7 = input.charAt(peg$currPos);\n        if (peg$r0.test(s7)) {\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n        s5 = input.substring(s5, peg$currPos);\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseParticipantDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 11);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 11;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 5);\n      if (s2.toLowerCase() === peg$c4) {\n        peg$currPos += 5;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          s7 = input.substr(peg$currPos, 2);\n          if (s7.toLowerCase() === peg$c5) {\n            peg$currPos += 2;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse__();\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parseRestOfLine();\n              if (s9 !== peg$FAILED) {\n                peg$savedPos = s5;\n                s5 = peg$f4(s2, s4, s9);\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s2, s4, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteStmt() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c6) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseNotePlacement();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNoteIds();\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s8 = peg$c7;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parse_();\n                s10 = peg$parseRestOfLine();\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseLineEnd();\n                  if (s11 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f6(s4, s6, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNotePlacement() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.substr(peg$currPos, 4);\n    if (s1.toLowerCase() === peg$c8) {\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f7();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = input.substr(peg$currPos, 7);\n      if (s1.toLowerCase() === peg$c9) {\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f8();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = input.substr(peg$currPos, 8);\n        if (s1.toLowerCase() === peg$c10) {\n          peg$currPos += 8;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f9();\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteIds() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 44) {\n        s5 = peg$c11;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseIdent();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f10(s1, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s5 = peg$c11;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseIdent();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s3 = peg$f10(s1, s7);\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f11(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFragStart() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c12) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 3);\n      if (s2.toLowerCase() === peg$c13) {\n        peg$currPos += 3;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 4);\n        if (s2.toLowerCase() === peg$c14) {\n          peg$currPos += 4;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 3);\n          if (s2.toLowerCase() === peg$c15) {\n            peg$currPos += 3;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          if (s2 === peg$FAILED) {\n            s2 = input.substr(peg$currPos, 8);\n            if (s2.toLowerCase() === peg$c16) {\n              peg$currPos += 8;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e17); }\n            }\n            if (s2 === peg$FAILED) {\n              s2 = input.substr(peg$currPos, 5);\n              if (s2.toLowerCase() === peg$c17) {\n                peg$currPos += 5;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e18); }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseRestOfLine();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f12(s2, s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFragElse() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c18) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 3);\n      if (s2.toLowerCase() === peg$c19) {\n        peg$currPos += 3;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseRestOfLine();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f14(s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f15(s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFragEnd() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c20) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f16();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseActivateStmt() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c21) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 10);\n      if (s2.toLowerCase() === peg$c22) {\n        peg$currPos += 10;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f17();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMessage() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseArrow();\n      if (s4 !== peg$FAILED) {\n        s5 = input.charAt(peg$currPos);\n        if (peg$r1.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parse_();\n        s7 = peg$parseIdent();\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s9 = peg$c7;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseRestOfLine();\n            if (s11 !== peg$FAILED) {\n              s12 = peg$parseLineEnd();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f18(s2, s4, s5, s7, s11);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c23) {\n      s1 = peg$c23;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c24) {\n        s1 = peg$c24;\n        peg$currPos += 3;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 3) === peg$c25) {\n          s1 = peg$c25;\n          peg$currPos += 3;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e27); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c26) {\n            s1 = peg$c26;\n            peg$currPos += 2;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e28); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c27) {\n              s1 = peg$c27;\n              peg$currPos += 3;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e29); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c28) {\n                s1 = peg$c28;\n                peg$currPos += 2;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e30); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 3) === peg$c29) {\n                  s1 = peg$c29;\n                  peg$currPos += 3;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e31); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 2) === peg$c30) {\n                    s1 = peg$c30;\n                    peg$currPos += 2;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e32); }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e33); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c31;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c32;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f19();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c31;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c32;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c31;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c32;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e36); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e37); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e37); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { SequenceDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutSequence } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { SequenceDocument, SeqParticipant, SeqMessage, SeqNote, SeqEvent } from './ir.js';\n\nexport const sequence: DiagramModule<SequenceDocument> = {\n  parseMermaid(input: string): SequenceDocument {\n    return parser.parse(input) as SequenceDocument;\n  },\n\n  parseYaml(input: string): SequenceDocument {\n    return JSON.parse(input) as SequenceDocument;\n  },\n\n  layout(ir: SequenceDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutSequence(ir, theme);\n  },\n};\n", "/**\n * @file graph/connect.ts \u2014 Edge endpoint helpers for node-link layouts.\n */\n\nexport interface BoxLike {\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\n/**\n * The point on a box's border along the ray from its centre toward (tx, ty).\n * Used to clip connector lines to node boundaries.\n */\nexport function borderPoint(box: BoxLike, tx: number, ty: number): { x: number; y: number } {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  const dx = tx - cx;\n  const dy = ty - cy;\n  if (dx === 0 && dy === 0) return { x: cx, y: cy };\n  const hw = box.width / 2;\n  const hh = box.height / 2;\n  const scale = 1 / Math.max(Math.abs(dx) / hw, Math.abs(dy) / hh);\n  return { x: cx + dx * scale, y: cy + dy * scale };\n}\n\nexport type Side = 'left' | 'right' | 'top' | 'bottom';\n\n/** The midpoint of one side of a box \u2014 an explicit anchor for slot pointers. */\nexport function slotAnchor(box: BoxLike, side: Side): { x: number; y: number } {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  switch (side) {\n    case 'left':   return { x: box.x, y: cy };\n    case 'right':  return { x: box.x + box.width, y: cy };\n    case 'top':    return { x: cx, y: box.y };\n    case 'bottom': return { x: cx, y: box.y + box.height };\n  }\n}\n\n/**\n * A slot-aware connector: clips both ends to the box borders along the line\n * joining their centres. Works for cells in a strip, nodes in a tree, or\n * panels in a poster (the same router the cross-link feature uses).\n */\nexport function connectSlots(from: BoxLike, to: BoxLike): {\n  start: { x: number; y: number };\n  end: { x: number; y: number };\n} {\n  const fc = { x: from.x + from.width / 2, y: from.y + from.height / 2 };\n  const tc = { x: to.x + to.width / 2, y: to.y + to.height / 2 };\n  return {\n    start: borderPoint(from, tc.x, tc.y),\n    end:   borderPoint(to, fc.x, fc.y),\n  };\n}\n", "/**\n * @file graph/layered.ts \u2014 Sugiyama layered graph placement kernel.\n *\n * Implements the full Sugiyama framework, with Phase 3 and Phase 4 ported\n * faithfully from dagre (https://github.com/dagrejs/dagre):\n *   1. Longest-path layer assignment\n *   2a. DFS back-edge detection (proper cycle identification)\n *   2b. Dummy node insertion for skip edges (spans > 1 layer)\n *   3. Dagre-faithful crossing minimisation \u2014 DFS initOrder, bi-directional\n *      barycenter sweeps with biasRight, dagre's sort() with unsortable-node\n *      interleaving, BIT-based cross-count feedback loop; keeps best ordering seen\n *   4. Dagre-faithful Brandes\u2013K\u00F6pf coordinate assignment \u2014 type-1 conflict\n *      detection, vertical alignment with NO isDummy guard (real\u2194dummy blocks),\n *      horizontal compaction (block graph, two-pass), 4 sweep directions,\n *      smallest-width selection, balance; plus our obstacle-aware dummy snap\n *   5. Dummy node removal + bend point extraction (edgeBends on LayeredResult)\n *\n * Shared by the node-link / UML diagram layouts (class, state, er, c4,\n * architecture, requirement, ds) so they all inherit crossing minimisation\n * and improved coordinate assignment automatically. Edge routing is left to\n * callers (they connect the returned boxes via the routing module).\n *\n * Deterministic: stable insertion order within a layer, no clock, no randomness.\n * Termination guaranteed: crossing-min loop exits after 4 non-improving sweeps.\n */\n\nimport { orthogonalRouter } from '../routing/router.js';\nimport { borderPoint } from './connect.js';\nimport type { Rect, PortDirection } from '../contracts/index.js';\n\nexport interface GraphNode {\n  readonly id: string;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface GraphEdge {\n  readonly from: string;\n  readonly to: string;\n}\n\n/** Internal dummy node inserted for skip edges (spans > 1 layer). */\ninterface DummyNode extends GraphNode {\n  readonly isDummy: true;\n  readonly originalEdgeIndex: number;\n  readonly segmentIndex: number;\n}\n\nfunction makeDummy(edgeIdx: number, segIdx: number): DummyNode {\n  return { id: `__dummy_${edgeIdx}_${segIdx}`, width: 0, height: 0, isDummy: true, originalEdgeIndex: edgeIdx, segmentIndex: segIdx };\n}\n\nexport interface NodeBox {\n  readonly id: string;\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface LayeredOptions {\n  /** Primary flow direction. 'TB' stacks layers top\u2192bottom; 'LR' left\u2192right. */\n  readonly direction?: 'TB' | 'LR';\n  /** Gap between consecutive layers (px). */\n  readonly layerGap?: number;\n  /** Gap between sibling nodes within a layer (px). */\n  readonly nodeGap?: number;\n  /** Outer margin (px). */\n  readonly margin?: number;\n}\n\nexport interface LayeredResult {\n  readonly boxes: Map<string, NodeBox>;\n  readonly width: number;\n  readonly height: number;\n  /** Bend points for original skip edges (those that spanned > 1 layer).\n   *  Key = index into the original `edges` array passed to `layeredLayout`.\n   *  Value = ordered list of bend points in layout coordinates (no yOff applied). */\n  readonly edgeBends: Map<number, Array<{ x: number; y: number }>>;\n  /**\n   * Per-dummy node x values from each of the 4 BK sweeps, BEFORE balance.\n   * Key = dummy node id. Value = [ul_x, ur_x, dl_x, dr_x].\n   * Only populated for dummy nodes that belong to skip-edge chains.\n   * Used by the skip-routing optimizer in layout.ts as seed candidates.\n   */\n  readonly dummySweepXs: Map<string, number[]>;\n  /**\n   * Map from original edge index \u2192 ordered dummy node ids forming the skip chain.\n   * Empty for direct (non-skip) edges.\n   */\n  readonly dummyChainIds: Map<number, string[]>;\n}\n\n// \u2500\u2500\u2500 Phase 1: Layer Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Assign each node a layer via longest-path; cycles are broken by a pass cap. */\nfunction assignLayers(nodes: readonly GraphNode[], edges: readonly GraphEdge[]): Map<string, number> {\n  const layer = new Map<string, number>();\n  for (const n of nodes) layer.set(n.id, 0);\n  const present = (id: string): boolean => layer.has(id);\n  // Relax edges up to N passes (caps cycles).\n  for (let pass = 0; pass < nodes.length; pass++) {\n    let changed = false;\n    for (const e of edges) {\n      if (!present(e.from) || !present(e.to)) continue;\n      const want = layer.get(e.from)! + 1;\n      if (layer.get(e.to)! < want) { layer.set(e.to, want); changed = true; }\n    }\n    if (!changed) break;\n  }\n  return layer;\n}\n\n// \u2500\u2500\u2500 Phase 2a: DFS Back-Edge Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Identify back-edges using DFS: an edge u\u2192v is a back-edge when v is already\n * on the DFS stack (i.e. v is an ancestor of u). This correctly handles cycles\n * regardless of layer assignment, and correctly classifies self-loops (u\u2192u).\n *\n * Uses an iterative DFS to avoid call-stack overflow on deep graphs.\n * Returns a set of indices into `edges`.\n */\nfunction detectBackEdges(\n  nodes: readonly GraphNode[],\n  edges: readonly GraphEdge[],\n): Set<number> {\n  // Build adjacency list: node id \u2192 [{to, edgeIdx}]\n  const adj = new Map<string, Array<{ to: string; edgeIdx: number }>>();\n  for (const n of nodes) adj.set(n.id, []);\n  edges.forEach((e, i) => {\n    const list = adj.get(e.from);\n    if (list) list.push({ to: e.to, edgeIdx: i });\n  });\n\n  const visited = new Set<string>();\n  const onStack = new Set<string>();\n  const backEdges = new Set<number>();\n\n  for (const startNode of nodes) {\n    if (visited.has(startNode.id)) continue;\n\n    // Iterative DFS: each stack frame tracks [nodeId, neighborIndex].\n    const stack: Array<{ id: string; adjIdx: number }> = [];\n    visited.add(startNode.id);\n    onStack.add(startNode.id);\n    stack.push({ id: startNode.id, adjIdx: 0 });\n\n    while (stack.length > 0) {\n      const frame = stack[stack.length - 1]!;\n      const neighbors = adj.get(frame.id) ?? [];\n\n      if (frame.adjIdx >= neighbors.length) {\n        onStack.delete(frame.id);\n        stack.pop();\n      } else {\n        const { to, edgeIdx } = neighbors[frame.adjIdx]!;\n        frame.adjIdx++;\n\n        if (onStack.has(to)) {\n          backEdges.add(edgeIdx); // back edge (cycle or self-loop)\n        } else if (!visited.has(to)) {\n          visited.add(to);\n          onStack.add(to);\n          stack.push({ id: to, adjIdx: 0 });\n        }\n      }\n    }\n  }\n\n  return backEdges;\n}\n\n// \u2500\u2500\u2500 Phase 2b: Dummy Node Insertion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * For every forward edge u\u2192v spanning more than 1 layer, replace it with a\n * chain of virtual edges through dummy nodes inserted at each intermediate layer.\n *\n * Back edges are kept as-is (they are not expanded).\n *\n * Returns:\n *  - newNodes: original nodes + all dummy nodes\n *  - newEdges: replacement edge array (back edges preserved, skip edges replaced\n *    by chains of adjacent-layer segment edges)\n *  - newBackEdgeSet: back-edge indices in the newEdges array\n *  - dummyChains: original edge index \u2192 ordered list of dummy node ids\n *\n * The caller-supplied `layer` Map is mutated to include dummy node layer entries.\n */\nfunction insertDummyNodes(\n  nodes: readonly GraphNode[],\n  edges: readonly GraphEdge[],\n  layer: Map<string, number>,\n  backEdgeSet: Set<number>,\n): {\n  newNodes: GraphNode[];\n  newEdges: GraphEdge[];\n  newBackEdgeSet: Set<number>;\n  dummyChains: Map<number, string[]>;\n} {\n  const newNodes: GraphNode[] = [...nodes];\n  const newEdges: GraphEdge[] = [];\n  const newBackEdgeSet = new Set<number>();\n  const dummyChains = new Map<number, string[]>();\n\n  for (let i = 0; i < edges.length; i++) {\n    const e = edges[i]!;\n\n    if (backEdgeSet.has(i)) {\n      // Keep back edges as-is, recording new index.\n      newBackEdgeSet.add(newEdges.length);\n      newEdges.push(e);\n      continue;\n    }\n\n    const lu = layer.get(e.from) ?? 0;\n    const lv = layer.get(e.to)   ?? 0;\n    const span = lv - lu;\n\n    if (span <= 1) {\n      // Adjacent-layer or same-layer forward edge: no expansion needed.\n      newEdges.push(e);\n      continue;\n    }\n\n    // Skip edge: create (span-1) dummy nodes at layers lu+1 \u2026 lv-1.\n    const dummies: string[] = [];\n    for (let seg = 0; seg < span - 1; seg++) {\n      const d = makeDummy(i, seg);\n      newNodes.push(d);\n      layer.set(d.id, lu + 1 + seg);\n      dummies.push(d.id);\n    }\n    dummyChains.set(i, dummies);\n\n    // Replace original edge with a chain: u \u2192 d0 \u2192 d1 \u2192 \u2026 \u2192 v\n    const chain = [e.from, ...dummies, e.to];\n    for (let s = 0; s < chain.length - 1; s++) {\n      newEdges.push({ from: chain[s]!, to: chain[s + 1]! });\n    }\n  }\n\n  return { newNodes, newEdges, newBackEdgeSet, dummyChains };\n}\n\n// \u2500\u2500\u2500 Phase 3 Helper: BIT-Based Crossing Count \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Count weighted edge crossings across all adjacent layer pairs.\n * Uses the O(E log N) BIT algorithm from Barth et al., \"Bilayer Cross Counting.\"\n * All edge weights are uniform (1). Back-edges and self-loops are excluded.\n */\nfunction crossCount(\n  byLayer: Map<number, GraphNode[]>,\n  edges: readonly GraphEdge[],\n  backEdgeSet: Set<number>,\n): number {\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n\n  const succList = new Map<string, string[]>();\n  for (const [, ns] of byLayer) for (const n of ns) succList.set(n.id, []);\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    succList.get(e.from)?.push(e.to);\n  });\n\n  let cc = 0;\n  for (let i = 1; i < layerKeys.length; i++) {\n    cc += bilayerCrossCount(\n      byLayer.get(layerKeys[i - 1]!)!,\n      byLayer.get(layerKeys[i]!)!,\n      succList,\n    );\n  }\n  return cc;\n}\n\nfunction bilayerCrossCount(\n  northLayer: GraphNode[],\n  southLayer: GraphNode[],\n  succList: Map<string, string[]>,\n): number {\n  if (southLayer.length === 0) return 0;\n\n  const southPos = new Map<string, number>();\n  southLayer.forEach((n, i) => southPos.set(n.id, i));\n\n  const positions: number[] = northLayer.flatMap(n =>\n    (succList.get(n.id) ?? [])\n      .filter(sid => southPos.has(sid))\n      .map(sid => southPos.get(sid)!)\n      .sort((a, b) => a - b),\n  );\n  if (positions.length === 0) return 0;\n\n  let firstIndex = 1;\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\n  const treeSize = 2 * firstIndex - 1;\n  firstIndex    -= 1;\n  const tree = new Array<number>(treeSize).fill(0);\n\n  let cc = 0;\n  for (const pos of positions) {\n    let idx = pos + firstIndex;\n    tree[idx] = (tree[idx] ?? 0) + 1;\n    let weightSum = 0;\n    while (idx > 0) {\n      if (idx % 2 === 1) weightSum += tree[idx + 1]!;\n      idx = (idx - 1) >> 1;\n      tree[idx] = (tree[idx] ?? 0) + 1;\n    }\n    cc += weightSum;\n  }\n  return cc;\n}\n\n// \u2500\u2500\u2500 Phase 3: Barycentric Crossing Minimisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Reorder nodes within each layer to reduce edge crossings (Sugiyama Phase 3).\n * Uses the barycentric heuristic with bi-directional sweeps.\n *\n * - Back-edges and self-loops are excluded from barycenter computation.\n * - Nodes without neighbours in the reference layer keep their current relative\n *   order (their current position index is used as the barycenter).\n * - Tie-breaking uses the original insertion index \u2014 deterministic and stable.\n * - Sweeps continue until no strict improvement for 4 consecutive passes\n *   (measured via BIT-based cross-count); best ordering is returned.\n */\n/**\n * Port of dagre's order() \u2014 barycentric crossing minimisation.\n *\n * Uses DFS-based initOrder (from dagre's init-order.ts) then bi-directional\n * barycenter sweeps with dagre's sort logic: nodes without neighbours in the\n * reference layer (\"unsortable\") are re-inserted at their original index rather\n * than being sorted with an arbitrary barycenter value.\n */\nfunction minimizeCrossings(\n  byLayer: Map<number, GraphNode[]>,\n  edges: readonly GraphEdge[],\n  backEdgeSet: Set<number>,\n): Map<number, GraphNode[]> {\n  const predIds = new Map<string, string[]>();\n  const succIds = new Map<string, string[]>();\n  for (const [, ns] of byLayer) {\n    for (const n of ns) { predIds.set(n.id, []); succIds.set(n.id, []); }\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    predIds.get(e.to)?.push(e.from);\n    succIds.get(e.from)?.push(e.to);\n  });\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n\n  const nodeById2  = new Map<string, GraphNode>();\n  const nodeLayer2 = new Map<string, number>();\n  for (const [lk, ns] of byLayer) for (const n of ns) {\n    nodeById2.set(n.id, n);\n    nodeLayer2.set(n.id, lk);\n  }\n\n  // initOrder: DFS-based initial ordering (port of dagre's init-order.ts).\n  // Nodes visited first via DFS end up earlier in their layer, correlating\n  // initial order with edge directions and reducing starting crossings.\n  function initOrder(): Map<number, GraphNode[]> {\n    const visited = new Set<string>();\n    const layers  = new Map<number, GraphNode[]>();\n    for (const k of layerKeys) layers.set(k, []);\n\n    function dfs(v: string): void {\n      if (visited.has(v)) return;\n      visited.add(v);\n      const lk = nodeLayer2.get(v);\n      if (lk !== undefined) layers.get(lk)?.push(nodeById2.get(v)!);\n      for (const w of (succIds.get(v) ?? [])) dfs(w);\n    }\n\n    // Visit all nodes sorted by layer (ascending) so DFS starts from roots first.\n    const allNodes = [...nodeById2.keys()].sort(\n      (a, b) => (nodeLayer2.get(a) ?? 0) - (nodeLayer2.get(b) ?? 0),\n    );\n    for (const v of allNodes) dfs(v);\n    return layers;\n  }\n\n  const order      = initOrder();\n  const posInLayer = new Map<string, number>();\n  function rebuildPos(): void {\n    for (const [, ns] of order) ns.forEach((n, i) => posInLayer.set(n.id, i));\n  }\n  rebuildPos();\n\n  // Port of dagre's sort() \u2014 separates sortable (have barycenter) from unsortable\n  // (no neighbours) entries, then interleaves unsortable nodes at their original\n  // positions rather than lumping them at arbitrary barycenters.\n  function sortLayer(layerIdx: number, neighborMap: Map<string, string[]>, biasRight: boolean): void {\n    const curr = order.get(layerIdx)!;\n\n    const entries = curr.map((node, origIdx) => {\n      const nbrs = (neighborMap.get(node.id) ?? []).filter(w => posInLayer.has(w));\n      if (nbrs.length === 0) return { node, barycenter: undefined as number | undefined, origIdx };\n      const sum = nbrs.reduce((s, nid) => s + posInLayer.get(nid)!, 0);\n      return { node, barycenter: sum / nbrs.length, origIdx };\n    });\n\n    const sortable   = entries.filter(e => e.barycenter !== undefined);\n    const unsortable = entries\n      .filter(e => e.barycenter === undefined)\n      .sort((a, b) => b.origIdx - a.origIdx); // descending \u2192 pop from end gives ascending\n\n    sortable.sort((a, b) => {\n      if (a.barycenter! !== b.barycenter!) return a.barycenter! - b.barycenter!;\n      return biasRight ? b.origIdx - a.origIdx : a.origIdx - b.origIdx;\n    });\n\n    const result: GraphNode[] = [];\n    let vsIndex = 0;\n\n    // Re-insert unsortable nodes at their original position indices (dagre's consumeUnsortable).\n    function consumeUnsortable(): void {\n      while (unsortable.length && unsortable[unsortable.length - 1]!.origIdx <= vsIndex) {\n        result.push(unsortable.pop()!.node);\n        vsIndex++;\n      }\n    }\n\n    consumeUnsortable();\n    for (const entry of sortable) {\n      result.push(entry.node);\n      vsIndex++;\n      consumeUnsortable();\n    }\n\n    order.set(layerIdx, result);\n    rebuildPos();\n  }\n\n  let bestCC = crossCount(order, edges, backEdgeSet);\n  const best = new Map<number, GraphNode[]>();\n  for (const [k, v] of order) best.set(k, [...v]);\n\n  for (let pass = 0, lastBest = 0; lastBest < 4; pass++, lastBest++) {\n    const biasRight = pass % 4 >= 2;\n    if (pass % 2 === 0) {\n      // Down sweep: fix each layer using its predecessors.\n      for (let li = 1; li < layerKeys.length; li++) sortLayer(layerKeys[li]!, predIds, biasRight);\n    } else {\n      // Up sweep: fix each layer using its successors.\n      for (let li = layerKeys.length - 2; li >= 0; li--) sortLayer(layerKeys[li]!, succIds, biasRight);\n    }\n    const cc = crossCount(order, edges, backEdgeSet);\n    if (cc < bestCC) {\n      lastBest = 0;\n      bestCC   = cc;\n      for (const [k, v] of order) best.set(k, [...v]);\n    } else if (cc === bestCC) {\n      for (const [k, v] of order) best.set(k, [...v]);\n    }\n  }\n\n  return best;\n}\n\n// \u2500\u2500\u2500 Phase 4: Full Brandes\u2013K\u00F6pf Coordinate Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Assign cross-axis positions using the full Brandes\u2013K\u00F6pf algorithm adapted for\n * Triton's data structures (Map<number, GraphNode[]>, no Graph object).\n *\n * Steps: (1) type-1 conflict detection, (2) vertical alignment (block chains),\n * (3) horizontal compaction (block graph, two-pass min then compact) \u2014 run for\n * 4 sweep directions (ul, ur, dl, dr). Then (4) pick tightest layout, (5) align\n * all 4 to share its min/max, (6) balance each node as median of 4 aligned values.\n */\nfunction assignCoordinatesBK4(\n  byLayer: Map<number, GraphNode[]>,\n  edges: readonly GraphEdge[],\n  backEdgeSet: Set<number>,\n  isLR: boolean,\n  nodeGap: number,\n  layerGap: number,\n  margin: number,\n): { boxes: Map<string, NodeBox>; dummySweepXs: Map<string, number[]> } {\n  const cross   = (n: GraphNode) => isLR ? n.height : n.width;\n  const along   = (n: GraphNode) => isLR ? n.width  : n.height;\n  const isDummy = (id: string)   => id.startsWith('__dummy_');\n\n  const nodeById = new Map<string, GraphNode>();\n  for (const [, ns] of byLayer) for (const n of ns) nodeById.set(n.id, n);\n\n  // Minimum centre-to-centre separation between adjacent nodes in a layer.\n  // Zero-width dummy nodes are invisible waypoints; they impose no gap on\n  // neighbouring real nodes so that real nodes can align freely.\n  function sep(a: string, b: string): number {\n    if (isDummy(a) || isDummy(b)) return 0;\n    const an = nodeById.get(a)!;\n    const bn = nodeById.get(b)!;\n    return cross(an) / 2 + nodeGap + cross(bn) / 2;\n  }\n\n  const layerKeys  = [...byLayer.keys()].sort((a, b) => a - b);\n  const numLayers  = layerKeys.length;\n  const baseLayers: string[][] = layerKeys.map(lk => byLayer.get(lk)!.map(n => n.id));\n\n  // Map each node id \u2192 its layer position index (0-based).\n  const nodeLayerIdx = new Map<string, number>();\n  for (let li = 0; li < numLayers; li++) {\n    for (const id of baseLayers[li]!) nodeLayerIdx.set(id, li);\n  }\n\n  const predMap = new Map<string, string[]>();\n  const succMap = new Map<string, string[]>();\n  for (const [, ns] of byLayer) for (const n of ns) {\n    predMap.set(n.id, []);\n    succMap.set(n.id, []);\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    predMap.get(e.to)?.push(e.from);\n    succMap.get(e.from)?.push(e.to);\n  });\n\n  // \u2500\u2500 BK Step 1: Type-1 Conflict Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // A type-1 conflict: a non-inner edge crosses an inner segment (dummy\u2192dummy).\n  const conflicts = new Set<string>();\n  const ck          = (u: string, v: string) => u < v ? `${u}\\0${v}` : `${v}\\0${u}`;\n  const addConflict = (u: string, v: string) => conflicts.add(ck(u, v));\n  const hasConflict = (u: string, v: string) => conflicts.has(ck(u, v));\n\n  for (let li = 1; li < numLayers; li++) {\n    const prevLayer = baseLayers[li - 1]!;\n    const layer     = baseLayers[li]!;\n\n    const prevPos = new Map<string, number>();\n    prevLayer.forEach((id, i) => prevPos.set(id, i));\n\n    let k0      = 0;\n    let scanPos = 0;\n    const lastNode = layer[layer.length - 1];\n\n    layer.forEach((v, i) => {\n      let innerPredPos: number | undefined;\n      if (isDummy(v)) {\n        for (const u of (predMap.get(v) ?? [])) {\n          if (isDummy(u) && prevPos.has(u)) { innerPredPos = prevPos.get(u)!; break; }\n        }\n      }\n      const k1 = innerPredPos !== undefined ? innerPredPos : prevLayer.length;\n\n      if (innerPredPos !== undefined || v === lastNode) {\n        for (let si = scanPos; si <= i; si++) {\n          const sn = layer[si]!;\n          for (const u of (predMap.get(sn) ?? [])) {\n            if (!prevPos.has(u)) continue;\n            const uPos = prevPos.get(u)!;\n            if ((uPos < k0 || uPos > k1) && !(isDummy(u) && isDummy(sn))) {\n              addConflict(u, sn);\n            }\n          }\n        }\n        scanPos = i + 1;\n        k0      = k1;\n      }\n    });\n  }\n\n  // \u2500\u2500 BK Step 2: Vertical Alignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // \u2500\u2500 BK Step 2: Vertical Alignment (port of dagre's bk.ts verticalAlignment) \u2500\u2500\n  // Dagre has NO isDummy guard here \u2014 real\u2194dummy alignment is intentional:\n  // it forms the block chains that make skip-edge segments travel in straight lines.\n  function verticalAlignment(\n    sweepLayers: readonly string[][],\n    neighborFn:  (v: string) => string[],\n  ): { root: Map<string, string>; align: Map<string, string> } {\n    const root  = new Map<string, string>();\n    const align = new Map<string, string>();\n    const pos   = new Map<string, number>();\n\n    for (const layer of sweepLayers) {\n      layer.forEach((v, i) => { root.set(v, v); align.set(v, v); pos.set(v, i); });\n    }\n\n    for (const layer of sweepLayers) {\n      let prevIdx = -1;\n      for (const v of layer) {\n        // All nodes participate \u2014 dummies form blocks with real nodes to straighten skip edges.\n        const wsRaw = neighborFn(v);\n        if (!wsRaw.length) continue;\n\n        const ws = wsRaw.filter(w => pos.has(w)).sort((a, b) => pos.get(a)! - pos.get(b)!);\n        if (ws.length === 0) continue;\n\n        const mp = (ws.length - 1) / 2;\n        for (let mi = Math.floor(mp), mEnd = Math.ceil(mp); mi <= mEnd; mi++) {\n          const w    = ws[mi]!;\n          const wPos = pos.get(w)!;\n          if (align.get(v) === v && prevIdx < wPos && !hasConflict(v, w)) {\n            align.set(w, v);\n            root.set(v, root.get(w)!);\n            align.set(v, root.get(v)!);\n            prevIdx = wPos;\n          }\n        }\n      }\n    }\n    return { root, align };\n  }\n\n  // \u2500\u2500 BK Step 3: Horizontal Compaction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function horizontalCompaction(\n    sweepLayers: readonly string[][],\n    root:        Map<string, string>,\n  ): Map<string, number> {\n    const blockSucc = new Map<string, Map<string, number>>();\n    const blockPred = new Map<string, Map<string, number>>();\n\n    function ensureBlock(r: string): void {\n      if (!blockSucc.has(r)) { blockSucc.set(r, new Map()); blockPred.set(r, new Map()); }\n    }\n\n    for (const layer of sweepLayers) {\n      let prevId: string | undefined;\n      for (const v of layer) {\n        const rv = root.get(v)!;\n        ensureBlock(rv);\n        if (prevId !== undefined) {\n          const rp = root.get(prevId)!;\n          if (rp !== rv) {\n            const w    = sep(prevId, v);\n            const curW = blockSucc.get(rp)!.get(rv) ?? 0;\n            if (w > curW) {\n              blockSucc.get(rp)!.set(rv, w);\n              blockPred.get(rv)!.set(rp, w);\n            }\n          }\n        }\n        prevId = v;\n      }\n    }\n\n    const xs = new Map<string, number>();\n\n    function iterate(\n      applyFn: (elem: string) => void,\n      nextFn:  (elem: string) => Iterable<string>,\n    ): void {\n      const stack   = [...blockSucc.keys()];\n      const visited = new Set<string>();\n      while (stack.length > 0) {\n        const elem = stack[stack.length - 1]!;\n        if (visited.has(elem)) {\n          stack.pop();\n          applyFn(elem);\n        } else {\n          visited.add(elem);\n          for (const nxt of nextFn(elem)) stack.push(nxt);\n        }\n      }\n    }\n\n    // Pass 1: assign minimum coordinates.\n    iterate(\n      elem => {\n        let max = 0;\n        for (const [from, w] of (blockPred.get(elem) ?? new Map()))\n          max = Math.max(max, (xs.get(from) ?? 0) + w);\n        xs.set(elem, max);\n      },\n      elem => blockPred.get(elem)?.keys() ?? [],\n    );\n\n    // Pass 2: compact rightward (remove slack).\n    iterate(\n      elem => {\n        const succs = blockSucc.get(elem);\n        if (succs && succs.size > 0) {\n          let min = Infinity;\n          for (const [to, w] of succs) min = Math.min(min, (xs.get(to) ?? 0) - w);\n          if (min !== Infinity) xs.set(elem, Math.max(xs.get(elem) ?? 0, min));\n        }\n      },\n      elem => blockSucc.get(elem)?.keys() ?? [],\n    );\n\n    // Propagate block-root coordinates to all member nodes.\n    for (const layer of sweepLayers) {\n      for (const v of layer) xs.set(v, xs.get(root.get(v)!)!);\n    }\n    return xs;\n  }\n\n  // \u2500\u2500 BK Step 4: Run 4 independent sweeps \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const xss = new Map<string, Map<string, number>>();\n\n  for (const vert of ['u', 'd'] as const) {\n    const vertLayers = vert === 'u' ? baseLayers : [...baseLayers].reverse();\n    for (const horiz of ['l', 'r'] as const) {\n      const sweepLayers = horiz === 'r'\n        ? vertLayers.map(layer => [...layer].reverse())\n        : vertLayers;\n      const neighborFn = vert === 'u'\n        ? (v: string) => predMap.get(v) ?? []\n        : (v: string) => succMap.get(v) ?? [];\n\n      const { root } = verticalAlignment(sweepLayers, neighborFn);\n      let xs = horizontalCompaction(sweepLayers, root);\n\n      if (horiz === 'r') {\n        // RL compaction works in a reversed coordinate space; negate to restore.\n        const neg = new Map<string, number>();\n        for (const [k, v] of xs) neg.set(k, -v);\n        xs = neg;\n      }\n      xss.set(vert + horiz, xs);\n    }\n  }\n\n  // Capture pre-balance x values for every dummy node across the 4 sweeps.\n  // Sweep key order: ul=0, ur=1, dl=2, dr=3.\n  const SWEEP_KEYS = ['ul', 'ur', 'dl', 'dr'] as const;\n  const dummySweepXs = new Map<string, number[]>();\n  for (const id of nodeById.keys()) {\n    if (!isDummy(id)) continue;\n    const vals = SWEEP_KEYS.map(k => xss.get(k)?.get(id) ?? 0);\n    dummySweepXs.set(id, vals);\n  }\n\n  // \u2500\u2500 BK Step 5: Find smallest-width alignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let minSpan    = Infinity;\n  let smallestXs = xss.get('ul')!;\n  for (const [, xs] of xss) {\n    let lo = Infinity, hi = -Infinity;\n    for (const [id, x] of xs) {\n      const n = nodeById.get(id);\n      if (!n) continue;\n      const half = cross(n) / 2;\n      lo = Math.min(lo, x - half);\n      hi = Math.max(hi, x + half);\n    }\n    if (hi - lo < minSpan) { minSpan = hi - lo; smallestXs = xs; }\n  }\n\n  // \u2500\u2500 BK Step 6: Align all 4 layouts to the smallest-width one \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const refVals = [...smallestXs.values()];\n  const refMin  = Math.min(...refVals);\n  const refMax  = Math.max(...refVals);\n\n  for (const [key, xs] of xss) {\n    if (xs === smallestXs) continue;\n    const vals    = [...xs.values()];\n    const isRight = key.endsWith('r');\n    const delta   = isRight\n      ? refMax - Math.max(...vals)\n      : refMin - Math.min(...vals);\n    if (delta !== 0) {\n      const shifted = new Map<string, number>();\n      for (const [id, x] of xs) shifted.set(id, x + delta);\n      xss.set(key, shifted);\n    }\n  }\n\n  // \u2500\u2500 BK Step 7: Balance \u2014 per-node median of the 4 aligned values \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const balanced = new Map<string, number>();\n  for (const [id] of xss.get('ul')!) {\n    const vals = ([...xss.values()].map(xs => xs.get(id) ?? 0)).sort((a, b) => a - b);\n    balanced.set(id, ((vals[1] ?? 0) + (vals[2] ?? 0)) / 2);\n  }\n\n  // \u2500\u2500 Column snap: align directly-connected adjacent-layer node chains \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Build chains (union-find) over direct edges between adjacent layers where the\n  // BK misalignment is small. Then snap each chain to the median balanced x of its\n  // members. Running per-edge would cause double-snap interference on multi-node\n  // chains (e.g. A\u2192B and B\u2192C would shift B twice with different partners).\n  const COLUMN_SNAP_EPSILON = 6; // px \u2014 only snap if misalignment is smaller than this\n\n  const csParent = new Map<string, string>();\n  const csFind = (id: string): string => {\n    let r = csParent.get(id) ?? id;\n    while (csParent.get(r) !== undefined && csParent.get(r) !== r) r = csParent.get(r)!;\n    csParent.set(id, r);\n    return r;\n  };\n  const csUnion = (a: string, b: string): void => {\n    const ra = csFind(a), rb = csFind(b);\n    if (ra !== rb) csParent.set(ra, rb);\n  };\n\n  edges.forEach((edge, i) => {\n    if (backEdgeSet.has(i) || edge.from === edge.to) return;\n    if (isDummy(edge.from) || isDummy(edge.to)) return;\n\n    const fromLayer = nodeLayerIdx.get(edge.from);\n    const toLayer   = nodeLayerIdx.get(edge.to);\n    if (fromLayer === undefined || toLayer === undefined) return;\n    if (Math.abs(toLayer - fromLayer) !== 1) return;\n\n    const fromX = balanced.get(edge.from);\n    const toX   = balanced.get(edge.to);\n    if (fromX === undefined || toX === undefined) return;\n    if (Math.abs(fromX - toX) > COLUMN_SNAP_EPSILON) return;\n\n    csUnion(edge.from, edge.to);\n  });\n\n  // Group chain members and snap each chain to its median balanced x.\n  const csGroups = new Map<string, string[]>();\n  for (const id of balanced.keys()) {\n    if (isDummy(id)) continue;\n    const root = csFind(id);\n    if (!csGroups.has(root)) csGroups.set(root, []);\n    csGroups.get(root)!.push(id);\n  }\n  for (const members of csGroups.values()) {\n    if (members.length < 2) continue;\n    const xs = members.map(id => balanced.get(id)!).sort((a, b) => a - b);\n    const medX = xs.length % 2 === 1\n      ? xs[Math.floor(xs.length / 2)]!\n      : (xs[xs.length / 2 - 1]! + xs[xs.length / 2]!) / 2;\n    for (const id of members) balanced.set(id, medX);\n  }\n\n  // Shift so the leftmost node's left edge sits at `margin`.\n  let minLeft = Infinity;\n  for (const [id, cx] of balanced) {\n    const n = nodeById.get(id);\n    if (n) minLeft = Math.min(minLeft, cx - cross(n) / 2);\n  }\n  const shift = margin - (isFinite(minLeft) ? minLeft : 0);\n\n  // \u2500\u2500 Build NodeBox results \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nodePos   = new Map<string, NodeBox>();\n  let alongCursor = margin;\n\n  for (let li = 0; li < numLayers; li++) {\n    const layerIdx  = layerKeys[li]!;\n    const ns        = byLayer.get(layerIdx)!;\n    const layerSize = ns.length > 0 ? Math.max(...ns.map(along)) : 0;\n\n    for (const node of ns) {\n      const cx        = (balanced.get(node.id) ?? 0) + shift;\n      const crossLeft = cx - cross(node) / 2;\n      const alongPos = (isDummy(node.id) && li > 0)\n        ? alongCursor - layerGap / 2\n        : alongCursor + (layerSize - along(node)) / 2;\n\n      nodePos.set(node.id, {\n        id:     node.id,\n        x:      isLR ? alongPos  : crossLeft,\n        y:      isLR ? crossLeft : alongPos,\n        width:  node.width,\n        height: node.height,\n      });\n    }\n    alongCursor += layerSize + layerGap;\n  }\n\n  return { boxes: nodePos, dummySweepXs };\n}\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layeredLayout(\n  nodes: readonly GraphNode[],\n  edges: readonly GraphEdge[],\n  options: LayeredOptions = {},\n): LayeredResult {\n  const direction  = options.direction ?? 'TB';\n  const layerGap   = options.layerGap ?? 70;\n  const nodeGap    = options.nodeGap ?? 40;\n  const margin     = options.margin ?? 32;\n  const isLR       = direction === 'LR';\n\n  if (nodes.length === 0) return { boxes: new Map(), width: margin * 2, height: margin * 2, edgeBends: new Map(), dummySweepXs: new Map(), dummyChainIds: new Map() };\n\n  // Phase 1: Layer assignment.\n  const layer    = assignLayers(nodes, edges);\n\n  // Phase 2a: Back-edge detection (DFS).\n  const backEdges = detectBackEdges(nodes, edges);\n\n  // Phase 2b: Dummy node insertion for skip edges (spans > 1 layer).\n  // `layer` is mutated to include dummy node layer assignments.\n  const { newNodes, newEdges, newBackEdgeSet, dummyChains } =\n    insertDummyNodes(nodes, edges, layer, backEdges);\n\n  // Rebuild byLayer with all nodes (real + dummy).\n  const newMaxLayer = Math.max(...newNodes.map(n => layer.get(n.id)!));\n  const byLayerArr: Map<number, GraphNode[]> = new Map();\n  for (let i = 0; i <= newMaxLayer; i++) byLayerArr.set(i, []);\n  for (const n of newNodes) byLayerArr.get(layer.get(n.id)!)!.push(n);\n\n  // Phase 3: Crossing minimisation (barycentric, bi-directional sweeps).\n  const orderedByLayer = minimizeCrossings(byLayerArr, newEdges, newBackEdgeSet);\n\n  // Phase 4: Full 4-layout B\u2013K coordinate assignment (variable node sizes).\n  const { boxes: allBoxesMap, dummySweepXs } = assignCoordinatesBK4(\n    orderedByLayer, newEdges, newBackEdgeSet,\n    isLR, nodeGap, layerGap, margin,\n  );\n\n  // Phase 5: Extract bend points from dummy node positions.\n  const edgeBends = new Map<number, Array<{ x: number; y: number }>>();\n  for (const [origEdgeIdx, dummyIds] of dummyChains) {\n    const bends = dummyIds.map(id => {\n      const b = allBoxesMap.get(id)!;\n      return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n    });\n    edgeBends.set(origEdgeIdx, bends);\n  }\n\n  // Remove dummy nodes from result boxes (callers only see real nodes).\n  const boxes = new Map<string, NodeBox>();\n  for (const [id, box] of allBoxesMap) {\n    if (!id.startsWith('__dummy_')) boxes.set(id, box);\n  }\n\n  // Phase 6: Compact gaps between disconnected subgraphs.\n  if (boxes.size > 1) {\n    const uf = new Map<string, string>(nodes.map(n => [n.id, n.id]));\n    const find = (x: string): string => {\n      while (uf.get(x) !== x) { uf.set(x, uf.get(uf.get(x)!)!); x = uf.get(x)!; }\n      return x;\n    };\n    for (const e of edges) {\n      if (boxes.has(e.from) && boxes.has(e.to)) {\n        const ra = find(e.from), rb = find(e.to);\n        if (ra !== rb) uf.set(ra, rb);\n      }\n    }\n    const comps = new Map<string, string[]>();\n    for (const id of boxes.keys()) {\n      const r = find(id);\n      if (!comps.has(r)) comps.set(r, []);\n      comps.get(r)!.push(id);\n    }\n    if (comps.size > 1) {\n      const compInfos = [...comps.values()].map(ids => ({\n        ids,\n        left:  Math.min(...ids.map(id => boxes.get(id)!.x)),\n        right: Math.max(...ids.map(id => boxes.get(id)!.x + boxes.get(id)!.width)),\n      })).sort((a, b) => a.left - b.left);\n\n      let cursor = compInfos[0]!.right;\n      for (let ci = 1; ci < compInfos.length; ci++) {\n        const comp = compInfos[ci]!;\n        const gap = comp.left - cursor;\n        const targetGap = nodeGap * 2;\n        if (gap > targetGap) {\n          const dx = -(gap - targetGap);\n          for (const id of comp.ids) {\n            const b = boxes.get(id)!;\n            boxes.set(id, { id: b.id, x: b.x + dx, y: b.y, width: b.width, height: b.height });\n          }\n          comp.left  += dx;\n          comp.right += dx;\n        }\n        cursor = comp.right;\n      }\n    }\n  }\n\n  // Compute total diagram dimensions from placed real boxes.\n  const allBoxes = [...boxes.values()];\n  const width  = allBoxes.length > 0\n    ? Math.max(...allBoxes.map(b => b.x + b.width))  + margin\n    : margin * 2;\n  const height = allBoxes.length > 0\n    ? Math.max(...allBoxes.map(b => b.y + b.height)) + margin\n    : margin * 2;\n\n  return { boxes, width, height, edgeBends, dummySweepXs, dummyChainIds: dummyChains };\n}\n\n// \u2500\u2500\u2500 Straight-line obstacle check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns true if segment p1\u2192p2 does not pass through the strict interior of\n * any obstacle (with padding). Uses Liang\u2013Barsky clipping.\n */\nfunction straightLineObstacleFree(\n  p1: { x: number; y: number },\n  p2: { x: number; y: number },\n  obstacles: ReadonlyArray<Rect>,\n  padding: number,\n): boolean {\n  const dx = p2.x - p1.x, dy = p2.y - p1.y;\n  for (const obs of obstacles) {\n    const xmin = obs.x - padding, xmax = obs.x + obs.width  + padding;\n    const ymin = obs.y - padding, ymax = obs.y + obs.height + padding;\n    let tmin = 0, tmax = 1;\n    const clips = [\n      { p: -dx, q: p1.x - xmin },\n      { p:  dx, q: xmax - p1.x },\n      { p: -dy, q: p1.y - ymin },\n      { p:  dy, q: ymax - p1.y },\n    ];\n    let crosses = true;\n    for (const { p, q } of clips) {\n      if (Math.abs(p) < 1e-10) {\n        if (q <= 0) { crosses = false; break; }\n      } else {\n        const t = q / p;\n        if (p < 0) tmin = Math.max(tmin, t);\n        else       tmax = Math.min(tmax, t);\n        if (tmin >= tmax) { crosses = false; break; }\n      }\n    }\n    if (crosses) return false; // this obstacle blocks the straight line\n  }\n  return true;\n}\n\n// \u2500\u2500\u2500 Obstacle-Avoiding Edge Routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Route an edge between two node boxes with obstacle avoidance.\n *\n * If a straight line from `fromPt` to `toPt` is unobstructed, it is used\n * directly. Otherwise the orthogonal router produces a bent path.\n *\n * @param fromBox   Source node box (in laid.boxes coordinates).\n * @param toBox     Target node box (in laid.boxes coordinates).\n * @param allBoxes  All node boxes in the diagram (obstacles are inferred from these).\n * @param yOff      Vertical offset to apply (e.g. title height) when computing world coords.\n * @param fromPt    Optional explicit source attachment point (overrides borderPoint).\n * @param toPt      Optional explicit target attachment point (overrides borderPoint).\n */\nexport function routeEdge(\n  fromBox: NodeBox,\n  toBox: NodeBox,\n  allBoxes: ReadonlyArray<NodeBox>,\n  yOff = 0,\n  fromPt?: { x: number; y: number },\n  toPt?: { x: number; y: number },\n  forceOrthogonal = false,\n): { path: string; labelMidpoint: { x: number; y: number } } {\n  const fromRect: Rect = { x: fromBox.x, y: fromBox.y + yOff, width: fromBox.width, height: fromBox.height };\n  const toRect:   Rect = { x: toBox.x,   y: toBox.y   + yOff, width: toBox.width,   height: toBox.height   };\n\n  const fromCx = fromRect.x + fromRect.width  / 2;\n  const fromCy = fromRect.y + fromRect.height / 2;\n  const toCx   = toRect.x   + toRect.width    / 2;\n  const toCy   = toRect.y   + toRect.height   / 2;\n\n  // Infer port directions from geometry (favour dominant axis).\n  const dx = toCx - fromCx;\n  const dy = toCy - fromCy;\n  let fromDir: PortDirection;\n  let toDir:   PortDirection;\n  if (Math.abs(dy) >= Math.abs(dx)) {\n    fromDir = dy > 0 ? 'S' : 'N';\n    toDir   = dy > 0 ? 'N' : 'S';\n  } else {\n    fromDir = dx > 0 ? 'E' : 'W';\n    toDir   = dx > 0 ? 'W' : 'E';\n  }\n\n  // Use caller-supplied attachment points when provided; otherwise clip to border.\n  const pa = fromPt ?? borderPoint(fromRect, toCx, toCy);\n  const pb = toPt   ?? borderPoint(toRect,   fromCx, fromCy);\n\n  // Every box that is neither the source nor the target is an obstacle.\n  const fromId = fromBox.id;\n  const toId   = toBox.id;\n  const obstacles: Rect[] = allBoxes\n    .filter(b => b.id !== fromId && b.id !== toId)\n    .map(b => ({ x: b.x, y: b.y + yOff, width: b.width, height: b.height }));\n\n  // Fast path: use a straight line when no obstacle blocks it.\n  // Skipped when forceOrthogonal=true (e.g. class diagrams require rectilinear routing).\n  if (!forceOrthogonal &&\n      (obstacles.length === 0 || straightLineObstacleFree(pa, pb, obstacles, 10))) {\n    return {\n      path: `M ${pa.x} ${pa.y} L ${pb.x} ${pb.y}`,\n      labelMidpoint: { x: (pa.x + pb.x) / 2, y: (pa.y + pb.y) / 2 },\n    };\n  }\n\n  const route = orthogonalRouter.route({\n    from: pa, to: pb,\n    style: 'orthogonal',\n    obstacles,\n    padding: 10,\n    fromDir,\n    toDir,\n  });\n\n  // Fallback: if the router produces an empty path, use a straight line.\n  // When forceOrthogonal is set, prefer a degenerate orthogonal path (V+H) over diagonal.\n  const path = route.path\n    || (forceOrthogonal\n        ? `M ${pa.x} ${pa.y} L ${pa.x} ${pb.y} L ${pb.x} ${pb.y}`\n        : `M ${pa.x} ${pa.y} L ${pb.x} ${pb.y}`);\n  return { path, labelMidpoint: route.labelPosition };\n}\n", "/**\n * @file diagrams/class/layout.ts \u2014 UML class diagram.\n *\n * Classes render as three-compartment boxes (name/stereotype, attributes,\n * methods); placement uses the shared layered kernel (inheritance points up).\n * Relationships draw as straight connectors clipped to box borders with\n * UML end markers (triangle / diamond / arrow) plus cardinality + labels.\n */\n\nimport type { ClassDocument, ClassBox, RelEnd } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { layeredLayout, routeEdge, type GraphNode, type GraphEdge, type NodeBox } from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\n// \u2500\u2500 Skip-edge routing helpers (module-level) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Axis-aligned segment stored as an inflated rect for overlap detection. */\ninterface RoutedSegment {\n  x1: number; y1: number;   // top-left\n  x2: number; y2: number;   // bottom-right (x2 >= x1, y2 >= y1)\n}\n\n/** A scored routing candidate carrying full path geometry for one wall-pair strategy. */\ninterface RouteCandidate {\n  strategy: 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'V' | 'X1' | 'X2';\n  laneX:    number;\n  segments: Array<[number, number, number, number]>;\n  labelMid: { x: number; y: number };\n  isMixed:  boolean;  // true for D, E, F \u2014 wall-pair penalty applies\n}\n\n/** True if axis-aligned segment (x1,y1)\u2192(x2,y2) passes through box interior. */\nfunction segmentIntersectsBox(\n  x1: number, y1: number, x2: number, y2: number,\n  box: NodeBox,\n): boolean {\n  const bx1 = box.x, bx2 = box.x + box.width;\n  const by1 = box.y, by2 = box.y + box.height;\n  if (y1 === y2) {\n    const lx = Math.min(x1, x2), rx = Math.max(x1, x2);\n    return y1 > by1 && y1 < by2 && lx < bx2 && rx > bx1;\n  }\n  const ty = Math.min(y1, y2), by = Math.max(y1, y2);\n  return x1 > bx1 && x1 < bx2 && ty < by2 && by > by1;\n}\n\n/** Convert a segment to a 2px-wide axis-aligned rect. */\nfunction toRect(x1: number, y1: number, x2: number, y2: number): RoutedSegment {\n  const W = 1;\n  return {\n    x1: Math.min(x1, x2) - W, y1: Math.min(y1, y2) - W,\n    x2: Math.max(x1, x2) + W, y2: Math.max(y1, y2) + W,\n  };\n}\n\n/** Returns the shared axis length between two RoutedSegment rects. */\nfunction rectsOverlapLength(a: RoutedSegment, b: RoutedSegment): number {\n  const ox = Math.min(a.x2, b.x2) - Math.max(a.x1, b.x1);\n  const oy = Math.min(a.y2, b.y2) - Math.max(a.y1, b.y1);\n  if (ox <= 0 || oy <= 0) return 0;\n  return Math.max(ox, oy);\n}\n\nconst CLEARANCE      = 12;  // obstacle avoidance (right-side, inter-column)\nconst LANE_CLEARANCE = 48;  // visual breathing room for left/right margin lanes\n\n/** True if point (lx, ly) falls inside any of the given boxes. */\nfunction labelInBox(lx: number, ly: number, boxes: NodeBox[], padding = 8): boolean {\n  return boxes.some(b =>\n    lx > b.x - padding && lx < b.x + b.width + padding &&\n    ly > b.y - padding && ly < b.y + b.height + padding\n  );\n}\n\n/** Remove values within tol pixels of each other (keep first occurrence). */\nfunction dedup(arr: number[], tol: number): number[] {\n  const result: number[] = [];\n  for (const v of arr) {\n    if (!result.some(r => Math.abs(r - v) < tol)) result.push(v);\n  }\n  return result;\n}\n\n/** Render a segment list to an SVG path string. */\nfunction segmentsToPath(segs: Array<[number, number, number, number]>): string {\n  if (segs.length === 0) return '';\n  if (segs.length === 1) {\n    return `M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])} L ${rhu(segs[0]![2])} ${rhu(segs[0]![3])}`;\n  }\n  const pts: string[] = [`M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])}`];\n  for (const [,, x2, y2] of segs) pts.push(`L ${rhu(x2)} ${rhu(y2)}`);\n  return pts.join(' ');\n}\n\n// \u2500\u2500 Port-assignment helpers (module-level) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype Wall = 'top' | 'bottom' | 'left' | 'right';\n\n// \u2500\u2500 Edge classification (module-level) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype EdgeClass =\n  | 'direct-same-column'\n  | 'direct-cross-column'\n  | 'skip-same-column'\n  | 'skip-cross-column';\n\nfunction classifyEdge(\n  a: NodeBox,\n  b: NodeBox,\n  bends: Array<{ x: number; y: number }> | undefined,\n): EdgeClass {\n  const cxA = a.x + a.width / 2;\n  const cxB = b.x + b.width / 2;\n  const sameCol = Math.abs(cxA - cxB) < 8;\n  const isSkip  = bends != null && bends.length > 0;\n  if (isSkip) return sameCol ? 'skip-same-column' : 'skip-cross-column';\n  return sameCol ? 'direct-same-column' : 'direct-cross-column';\n}\n\nconst MIN_PORT_GAP = 32;\nconst WALL_MARGIN  = 16;\n\n/**\n * Cascade algorithm: given N ideal positions (pre-sorted ascending) in [lo, hi],\n * return N positions that respect minGap while staying as close to ideals as possible.\n * Falls back to even distribution when the required span exceeds the available space.\n */\nfunction cascadePorts(ideals: number[], lo: number, hi: number, minGap: number): number[] {\n  const n = ideals.length;\n  if (n === 0) return [];\n  if (n === 1) return [Math.max(lo, Math.min(hi, ideals[0]!))];\n  if ((n - 1) * minGap > hi - lo) {\n    const step = (hi - lo) / (n + 1);\n    return Array.from({ length: n }, (_, i) => lo + step * (i + 1));\n  }\n  const pos = ideals.map(v => Math.max(lo, Math.min(hi, v)));\n  for (let iter = 0; iter < 5; iter++) {\n    let changed = false;\n    for (let i = 1; i < n; i++) {\n      const minI = pos[i - 1]! + minGap;\n      if (pos[i]! < minI) { pos[i] = minI; changed = true; }\n    }\n    for (let i = n - 1; i >= 0; i--) {\n      const maxI = i === n - 1 ? hi : pos[i + 1]! - minGap;\n      if (pos[i]! > maxI) { pos[i] = maxI; changed = true; }\n    }\n    if (pos[0]! < lo) { pos[0] = lo; changed = true; }\n    if (!changed) break;\n  }\n  return pos;\n}\n\n/**\n * Compute port points for one (box, wall) group of edges.\n * Edges are sorted by their opposite-end node centre along the wall axis\n * (crossing-minimisation), then spread via cascade to enforce MIN_PORT_GAP.\n * Returns Map<relationIndex, {x,y}>.\n */\nfunction assignGroupPorts(\n  box: NodeBox,\n  wall: Wall,\n  group: Array<{ ri: number; sourceCenter: number }>,\n  yOff: number,\n): Map<number, { x: number; y: number }> {\n  const result = new Map<number, { x: number; y: number }>();\n  if (group.length === 0) return result;\n\n  const sorted = [...group].sort((a, b) => a.sourceCenter - b.sourceCenter);\n\n  let wallBase: number, wallLen: number, fixedCoord: number, isHorizontal: boolean;\n  switch (wall) {\n    case 'top':\n      wallBase = box.x; wallLen = box.width; fixedCoord = box.y + yOff; isHorizontal = true; break;\n    case 'bottom':\n      wallBase = box.x; wallLen = box.width; fixedCoord = box.y + yOff + box.height; isHorizontal = true; break;\n    case 'left':\n      wallBase = box.y + yOff; wallLen = box.height; fixedCoord = box.x; isHorizontal = false; break;\n    default: // 'right'\n      wallBase = box.y + yOff; wallLen = box.height; fixedCoord = box.x + box.width; isHorizontal = false; break;\n  }\n\n  const lo = wallBase + WALL_MARGIN;\n  const hi = wallBase + wallLen - WALL_MARGIN;\n  const ideals = sorted.map(e => Math.max(lo, Math.min(hi, e.sourceCenter)));\n  const positions = cascadePorts(ideals, lo, hi, MIN_PORT_GAP);\n\n  for (let i = 0; i < sorted.length; i++) {\n    const p = positions[i]!;\n    result.set(sorted[i]!.ri, isHorizontal ? { x: p, y: fixedCoord } : { x: fixedCoord, y: p });\n  }\n  return result;\n}\n\nexport function layoutClass(ir: ClassDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const memFont = typography.smallFontSize;\n  const nameFont = typography.baseFontSize;\n  const lineH = rhuInt(memFont * 1.6);\n  const headH = rhuInt(nameFont * 1.6);\n\n  // \u2500\u2500 Box sizing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const sizeOf = (c: ClassBox): { w: number; h: number; attrH: number } => {\n    const memberTexts = [...(c.stereotype ? [`\u00AB${c.stereotype}\u00BB`] : []), ...c.attributes.map(m => m.text), ...c.methods.map(m => m.text)];\n    const nameW = measureText(c.name, nameFont).width + 24;\n    const w = Math.max(130, nameW, ...memberTexts.map(t => measureText(t, memFont).width + 24));\n    const stereoH = c.stereotype ? memFont + 4 : 0;\n    const attrH = c.attributes.length * lineH + 8;\n    const methH = c.methods.length * lineH + 8;\n    const h = headH + stereoH + attrH + methH;\n    return { w, h, attrH: headH + stereoH + attrH };\n  };\n  const sizes = new Map(ir.classes.map(c => [c.name, sizeOf(c)]));\n\n  const nodes: GraphNode[] = ir.classes.map(c => ({ id: c.name, width: sizes.get(c.name)!.w, height: sizes.get(c.name)!.h }));\n  const edges: GraphEdge[] = ir.relations.map(r =>\n    r.leftHead === 'triangle' ? { from: r.right, to: r.left } : { from: r.left, to: r.right });\n  const LAYER_GAP = 64;\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: LAYER_GAP, nodeGap: 46, margin });\n\n  const canvasWidth  = laid.width + margin * 2;\n  const allRealBoxes = [...laid.boxes.values()];\n\n  // Segment registry: updated after each skip edge is routed.\n  const routedSegments: RoutedSegment[] = [];\n\n  // Real-node x-centre values, deduplicated and sorted.\n  const realColumnXs = [...new Set(\n    allRealBoxes.map(b => b.x + b.width / 2)\n  )].sort((a, b) => a - b);\n\n  // Midpoint between each adjacent pair of real-node columns.\n  const interColMidpoints: number[] = [];\n  for (let ci = 0; ci < realColumnXs.length - 1; ci++) {\n    interColMidpoints.push((realColumnXs[ci]! + realColumnXs[ci + 1]!) / 2);\n  }\n\n  /**\n   * Score a candidate lane x for a skip or direct edge.\n   * Lower score = better. Returns Infinity if the candidate is out-of-bounds.\n   */\n  function scoreLane(\n    laneX:           number,\n    segments:        Array<[number, number, number, number]>,\n    interBoxes:      NodeBox[],\n    routed:          RoutedSegment[],\n    canvasW:         number,\n    realMinX:        number,\n    wallPairPenalty: number = 0,\n    sameWallBonus:   number = 0,\n    straightBonus:   number = 0,\n    labelMid:        { x: number; y: number } | null = null,\n  ): number {\n    if (laneX > canvasW) return Infinity;  // only hard-clip on the right\n\n    let pathLength  = 0;\n    let segCount    = segments.length;\n    let boxHits     = 0;\n    let overlapHits = 0;\n\n    for (const [x1, y1, x2, y2] of segments) {\n      const dx = x2 - x1, dy = y2 - y1;\n      pathLength += Math.sqrt(dx * dx + dy * dy);\n\n      for (const nb of interBoxes) {\n        if (segmentIntersectsBox(x1, y1, x2, y2, nb)) boxHits++;\n      }\n\n      const segRect = toRect(x1, y1, x2, y2);\n      for (const rs of routed) {\n        if (rectsOverlapLength(segRect, rs) >= 10) overlapHits++;\n      }\n    }\n\n    const dirPenalty = laneX <= realMinX - CLEARANCE ? 0 : 5;\n\n    // Canvas expansion penalty: very small \u2014 we want comfortable spacing\n    // to win over tight spacing, not be penalised for it.\n    const expansionPenalty = laneX < realMinX ? (realMinX - laneX) * 0.05 : 0;\n\n    const labelPenalty = (labelMid != null && labelInBox(labelMid.x, labelMid.y, allRealBoxes))\n      ? 200 : 0;\n\n    return (\n      0.3   * pathLength  +\n      10.0  * segCount    +\n      1000  * boxHits     +\n      50    * overlapHits +\n      dirPenalty          +\n      expansionPenalty    +\n      wallPairPenalty     -\n      sameWallBonus       -   // bonus for same-wall same-column routing (B/C)\n      straightBonus       +   // reward for single-segment straight vertical\n      labelPenalty            // penalty when label mid falls inside a box\n    );\n  }\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n\n  const elements: SceneElement[] = [];\n  if (title) elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Relationships (under boxes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n\n  const approachWall = (from: NodeBox, to: NodeBox): Wall => {\n    if (from.y + from.height <= to.y) return 'top';\n    if (to.y + to.height     <= from.y) return 'bottom';\n    const dx = (to.x + to.width / 2) - (from.x + from.width / 2);\n    const dy = (to.y + to.height / 2) - (from.y + from.height / 2);\n    if (Math.abs(dy) >= Math.abs(dx)) return dy >= 0 ? 'top' : 'bottom';\n    return dx >= 0 ? 'left' : 'right';\n  };\n\n  const wallPoint = (box: NodeBox, wall: Wall, t: number, yOff_: number): { x: number; y: number } => {\n    const bx = box.x, by = box.y + yOff_, bw = box.width, bh = box.height;\n    switch (wall) {\n      case 'top':    return { x: bx + t * bw, y: by };\n      case 'bottom': return { x: bx + t * bw, y: by + bh };\n      case 'left':   return { x: bx,           y: by + t * bh };\n      case 'right':  return { x: bx + bw,      y: by + t * bh };\n    }\n  };\n\n  // \u2500\u2500 Port assignment: arrival ports (toPortMap2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Group edges by (targetId, wall). Sort each group by source-center along the\n  // wall axis \u2192 crossing-free order. Spread with cascade to enforce MIN_PORT_GAP.\n  // All edges (including skip edges) participate so ports are always separated.\n  // For skip edges, use laneX as the ideal arrival position so cascade sees a\n  // distinct ideal and doesn't tie with direct-edge ideals.\n  const toGroupAccum = new Map<string, Array<{ ri: number; sourceCenter: number }>>();\n  for (let ri = 0; ri < ir.relations.length; ri++) {\n    const r = ir.relations[ri]!;\n    const isFlipped = r.leftHead === 'triangle';\n    const a = laid.boxes.get(isFlipped ? r.right : r.left),\n          b = laid.boxes.get(isFlipped ? r.left  : r.right);\n    if (!a || !b) continue;\n    const wall = approachWall(a, b);\n    const key = `${b.id}:${wall}`;\n    const bends = laid.edgeBends.get(ri);\n    const sourceCenter = (wall === 'top' || wall === 'bottom')\n      ? (bends && bends.length > 0 ? bends[0]!.x : a.x + a.width / 2)\n      : a.y + a.height / 2 + yOff;\n    if (!toGroupAccum.has(key)) toGroupAccum.set(key, []);\n    toGroupAccum.get(key)!.push({ ri, sourceCenter });\n  }\n  const toPortMap2 = new Map<string, Map<number, { x: number; y: number }>>();\n  for (const [key, group] of toGroupAccum) {\n    const nodeId = key.split(':')[0]!;\n    const wall = key.split(':')[1] as Wall;\n    toPortMap2.set(key, assignGroupPorts(laid.boxes.get(nodeId)!, wall, group, yOff));\n  }\n\n  // \u2500\u2500 Port assignment: departure ports (fromPortMap2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Departure wall of A toward B = approachWall(b, a). Sort by target-center.\n  // For skip edges, use laneX as the ideal departure position so cascade sees a\n  // distinct ideal and doesn't tie with direct-edge ideals.\n  const fromGroupAccum = new Map<string, Array<{ ri: number; sourceCenter: number }>>();\n  for (let ri = 0; ri < ir.relations.length; ri++) {\n    const r = ir.relations[ri]!;\n    const isFlipped = r.leftHead === 'triangle';\n    const a = laid.boxes.get(isFlipped ? r.right : r.left),\n          b = laid.boxes.get(isFlipped ? r.left  : r.right);\n    if (!a || !b) continue;\n    const wall = approachWall(b, a);\n    const key = `${a.id}:${wall}`;\n    const bends = laid.edgeBends.get(ri);\n    const targetCenter = (wall === 'top' || wall === 'bottom')\n      ? (bends && bends.length > 0 ? bends[0]!.x : b.x + b.width / 2)\n      : b.y + b.height / 2 + yOff;\n    if (!fromGroupAccum.has(key)) fromGroupAccum.set(key, []);\n    fromGroupAccum.get(key)!.push({ ri, sourceCenter: targetCenter });\n  }\n  const fromPortMap2 = new Map<string, Map<number, { x: number; y: number }>>();\n  for (const [key, group] of fromGroupAccum) {\n    const nodeId = key.split(':')[0]!;\n    const wall = key.split(':')[1] as Wall;\n    fromPortMap2.set(key, assignGroupPorts(laid.boxes.get(nodeId)!, wall, group, yOff));\n  }\n\n  // Arrowhead direction: point just outside the wall in the edge's travel direction.\n  const wallDir = (wall: Wall, pt: { x: number; y: number }): { x: number; y: number } => {\n    switch (wall) {\n      case 'top':    return { x: pt.x,     y: pt.y - 1 };\n      case 'bottom': return { x: pt.x,     y: pt.y + 1 };\n      case 'left':   return { x: pt.x - 1, y: pt.y     };\n      case 'right':  return { x: pt.x + 1, y: pt.y     };\n    }\n  };\n\n  // \u2500\u2500 Edge classification + processing-order sort \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Classify all edges; sort most-constrained first (skip-cross, then skip-same,\n  // then direct-cross, then direct-same). Within each class, longest span first.\n  interface EdgeEntry { ri: number; cls: EdgeClass; span: number; }\n  const edgeEntries: EdgeEntry[] = [];\n  for (let ri_ = 0; ri_ < ir.relations.length; ri_++) {\n    const r_ = ir.relations[ri_]!;\n    const isFlipped_ = r_.leftHead === 'triangle';\n    const a_ = laid.boxes.get(isFlipped_ ? r_.right : r_.left),\n          b_ = laid.boxes.get(isFlipped_ ? r_.left  : r_.right);\n    if (!a_ || !b_) continue;\n    const bends_ = laid.edgeBends.get(ri_);\n    const cls_ = classifyEdge(a_, b_, bends_);\n    const span_ = Math.abs((a_.x + a_.width / 2) - (b_.x + b_.width / 2)) +\n                  Math.abs((a_.y + a_.height / 2) - (b_.y + b_.height / 2));\n    edgeEntries.push({ ri: ri_, cls: cls_, span: span_ });\n  }\n  const classOrder: Record<EdgeClass, number> = {\n    'skip-cross-column':   0,\n    'skip-same-column':    1,\n    'direct-cross-column': 2,\n    'direct-same-column':  3,\n  };\n  edgeEntries.sort((ea, eb) =>\n    classOrder[ea.cls] - classOrder[eb.cls] || eb.span - ea.span\n  );\n\n  for (const { ri, cls } of edgeEntries) {\n    const r = ir.relations[ri]!;\n    // When leftHead='triangle', the graph edge was flipped (from=r.right, to=r.left)\n    // for layout \u2014 rendering must match that direction.\n    const isFlipped = r.leftHead === 'triangle';\n    const a = laid.boxes.get(isFlipped ? r.right : r.left),\n          b = laid.boxes.get(isFlipped ? r.left  : r.right);\n    if (!a || !b) continue;\n\n    // Arrival port: cascade-assigned position on target wall.\n    const toWall = approachWall(a, b);\n    const toPt = toPortMap2.get(`${b.id}:${toWall}`)?.get(ri) ?? wallPoint(b, toWall, 0.5, yOff);\n\n    // Departure port: cascade-assigned position on source wall, aimed at toPt.\n    const fromWall = approachWall(b, a);\n    const fromPt = fromPortMap2.get(`${a.id}:${fromWall}`)?.get(ri)\n      ?? borderPoint({ ...a, y: a.y + yOff }, toPt.x, toPt.y);\n\n    const bends = laid.edgeBends.get(ri);\n    let safePath: string;\n    let labelMid: { x: number; y: number };\n    let skipEdgeLateralStrategy = false;\n    let effectiveFromPt: { x: number; y: number } = fromPt;\n    let effectiveFromWall: Wall = fromWall;\n    let effectiveToPt: { x: number; y: number } = toPt;\n    let effectiveToWall: Wall = toWall;\n\n    if (bends && bends.length > 0) {\n      // \u2500\u2500 Build candidate lane x positions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const srcLayerY = a.y;\n      const tgtLayerY = b.y;\n      const minY = Math.min(srcLayerY, tgtLayerY);\n      const maxY = Math.max(srcLayerY, tgtLayerY);\n      const interBoxes = allRealBoxes.filter(nb => {\n        const cy = nb.y + nb.height / 2;\n        return cy > minY && cy < maxY;\n      });\n\n      // Seed from BK sweeps: the 4 per-dummy x values from the first dummy in chain\n      const firstDummyId = laid.dummyChainIds.get(ri)?.[0] ?? null;\n      const sweepCandidates: number[] = firstDummyId\n        ? (laid.dummySweepXs.get(firstDummyId) ?? [])\n        : [];\n\n      const rightMarginX = Math.max(...allRealBoxes.map(b => b.x + b.width)) + CLEARANCE;\n      const sourceX      = fromPt.x;\n      const realMinX     = Math.min(...allRealBoxes.map(b => b.x));\n\n      // \u2500\u2500 Compute route for each candidate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const exitY  = bends[0]!.y + yOff;\n      const entryY = toPt.y - LAYER_GAP / 2;\n\n      // Adaptive left-margin: push far enough left that horizontal segments at\n      // exitY and entryY clear ALL intermediate boxes.\n      // safeX = min(fromPt.x, toPt.x) - max(intermediate box right edge that\n      // would be crossed by a horizontal from laneX to fromPt.x) - CLEARANCE.\n      // Equivalently: laneX must satisfy laneX < min(interBox.left) for all\n      // interBoxes whose y range overlaps exitY or entryY.\n      const blockingAtExit  = interBoxes.filter(b => exitY  > b.y && exitY  < b.y + b.height);\n      const blockingAtEntry = interBoxes.filter(b => entryY > b.y && entryY < b.y + b.height);\n      const allBlocking     = [...blockingAtExit, ...blockingAtEntry];\n\n      const adaptiveLeftX = allBlocking.length > 0\n        ? Math.min(...allBlocking.map(b => b.x)) - CLEARANCE\n        : realMinX - CLEARANCE;\n\n      const candidates_A: number[] = [\n        ...sweepCandidates,\n        adaptiveLeftX,\n        rightMarginX,\n        sourceX,\n        ...interColMidpoints,\n      ];\n\n      // \u2500\u2500 Mid-wall port coords for non-A strategies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const srcMidY_  = a.y  + a.height  / 2 + yOff;\n      const tgtMidY_  = b.y  + b.height  / 2 + yOff;\n      const srcLeft_  = a.x;\n      const srcRight_ = a.x  + a.width;\n      const tgtLeft_  = b.x;\n      const tgtRight_ = b.x  + b.width;\n\n      // Extended blocking set: covers B/C/D/E/F horizontal segments that may\n      // hit boxes at srcMidY or tgtMidY rows outside the strict inter-layer band.\n      const interBoxesExt = allRealBoxes.filter(nb => {\n        const cy = nb.y + nb.height / 2;\n        return cy > a.y && cy < b.y + b.height && nb.id !== a.id && nb.id !== b.id;\n      });\n\n      // Adaptive left-margin for B/D strategies (left-side lanes)\n      const blockingBD = allRealBoxes.filter(nb => {\n        const ny = nb.y, nh = nb.height;\n        return (srcMidY_ > ny && srcMidY_ < ny + nh) || (tgtMidY_ > ny && tgtMidY_ < ny + nh);\n      });\n      const adaptiveLeftX_BD = blockingBD.length > 0\n        ? Math.min(...blockingBD.map(nb => nb.x)) - LANE_CLEARANCE\n        : realMinX - LANE_CLEARANCE;\n\n      // Adaptive right-margin for C/E strategies (right-side lanes)\n      const adaptiveRightX_CE = blockingBD.length > 0\n        ? Math.max(...blockingBD.map(nb => nb.x + nb.width)) + LANE_CLEARANCE\n        : rightMarginX;\n\n      // Adaptive left-margin for F strategy (checks exitY and tgtMidY rows)\n      const blockingF = allRealBoxes.filter(nb => {\n        return (exitY   > nb.y && exitY   < nb.y + nb.height) ||\n               (tgtMidY_ > nb.y && tgtMidY_ < nb.y + nb.height);\n      });\n      const adaptiveLeftX_F = blockingF.length > 0\n        ? Math.min(...blockingF.map(nb => nb.x)) - LANE_CLEARANCE\n        : realMinX - LANE_CLEARANCE;\n\n      // \u2500\u2500 Segment builder functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      function buildSegmentsA(laneX: number): Array<[number, number, number, number]> {\n        const fx = fromPt.x, fy = fromPt.y;\n        const tx = toPt.x,   ty = toPt.y;\n        if (Math.abs(laneX - fx) < 1 && Math.abs(laneX - tx) < 1) {\n          return [[fx, fy, tx, ty]];\n        }\n        return [\n          [fx,    fy,     fx,    exitY  ],\n          [fx,    exitY,  laneX, exitY  ],\n          [laneX, exitY,  laneX, entryY ],\n          [laneX, entryY, tx,    entryY ],\n          [tx,    entryY, tx,    ty     ],\n        ];\n      }\n\n      function buildSegmentsB(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcLeft_,  srcMidY_, laneX,    srcMidY_],\n          [laneX,     srcMidY_, laneX,    tgtMidY_],\n          [laneX,     tgtMidY_, tgtLeft_, tgtMidY_],\n        ];\n      }\n\n      function buildSegmentsC(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcRight_,  srcMidY_, laneX,     srcMidY_],\n          [laneX,      srcMidY_, laneX,     tgtMidY_],\n          [laneX,      tgtMidY_, tgtRight_, tgtMidY_],\n        ];\n      }\n\n      function buildSegmentsD(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcLeft_, srcMidY_, laneX,  srcMidY_],\n          [laneX,    srcMidY_, laneX,  entryY  ],\n          [laneX,    entryY,   toPt.x, entryY  ],\n          [toPt.x,   entryY,   toPt.x, toPt.y  ],\n        ];\n      }\n\n      function buildSegmentsE(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcRight_, srcMidY_, laneX,  srcMidY_],\n          [laneX,     srcMidY_, laneX,  entryY  ],\n          [laneX,     entryY,   toPt.x, entryY  ],\n          [toPt.x,    entryY,   toPt.x, toPt.y  ],\n        ];\n      }\n\n      function buildSegmentsF(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [fromPt.x, fromPt.y, fromPt.x, exitY   ],\n          [fromPt.x, exitY,    laneX,    exitY   ],\n          [laneX,    exitY,    laneX,    tgtMidY_],\n          [laneX,    tgtMidY_, tgtLeft_, tgtMidY_],\n        ];\n      }\n\n      // \u2500\u2500 Build flat candidate list from all strategies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const allCandidates: RouteCandidate[] = [];\n\n      for (const laneX of candidates_A) {\n        allCandidates.push({\n          strategy: 'A', laneX, isMixed: false,\n          segments: buildSegmentsA(laneX),\n          labelMid: { x: laneX, y: (exitY + entryY) / 2 },\n        });\n      }\n\n      const minAllowedLaneX = Math.min(srcLeft_, tgtLeft_) - LANE_CLEARANCE;\n      const laneXsB = [\n        adaptiveLeftX_BD,                        // LANE_CLEARANCE from nearest box\n        realMinX - LANE_CLEARANCE * 1.5,\n        realMinX - LANE_CLEARANCE * 2,\n        realMinX - LANE_CLEARANCE * 3,\n        ...sweepCandidates,\n      ].filter(x => x <= minAllowedLaneX);      // must have at least LANE_CLEARANCE gap\n      for (const laneX of laneXsB) {\n        allCandidates.push({\n          strategy: 'B', laneX, isMixed: false,\n          segments: buildSegmentsB(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + tgtMidY_) / 2 },\n        });\n      }\n\n      const laneXsC = [\n        adaptiveRightX_CE,\n        rightMarginX,\n        rightMarginX + LANE_CLEARANCE * 0.5,\n        rightMarginX + LANE_CLEARANCE,\n        ...sweepCandidates,\n      ].filter(x => x > Math.max(srcRight_, tgtRight_));\n      for (const laneX of laneXsC) {\n        allCandidates.push({\n          strategy: 'C', laneX, isMixed: false,\n          segments: buildSegmentsC(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + tgtMidY_) / 2 },\n        });\n      }\n\n      const laneXsD = [adaptiveLeftX_BD, realMinX - CLEARANCE, ...sweepCandidates]\n        .filter(x => x < srcLeft_);\n      for (const laneX of laneXsD) {\n        allCandidates.push({\n          strategy: 'D', laneX, isMixed: true,\n          segments: buildSegmentsD(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + entryY) / 2 },\n        });\n      }\n\n      const laneXsE = [adaptiveRightX_CE, rightMarginX, ...sweepCandidates]\n        .filter(x => x > srcRight_);\n      for (const laneX of laneXsE) {\n        allCandidates.push({\n          strategy: 'E', laneX, isMixed: true,\n          segments: buildSegmentsE(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + entryY) / 2 },\n        });\n      }\n\n      const laneXsF = [adaptiveLeftX_F, realMinX - CLEARANCE, ...sweepCandidates]\n        .filter(x => x < tgtLeft_);\n      for (const laneX of laneXsF) {\n        allCandidates.push({\n          strategy: 'F', laneX, isMixed: true,\n          segments: buildSegmentsF(laneX),\n          labelMid: { x: laneX, y: (exitY + tgtMidY_) / 2 },\n        });\n      }\n\n      // \u2500\u2500 Score all candidates and pick best \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      let bestScore     = Infinity;\n      let bestCandidate: RouteCandidate = allCandidates[0] ?? {\n        strategy: 'A', laneX: bends[0]!.x, isMixed: false,\n        segments: buildSegmentsA(bends[0]!.x),\n        labelMid: { x: bends[0]!.x, y: (exitY + entryY) / 2 },\n      };\n\n      for (const c of allCandidates) {\n        // Same-wall bonus: Strategy B (left\u2192left) and C (right\u2192right) are\n        // the canonical routing style for skip edges in the same column.\n        // 30-point bonus ensures they win over A when geometry is clean.\n        const sameWallBonus = (c.strategy === 'B' || c.strategy === 'C') ? 30 : 0;\n        const score = scoreLane(\n          c.laneX, c.segments, interBoxesExt, routedSegments,\n          canvasWidth, realMinX,\n          c.isMixed ? 2.0 : 0,\n          sameWallBonus,\n          0,\n          c.labelMid,\n        );\n        if (score < bestScore) {\n          bestScore     = score;\n          bestCandidate = c;\n        }\n      }\n\n      // \u2500\u2500 Register winning segments \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      for (const [x1, y1, x2, y2] of bestCandidate.segments) {\n        routedSegments.push(toRect(x1, y1, x2, y2));\n      }\n      skipEdgeLateralStrategy = bestCandidate.strategy === 'B' || bestCandidate.strategy === 'C';\n\n      // \u2500\u2500 Determine effective port points and walls for arrowheads \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      switch (bestCandidate.strategy) {\n        case 'B':\n          effectiveFromPt   = { x: srcLeft_,  y: srcMidY_ };\n          effectiveFromWall = 'left';\n          effectiveToPt     = { x: tgtLeft_,  y: tgtMidY_ };\n          effectiveToWall   = 'left';\n          break;\n        case 'C':\n          effectiveFromPt   = { x: srcRight_, y: srcMidY_ };\n          effectiveFromWall = 'right';\n          effectiveToPt     = { x: tgtRight_, y: tgtMidY_ };\n          effectiveToWall   = 'right';\n          break;\n        case 'D':\n          effectiveFromPt   = { x: srcLeft_,  y: srcMidY_ };\n          effectiveFromWall = 'left';\n          break;\n        case 'E':\n          effectiveFromPt   = { x: srcRight_, y: srcMidY_ };\n          effectiveFromWall = 'right';\n          break;\n        case 'F':\n          effectiveToPt     = { x: tgtLeft_,  y: tgtMidY_ };\n          effectiveToWall   = 'left';\n          break;\n      }\n\n      // \u2500\u2500 Render path from winning candidate's segments \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const segs = bestCandidate.segments;\n      if (segs.length === 1) {\n        safePath = `M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])} L ${rhu(segs[0]![2])} ${rhu(segs[0]![3])}`;\n      } else {\n        const pts: string[] = [`M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])}`];\n        for (const [,, x2, y2] of segs) {\n          pts.push(`L ${rhu(x2)} ${rhu(y2)}`);\n        }\n        safePath = pts.join(' ');\n      }\n      labelMid = bestCandidate.labelMid;\n\n      elements.push(p.path(safePath, palette.textMuted, 1.3, r.dashed ? { dash: '6 4' } : {}));\n\n      // When edge is flipped, leftHead belongs at toPt (b=r.left) and rightHead at fromPt (a=r.right).\n      const headFrom = isFlipped ? r.rightHead : r.leftHead;\n      const headTo   = isFlipped ? r.leftHead  : r.rightHead;\n      elements.push(...endMarker(p, effectiveFromPt, wallDir(effectiveFromWall, effectiveFromPt), headFrom, palette));\n      elements.push(...endMarker(p, effectiveToPt,   wallDir(effectiveToWall,   effectiveToPt),   headTo,   palette));\n    } else {\n      // \u2500\u2500 Direct-edge optimizer (X1/X2 for cross-column; V/B/C for same-column) \u2500\u2500\n      const fx = fromPt.x, fy = fromPt.y, tx = toPt.x, ty = toPt.y;\n      const realMinX_d     = Math.min(...allRealBoxes.map(nb => nb.x));\n      const rightMarginX_d = Math.max(...allRealBoxes.map(nb => nb.x + nb.width)) + CLEARANCE;\n      // All real boxes except source and target are obstacles.\n      const interBoxesDirect = allRealBoxes.filter(nb => nb.id !== a.id && nb.id !== b.id);\n\n      const directCandidates: RouteCandidate[] = [];\n\n      if (cls === 'direct-same-column') {\n        // V: straight vertical (or near-vertical) \u2014 gets a straightBonus\n        directCandidates.push({\n          strategy: 'V', laneX: fx, isMixed: false,\n          segments: [[fx, fy, tx, ty]],\n          labelMid: { x: fx, y: (fy + ty) / 2 },\n        });\n        // B/C: left/right wall lanes (same builders as skip edges)\n        const srcMidY_d  = a.y + a.height / 2 + yOff;\n        const tgtMidY_d  = b.y + b.height / 2 + yOff;\n        const srcLeft_d  = a.x;\n        const srcRight_d = a.x + a.width;\n        const tgtLeft_d  = b.x;\n        const tgtRight_d = b.x + b.width;\n        const blockingBD_d = allRealBoxes.filter(nb => {\n          const ny = nb.y, nh = nb.height;\n          return (srcMidY_d > ny && srcMidY_d < ny + nh) ||\n                 (tgtMidY_d > ny && tgtMidY_d < ny + nh);\n        });\n        const adaptiveLeftX_BD_d = blockingBD_d.length > 0\n          ? Math.min(...blockingBD_d.map(nb => nb.x)) - LANE_CLEARANCE\n          : realMinX_d - LANE_CLEARANCE;\n        const adaptiveRightX_CE_d = blockingBD_d.length > 0\n          ? Math.max(...blockingBD_d.map(nb => nb.x + nb.width)) + LANE_CLEARANCE\n          : rightMarginX_d;\n        if (adaptiveLeftX_BD_d < srcLeft_d) {\n          directCandidates.push({\n            strategy: 'B', laneX: adaptiveLeftX_BD_d, isMixed: false,\n            segments: [\n              [srcLeft_d,  srcMidY_d, adaptiveLeftX_BD_d,  srcMidY_d],\n              [adaptiveLeftX_BD_d, srcMidY_d, adaptiveLeftX_BD_d, tgtMidY_d],\n              [adaptiveLeftX_BD_d, tgtMidY_d, tgtLeft_d,  tgtMidY_d],\n            ],\n            labelMid: { x: adaptiveLeftX_BD_d, y: (srcMidY_d + tgtMidY_d) / 2 },\n          });\n        }\n        if (adaptiveRightX_CE_d > srcRight_d) {\n          directCandidates.push({\n            strategy: 'C', laneX: adaptiveRightX_CE_d, isMixed: false,\n            segments: [\n              [srcRight_d,  srcMidY_d, adaptiveRightX_CE_d,  srcMidY_d],\n              [adaptiveRightX_CE_d, srcMidY_d, adaptiveRightX_CE_d, tgtMidY_d],\n              [adaptiveRightX_CE_d, tgtMidY_d, tgtRight_d,  tgtMidY_d],\n            ],\n            labelMid: { x: adaptiveRightX_CE_d, y: (srcMidY_d + tgtMidY_d) / 2 },\n          });\n        }\n      } else {\n        // direct-cross-column: X1 (V-then-H) and X2 (H-then-V) families\n        // \u2500\u2500 X1 candidates \u2500\u2500\n        const midYRaw = [\n          (fy + ty) / 2,\n          fy + LAYER_GAP / 2,\n          ty - LAYER_GAP / 2,\n        ];\n        for (const midY of dedup(midYRaw, 2)) {\n          const segsX1: Array<[number, number, number, number]> = Math.abs(fx - tx) < 1\n            ? [[fx, fy, tx, ty]]\n            : [[fx, fy, fx, midY], [fx, midY, tx, midY], [tx, midY, tx, ty]];\n          directCandidates.push({\n            strategy: 'X1', laneX: (fx + tx) / 2, isMixed: false,\n            segments: segsX1,\n            labelMid: { x: (fx + tx) / 2, y: midY },\n          });\n        }\n        // \u2500\u2500 X2 candidates \u2500\u2500\n        const midXRaw = [\n          ...interColMidpoints.filter(x => x > Math.min(fx, tx) && x < Math.max(fx, tx)),\n          realMinX_d - CLEARANCE,\n          rightMarginX_d,\n        ];\n        for (const midX of dedup(midXRaw, 2)) {\n          const segsX2: Array<[number, number, number, number]> = Math.abs(fy - ty) < 1\n            ? [[fx, fy, tx, ty]]\n            : [[fx, fy, midX, fy], [midX, fy, midX, ty], [midX, ty, tx, ty]];\n          directCandidates.push({\n            strategy: 'X2', laneX: midX, isMixed: false,\n            segments: segsX2,\n            labelMid: { x: midX, y: (fy + ty) / 2 },\n          });\n        }\n      }\n\n      // \u2500\u2500 Score all direct candidates and pick best \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      let bestScoreDirect = Infinity;\n      let bestDirect: RouteCandidate | null = directCandidates[0] ?? null;\n      for (const c of directCandidates) {\n        const straightBns = c.strategy === 'V' ? 40 : 0;\n        // For X1/X2 cross-column routes, use ALL boxes (including src/tgt)\n        // so segments that clip through the source or target body are penalised.\n        const boxesForScoring = (c.strategy === 'X1' || c.strategy === 'X2')\n          ? allRealBoxes\n          : interBoxesDirect;\n        const score = scoreLane(\n          c.laneX, c.segments, boxesForScoring, routedSegments,\n          canvasWidth, realMinX_d,\n          c.isMixed ? 2.0 : 0,\n          0,\n          straightBns,\n          c.labelMid,\n        );\n        if (score < bestScoreDirect) {\n          bestScoreDirect = score;\n          bestDirect = c;\n        }\n      }\n\n      if (bestScoreDirect === Infinity || bestDirect == null || cls === 'direct-same-column') {\n        // Same-column direct edges: always use routeEdge() \u2014 cascade ports\n        // already handle port spreading; the V candidate deviates from them.\n        // Cross-column fallback when all candidates score Infinity.\n        const routed = routeEdge(a, b, allBoxes, yOff, fromPt, toPt, true);\n        safePath = routed.path || `M ${fromPt.x} ${fromPt.y} L ${toPt.x} ${toPt.y}`;\n        labelMid = routed.labelMidpoint;\n        // Register routeEdge segments so later edges see claimed corridors.\n        routedSegments.push(toRect(fromPt.x, fromPt.y, toPt.x, toPt.y));\n      } else {\n        // Register winning segments so later edges see claimed corridors.\n        for (const [x1, y1, x2, y2] of bestDirect.segments) {\n          routedSegments.push(toRect(x1, y1, x2, y2));\n        }\n        safePath = segmentsToPath(bestDirect.segments);\n        labelMid = bestDirect.labelMid;\n      }\n\n      elements.push(p.path(safePath, palette.textMuted, 1.3, r.dashed ? { dash: '6 4' } : {}));\n      elements.push(...endMarker(p, effectiveFromPt, wallDir(effectiveFromWall, effectiveFromPt), isFlipped ? r.rightHead : r.leftHead,  palette));\n      elements.push(...endMarker(p, effectiveToPt,   wallDir(effectiveToWall,   effectiveToPt),   isFlipped ? r.leftHead  : r.rightHead, palette));\n    }\n\n    const mx = labelMid.x, my = labelMid.y;\n    if (r.label) {\n      let labelX: number, labelAnchor: 'start' | 'middle' | 'end';\n      if (skipEdgeLateralStrategy && labelMid.x < Math.min(...allRealBoxes.map(b => b.x))) {\n        labelX = mx - 4; labelAnchor = 'end';\n      } else if (skipEdgeLateralStrategy) {\n        labelX = mx + 8; labelAnchor = 'start';\n      } else {\n        labelX = mx; labelAnchor = 'middle';\n      }\n      elements.push(p.text(r.label, rhuInt(labelX), rhuInt(my - 4), memFont, palette.textMuted, { anchor: labelAnchor }));\n    }\n    const cardOffset = (wall: Wall, pt: { x: number; y: number }): { cx: number; cy: number } => {\n      switch (wall) {\n        case 'top':    return { cx: pt.x + 10, cy: pt.y - 10 };\n        case 'bottom': return { cx: pt.x + 10, cy: pt.y + 10 };\n        case 'left':   return { cx: pt.x - 10, cy: pt.y - 10 };\n        default:       return { cx: pt.x + 10, cy: pt.y - 10 };\n      }\n    };\n    if (r.leftCard)  { const o = cardOffset(isFlipped ? effectiveToWall   : effectiveFromWall, isFlipped ? effectiveToPt   : effectiveFromPt); elements.push(p.text(r.leftCard,  rhu(o.cx), rhu(o.cy), memFont, palette.textMuted)); }\n    if (r.rightCard) { const o = cardOffset(isFlipped ? effectiveFromWall : effectiveToWall,   isFlipped ? effectiveFromPt : effectiveToPt);   elements.push(p.text(r.rightCard, rhu(o.cx), rhu(o.cy), memFont, palette.textMuted)); }\n  }\n\n  // \u2500\u2500 Class boxes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const c of ir.classes) {\n    const box = laid.boxes.get(c.name)!;\n    const s = sizes.get(c.name)!;\n    const x = box.x, y = box.y + yOff;\n    elements.push(p.rect({ x: rhu(x), y: rhu(y), width: rhu(s.w), height: rhu(s.h) }, palette.surface, palette.border, 1.4, { rx: 4 }));\n\n    // Header \u2014 title vertically centered in headH band\n    const headerMidY = y + headH / 2;\n    let ty = headerMidY + nameFont * 0.35; // 0.35 \u2248 half cap-height for baseline offset\n    elements.push(p.text(c.name, rhuInt(x + s.w / 2), rhu(ty), nameFont, palette.text, { weight: 'bold', anchor: 'middle' }));\n    if (c.stereotype) { ty += memFont + 2; elements.push(p.text(`\u00AB${c.stereotype}\u00BB`, rhuInt(x + s.w / 2), rhu(ty), memFont, palette.textMuted, { anchor: 'middle' })); }\n    const headerBottom = y + headH + (c.stereotype ? memFont + 4 : 0);\n    elements.push(p.path(`M ${rhu(x)} ${rhu(headerBottom)} L ${rhu(x + s.w)} ${rhu(headerBottom)}`, palette.border, 1));\n\n    // Attributes\n    let ay = headerBottom + lineH - 4;\n    for (const m of c.attributes) { elements.push(p.text(m.text, rhu(x + 8), rhu(ay), memFont, palette.text)); ay += lineH; }\n    const attrBottom = y + s.attrH;\n    elements.push(p.path(`M ${rhu(x)} ${rhu(attrBottom)} L ${rhu(x + s.w)} ${rhu(attrBottom)}`, palette.border, 1));\n\n    // Methods\n    let my2 = attrBottom + lineH - 4;\n    for (const m of c.methods) { elements.push(p.text(m.text, rhu(x + 8), rhu(my2), memFont, palette.text)); my2 += lineH; }\n  }\n\n  const totalW = rhuInt(laid.width + margin);\n  const totalH = rhuInt(laid.height + yOff + margin);\n\n  // If any skip-edge routing went left of x=margin (Strategy B lateral lanes),\n  // expand the viewBox leftward. Add extra margin for the label text width (~48px).\n  const LABEL_EXTRA = 48;\n  const routingMinX = Math.min(0, ...routedSegments.map(s => s.x1));\n  const leftOvershoot = routingMinX < margin ? Math.ceil(margin - routingMinX) + LABEL_EXTRA : 0;\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: -leftOvershoot, y: 0, width: totalW + leftOvershoot, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n\n/** Draw a UML relationship end marker at `at`, pointing from `toward` into the box. */\nfunction endMarker(\n  p: ReturnType<typeof pen>,\n  at: { x: number; y: number },\n  toward: { x: number; y: number },\n  type: RelEnd,\n  palette: ResolvedTheme['palette'],\n): SceneElement[] {\n  if (type === 'none') return [];\n  const ang = Math.atan2(at.y - toward.y, at.x - toward.x); // points outward from box centre toward marker\n  const back = ang + Math.PI; // into the box\n  const at2 = (len: number, spread: number) => ({\n    x: at.x + Math.cos(back + spread) * len,\n    y: at.y + Math.sin(back + spread) * len,\n  });\n  const tip = `${rhu(at.x)} ${rhu(at.y)}`;\n\n  if (type === 'arrow') {\n    const a = at2(12, 0.4), b = at2(12, -0.4);\n    return [p.path(`M ${rhu(a.x)} ${rhu(a.y)} L ${tip} L ${rhu(b.x)} ${rhu(b.y)}`, palette.textMuted, 1.4)];\n  }\n  if (type === 'triangle') {\n    const a = at2(14, 0.45), b = at2(14, -0.45);\n    return [p.path(`M ${tip} L ${rhu(a.x)} ${rhu(a.y)} L ${rhu(b.x)} ${rhu(b.y)} Z`, palette.textMuted, 1.3, { fill: palette.background })];\n  }\n  // diamonds\n  const near = at2(11, 0);\n  const a = at2(8, 0.9), b = at2(8, -0.9);\n  const fill = type === 'diamondF' ? palette.textMuted : palette.background;\n  return [p.path(`M ${tip} L ${rhu(a.x)} ${rhu(a.y)} L ${rhu(near.x)} ${rhu(near.y)} L ${rhu(b.x)} ${rhu(b.y)} Z`, palette.textMuted, 1.3, { fill })];\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function relHeads(tok) {\n    const dashed = tok.includes('..');\n    let leftHead = 'none', rightHead = 'none';\n    if (tok.startsWith('<|')) leftHead = 'triangle';\n    else if (tok.startsWith('*')) leftHead = 'diamondF';\n    else if (tok.startsWith('o')) leftHead = 'diamondO';\n    else if (tok.startsWith('<')) leftHead = 'arrow';\n    if (tok.endsWith('|>')) rightHead = 'triangle';\n    else if (tok.endsWith('*')) rightHead = 'diamondF';\n    else if (tok.endsWith('o')) rightHead = 'diamondO';\n    else if (tok.endsWith('>')) rightHead = 'arrow';\n    return { leftHead, rightHead, dashed };\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"classdiagram\";\n  var peg$c1 = \"-v2\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"class\";\n  var peg$c4 = \"{\";\n  var peg$c5 = \"\\r\";\n  var peg$c6 = \"\\n\";\n  var peg$c7 = \"}\";\n  var peg$c8 = \":\";\n  var peg$c9 = \"note\";\n  var peg$c10 = \"<|--\";\n  var peg$c11 = \"<|..\";\n  var peg$c12 = \"--|>\";\n  var peg$c13 = \"..|>\";\n  var peg$c14 = \"*--\";\n  var peg$c15 = \"--*\";\n  var peg$c16 = \"o--\";\n  var peg$c17 = \"--o\";\n  var peg$c18 = \"<--\";\n  var peg$c19 = \"-->\";\n  var peg$c20 = \"<..\";\n  var peg$c21 = \"..>\";\n  var peg$c22 = \"..\";\n  var peg$c23 = \"--\";\n  var peg$c24 = \"\\\"\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[A-Za-z0-9_~]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"classDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"-v2\", false);\n  var peg$e2 = peg$literalExpectation(\"---\", false);\n  var peg$e3 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\"class\", true);\n  var peg$e5 = peg$literalExpectation(\"{\", false);\n  var peg$e6 = peg$literalExpectation(\"\\r\", false);\n  var peg$e7 = peg$literalExpectation(\"\\n\", false);\n  var peg$e8 = peg$literalExpectation(\"}\", false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$literalExpectation(\"note\", true);\n  var peg$e11 = peg$literalExpectation(\"<|--\", false);\n  var peg$e12 = peg$literalExpectation(\"<|..\", false);\n  var peg$e13 = peg$literalExpectation(\"--|>\", false);\n  var peg$e14 = peg$literalExpectation(\"..|>\", false);\n  var peg$e15 = peg$literalExpectation(\"*--\", false);\n  var peg$e16 = peg$literalExpectation(\"--*\", false);\n  var peg$e17 = peg$literalExpectation(\"o--\", false);\n  var peg$e18 = peg$literalExpectation(\"--o\", false);\n  var peg$e19 = peg$literalExpectation(\"<--\", false);\n  var peg$e20 = peg$literalExpectation(\"-->\", false);\n  var peg$e21 = peg$literalExpectation(\"<..\", false);\n  var peg$e22 = peg$literalExpectation(\"..>\", false);\n  var peg$e23 = peg$literalExpectation(\"..\", false);\n  var peg$e24 = peg$literalExpectation(\"--\", false);\n  var peg$e25 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e26 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e27 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"~\"], false, false);\n  var peg$e28 = peg$anyExpectation();\n  var peg$e29 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const classes = [];\n      const relations = [];\n      const ensure = (name) => {\n        let c = classes.find(x => x.name === name);\n        if (!c) { c = { name, attributes: [], methods: [] }; classes.push(c); }\n        return c;\n      };\n      const addMember = (c, raw) => {\n        const s = raw.trim();\n        if (!s) return;\n        if (s.startsWith('<<')) { c.stereotype = s.replace(/[<>]/g, '').trim(); return; }\n        const isMethod = s.includes('(');\n        (isMethod ? c.methods : c.attributes).push({ text: s, isMethod });\n      };\n      for (const st of stmts.filter(Boolean)) {\n        if (st.t === 'class') { const c = ensure(st.name); for (const m of st.members) addMember(c, m); }\n        else if (st.t === 'member') addMember(ensure(st.name), st.content);\n        else if (st.t === 'relation') {\n          ensure(st.left); ensure(st.right);\n          const { leftHead, rightHead, dashed } = relHeads(st.tok);\n          relations.push({ left: st.left, right: st.right, leftHead, rightHead, dashed,\n            ...(st.label ? { label: st.label } : {}),\n            ...(st.lc ? { leftCard: st.lc } : {}),\n            ...(st.rc ? { rightCard: st.rc } : {}) });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, classes, relations };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(name, rows) { return { t: 'class', name, members: rows.filter(Boolean) }; };\n  var peg$f4 = function(content) { return content.trim(); };\n  var peg$f5 = function() { return null; };\n  var peg$f6 = function(name, content) { return { t: 'member', name, content: content.trim() }; };\n  var peg$f7 = function(left, lc, tok, rc, right, l) { return l.trim(); };\n  var peg$f8 = function(left, lc, tok, rc, right, label) {\n      return { t: 'relation', left, right, tok, lc: lc || undefined, rc: rc || undefined, label: label || undefined };\n    };\n  var peg$f9 = function() { return null; };\n  var peg$f10 = function(s) { return s; };\n  var peg$f11 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 12);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 12;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c1) {\n        s4 = peg$c1;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseClassBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRelation();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseClassMemberLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseNoteLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseClassBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 123) {\n            s6 = peg$c4;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s8 = peg$c5;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s8 === peg$FAILED) {\n              s8 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s9 = peg$c6;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = [];\n              s11 = peg$parseMemberRow();\n              while (s11 !== peg$FAILED) {\n                s10.push(s11);\n                s11 = peg$parseMemberRow();\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 125) {\n                s12 = peg$c7;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parseLineEnd();\n                if (s13 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f3(s4, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMemberRow() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 125) {\n      s3 = peg$c7;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r0.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s4 = peg$c5;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s5 = peg$c6;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f4(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c5;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseClassMemberLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c8;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseRestOfLine();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelation() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseCardStr();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parse_();\n      s6 = peg$parseRelTok();\n      if (s6 !== peg$FAILED) {\n        s7 = peg$parse_();\n        s8 = peg$parseCardStr();\n        if (s8 === peg$FAILED) {\n          s8 = null;\n        }\n        s9 = peg$parse_();\n        s10 = peg$parseIdent();\n        if (s10 !== peg$FAILED) {\n          s11 = peg$currPos;\n          s12 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s13 = peg$c8;\n            peg$currPos++;\n          } else {\n            s13 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s13 !== peg$FAILED) {\n            s14 = peg$parse_();\n            s15 = peg$parseRestOfLine();\n            if (s15 !== peg$FAILED) {\n              peg$savedPos = s11;\n              s11 = peg$f7(s2, s4, s6, s8, s10, s15);\n            } else {\n              peg$currPos = s11;\n              s11 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s11;\n            s11 = peg$FAILED;\n          }\n          if (s11 === peg$FAILED) {\n            s11 = null;\n          }\n          s12 = peg$parseLineEnd();\n          if (s12 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f8(s2, s4, s6, s8, s10, s11);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c9) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f9();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelTok() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c10) {\n      s1 = peg$c10;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c11) {\n        s1 = peg$c11;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c12) {\n          s1 = peg$c12;\n          peg$currPos += 4;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c13) {\n            s1 = peg$c13;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c14) {\n              s1 = peg$c14;\n              peg$currPos += 3;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 3) === peg$c15) {\n                s1 = peg$c15;\n                peg$currPos += 3;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 3) === peg$c16) {\n                  s1 = peg$c16;\n                  peg$currPos += 3;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 3) === peg$c17) {\n                    s1 = peg$c17;\n                    peg$currPos += 3;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 3) === peg$c18) {\n                      s1 = peg$c18;\n                      peg$currPos += 3;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                    }\n                    if (s1 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 3) === peg$c19) {\n                        s1 = peg$c19;\n                        peg$currPos += 3;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n                      }\n                      if (s1 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 3) === peg$c20) {\n                          s1 = peg$c20;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n                        }\n                        if (s1 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 3) === peg$c21) {\n                            s1 = peg$c21;\n                            peg$currPos += 3;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e22); }\n                          }\n                          if (s1 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 2) === peg$c22) {\n                              s1 = peg$c22;\n                              peg$currPos += 2;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e23); }\n                            }\n                            if (s1 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 2) === peg$c23) {\n                                s1 = peg$c23;\n                                peg$currPos += 2;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e24); }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardStr() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c24;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c24;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e27); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e27); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f11();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e28); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e29); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e29); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { ClassDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutClass } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { ClassDocument, ClassBox, ClassMember, ClassRelation } from './ir.js';\n\nexport const classDiagram: DiagramModule<ClassDocument> = {\n  parseMermaid(input: string): ClassDocument {\n    return parser.parse(input) as ClassDocument;\n  },\n\n  parseYaml(input: string): ClassDocument {\n    return JSON.parse(input) as ClassDocument;\n  },\n\n  layout(ir: ClassDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutClass(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/state/layout.ts \u2014 UML state machine.\n *\n * States place via the shared layered kernel; transitions draw as arrows\n * clipped to node borders with optional labels. Pseudo-states render specially:\n * start (filled dot), end (ringed dot), choice (diamond).\n */\n\nimport type { StateDocument, StateNode } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { layeredLayout, routeEdge, type GraphNode, type GraphEdge } from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'state-arrow';\n\nexport function layoutState(ir: StateDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n\n  const sizeOf = (s: StateNode): { w: number; h: number } => {\n    if (s.kind === 'start' || s.kind === 'end') return { w: 22, h: 22 };\n    if (s.kind === 'choice') return { w: 34, h: 34 };\n    return { w: Math.max(76, measureText(s.label, font).width + 28), h: 38 };\n  };\n  const sizes = new Map(ir.states.map(s => [s.id, sizeOf(s)]));\n\n  const nodes: GraphNode[] = ir.states.map(s => ({ id: s.id, width: sizes.get(s.id)!.w, height: sizes.get(s.id)!.h }));\n  const edges: GraphEdge[] = ir.transitions.map(t => ({ from: t.from, to: t.to }));\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 56, nodeGap: 40, margin });\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n\n  const elements: SceneElement[] = [];\n  if (title) elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Composite containers (bounding boxes around members) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const composites = ir.composites ?? [];\n  const containerRect = new Map<string, { x: number; y: number; width: number; height: number }>();\n  const hidden = new Set<string>();      // composite node ids hidden in favour of their container\n  for (const comp of composites) {\n    const memberIdSet = new Set(comp.nodeIds);\n    const rects = comp.nodeIds.map(id => laid.boxes.get(id)).filter((r): r is NonNullable<typeof r> => !!r);\n    if (rects.length === 0) continue;\n    const pad = 16;\n    let minX = Math.min(...rects.map(r => r.x)) - pad;\n    let minY = Math.min(...rects.map(r => r.y)) - pad - 14 + yOff;\n    let maxX = Math.max(...rects.map(r => r.x + r.width)) + pad;\n    let maxY = Math.max(...rects.map(r => r.y + r.height)) + pad + yOff;\n\n    // Clamp boundary so it does not encroach on non-member nodes that share the\n    // same y-range. This prevents the container from overlapping sibling nodes.\n    for (const [id, box] of laid.boxes) {\n      if (memberIdSet.has(id) || hidden.has(id)) continue;\n      const nmMinY = box.y;\n      const nmMaxY = box.y + box.height;\n      const rawMinY = Math.min(...rects.map(r => r.y)) - pad;\n      const rawMaxY = Math.max(...rects.map(r => r.y + r.height)) + pad;\n      // Skip if no y-overlap with the composite boundary range.\n      if (nmMaxY <= rawMinY || nmMinY >= rawMaxY) continue;\n      // Non-member overlaps in y \u2014 ensure the x boundary stays clear.\n      const nmLeft = box.x, nmRight = box.x + box.width;\n      const memberCentreX = (Math.min(...rects.map(r => r.x)) + Math.max(...rects.map(r => r.x + r.width))) / 2;\n      if (nmLeft < maxX && nmRight > minX) {\n        if (nmRight <= memberCentreX) {\n          // Non-member is left of members \u2014 push our left boundary right.\n          minX = Math.max(minX, nmRight + 4);\n        } else {\n          // Non-member is right of members \u2014 push our right boundary left.\n          maxX = Math.min(maxX, nmLeft - 4);\n        }\n      }\n    }\n\n    const rect = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n    containerRect.set(comp.id, rect);\n    hidden.add(comp.id);\n    elements.push(p.rect({ x: rhu(minX), y: rhu(minY), width: rhu(rect.width), height: rhu(rect.height) }, palette.surface, palette.primary, 1.4, { rx: 10, opacity: 0.5 }));\n    elements.push(p.text(comp.label, rhu(minX + 12), rhu(minY + 16), typography.smallFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // Resolve a node's effective rect (container for composites, box otherwise).\n  const rectFor = (id: string): { x: number; y: number; width: number; height: number } | undefined => {\n    const c = containerRect.get(id);\n    if (c) return c;\n    const b = laid.boxes.get(id);\n    return b ? { x: b.x, y: b.y + yOff, width: b.width, height: b.height } : undefined;\n  };\n\n  // \u2500\u2500 Transitions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const t of ir.transitions) {\n    const a = rectFor(t.from), b = rectFor(t.to);\n    if (!a || !b) continue;\n    const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 };\n    const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n    const pa = borderPoint(a, bc.x, bc.y);\n    const pb = borderPoint(b, ac.x, ac.y);\n    // Use routed path for obstacle avoidance; fall back to straight for\n    // composite-to-member transitions where one endpoint is inside a container.\n    const fromBox = laid.boxes.get(t.from), toBox = laid.boxes.get(t.to);\n    let edgePath: string;\n    if (fromBox && toBox) {\n      ({ path: edgePath } = routeEdge(fromBox, toBox, allBoxes, yOff));\n    } else {\n      edgePath = `M ${rhu(pa.x)} ${rhu(pa.y)} L ${rhu(pb.x)} ${rhu(pb.y)}`;\n    }\n    elements.push(p.path(edgePath, palette.textMuted, 1.4, { markerEnd: ARROW_ID }));\n    if (t.label) {\n      let mx = (pa.x + pb.x) / 2, my = (pa.y + pb.y) / 2;\n      // Only shift label outside a composite boundary if exactly one endpoint\n      // belongs to that composite (cross-boundary edge). Inner transitions\n      // (both endpoints inside) keep their labels inside the boundary.\n      for (const [compId, cr] of containerRect) {\n        const comp = composites.find(c => c.id === compId);\n        if (!comp) continue;\n        const fromInside = comp.nodeIds.includes(t.from);\n        const toInside   = comp.nodeIds.includes(t.to);\n        if (fromInside && toInside) continue;   // inner: no shift needed\n        if (!fromInside && !toInside) continue; // unrelated: no shift needed\n        // Cross-boundary: shift label outside if midpoint landed inside.\n        if (mx > cr.x && mx < cr.x + cr.width && my > cr.y && my < cr.y + cr.height) {\n          my = cr.y - typography.smallFontSize - 4;\n          break;\n        }\n      }\n      const w = measureText(t.label, typography.smallFontSize).width + 8;\n      elements.push(p.rect({ x: rhu(mx - w / 2), y: rhu(my - typography.smallFontSize), width: rhu(w), height: typography.smallFontSize + 4 }, palette.background, palette.background, 0));\n      elements.push(p.text(t.label, rhuInt(mx), rhu(my - 1), typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  // \u2500\u2500 States \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const s of ir.states) {\n    if (hidden.has(s.id)) continue;\n    const box = laid.boxes.get(s.id)!;\n    const x = box.x, y = box.y + yOff;\n    const cx = x + box.width / 2, cy = y + box.height / 2;\n    if (s.kind === 'start') {\n      elements.push(p.circle({ x: rhu(cx), y: rhu(cy), }, 8, palette.text, palette.text, 0));\n    } else if (s.kind === 'end') {\n      elements.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 10, 'none', palette.text, 1.5));\n      elements.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 5, palette.text, palette.text, 0));\n    } else if (s.kind === 'choice') {\n      const r = box.width / 2;\n      elements.push(p.path(`M ${rhu(cx)} ${rhu(cy - r)} L ${rhu(cx + r)} ${rhu(cy)} L ${rhu(cx)} ${rhu(cy + r)} L ${rhu(cx - r)} ${rhu(cy)} Z`, palette.border, 1.4, { fill: palette.surface }));\n    } else {\n      elements.push(p.rect({ x: rhu(x), y: rhu(y), width: rhu(box.width), height: rhu(box.height) }, palette.surface, palette.primary, 1.4, { rx: 10 }));\n      elements.push(p.text(s.label, rhuInt(cx), rhu(cy + font * 0.35), font, palette.text, { anchor: 'middle', weight: 'bold' }));\n    }\n  }\n\n  const totalW = rhuInt(laid.width + margin);\n  const totalH = rhuInt(laid.height + yOff + margin);\n  const defs = [`<marker id=\"${ARROW_ID}\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><polygon points=\"0 0, 10 4, 0 8\" fill=\"${palette.textMuted}\" /></marker>`];\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n    defs,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function collect(stmts, states, transitions, composites) {\n    const ensure = (id, label, kind) => {\n      let s = states.find(x => x.id === id);\n      if (!s) { s = { id, label: label || id, kind: kind || 'normal' }; states.push(s); }\n      else if (kind && s.kind === 'normal') s.kind = kind;\n      return s;\n    };\n    const ref = (r, side) => {\n      if (r === '[*]') { const id = side === 'from' ? '__start__' : '__end__'; ensure(id, '', side === 'from' ? 'start' : 'end'); return id; }\n      ensure(r); return r;\n    };\n    const localIds = new Set();\n    for (const st of stmts.filter(Boolean)) {\n      if (st.t === 'choice') { ensure(st.id, st.id, 'choice'); localIds.add(st.id); }\n      else if (st.t === 'state') { ensure(st.id, st.label || st.id, 'normal'); localIds.add(st.id); }\n      else if (st.t === 'trans') {\n        const f = ref(st.from, 'from'), to = ref(st.to, 'to');\n        transitions.push({ from: f, to: to, ...(st.label ? { label: st.label } : {}) });\n        if (f !== '__start__' && f !== '__end__') localIds.add(f);\n        if (to !== '__start__' && to !== '__end__') localIds.add(to);\n      } else if (st.t === 'block') {\n        ensure(st.name, st.name, 'normal');\n        const innerIds = collect(st.inner, states, transitions, composites);\n        const memberIds = [...innerIds].filter(id => id !== '__start__' && id !== '__end__');\n        composites.push({ id: st.name, label: st.name, nodeIds: memberIds });\n        for (const id of innerIds) localIds.add(id);\n        localIds.add(st.name);\n      }\n    }\n    return localIds;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"statediagram\";\n  var peg$c1 = \"-v2\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"state\";\n  var peg$c4 = \"{\";\n  var peg$c5 = \"\\r\";\n  var peg$c6 = \"\\n\";\n  var peg$c7 = \"}\";\n  var peg$c8 = \"<<\";\n  var peg$c9 = \"choice\";\n  var peg$c10 = \"fork\";\n  var peg$c11 = \"join\";\n  var peg$c12 = \">>\";\n  var peg$c13 = \"-->\";\n  var peg$c14 = \":\";\n  var peg$c15 = \"as\";\n  var peg$c16 = \"direction\";\n  var peg$c17 = \"note\";\n  var peg$c18 = \"[*]\";\n  var peg$c19 = \"\\\"\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"stateDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"-v2\", false);\n  var peg$e2 = peg$literalExpectation(\"---\", false);\n  var peg$e3 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\"state\", true);\n  var peg$e5 = peg$literalExpectation(\"{\", false);\n  var peg$e6 = peg$literalExpectation(\"\\r\", false);\n  var peg$e7 = peg$literalExpectation(\"\\n\", false);\n  var peg$e8 = peg$literalExpectation(\"}\", false);\n  var peg$e9 = peg$literalExpectation(\"<<\", false);\n  var peg$e10 = peg$literalExpectation(\"choice\", false);\n  var peg$e11 = peg$literalExpectation(\"fork\", false);\n  var peg$e12 = peg$literalExpectation(\"join\", false);\n  var peg$e13 = peg$literalExpectation(\">>\", false);\n  var peg$e14 = peg$literalExpectation(\"-->\", false);\n  var peg$e15 = peg$literalExpectation(\":\", false);\n  var peg$e16 = peg$literalExpectation(\"as\", true);\n  var peg$e17 = peg$literalExpectation(\"direction\", true);\n  var peg$e18 = peg$literalExpectation(\"note\", true);\n  var peg$e19 = peg$literalExpectation(\"[*]\", false);\n  var peg$e20 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e21 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e22 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e23 = peg$anyExpectation();\n  var peg$e24 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const states = [];\n      const transitions = [];\n      const composites = [];\n      collect(stmts, states, transitions, composites);\n      return { version: '1.0', metadata: { ...(fm || {}) }, states, transitions, ...(composites.length ? { composites } : {}) };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(name, inner) { return { t: 'block', name, inner }; };\n  var peg$f4 = function(id) { return { t: 'choice', id }; };\n  var peg$f5 = function(from, to, l) { return l.trim(); };\n  var peg$f6 = function(from, to, label) {\n      return { t: 'trans', from, to, label: label || undefined };\n    };\n  var peg$f7 = function(label, id) { return { t: 'state', id, label }; };\n  var peg$f8 = function(id) { return { t: 'state', id, label: id }; };\n  var peg$f9 = function() { return null; };\n  var peg$f10 = function() { return '[*]'; };\n  var peg$f11 = function(s) { return s; };\n  var peg$f12 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 12);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 12;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c1) {\n        s4 = peg$c1;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseStateBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseChoiceDecl();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseTransition();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseStateDecl();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseDirectiveLine();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 123) {\n            s6 = peg$c4;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s8 = peg$c5;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s8 === peg$FAILED) {\n              s8 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s9 = peg$c6;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = [];\n              s11 = peg$parseStatement();\n              while (s11 !== peg$FAILED) {\n                s10.push(s11);\n                s11 = peg$parseStatement();\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 125) {\n                s12 = peg$c7;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parseLineEnd();\n                if (s13 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f3(s4, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseChoiceDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c8) {\n              s6 = peg$c8;\n              peg$currPos += 2;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e9); }\n            }\n            if (s6 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 6) === peg$c9) {\n                s7 = peg$c9;\n                peg$currPos += 6;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e10); }\n              }\n              if (s7 === peg$FAILED) {\n                if (input.substr(peg$currPos, 4) === peg$c10) {\n                  s7 = peg$c10;\n                  peg$currPos += 4;\n                } else {\n                  s7 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e11); }\n                }\n                if (s7 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c11) {\n                    s7 = peg$c11;\n                    peg$currPos += 4;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e12); }\n                  }\n                }\n              }\n              if (s7 !== peg$FAILED) {\n                if (input.substr(peg$currPos, 2) === peg$c12) {\n                  s8 = peg$c12;\n                  peg$currPos += 2;\n                } else {\n                  s8 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e13); }\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parseLineEnd();\n                  if (s9 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f4(s4);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTransition() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseStateRef();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.substr(peg$currPos, 3) === peg$c13) {\n        s4 = peg$c13;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseStateRef();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$currPos;\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s9 = peg$c14;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseRestOfLine();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s7;\n              s7 = peg$f5(s2, s6, s11);\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 === peg$FAILED) {\n            s7 = null;\n          }\n          s8 = peg$parseLineEnd();\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s2, s6, s7);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseQuotedOrId();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = input.substr(peg$currPos, 2);\n            if (s6.toLowerCase() === peg$c15) {\n              peg$currPos += 2;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse__();\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parseIdent();\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parseLineEnd();\n                  if (s9 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f7(s4, s8);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      s2 = input.substr(peg$currPos, 5);\n      if (s2.toLowerCase() === peg$c3) {\n        peg$currPos += 5;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseIdent();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parseLineEnd();\n            if (s5 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f8(s4);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirectiveLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 9);\n    if (s2.toLowerCase() === peg$c16) {\n      peg$currPos += 9;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 4);\n      if (s2.toLowerCase() === peg$c17) {\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f9();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateRef() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c18) {\n      s1 = peg$c18;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f10();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseIdent();\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuotedOrId() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c19;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c19;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f11(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseIdent();\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e22); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f12();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { StateDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutState } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { StateDocument, StateNode, StateTransition } from './ir.js';\n\nexport const state: DiagramModule<StateDocument> = {\n  parseMermaid(input: string): StateDocument {\n    return parser.parse(input) as StateDocument;\n  },\n\n  parseYaml(input: string): StateDocument {\n    return JSON.parse(input) as StateDocument;\n  },\n\n  layout(ir: StateDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutState(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/er/layout.ts \u2014 Entity-relationship diagram.\n *\n * Entities render as header + typed-attribute tables; placement uses the shared\n * layered kernel. Relationships connect entity borders with crow's-foot\n * cardinality markers (one = tick, many = foot, zero = circle).\n */\n\nimport type { ErDocument, ErEntity } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { layeredLayout, routeEdge, type GraphNode, type GraphEdge } from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutEr(ir: ErDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const nameFont = typography.baseFontSize;\n  const rowFont  = typography.smallFontSize;\n  const rowH     = rhuInt(rowFont * 1.7);\n  const headH    = rhuInt(nameFont * 1.8);\n\n  const sizeOf = (e: ErEntity): { w: number; h: number } => {\n    const rowText = (a: ErEntity['attributes'][number]) => `${a.type}  ${a.name}${a.key ? '  ' + a.key : ''}`;\n    const w = Math.max(140, measureText(e.name, nameFont).width + 28, ...e.attributes.map(a => measureText(rowText(a), rowFont).width + 28));\n    const h = headH + e.attributes.length * rowH + (e.attributes.length ? 6 : 0);\n    return { w, h };\n  };\n  const sizes = new Map(ir.entities.map(e => [e.name, sizeOf(e)]));\n\n  const nodes: GraphNode[] = ir.entities.map(e => ({ id: e.name, width: sizes.get(e.name)!.w, height: sizes.get(e.name)!.h }));\n  const edges: GraphEdge[] = ir.relations.map(r => ({ from: r.left, to: r.right }));\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 70, nodeGap: 50, margin });\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n\n  const elements: SceneElement[] = [];\n  if (title) elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Relationships \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const r of ir.relations) {\n    const a = laid.boxes.get(r.left), b = laid.boxes.get(r.right);\n    if (!a || !b) continue;\n    const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 + yOff };\n    const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 + yOff };\n    const pa = borderPoint({ ...a, y: a.y + yOff }, bc.x, bc.y);\n    const pb = borderPoint({ ...b, y: b.y + yOff }, ac.x, ac.y);\n    const { path } = routeEdge(a, b, allBoxes, yOff);\n    elements.push(p.path(path, palette.textMuted, 1.3, r.dashed ? { dash: '6 4' } : {}));\n    elements.push(...crowFoot(p, pa, bc, r.leftCard, palette));\n    elements.push(...crowFoot(p, pb, ac, r.rightCard, palette));\n    if (r.label) {\n      const mx = (pa.x + pb.x) / 2, my = (pa.y + pb.y) / 2;\n      const w = measureText(r.label, rowFont).width + 8;\n      elements.push(p.rect({ x: rhu(mx - w / 2), y: rhu(my - rowFont), width: rhu(w), height: rowFont + 4 }, palette.background, palette.background, 0));\n      elements.push(p.text(r.label, rhuInt(mx), rhu(my - 1), rowFont, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  // \u2500\u2500 Entities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const e of ir.entities) {\n    const box = laid.boxes.get(e.name)!;\n    const s = sizes.get(e.name)!;\n    const x = box.x, y = box.y + yOff;\n    elements.push(p.rect({ x: rhu(x), y: rhu(y), width: rhu(s.w), height: rhu(s.h) }, palette.surface, palette.border, 1.4, { rx: 4 }));\n    elements.push(p.rect({ x: rhu(x), y: rhu(y), width: rhu(s.w), height: headH }, palette.primary, palette.border, 1.4, { rx: 4 }));\n    elements.push(p.text(e.name, rhuInt(x + s.w / 2), rhu(y + headH / 2 + nameFont * 0.35), nameFont, '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n    let ry = y + headH + rowH - 5;\n    for (const a of e.attributes) {\n      elements.push(p.text(`${a.type}  ${a.name}`, rhu(x + 8), rhu(ry), rowFont, palette.text));\n      if (a.key) elements.push(p.text(a.key, rhu(x + s.w - 8), rhu(ry), rowFont, palette.secondary, { anchor: 'end', weight: 'bold' }));\n      ry += rowH;\n    }\n  }\n\n  const totalW = rhuInt(laid.width + margin);\n  const totalH = rhuInt(laid.height + yOff + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n\n/** Crow's-foot cardinality marker at `at`, line heading toward `toward`. */\nfunction crowFoot(\n  p: ReturnType<typeof pen>,\n  at: { x: number; y: number },\n  toward: { x: number; y: number },\n  card: string,\n  palette: ResolvedTheme['palette'],\n): SceneElement[] {\n  const len = Math.hypot(toward.x - at.x, toward.y - at.y) || 1;\n  const ux = (toward.x - at.x) / len, uy = (toward.y - at.y) / len;          // unit toward other entity\n  const px = -uy, py = ux;                                                    // perpendicular\n  const at2 = (d: number, s: number) => ({ x: at.x + ux * d + px * s, y: at.y + uy * d + py * s });\n  const out: SceneElement[] = [];\n  const color = palette.textMuted;\n\n  const many = /[}{]/.test(card);\n  const zero = /o/.test(card);\n  const one  = /\\|/.test(card);\n\n  if (many) {\n    const base = at2(14, 0);\n    const a = at2(0, 6), b = at2(0, -6);\n    out.push(p.path(`M ${rhu(base.x)} ${rhu(base.y)} L ${rhu(a.x)} ${rhu(a.y)}`, color, 1.2));\n    out.push(p.path(`M ${rhu(base.x)} ${rhu(base.y)} L ${rhu(b.x)} ${rhu(b.y)}`, color, 1.2));\n    out.push(p.path(`M ${rhu(base.x)} ${rhu(base.y)} L ${rhu(at.x)} ${rhu(at.y)}`, color, 1.2));\n  } else if (one) {\n    const c1 = at2(10, 6), c2 = at2(10, -6);\n    out.push(p.path(`M ${rhu(c1.x)} ${rhu(c1.y)} L ${rhu(c2.x)} ${rhu(c2.y)}`, color, 1.3));\n  }\n  if (zero) {\n    const c = at2(many ? 20 : 16, 0);\n    out.push(p.circle({ x: rhu(c.x), y: rhu(c.y) }, 4, palette.background, color, 1.2));\n  } else if (one && !many) {\n    const c1 = at2(15, 5), c2 = at2(15, -5);\n    out.push(p.path(`M ${rhu(c1.x)} ${rhu(c1.y)} L ${rhu(c2.x)} ${rhu(c2.y)}`, color, 1.3));\n  }\n  return out;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"erdiagram\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"{\";\n  var peg$c3 = \"\\r\";\n  var peg$c4 = \"\\n\";\n  var peg$c5 = \"}\";\n  var peg$c6 = \"\\\"\";\n  var peg$c7 = \":\";\n  var peg$c8 = \"--\";\n  var peg$c9 = \"..\";\n  var peg$c10 = \"PK\";\n  var peg$c11 = \"FK\";\n  var peg$c12 = \"UK\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[|}{o]/;\n  var peg$r3 = /^[A-Za-z0-9_]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"erDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"{\", false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$literalExpectation(\"}\", false);\n  var peg$e7 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e8 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$classExpectation([\"|\", \"}\", \"{\", \"o\"], false, false);\n  var peg$e11 = peg$literalExpectation(\"--\", false);\n  var peg$e12 = peg$literalExpectation(\"..\", false);\n  var peg$e13 = peg$literalExpectation(\"PK\", false);\n  var peg$e14 = peg$literalExpectation(\"FK\", false);\n  var peg$e15 = peg$literalExpectation(\"UK\", false);\n  var peg$e16 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e17 = peg$anyExpectation();\n  var peg$e18 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const entities = [];\n      const relations = [];\n      const ensure = (name) => { let e = entities.find(x => x.name === name); if (!e) { e = { name, attributes: [] }; entities.push(e); } return e; };\n      for (const st of stmts.filter(Boolean)) {\n        if (st.t === 'entity') { const e = ensure(st.name); for (const a of st.attrs) e.attributes.push(a); }\n        else if (st.t === 'rel') {\n          ensure(st.left); ensure(st.right);\n          const dashed = st.tok.includes('..');\n          const leftCard = st.tok.slice(0, 2);\n          const rightCard = st.tok.slice(-2);\n          relations.push({ left: st.left, right: st.right, leftCard, rightCard, dashed, ...(st.label ? { label: st.label } : {}) });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, entities, relations };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(name, rows) { return { t: 'entity', name, attrs: rows.filter(Boolean) }; };\n  var peg$f4 = function(type, name, k) { return k; };\n  var peg$f5 = function(type, name, key) {\n      return { type, name, ...(key ? { key } : {}) };\n    };\n  var peg$f6 = function() { return null; };\n  var peg$f7 = function(left, tok, right, label) {\n      return { t: 'rel', left, right, tok, label };\n    };\n  var peg$f8 = function(s) { return s; };\n  var peg$f9 = function(s) { return s.trim(); };\n  var peg$f10 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 9);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 9;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseEntityBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRelation();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEntityBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 123) {\n        s4 = peg$c2;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s6 = peg$c3;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s7 = peg$c4;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = [];\n          s9 = peg$parseAttrRow();\n          while (s9 !== peg$FAILED) {\n            s8.push(s9);\n            s9 = peg$parseAttrRow();\n          }\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 125) {\n            s10 = peg$c5;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parseLineEnd();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f3(s2, s8);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 125) {\n      s3 = peg$c5;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseIdent();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse__();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseIdent();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = peg$parse__();\n            if (s7 !== peg$FAILED) {\n              s8 = peg$parseKey();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s6;\n                s6 = peg$f4(s3, s5, s8);\n              } else {\n                peg$currPos = s6;\n                s6 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n            if (s6 === peg$FAILED) {\n              s6 = null;\n            }\n            s7 = peg$currPos;\n            s8 = peg$parse__();\n            if (s8 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 34) {\n                s9 = peg$c6;\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n              if (s9 !== peg$FAILED) {\n                s10 = [];\n                s11 = input.charAt(peg$currPos);\n                if (peg$r1.test(s11)) {\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                }\n                while (s11 !== peg$FAILED) {\n                  s10.push(s11);\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r1.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                  }\n                }\n                if (input.charCodeAt(peg$currPos) === 34) {\n                  s11 = peg$c6;\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                }\n                if (s11 !== peg$FAILED) {\n                  s8 = [s8, s9, s10, s11];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            if (s7 === peg$FAILED) {\n              s7 = null;\n            }\n            s8 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s9 = peg$c3;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            if (s9 === peg$FAILED) {\n              s9 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s10 = peg$c4;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f5(s3, s5, s6);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c3;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c4;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f6();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelation() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseErTok();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseIdent();\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s8 = peg$c7;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e9); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parse_();\n                s10 = peg$parseRelLabel();\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseLineEnd();\n                  if (s11 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f7(s2, s4, s6, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c6;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r0.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f9(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseErTok() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = input.charAt(peg$currPos);\n      if (peg$r2.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c8) {\n          s4 = peg$c8;\n          peg$currPos += 2;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s4 === peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c9) {\n            s4 = peg$c9;\n            peg$currPos += 2;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = input.charAt(peg$currPos);\n          if (peg$r2.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e10); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = input.charAt(peg$currPos);\n            if (peg$r2.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n            if (s6 !== peg$FAILED) {\n              s2 = [s2, s3, s4, s5, s6];\n              s1 = s2;\n            } else {\n              peg$currPos = s1;\n              s1 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s1;\n            s1 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseKey() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c10) {\n      s0 = peg$c10;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c11) {\n        s0 = peg$c11;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c12) {\n          s0 = peg$c12;\n          peg$currPos += 2;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r3.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c4;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f10();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r4.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { ErDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutEr } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { ErDocument, ErEntity, ErAttribute, ErRelation } from './ir.js';\n\nexport const er: DiagramModule<ErDocument> = {\n  parseMermaid(input: string): ErDocument {\n    return parser.parse(input) as ErDocument;\n  },\n\n  parseYaml(input: string): ErDocument {\n    return JSON.parse(input) as ErDocument;\n  },\n\n  layout(ir: ErDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutEr(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/block/layout.ts \u2014 Block diagram (column grid).\n *\n * Blocks pack left\u2192right into a fixed column grid, honouring per-block column\n * spans and wrapping when a span would overflow the row. Edges connect block\n * centres, clipped to borders, with an arrowhead.\n */\n\nimport type { BlockDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult, Rect } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'block-arrow';\n\nexport function layoutBlock(ir: BlockDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const cols   = Math.max(1, ir.columns);\n  const cellW  = 150;\n  const gap    = 16;\n  const rowH   = 56;\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const top    = margin + titleH;\n\n  // \u2500\u2500 Pack into the grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const rects = new Map<string, Rect>();\n  let col = 0, row = 0;\n  for (const b of ir.blocks) {\n    const span = Math.min(b.span, cols);\n    if (col + span > cols) { col = 0; row += 1; }\n    const x = margin + col * (cellW + gap);\n    const w = span * cellW + (span - 1) * gap;\n    const y = top + row * (rowH + gap);\n    rects.set(b.id, { x, y, width: w, height: rowH });\n    col += span;\n  }\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title) elements.push(p.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Edges (under blocks) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const e of ir.edges) {\n    const a = rects.get(e.from), b = rects.get(e.to);\n    if (!a || !b) continue;\n    const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 };\n    const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n    const pa = borderPoint(a, bc.x, bc.y);\n    const pb = borderPoint(b, ac.x, ac.y);\n    elements.push(p.path(`M ${rhu(pa.x)} ${rhu(pa.y)} L ${rhu(pb.x)} ${rhu(pb.y)}`, palette.primary, 1.6, { markerEnd: ARROW_ID }));\n    if (e.label) elements.push(p.text(e.label, rhuInt((pa.x + pb.x) / 2), rhuInt((pa.y + pb.y) / 2 - 4), typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.blocks.forEach((b, i) => {\n    const r = rects.get(b.id)!;\n    const hue = categoricalHue(i);\n    elements.push(p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) }, palette.surface, hue, 1.6, { rx: 8 }));\n    elements.push(p.text(b.label, rhuInt(r.x + r.width / 2), rhuInt(r.y + r.height / 2 + typography.baseFontSize * 0.35), typography.baseFontSize, palette.text, { weight: 'bold', anchor: 'middle' }));\n  });\n\n  const maxRight  = Math.max(margin, ...[...rects.values()].map(r => r.x + r.width));\n  const maxBottom = Math.max(top, ...[...rects.values()].map(r => r.y + r.height));\n  const defs = [`<marker id=\"${ARROW_ID}\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><polygon points=\"0 0, 10 4, 0 8\" fill=\"${palette.primary}\" /></marker>`];\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: rhuInt(maxRight + margin), height: rhuInt(maxBottom + margin) },\n    background: palette.background,\n    elements,\n    defs,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"block-beta\";\n  var peg$c1 = \"columns\";\n  var peg$c2 = \"-->\";\n  var peg$c3 = \"|\";\n  var peg$c4 = \"[\";\n  var peg$c5 = \"]\";\n  var peg$c6 = \":\";\n  var peg$c7 = \"\\r\";\n  var peg$c8 = \"\\n\";\n\n  var peg$r0 = /^[^|\\n]/;\n  var peg$r1 = /^[^\\]\\n]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[0-9]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"block-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"columns\", true);\n  var peg$e2 = peg$literalExpectation(\"-->\", false);\n  var peg$e3 = peg$literalExpectation(\"|\", false);\n  var peg$e4 = peg$classExpectation([\"|\", \"\\n\"], true, false);\n  var peg$e5 = peg$literalExpectation(\"[\", false);\n  var peg$e6 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e7 = peg$literalExpectation(\"]\", false);\n  var peg$e8 = peg$literalExpectation(\":\", false);\n  var peg$e9 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e10 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e11 = peg$literalExpectation(\"\\r\", false);\n  var peg$e12 = peg$literalExpectation(\"\\n\", false);\n  var peg$e13 = peg$anyExpectation();\n  var peg$e14 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      let columns = 1;\n      const blocks = [];\n      const edges = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'columns') columns = s.n;\n        else if (s.t === 'blocks')  for (const b of s.items) blocks.push(b);\n        else if (s.t === 'edge')    edges.push({ from: s.from, to: s.to, ...(s.label ? { label: s.label } : {}) });\n      }\n      return { version: '1.0', metadata: {}, columns, blocks, edges };\n    };\n  var peg$f1 = function(n) { return { t: 'columns', n }; };\n  var peg$f2 = function(from, l) { return l.trim(); };\n  var peg$f3 = function(from, label, to) {\n      return { t: 'edge', from, to, label: label || undefined };\n    };\n  var peg$f4 = function(first, b) { return b; };\n  var peg$f5 = function(first, rest) {\n      return { t: 'blocks', items: [first, ...rest] };\n    };\n  var peg$f6 = function(id, t) { return t; };\n  var peg$f7 = function(id, label, n) { return n; };\n  var peg$f8 = function(id, label, span) {\n      return { id, label: label != null ? label.replace(/^[\"']|[\"']$/g, '') : id, span: span || 1 };\n    };\n  var peg$f9 = function(n) { return parseInt(n, 10); };\n  var peg$f10 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 10);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 10;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseStatement();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseStatement();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseColumnsLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseEdgeLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlockLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseBlankLine();\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseColumnsLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c1) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseInteger();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f1(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.substr(peg$currPos, 3) === peg$c2) {\n        s4 = peg$c2;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 124) {\n          s6 = peg$c3;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s6 !== peg$FAILED) {\n          s7 = peg$currPos;\n          s8 = [];\n          s9 = input.charAt(peg$currPos);\n          if (peg$r0.test(s9)) {\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e4); }\n          }\n          if (s9 !== peg$FAILED) {\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = input.charAt(peg$currPos);\n              if (peg$r0.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e4); }\n              }\n            }\n          } else {\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            s7 = input.substring(s7, peg$currPos);\n          } else {\n            s7 = s8;\n          }\n          if (s7 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 124) {\n              s8 = peg$c3;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            if (s8 !== peg$FAILED) {\n              peg$savedPos = s5;\n              s5 = peg$f2(s2, s7);\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parse_();\n        s7 = peg$parseIdent();\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseLineEnd();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s2, s5, s7);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseBlockDef();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$parse__();\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parseBlockDef();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s4;\n          s4 = peg$f4(s2, s6);\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$parse__();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parseBlockDef();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f4(s2, s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s4 = peg$parse_();\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockDef() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s3 = peg$c4;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r1.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r1.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s5 = peg$c5;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s2;\n            s2 = peg$f6(s1, s4);\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c6;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseInteger();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f7(s1, s2, s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f8(s1, s2, s3);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInteger() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r3.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r3.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f9(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c7;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c8;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f10();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c7;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c8;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r4.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { BlockDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutBlock } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { BlockDocument, BlockNode, BlockEdge } from './ir.js';\n\nexport const block: DiagramModule<BlockDocument> = {\n  parseMermaid(input: string): BlockDocument {\n    return parser.parse(input) as BlockDocument;\n  },\n\n  parseYaml(input: string): BlockDocument {\n    return JSON.parse(input) as BlockDocument;\n  },\n\n  layout(ir: BlockDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutBlock(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/requirement/layout.ts \u2014 SysML-style requirement diagram.\n *\n * Requirement / element nodes render as titled boxes (\u00ABkind\u00BB + name + fields);\n * placement uses the shared layered kernel. Relationships draw as dashed\n * connectors with the relationship type as the edge label.\n */\n\nimport type { RequirementDocument, ReqNode } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { layeredLayout, routeEdge, type GraphNode, type GraphEdge } from '../../../graph/layered.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'req-arrow';\nconst BOX_W = 230;\n\nexport function layoutRequirement(ir: RequirementDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const nameFont = typography.baseFontSize;\n  const fieldFont = typography.smallFontSize;\n  const lineH = rhuInt(fieldFont * 1.5);\n\n  // Pre-wrap fields and size boxes.\n  const prepared = new Map<string, { lines: string[]; h: number }>();\n  const sizeOf = (n: ReqNode): { w: number; h: number } => {\n    const lines: string[] = [];\n    for (const f of n.fields) {\n      const wrapped = wrapText(`${f.key}: ${f.value}`, fieldFont, BOX_W - 20, 3).lines;\n      lines.push(...wrapped);\n    }\n    const headH = rhuInt(nameFont * 1.5) + fieldFont + 8;\n    const h = headH + lines.length * lineH + 8;\n    prepared.set(n.id, { lines, h });\n    return { w: BOX_W, h };\n  };\n  const sizes = new Map(ir.nodes.map(n => [n.id, sizeOf(n)]));\n\n  const nodes: GraphNode[] = ir.nodes.map(n => ({ id: n.id, width: BOX_W, height: sizes.get(n.id)!.h }));\n  const edges: GraphEdge[] = ir.relations.map(r => ({ from: r.from, to: r.to }));\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 60, nodeGap: 44, margin });\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Relationships \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const r of ir.relations) {\n    const a = laid.boxes.get(r.from), b = laid.boxes.get(r.to);\n    if (!a || !b) continue;\n    const { path, labelMidpoint } = routeEdge(a, b, allBoxes);\n    elements.push(p.path(path, palette.textMuted, 1.3, { dash: '6 4', markerEnd: ARROW_ID }));\n    const mx = labelMidpoint.x, my = labelMidpoint.y;\n    const w = measureText(`\u00AB${r.type}\u00BB`, fieldFont).width + 8;\n    elements.push(p.rect({ x: rhu(mx - w / 2), y: rhu(my - fieldFont), width: rhu(w), height: fieldFont + 4 }, palette.background, palette.background, 0));\n    elements.push(p.text(`\u00AB${r.type}\u00BB`, rhuInt(mx), rhu(my - 1), fieldFont, palette.secondary, { anchor: 'middle' }));\n  }\n\n  // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const n of ir.nodes) {\n    const box = laid.boxes.get(n.id)!;\n    const prep = prepared.get(n.id)!;\n    const { x, y } = box;\n    const headH = rhuInt(nameFont * 1.5) + fieldFont + 8;\n    elements.push(p.rect({ x: rhu(x), y: rhu(y), width: BOX_W, height: rhu(box.height) }, palette.surface, palette.primary, 1.4, { rx: 6 }));\n    elements.push(p.text(`\u00AB${n.kind}\u00BB`, rhuInt(x + BOX_W / 2), rhu(y + fieldFont + 4), fieldFont, palette.textMuted, { anchor: 'middle' }));\n    elements.push(p.text(n.id, rhuInt(x + BOX_W / 2), rhu(y + fieldFont + 6 + nameFont), nameFont, palette.text, { weight: 'bold', anchor: 'middle' }));\n    elements.push(p.path(`M ${rhu(x)} ${rhu(y + headH)} L ${rhu(x + BOX_W)} ${rhu(y + headH)}`, palette.border, 1));\n    let fy = y + headH + lineH - 3;\n    for (const ln of prep.lines) { elements.push(p.text(ln, rhu(x + 10), rhu(fy), fieldFont, palette.text)); fy += lineH; }\n  }\n\n  const defs = [`<marker id=\"${ARROW_ID}\" markerWidth=\"11\" markerHeight=\"9\" refX=\"9\" refY=\"4.5\" orient=\"auto\"><polyline points=\"0 0, 10 4.5, 0 9\" fill=\"none\" stroke=\"${palette.textMuted}\" stroke-width=\"1.3\" /></marker>`];\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: rhuInt(laid.width + margin), height: rhuInt(laid.height + margin) },\n    background: palette.background,\n    elements,\n    defs,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"requirementdiagram\";\n  var peg$c1 = \"{\";\n  var peg$c2 = \"\\r\";\n  var peg$c3 = \"\\n\";\n  var peg$c4 = \"}\";\n  var peg$c5 = \":\";\n  var peg$c6 = \"-\";\n  var peg$c7 = \"->\";\n  var peg$c8 = \"functionalrequirement\";\n  var peg$c9 = \"interfacerequirement\";\n  var peg$c10 = \"performancerequirement\";\n  var peg$c11 = \"physicalrequirement\";\n  var peg$c12 = \"designconstraint\";\n  var peg$c13 = \"requirement\";\n  var peg$c14 = \"element\";\n\n  var peg$r0 = /^[^:\\n]/;\n  var peg$r1 = /^[^\\n]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"requirementDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"{\", false);\n  var peg$e2 = peg$literalExpectation(\"\\r\", false);\n  var peg$e3 = peg$literalExpectation(\"\\n\", false);\n  var peg$e4 = peg$literalExpectation(\"}\", false);\n  var peg$e5 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e6 = peg$literalExpectation(\":\", false);\n  var peg$e7 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e8 = peg$literalExpectation(\"-\", false);\n  var peg$e9 = peg$literalExpectation(\"->\", false);\n  var peg$e10 = peg$literalExpectation(\"functionalRequirement\", true);\n  var peg$e11 = peg$literalExpectation(\"interfaceRequirement\", true);\n  var peg$e12 = peg$literalExpectation(\"performanceRequirement\", true);\n  var peg$e13 = peg$literalExpectation(\"physicalRequirement\", true);\n  var peg$e14 = peg$literalExpectation(\"designConstraint\", true);\n  var peg$e15 = peg$literalExpectation(\"requirement\", true);\n  var peg$e16 = peg$literalExpectation(\"element\", true);\n  var peg$e17 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e18 = peg$anyExpectation();\n  var peg$e19 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      const nodes = [];\n      const relations = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'node') nodes.push({ id: s.name, kind: s.kind, fields: s.fields });\n        else if (s.t === 'rel')  relations.push({ from: s.from, to: s.to, type: s.type });\n      }\n      return { version: '1.0', metadata: {}, nodes, relations };\n    };\n  var peg$f1 = function(kind, name, rows) {\n      return { t: 'node', kind, name, fields: rows.filter(Boolean) };\n    };\n  var peg$f2 = function(key, val) { return { key: key.trim(), value: val.trim() }; };\n  var peg$f3 = function() { return null; };\n  var peg$f4 = function(from, type, to) { return { t: 'rel', from, to, type }; };\n  var peg$f5 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 18);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 18;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseStatement();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseStatement();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRelation();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseReqKind();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 123) {\n            s6 = peg$c1;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s8 = peg$c2;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            if (s8 === peg$FAILED) {\n              s8 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s9 = peg$c3;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = [];\n              s11 = peg$parseFieldRow();\n              while (s11 !== peg$FAILED) {\n                s10.push(s11);\n                s11 = peg$parseFieldRow();\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 125) {\n                s12 = peg$c4;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e4); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parseLineEnd();\n                if (s13 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f1(s2, s4, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFieldRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 125) {\n      s3 = peg$c4;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r0.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c5;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r1.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r1.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s6 = peg$c2;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            if (s6 === peg$FAILED) {\n              s6 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s7 = peg$c3;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f2(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c2;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c3;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelation() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 45) {\n        s4 = peg$c6;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseIdent();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          if (input.substr(peg$currPos, 2) === peg$c7) {\n            s8 = peg$c7;\n            peg$currPos += 2;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            s10 = peg$parseIdent();\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseLineEnd();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f4(s2, s6, s10);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseReqKind() {\n    var s0;\n\n    s0 = input.substr(peg$currPos, 21);\n    if (s0.toLowerCase() === peg$c8) {\n      peg$currPos += 21;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.substr(peg$currPos, 20);\n      if (s0.toLowerCase() === peg$c9) {\n        peg$currPos += 20;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = input.substr(peg$currPos, 22);\n        if (s0.toLowerCase() === peg$c10) {\n          peg$currPos += 22;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n        if (s0 === peg$FAILED) {\n          s0 = input.substr(peg$currPos, 19);\n          if (s0.toLowerCase() === peg$c11) {\n            peg$currPos += 19;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e13); }\n          }\n          if (s0 === peg$FAILED) {\n            s0 = input.substr(peg$currPos, 16);\n            if (s0.toLowerCase() === peg$c12) {\n              peg$currPos += 16;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e14); }\n            }\n            if (s0 === peg$FAILED) {\n              s0 = input.substr(peg$currPos, 11);\n              if (s0.toLowerCase() === peg$c13) {\n                peg$currPos += 11;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s0 === peg$FAILED) {\n                s0 = input.substr(peg$currPos, 7);\n                if (s0.toLowerCase() === peg$c14) {\n                  peg$currPos += 7;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c2;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c3;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f5();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e19); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { RequirementDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutRequirement } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { RequirementDocument, ReqNode, ReqRelation, ReqField } from './ir.js';\n\nexport const requirement: DiagramModule<RequirementDocument> = {\n  parseMermaid(input: string): RequirementDocument {\n    return parser.parse(input) as RequirementDocument;\n  },\n\n  parseYaml(input: string): RequirementDocument {\n    return JSON.parse(input) as RequirementDocument;\n  },\n\n  layout(ir: RequirementDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutRequirement(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/sankey/layout.ts \u2014 Sankey flow diagram.\n *\n * Nodes are assigned to columns by longest-path depth; node height is\n * proportional to its larger of in/out flow. Links render as filled bezier\n * ribbons whose width encodes value, coloured by source. Deterministic.\n */\n\nimport type { SankeyDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutSankey(ir: SankeyDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Nodes + layering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const order: string[] = [];\n  const seen = new Set<string>();\n  const add = (n: string) => { if (!seen.has(n)) { seen.add(n); order.push(n); } };\n  for (const l of ir.links) { add(l.source); add(l.target); }\n\n  const layer = new Map(order.map(n => [n, 0]));\n  for (let pass = 0; pass < order.length; pass++) {\n    let changed = false;\n    for (const l of ir.links) {\n      const want = layer.get(l.source)! + 1;\n      if (layer.get(l.target)! < want) { layer.set(l.target, want); changed = true; }\n    }\n    if (!changed) break;\n  }\n  const maxLayer = Math.max(0, ...order.map(n => layer.get(n)!));\n\n  const sumOut = new Map<string, number>();\n  const sumIn  = new Map<string, number>();\n  for (const l of ir.links) {\n    sumOut.set(l.source, (sumOut.get(l.source) ?? 0) + l.value);\n    sumIn.set(l.target, (sumIn.get(l.target) ?? 0) + l.value);\n  }\n  const nodeValue = (n: string): number => Math.max(sumOut.get(n) ?? 0, sumIn.get(n) ?? 0);\n\n  // Group by layer (insertion order within layer).\n  const byLayer: string[][] = Array.from({ length: maxLayer + 1 }, () => []);\n  for (const n of order) byLayer[layer.get(n)!]!.push(n);\n  const colSum = byLayer.map(col => col.reduce((s, n) => s + nodeValue(n), 0));\n  const maxColSum = Math.max(1, ...colSum);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const plotH  = 480;\n  const nodeW  = 18;\n  const colGap = 220;\n  const nodeGap = 14;\n  const unit = (plotH - 0) / maxColSum;\n  const plotLeft = margin + 4;\n  const plotTop  = margin + titleH + 6;\n  const colX = (li: number): number => plotLeft + li * (nodeW + colGap);\n\n  // Node rects + per-node running offsets.\n  interface NodeBox { x: number; y: number; h: number; }\n  const boxes = new Map<string, NodeBox>();\n  byLayer.forEach((col, li) => {\n    const totalH = col.reduce((s, n) => s + nodeValue(n) * unit, 0) + (col.length - 1) * nodeGap;\n    let y = plotTop + (plotH - totalH) / 2;\n    for (const n of col) {\n      const h = Math.max(2, nodeValue(n) * unit);\n      boxes.set(n, { x: colX(li), y, h });\n      y += h + nodeGap;\n    }\n  });\n\n  const elements: SceneElement[] = [];\n  if (title) elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Link ribbons (under nodes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const outOff = new Map<string, number>();\n  const inOff  = new Map<string, number>();\n  const hueOf  = new Map(order.map((n, i) => [n, categoricalHue(i)]));\n  for (const l of ir.links) {\n    const sb = boxes.get(l.source)!, tb = boxes.get(l.target)!;\n    const lh = Math.max(1, l.value * unit);\n    const so = outOff.get(l.source) ?? 0; outOff.set(l.source, so + lh);\n    const io = inOff.get(l.target) ?? 0; inOff.set(l.target, io + lh);\n    const sx = sb.x + nodeW, tx = tb.x;\n    const sy0 = sb.y + so, sy1 = sy0 + lh;\n    const ty0 = tb.y + io, ty1 = ty0 + lh;\n    const mx = (sx + tx) / 2;\n    const d = `M ${rhu(sx)} ${rhu(sy0)} C ${rhu(mx)} ${rhu(sy0)}, ${rhu(mx)} ${rhu(ty0)}, ${rhu(tx)} ${rhu(ty0)} `\n            + `L ${rhu(tx)} ${rhu(ty1)} C ${rhu(mx)} ${rhu(ty1)}, ${rhu(mx)} ${rhu(sy1)}, ${rhu(sx)} ${rhu(sy1)} Z`;\n    elements.push(p.path(d, 'none', 0, { fill: hueOf.get(l.source)!, opacity: 0.4 }));\n  }\n\n  // \u2500\u2500 Node bars + labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  byLayer.forEach((col, li) => {\n    const lastCol = li === maxLayer;\n    for (const n of col) {\n      const b = boxes.get(n)!;\n      elements.push(p.rect({ x: rhu(b.x), y: rhu(b.y), width: nodeW, height: rhu(b.h) }, hueOf.get(n)!, hueOf.get(n)!, 0, { rx: 2 }));\n      const ly = rhu(b.y + b.h / 2 + typography.smallFontSize * 0.35);\n      if (lastCol) elements.push(p.text(n, rhu(b.x - 6), ly, typography.smallFontSize, palette.text, { anchor: 'end' }));\n      else         elements.push(p.text(n, rhu(b.x + nodeW + 6), ly, typography.smallFontSize, palette.text));\n    }\n  });\n\n  // Width: account for the last column's left-anchored labels and others' right labels.\n  const lastLabelW = Math.max(0, ...byLayer[maxLayer]!.map(n => measureText(n, typography.smallFontSize).width));\n  const otherLabelW = 140;\n  const totalW = rhuInt(colX(maxLayer) + nodeW + (maxLayer === 0 ? otherLabelW : Math.max(otherLabelW, 0)) + margin);\n  const totalH = rhuInt(plotTop + plotH + margin);\n  void lastLabelW;\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"sankey-beta\";\n  var peg$c1 = \",\";\n  var peg$c2 = \"\\r\";\n  var peg$c3 = \"\\n\";\n  var peg$c4 = \"%%\";\n  var peg$c5 = \"-\";\n  var peg$c6 = \".\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^,\\n]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"sankey-beta\", true);\n  var peg$e1 = peg$literalExpectation(\",\", false);\n  var peg$e2 = peg$literalExpectation(\"\\r\", false);\n  var peg$e3 = peg$literalExpectation(\"\\n\", false);\n  var peg$e4 = peg$literalExpectation(\"%%\", false);\n  var peg$e5 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e6 = peg$anyExpectation();\n  var peg$e7 = peg$classExpectation([\",\", \"\\n\"], true, false);\n  var peg$e8 = peg$literalExpectation(\"-\", false);\n  var peg$e9 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e10 = peg$literalExpectation(\".\", false);\n  var peg$e11 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(rows) {\n      const links = rows.filter(Boolean);\n      return { version: '1.0', metadata: {}, links };\n    };\n  var peg$f1 = function(src, tgt, val) { return { source: src.trim(), target: tgt.trim(), value: val }; };\n  var peg$f2 = function() { return null; };\n  var peg$f3 = function() { return null; };\n  var peg$f4 = function(n) { return parseFloat(n); };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 11);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 11;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseRow();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseRow();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$parseComment();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      s2 = peg$parseField();\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s3 = peg$c1;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseField();\n          if (s4 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s5 = peg$c1;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parse_();\n              s7 = peg$parseNum();\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parse_();\n                s9 = peg$parseLineEnd();\n                if (s9 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f1(s2, s4, s7);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s2 = peg$c2;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s3 = peg$c3;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f2();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 2) === peg$c4) {\n      s2 = peg$c4;\n      peg$currPos += 2;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n      s3 = input.substring(s3, peg$currPos);\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s5 = peg$c2;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s6 = peg$c3;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s6 !== peg$FAILED) {\n        s5 = [s5, s6];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = peg$currPos;\n        peg$silentFails++;\n        if (input.length > peg$currPos) {\n          s5 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        peg$silentFails--;\n        if (s5 === peg$FAILED) {\n          s4 = undefined;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseField() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r1.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c5;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r2.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r2.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c6;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r2.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e9); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f4(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { SankeyDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutSankey } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { SankeyDocument, SankeyLink } from './ir.js';\n\nexport const sankey: DiagramModule<SankeyDocument> = {\n  parseMermaid(input: string): SankeyDocument {\n    return parser.parse(input) as SankeyDocument;\n  },\n\n  parseYaml(input: string): SankeyDocument {\n    return JSON.parse(input) as SankeyDocument;\n  },\n\n  layout(ir: SankeyDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutSankey(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/mindmap/layout.ts \u2014 Right-growing tidy tree (mindmap).\n *\n * Depth maps to x (root at left), a post-order sweep assigns leaf rows and\n * centres parents on their children. Depth-1 branches take distinct categorical\n * hues that descendants inherit; curved connectors link parent\u2192child.\n */\n\nimport type { MindmapDocument, MindNode } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\ninterface Placed { label: string; depth: number; x: number; y: number; w: number; hue: string; icon?: string; children: Placed[]; }\n\nexport function layoutMindmap(ir: MindmapDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  if (!ir.root) {\n    return { scene: { viewBox: { x: 0, y: 0, width: 100, height: 60 }, background: palette.background, elements: [] }, anchors: {} };\n  }\n\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const rowGap   = 30;\n  const levelGap = 70;\n  const titleH   = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n\n  const fontFor = (d: number): number => (d === 0 ? typography.titleFontSize : d === 1 ? font : smallFont);\n  const widthFor = (label: string, d: number): number => measureText(label, fontFor(d)) .width + (d === 0 ? 40 : 28);\n\n  // Assign x by depth, y by post-order leaf sweep.\n  let leafCursor = margin + titleH + 20;\n  const place = (node: MindNode, depth: number, hue: string): Placed => {\n    const kids = node.children.map((c, i) => place(c, depth + 1, depth === 0 ? categoricalHue(i) : hue));\n    let y: number;\n    if (kids.length === 0) { y = leafCursor; leafCursor += rowGap; }\n    else { y = (kids[0]!.y + kids[kids.length - 1]!.y) / 2; }\n    return { label: node.label, depth, x: 0, y, w: widthFor(node.label, depth), hue, ...(node.icon ? { icon: node.icon } : {}), children: kids };\n  };\n  const root = place(ir.root, 0, palette.primary);\n\n  // Column x: per-depth max width + level gaps.\n  const all = flat(root);\n  const depthMax = maxDepth(root);\n  const maxW: number[] = [];\n  for (const n of all) maxW[n.depth] = Math.max(maxW[n.depth] ?? 0, n.w);\n  const colStart: number[] = [margin];\n  for (let d = 1; d <= depthMax; d++) colStart[d] = colStart[d - 1]! + (maxW[d - 1] ?? 0) + levelGap;\n  for (const n of all) n.x = colStart[n.depth]!;\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title) elements.push(p.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Connectors (under nodes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const drawEdges = (n: Placed): void => {\n    for (const c of n.children) {\n      const x1 = n.x + n.w, y1 = n.y, x2 = c.x, y2 = c.y;\n      const mx = (x1 + x2) / 2;\n      elements.push(p.path(`M ${rhu(x1)} ${rhu(y1)} C ${rhu(mx)} ${rhu(y1)}, ${rhu(mx)} ${rhu(y2)}, ${rhu(x2)} ${rhu(y2)}`, c.hue, 2));\n      drawEdges(c);\n    }\n  };\n  drawEdges(root);\n\n  // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const drawNode = (n: Placed): void => {\n    const h = (n.depth === 0 ? 44 : n.depth === 1 ? 34 : 26);\n    const cy = n.y;\n    if (n.depth === 0) {\n      elements.push(p.rect({ x: rhu(n.x), y: rhu(cy - h / 2), width: rhu(n.w), height: h }, palette.primary, palette.primary, 0, { rx: h / 2 }));\n      elements.push(p.text(n.label, rhuInt(n.x + n.w / 2), rhu(cy + fontFor(0) * 0.35), fontFor(0), '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n    } else if (n.depth === 1) {\n      elements.push(p.rect({ x: rhu(n.x), y: rhu(cy - h / 2), width: rhu(n.w), height: h }, n.hue, n.hue, 0, { rx: 8 }));\n      elements.push(p.text(n.label, rhuInt(n.x + n.w / 2), rhu(cy + font * 0.35), font, '#FFFFFF', { weight: 'bold', anchor: 'middle' }));\n    } else {\n      elements.push(p.rect({ x: rhu(n.x), y: rhu(cy - h / 2), width: rhu(n.w), height: h }, palette.surface, n.hue, 1.4, { rx: 6 }));\n      elements.push(p.text(n.label, rhuInt(n.x + n.w / 2), rhu(cy + smallFont * 0.35), smallFont, palette.text, { anchor: 'middle' }));\n    }\n    if (n.icon) elements.push(p.circle({ x: rhu(n.x - 7), y: rhu(cy) }, 4, n.hue, palette.background, 1.5));\n    for (const c of n.children) drawNode(c);\n  };\n  drawNode(root);\n\n  const totalW = rhuInt(Math.max(...all.map(n => n.x + n.w)) + margin);\n  const totalH = rhuInt(leafCursor + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n\nfunction flat(n: Placed, acc: Placed[] = []): Placed[] { acc.push(n); for (const c of n.children) flat(c, acc); return acc; }\nfunction maxDepth(n: Placed): number { return n.children.length ? Math.max(...n.children.map(maxDepth)) : n.depth; }\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"mindmap\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"\\r\";\n  var peg$c3 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[ \\t]/;\n  var peg$r2 = /^[^ \\t\\n]/;\n\n  var peg$e0 = peg$literalExpectation(\"mindmap\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$anyExpectation();\n  var peg$e7 = peg$classExpectation([\" \", \"\\t\", \"\\n\"], true, false);\n\n  var peg$f0 = function(fm, lines) {\n      return { version: '1.0', metadata: { ...(fm || {}) }, lines: lines.filter(Boolean) };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(fmlines) {\n      const meta = {}; for (const line of fmlines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(indent, content) { return { indent: indent.length, raw: content.trim() }; };\n  var peg$f4 = function(content) { return { indent: 0, raw: content.trim() }; };\n  var peg$f5 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 7);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 7;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseLine();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseLine();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r1.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r0.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r0.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s4 = peg$c2;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s5 = peg$c3;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 === peg$FAILED) {\n          s3 = peg$currPos;\n          peg$silentFails++;\n          if (input.length > peg$currPos) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          peg$silentFails--;\n          if (s4 === peg$FAILED) {\n            s3 = undefined;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s1, s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = input.charAt(peg$currPos);\n      if (peg$r2.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r0.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n        s3 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s4 = peg$c2;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s5 = peg$c3;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 === peg$FAILED) {\n          s3 = peg$currPos;\n          peg$silentFails++;\n          if (input.length > peg$currPos) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          peg$silentFails--;\n          if (s4 === peg$FAILED) {\n            s3 = undefined;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f4(s1);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = [];\n        s2 = input.charAt(peg$currPos);\n        if (peg$r1.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r1.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n        }\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s2 = peg$c2;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s3 = peg$c3;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f5();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r1.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { MindmapDocument, MindNode } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutMindmap } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { MindmapDocument, MindNode } from './ir.js';\n\ninterface RawLine { indent: number; raw: string }\ninterface RawDoc { version: string; metadata: MindmapDocument['metadata']; lines: RawLine[] }\n\ninterface MutNode { label: string; icon?: string; children: MutNode[] }\n\nfunction cleanLabel(raw: string): string {\n  // Strip a node-shape wrapper, ignoring any leading id: id((label)) \u2192 label.\n  const m = raw.match(/^[^([{]*[([{]+(.+?)[)\\]}]+$/);\n  return (m ? m[1]! : raw).trim();\n}\n\nfunction buildTree(lines: RawLine[]): MindNode | undefined {\n  if (lines.length === 0) return undefined;\n  const first = lines.find(l => !l.raw.startsWith('::'));\n  if (!first) return undefined;\n  const root: MutNode = { label: cleanLabel(first.raw), children: [] };\n  const stack: Array<{ node: MutNode; indent: number }> = [{ node: root, indent: first.indent }];\n  let last: MutNode = root;\n  let started = false;\n  for (const ln of lines) {\n    if (!started) { if (ln === first) started = true; continue; }\n    // `::icon(...)` attaches to the most recent node rather than creating one.\n    const iconMatch = ln.raw.match(/^::icon\\(([^)]*)\\)/);\n    if (iconMatch) { last.icon = iconMatch[1]!.trim(); continue; }\n    const node: MutNode = { label: cleanLabel(ln.raw), children: [] };\n    while (stack.length > 1 && stack[stack.length - 1]!.indent >= ln.indent) stack.pop();\n    stack[stack.length - 1]!.node.children.push(node);\n    stack.push({ node, indent: ln.indent });\n    last = node;\n  }\n  return root as MindNode;\n}\n\nexport const mindmap: DiagramModule<MindmapDocument> = {\n  parseMermaid(input: string): MindmapDocument {\n    const raw = parser.parse(input) as RawDoc;\n    const root = buildTree(raw.lines);\n    return { version: raw.version, metadata: raw.metadata, ...(root ? { root } : {}) };\n  },\n\n  parseYaml(input: string): MindmapDocument {\n    return JSON.parse(input) as MindmapDocument;\n  },\n\n  layout(ir: MindmapDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutMindmap(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/gitgraph/layout.ts \u2014 Git commit graph.\n *\n * Branches occupy horizontal lanes; commits sit at sequential x positions.\n * Lane lines, branch-point curves and merge curves connect them; commit dots\n * carry ids and tags. Lane colours come from the categorical hue cycle.\n */\n\nimport type { GitgraphDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutGitgraph(ir: GitgraphDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const xGap    = 70;\n  const laneGap = 60;\n  const leftPad = margin + 70;            // room for lane labels\n  const topPad  = margin + titleH + 24;\n  const maxX = Math.max(0, ...ir.commits.map(c => c.x));\n\n  const cx = (x: number): number => leftPad + x * xGap;\n  const cy = (lane: number): number => topPad + lane * laneGap;\n  const hue = (lane: number): string => categoricalHue(lane);\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title) elements.push(p.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Lane lines + labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (let lane = 0; lane < ir.lanes; lane++) {\n    const laneCommits = ir.commits.filter(c => c.lane === lane);\n    if (laneCommits.length === 0 && lane !== 0) continue;\n    const xs = laneCommits.map(c => c.x);\n    const bp = ir.branchPoints.find(b => b.lane === lane);\n    const startX = bp ? Math.min(bp.x, ...(xs.length ? xs : [bp.x])) : Math.min(0, ...(xs.length ? xs : [0]));\n    const endX = xs.length ? Math.max(...xs) : startX;\n    elements.push(p.path(`M ${rhu(cx(startX))} ${rhu(cy(lane))} L ${rhu(cx(endX))} ${rhu(cy(lane))}`, hue(lane), 3, { opacity: 0.55 }));\n    const name = ir.laneNames[lane];\n    if (name) elements.push(p.text(name, margin, rhu(cy(lane) + typography.smallFontSize * 0.35), typography.smallFontSize, hue(lane), { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Branch-point curves \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const b of ir.branchPoints) {\n    const x1 = cx(b.parentX), y1 = cy(b.parentLane);\n    const x2 = cx(b.x), y2 = cy(b.lane);\n    const mx = (x1 + x2) / 2;\n    elements.push(p.path(`M ${rhu(x1)} ${rhu(y1)} C ${rhu(mx)} ${rhu(y1)}, ${rhu(mx)} ${rhu(y2)}, ${rhu(x2)} ${rhu(y2)}`, hue(b.lane), 2.5, { opacity: 0.55 }));\n  }\n\n  // \u2500\u2500 Merge curves \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const c of ir.commits) {\n    if (!c.isMerge || c.fromLane === undefined || c.fromX === undefined) continue;\n    const x1 = cx(c.fromX), y1 = cy(c.fromLane);\n    const x2 = cx(c.x), y2 = cy(c.lane);\n    const mx = (x1 + x2) / 2;\n    elements.push(p.path(`M ${rhu(x1)} ${rhu(y1)} C ${rhu(mx)} ${rhu(y1)}, ${rhu(mx)} ${rhu(y2)}, ${rhu(x2)} ${rhu(y2)}`, hue(c.fromLane), 2.5, { opacity: 0.6 }));\n  }\n\n  // \u2500\u2500 Commit dots + ids + tags \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const c of ir.commits) {\n    const x = cx(c.x), y = cy(c.lane);\n    const col = hue(c.lane);\n    if (c.type === 'highlight') {\n      elements.push(p.rect({ x: rhu(x - 9), y: rhu(y - 9), width: 18, height: 18 }, palette.warning, palette.background, 2, { rx: 3 }));\n    } else if (c.isMerge) {\n      elements.push(p.circle({ x: rhu(x), y: rhu(y) }, 9, palette.background, col, 2.5));\n      elements.push(p.circle({ x: rhu(x), y: rhu(y) }, 3.5, col, col, 0));\n    } else {\n      elements.push(p.circle({ x: rhu(x), y: rhu(y) }, 8, col, palette.background, 2));\n    }\n    elements.push(p.text(c.id, rhu(x), rhu(y + 22), typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n    if (c.tag) {\n      const w = measureText(c.tag, typography.smallFontSize).width + 12;\n      elements.push(p.rect({ x: rhu(x - w / 2), y: rhu(y - 34), width: rhu(w), height: 17 }, palette.warning + '22', palette.warning, 1, { rx: 3 }));\n      elements.push(p.text(c.tag, rhu(x), rhu(y - 22), typography.smallFontSize, palette.text, { anchor: 'middle', weight: 'bold' }));\n    }\n  }\n\n  const totalW = rhuInt(cx(maxX) + 80 + margin);\n  const totalH = rhuInt(cy(ir.lanes - 1) + laneGap + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function opts(list) {\n    const o = {};\n    for (const it of list) o[it.k.toLowerCase()] = it.v;\n    return o;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"gitgraph\";\n  var peg$c1 = \":\";\n  var peg$c2 = \"commit\";\n  var peg$c3 = \"branch\";\n  var peg$c4 = \"order:\";\n  var peg$c5 = \"checkout\";\n  var peg$c6 = \"switch\";\n  var peg$c7 = \"merge\";\n  var peg$c8 = \"id\";\n  var peg$c9 = \"tag\";\n  var peg$c10 = \"type\";\n  var peg$c11 = \"\\\"\";\n  var peg$c12 = \"\\r\";\n  var peg$c13 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[0-9]/;\n  var peg$r2 = /^[^\"]/;\n  var peg$r3 = /^[A-Za-z0-9_]/;\n  var peg$r4 = /^[A-Za-z0-9_\\/.\\-]/;\n  var peg$r5 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"gitGraph\", true);\n  var peg$e1 = peg$literalExpectation(\":\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"commit\", true);\n  var peg$e4 = peg$literalExpectation(\"branch\", true);\n  var peg$e5 = peg$literalExpectation(\"order:\", false);\n  var peg$e6 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e7 = peg$literalExpectation(\"checkout\", true);\n  var peg$e8 = peg$literalExpectation(\"switch\", true);\n  var peg$e9 = peg$literalExpectation(\"merge\", true);\n  var peg$e10 = peg$literalExpectation(\"id\", true);\n  var peg$e11 = peg$literalExpectation(\"tag\", true);\n  var peg$e12 = peg$literalExpectation(\"type\", true);\n  var peg$e13 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e14 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e15 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e16 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"/\", \".\", \"-\"], false, false);\n  var peg$e17 = peg$literalExpectation(\"\\r\", false);\n  var peg$e18 = peg$literalExpectation(\"\\n\", false);\n  var peg$e19 = peg$anyExpectation();\n  var peg$e20 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      return { version: '1.0', metadata: {}, statements: stmts.filter(Boolean) };\n    };\n  var peg$f1 = function(o) { const x = opts(o); return { t: 'commit', id: x.id, tag: x.tag, type: x.type }; };\n  var peg$f2 = function(name) { return { t: 'branch', name }; };\n  var peg$f3 = function(name) { return { t: 'checkout', name }; };\n  var peg$f4 = function(name, o) { const x = opts(o); return { t: 'merge', name, id: x.id, tag: x.tag, type: x.type }; };\n  var peg$f5 = function(k, v) { return { k, v }; };\n  var peg$f6 = function(s) { return s; };\n  var peg$f7 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s5 = peg$c1;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s6 = peg$parse_();\n      s7 = peg$currPos;\n      s8 = [];\n      s9 = input.charAt(peg$currPos);\n      if (peg$r0.test(s9)) {\n        peg$currPos++;\n      } else {\n        s9 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      while (s9 !== peg$FAILED) {\n        s8.push(s9);\n        s9 = input.charAt(peg$currPos);\n        if (peg$r0.test(s9)) {\n          peg$currPos++;\n        } else {\n          s9 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      s7 = input.substring(s7, peg$currPos);\n      s4 = [s4, s5, s6, s7];\n      s3 = s4;\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseCommit();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseBranch();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseCheckout();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseMerge();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCommit() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseOpt();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseOpt();\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f1(s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBranch() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseBranchName();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.substr(peg$currPos, 6) === peg$c4) {\n            s7 = peg$c4;\n            peg$currPos += 6;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = [];\n            s10 = input.charAt(peg$currPos);\n            if (peg$r1.test(s10)) {\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s10 !== peg$FAILED) {\n              while (s10 !== peg$FAILED) {\n                s9.push(s10);\n                s10 = input.charAt(peg$currPos);\n                if (peg$r1.test(s10)) {\n                  peg$currPos++;\n                } else {\n                  s10 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e6); }\n                }\n              }\n            } else {\n              s9 = peg$FAILED;\n            }\n            if (s9 !== peg$FAILED) {\n              s6 = [s6, s7, s8, s9];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCheckout() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c5) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 6);\n      if (s2.toLowerCase() === peg$c6) {\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseBranchName();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMerge() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c7) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseBranchName();\n        if (s4 !== peg$FAILED) {\n          s5 = [];\n          s6 = peg$parseOpt();\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = peg$parseOpt();\n          }\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s4, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOpt() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      s2 = input.substr(peg$currPos, 2);\n      if (s2.toLowerCase() === peg$c8) {\n        peg$currPos += 2;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 3);\n        if (s2.toLowerCase() === peg$c9) {\n          peg$currPos += 3;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 4);\n          if (s2.toLowerCase() === peg$c10) {\n            peg$currPos += 4;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n        }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c1;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          s6 = peg$parseOptVal();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOptVal() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c11;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c11;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f6(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = input.charAt(peg$currPos);\n      if (peg$r3.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r3.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBranchName() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r4.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r4.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c12;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c13;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f7();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c13;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r5.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r5.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e20); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { GitgraphDocument, GitCommit, GitBranchPoint, GitCommitType } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutGitgraph } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { GitgraphDocument, GitCommit, GitBranchPoint } from './ir.js';\n\ninterface Stmt { t: string; name?: string; id?: string; tag?: string; type?: string }\ninterface RawDoc { version: string; metadata: GitgraphDocument['metadata']; statements: Stmt[] }\n\nfunction commitType(raw?: string): GitCommitType {\n  const t = (raw || '').toUpperCase();\n  return t === 'HIGHLIGHT' ? 'highlight' : t === 'REVERSE' ? 'reverse' : 'normal';\n}\n\nexport const gitgraph: DiagramModule<GitgraphDocument> = {\n  parseMermaid(input: string): GitgraphDocument {\n    const raw = parser.parse(input) as RawDoc;\n    const laneOf = new Map<string, number>([['main', 0]]);\n    const laneNames = ['main'];\n    const lastX = new Map<number, number>();          // lane \u2192 x of last commit\n    const commits: GitCommit[] = [];\n    const branchPoints: GitBranchPoint[] = [];\n    let current = 'main';\n    let nextLane = 1;\n    let order = 0;\n    let auto = 0;\n\n    for (const s of raw.statements) {\n      if (s.t === 'commit') {\n        const lane = laneOf.get(current)!;\n        commits.push({ id: s.id || `c${auto++}`, lane, x: order, type: commitType(s.type), isMerge: false, ...(s.tag ? { tag: s.tag } : {}) });\n        lastX.set(lane, order); order++;\n      } else if (s.t === 'branch') {\n        if (!laneOf.has(s.name!)) { laneOf.set(s.name!, nextLane); laneNames[nextLane] = s.name!; nextLane++; }\n        const lane = laneOf.get(s.name!)!;\n        const parentLane = laneOf.get(current)!;\n        branchPoints.push({ lane, parentLane, x: order, parentX: lastX.get(parentLane) ?? 0 });\n        current = s.name!;\n      } else if (s.t === 'checkout') {\n        if (laneOf.has(s.name!)) current = s.name!;\n      } else if (s.t === 'merge') {\n        const lane = laneOf.get(current)!;\n        const fromLane = laneOf.get(s.name!) ?? lane;\n        commits.push({ id: s.id || `m${auto++}`, lane, x: order, type: commitType(s.type), isMerge: true, fromLane, fromX: lastX.get(fromLane) ?? order, ...(s.tag ? { tag: s.tag } : {}) });\n        lastX.set(lane, order); order++;\n      }\n    }\n\n    return { version: raw.version, metadata: raw.metadata, lanes: nextLane, laneNames, commits, branchPoints };\n  },\n\n  parseYaml(input: string): GitgraphDocument {\n    return JSON.parse(input) as GitgraphDocument;\n  },\n\n  layout(ir: GitgraphDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutGitgraph(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/c4/layout.ts \u2014 C4 context/container diagram.\n *\n * Nodes (Person/System, optionally _Ext) place via the shared layered kernel;\n * boundaries draw as labeled dashed containers around their descendant nodes\n * (outer first). Relationships are arrows with label + optional technology.\n */\n\nimport type { C4Document, C4Node } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult, Rect } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { layeredLayout, routeEdge, type GraphNode, type GraphEdge } from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'c4-arrow';\nconst NODE_W = 180;\n\nexport function layoutC4(ir: C4Document, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.smallFontSize;\n\n  const isPerson = (k: C4Node['kind']) => k === 'person' || k === 'person_ext';\n  const isExt    = (k: C4Node['kind']) => k.endsWith('_ext');\n\n  // Pre-wrap + size.\n  const prep = new Map<string, { labelLines: string[]; descrLines: string[]; h: number }>();\n  for (const n of ir.nodes) {\n    const labelLines = wrapText(n.label, typography.baseFontSize, NODE_W - 20, 2).lines;\n    const descrLines = n.descr ? wrapText(n.descr, font, NODE_W - 20, 3).lines : [];\n    const h = 14 + labelLines.length * rhuInt(typography.baseFontSize * 1.25) + 4 + descrLines.length * rhuInt(font * 1.3) + 14 + (isPerson(n.kind) ? 10 : 0);\n    prep.set(n.id, { labelLines, descrLines, h });\n  }\n\n  const nodes: GraphNode[] = ir.nodes.map(n => ({ id: n.id, width: NODE_W, height: prep.get(n.id)!.h }));\n  const edges: GraphEdge[] = ir.rels.map(r => ({ from: r.from, to: r.to }));\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 80, nodeGap: 50, margin: margin + 24 });\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const yOff = titleH + 12;\n\n  const elements: SceneElement[] = [];\n  if (title) elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Boundaries (outer first) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const sorted = [...ir.boundaries].sort((a, b) => a.depth - b.depth);\n  for (const bnd of sorted) {\n    const rects = bnd.nodeIds.map(id => laid.boxes.get(id)).filter((r): r is NonNullable<typeof r> => !!r);\n    if (rects.length === 0) continue;\n    const pad = 18 + bnd.depth * 4;\n    const minX = Math.min(...rects.map(r => r.x)) - pad;\n    const minY = Math.min(...rects.map(r => r.y)) - pad - 16 + yOff;\n    const maxX = Math.max(...rects.map(r => r.x + r.width)) + pad;\n    const maxY = Math.max(...rects.map(r => r.y + r.height)) + pad + yOff;\n    const bx = rhu(minX), by = rhu(minY), bw = rhu(maxX - minX), bh = rhu(maxY - minY);\n    elements.push(p.path(`M ${bx} ${by} h ${bw} v ${bh} h ${-bw} Z`, palette.textMuted, 1.3, { dash: '7 5' }));\n    elements.push(p.text(bnd.label, rhu(minX + 10), rhu(minY + 16), font, palette.textMuted, { weight: 'bold' }));\n  }\n\n  // \u2500\u2500 Relationships \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const r of ir.rels) {\n    const a = laid.boxes.get(r.from), b = laid.boxes.get(r.to);\n    if (!a || !b) continue;\n    const ao = { ...a, y: a.y + yOff }, bo = { ...b, y: b.y + yOff };\n    const ac = { x: ao.x + ao.width / 2, y: ao.y + ao.height / 2 };\n    const bc = { x: bo.x + bo.width / 2, y: bo.y + bo.height / 2 };\n    const pa = borderPoint(ao, bc.x, bc.y);\n    const pb = borderPoint(bo, ac.x, ac.y);\n    const { path, labelMidpoint } = routeEdge(a, b, allBoxes, yOff);\n    elements.push(p.path(path, palette.textMuted, 1.4, { ...(r.ext ? { dash: '6 4' } : {}), markerEnd: ARROW_ID }));\n    const mx = labelMidpoint.x, my = labelMidpoint.y;\n    const lbl = r.tech ? `${r.label ?? ''} [${r.tech}]` : (r.label ?? '');\n    if (lbl) {\n      const w = measureText(lbl, font).width + 8;\n      elements.push(p.rect({ x: rhu(mx - w / 2), y: rhu(my - font), width: rhu(w), height: font + 4 }, palette.background, palette.background, 0));\n      elements.push(p.text(lbl, rhuInt(mx), rhu(my - 1), font, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const n of ir.nodes) {\n    const box = laid.boxes.get(n.id)!;\n    const pr = prep.get(n.id)!;\n    const x = box.x, y = box.y + yOff, w = NODE_W, h = box.height;\n    const fill = isExt(n.kind) ? palette.surface : (isPerson(n.kind) ? palette.secondary : palette.primary);\n    const txt = isExt(n.kind) ? palette.text : '#FFFFFF';\n    const rx = isPerson(n.kind) ? 16 : 6;\n    elements.push(p.rect({ x: rhu(x), y: rhu(y), width: w, height: rhu(h) }, fill, isExt(n.kind) ? palette.textMuted : fill, isExt(n.kind) ? 1.4 : 0, { rx }));\n    let ty = y + 16;\n    for (const ln of pr.labelLines) { elements.push(p.text(ln, rhuInt(x + w / 2), rhu(ty), typography.baseFontSize, txt, { weight: 'bold', anchor: 'middle' })); ty += rhuInt(typography.baseFontSize * 1.25); }\n    elements.push(p.text(`[${n.kind.replace('_', ' ')}]`, rhuInt(x + w / 2), rhu(ty), font, isExt(n.kind) ? palette.textMuted : '#FFFFFF', { anchor: 'middle' }));\n    ty += rhuInt(font * 1.3) + 2;\n    for (const ln of pr.descrLines) { elements.push(p.text(ln, rhuInt(x + w / 2), rhu(ty), font, isExt(n.kind) ? palette.textMuted : '#FFFFFF', { anchor: 'middle', opacity: 0.9 })); ty += rhuInt(font * 1.3); }\n  }\n\n  const allRects: Rect[] = ir.nodes.map(n => { const b = laid.boxes.get(n.id)!; return { x: b.x, y: b.y + yOff, width: b.width, height: b.height }; });\n  const totalW = rhuInt(Math.max(laid.width, ...allRects.map(r => r.x + r.width)) + margin + 24);\n  const totalH = rhuInt(Math.max(...allRects.map(r => r.y + r.height)) + margin + 24);\n  const defs = [`<marker id=\"${ARROW_ID}\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><polygon points=\"0 0, 10 4, 0 8\" fill=\"${palette.textMuted}\" /></marker>`];\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n    defs,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function kindOf(k) {\n    const s = k.toLowerCase();\n    if (s === 'person') return 'person';\n    if (s === 'person_ext') return 'person_ext';\n    if (s === 'system_ext') return 'system_ext';\n    if (s === 'systemdb' || s === 'containerdb') return 'db';\n    if (s.startsWith('container')) return s.endsWith('_ext') ? 'container_ext' : 'container';\n    if (s.startsWith('component')) return 'component';\n    return 'system';\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"c4\";\n  var peg$c1 = \"context\";\n  var peg$c2 = \"container\";\n  var peg$c3 = \"component\";\n  var peg$c4 = \"dynamic\";\n  var peg$c5 = \"deployment\";\n  var peg$c6 = \"---\";\n  var peg$c7 = \"title\";\n  var peg$c8 = \"enterprise_boundary\";\n  var peg$c9 = \"system_boundary\";\n  var peg$c10 = \"container_boundary\";\n  var peg$c11 = \"boundary\";\n  var peg$c12 = \"(\";\n  var peg$c13 = \",\";\n  var peg$c14 = \")\";\n  var peg$c15 = \"{\";\n  var peg$c16 = \"\\r\";\n  var peg$c17 = \"\\n\";\n  var peg$c18 = \"}\";\n  var peg$c19 = \"rel_ext\";\n  var peg$c20 = \"birel\";\n  var peg$c21 = \"rel\";\n  var peg$c22 = \"\\\"\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[A-Za-z]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[^\"]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"C4\", true);\n  var peg$e1 = peg$literalExpectation(\"Context\", true);\n  var peg$e2 = peg$literalExpectation(\"Container\", true);\n  var peg$e3 = peg$literalExpectation(\"Component\", true);\n  var peg$e4 = peg$literalExpectation(\"Dynamic\", true);\n  var peg$e5 = peg$literalExpectation(\"Deployment\", true);\n  var peg$e6 = peg$literalExpectation(\"---\", false);\n  var peg$e7 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e8 = peg$literalExpectation(\"title\", true);\n  var peg$e9 = peg$literalExpectation(\"Enterprise_Boundary\", true);\n  var peg$e10 = peg$literalExpectation(\"System_Boundary\", true);\n  var peg$e11 = peg$literalExpectation(\"Container_Boundary\", true);\n  var peg$e12 = peg$literalExpectation(\"Boundary\", true);\n  var peg$e13 = peg$literalExpectation(\"(\", false);\n  var peg$e14 = peg$literalExpectation(\",\", false);\n  var peg$e15 = peg$literalExpectation(\")\", false);\n  var peg$e16 = peg$literalExpectation(\"{\", false);\n  var peg$e17 = peg$literalExpectation(\"\\r\", false);\n  var peg$e18 = peg$literalExpectation(\"\\n\", false);\n  var peg$e19 = peg$literalExpectation(\"}\", false);\n  var peg$e20 = peg$literalExpectation(\"Rel_Ext\", true);\n  var peg$e21 = peg$literalExpectation(\"BiRel\", true);\n  var peg$e22 = peg$literalExpectation(\"Rel\", true);\n  var peg$e23 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"]], false, false);\n  var peg$e24 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e25 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e26 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e27 = peg$anyExpectation();\n  var peg$e28 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const nodes = [];\n      const boundaries = [];\n      const rels = [];\n      let title;\n      const walk = (list, depth) => {\n        const ids = [];\n        for (const s of list.filter(Boolean)) {\n          if (s.t === 'title') title = s.v;\n          else if (s.t === 'node') { nodes.push({ id: s.id, label: s.label, kind: s.kind, ...(s.descr ? { descr: s.descr } : {}) }); ids.push(s.id); }\n          else if (s.t === 'rel') rels.push({ from: s.from, to: s.to, ext: s.ext, ...(s.label ? { label: s.label } : {}), ...(s.tech ? { tech: s.tech } : {}) });\n          else if (s.t === 'boundary') {\n            const inner = walk(s.inner, depth + 1);\n            boundaries.push({ id: s.id, label: s.label, depth, nodeIds: inner });\n            for (const id of inner) ids.push(id);\n          }\n        }\n        return ids;\n      };\n      walk(stmts, 0);\n      return { version: '1.0', metadata: { ...(fm || {}), ...(title ? { title } : {}) }, nodes, boundaries, rels };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(id, label, inner) {\n      return { t: 'boundary', id, label, inner };\n    };\n  var peg$f5 = function(k, id, label, d) { return d; };\n  var peg$f6 = function(k, id, label, descr) {\n      return { t: 'node', kind: kindOf(k), id, label, descr: descr || undefined };\n    };\n  var peg$f7 = function(kind, from, to, l) { return l; };\n  var peg$f8 = function(kind, from, to, label, t) { return t; };\n  var peg$f9 = function(kind, from, to, label, tech) {\n      return { t: 'rel', from, to, label: label || undefined, tech: tech || undefined, ext: kind.toLowerCase() === 'rel_ext' };\n    };\n  var peg$f10 = function(s) { return s.replace(/<br\\s*\\/?>/gi, ' ').replace(/\\s+/g, ' ').trim(); };\n  var peg$f11 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 2);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 2;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = input.substr(peg$currPos, 7);\n      if (s4.toLowerCase() === peg$c1) {\n        peg$currPos += 7;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = input.substr(peg$currPos, 9);\n        if (s4.toLowerCase() === peg$c2) {\n          peg$currPos += 9;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = input.substr(peg$currPos, 9);\n          if (s4.toLowerCase() === peg$c3) {\n            peg$currPos += 9;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s4 === peg$FAILED) {\n            s4 = input.substr(peg$currPos, 7);\n            if (s4.toLowerCase() === peg$c4) {\n              peg$currPos += 7;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            if (s4 === peg$FAILED) {\n              s4 = input.substr(peg$currPos, 10);\n              if (s4.toLowerCase() === peg$c5) {\n                peg$currPos += 10;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e5); }\n              }\n            }\n          }\n        }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          s6 = [];\n          s7 = peg$parseStatement();\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = peg$parseStatement();\n          }\n          s7 = peg$parse_();\n          peg$savedPos = s0;\n          s0 = peg$f0(s1, s6);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c6) {\n          s7 = peg$c6;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c6) {\n            s7 = peg$c6;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c6) {\n          s4 = peg$c6;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitleLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseBoundaryBlock();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseRelDecl();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseNodeDecl();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c7) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoundaryBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 19);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 19;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 15);\n      if (s2.toLowerCase() === peg$c9) {\n        peg$currPos += 15;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 18);\n        if (s2.toLowerCase() === peg$c10) {\n          peg$currPos += 18;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 8);\n          if (s2.toLowerCase() === peg$c11) {\n            peg$currPos += 8;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseIdent();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c13;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseQuoted();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s12 = peg$c13;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseQuoted();\n                if (s14 !== peg$FAILED) {\n                  s11 = [s11, s12, s13, s14];\n                  s10 = s11;\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 41) {\n                s12 = peg$c14;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 123) {\n                  s14 = peg$c15;\n                  peg$currPos++;\n                } else {\n                  s14 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                if (s14 !== peg$FAILED) {\n                  s15 = peg$parse_();\n                  if (input.charCodeAt(peg$currPos) === 13) {\n                    s16 = peg$c16;\n                    peg$currPos++;\n                  } else {\n                    s16 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                  }\n                  if (s16 === peg$FAILED) {\n                    s16 = null;\n                  }\n                  if (input.charCodeAt(peg$currPos) === 10) {\n                    s17 = peg$c17;\n                    peg$currPos++;\n                  } else {\n                    s17 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                  }\n                  if (s17 !== peg$FAILED) {\n                    s18 = [];\n                    s19 = peg$parseStatement();\n                    while (s19 !== peg$FAILED) {\n                      s18.push(s19);\n                      s19 = peg$parseStatement();\n                    }\n                    s19 = peg$parse_();\n                    if (input.charCodeAt(peg$currPos) === 125) {\n                      s20 = peg$c18;\n                      peg$currPos++;\n                    } else {\n                      s20 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                    }\n                    if (s20 !== peg$FAILED) {\n                      s21 = peg$parseLineEnd();\n                      if (s21 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s0 = peg$f4(s5, s9, s18);\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseNodeKind();\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseIdent();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c13;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseQuoted();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s12 = peg$c13;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseQuoted();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f5(s2, s5, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = [];\n              s12 = peg$currPos;\n              s13 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s14 = peg$c13;\n                peg$currPos++;\n              } else {\n                s14 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s14 !== peg$FAILED) {\n                s15 = peg$parse_();\n                s16 = peg$parseQuoted();\n                if (s16 !== peg$FAILED) {\n                  s13 = [s13, s14, s15, s16];\n                  s12 = s13;\n                } else {\n                  peg$currPos = s12;\n                  s12 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s12;\n                s12 = peg$FAILED;\n              }\n              while (s12 !== peg$FAILED) {\n                s11.push(s12);\n                s12 = peg$currPos;\n                s13 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 44) {\n                  s14 = peg$c13;\n                  peg$currPos++;\n                } else {\n                  s14 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                }\n                if (s14 !== peg$FAILED) {\n                  s15 = peg$parse_();\n                  s16 = peg$parseQuoted();\n                  if (s16 !== peg$FAILED) {\n                    s13 = [s13, s14, s15, s16];\n                    s12 = s13;\n                  } else {\n                    peg$currPos = s12;\n                    s12 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s12;\n                  s12 = peg$FAILED;\n                }\n              }\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 41) {\n                s13 = peg$c14;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parseLineEnd();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f6(s2, s5, s9, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c19) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 5);\n      if (s2.toLowerCase() === peg$c20) {\n        peg$currPos += 5;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 3);\n        if (s2.toLowerCase() === peg$c21) {\n          peg$currPos += 3;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e22); }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseIdent();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c13;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseIdent();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s12 = peg$c13;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseQuoted();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f7(s2, s5, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = peg$currPos;\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s13 = peg$c13;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parse_();\n                s15 = peg$parseQuoted();\n                if (s15 !== peg$FAILED) {\n                  peg$savedPos = s11;\n                  s11 = peg$f8(s2, s5, s9, s10, s15);\n                } else {\n                  peg$currPos = s11;\n                  s11 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n              if (s11 === peg$FAILED) {\n                s11 = null;\n              }\n              s12 = [];\n              s13 = peg$currPos;\n              s14 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s15 = peg$c13;\n                peg$currPos++;\n              } else {\n                s15 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s15 !== peg$FAILED) {\n                s16 = peg$parse_();\n                s17 = peg$parseQuoted();\n                if (s17 !== peg$FAILED) {\n                  s14 = [s14, s15, s16, s17];\n                  s13 = s14;\n                } else {\n                  peg$currPos = s13;\n                  s13 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s13;\n                s13 = peg$FAILED;\n              }\n              while (s13 !== peg$FAILED) {\n                s12.push(s13);\n                s13 = peg$currPos;\n                s14 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 44) {\n                  s15 = peg$c13;\n                  peg$currPos++;\n                } else {\n                  s15 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                }\n                if (s15 !== peg$FAILED) {\n                  s16 = peg$parse_();\n                  s17 = peg$parseQuoted();\n                  if (s17 !== peg$FAILED) {\n                    s14 = [s14, s15, s16, s17];\n                    s13 = s14;\n                  } else {\n                    peg$currPos = s13;\n                    s13 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s13;\n                  s13 = peg$FAILED;\n                }\n              }\n              s13 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 41) {\n                s14 = peg$c14;\n                peg$currPos++;\n              } else {\n                s14 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s14 !== peg$FAILED) {\n                s15 = peg$parseLineEnd();\n                if (s15 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f9(s2, s5, s9, s10, s11);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeKind() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c22;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c22;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c16;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c17;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f11();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c16;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c17;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c16;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c17;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e27); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e28); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r4.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e28); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { C4Document } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutC4 } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { C4Document, C4Node, C4Boundary, C4Rel } from './ir.js';\n\nexport const c4: DiagramModule<C4Document> = {\n  parseMermaid(input: string): C4Document {\n    return parser.parse(input) as C4Document;\n  },\n\n  parseYaml(input: string): C4Document {\n    return JSON.parse(input) as C4Document;\n  },\n\n  layout(ir: C4Document, theme: ResolvedTheme): LayoutResult {\n    return layoutC4(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/architecture/layout.ts \u2014 Cloud architecture diagram.\n *\n * Services place via the shared layered kernel; group boxes wrap their members;\n * edges connect side-anchored ports (L/R/T/B) with an orthogonal connector.\n */\n\nimport type { ArchitectureDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult, Rect, PortDirection } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { layeredLayout, type GraphNode, type GraphEdge } from '../../../graph/layered.js';\nimport { orthogonalRouter } from '../../../routing/router.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'arch-arrow';\n\nfunction port(r: Rect, side: string): { x: number; y: number } {\n  switch (side.toUpperCase()) {\n    case 'L': return { x: r.x, y: r.y + r.height / 2 };\n    case 'R': return { x: r.x + r.width, y: r.y + r.height / 2 };\n    case 'T': return { x: r.x + r.width / 2, y: r.y };\n    default:  return { x: r.x + r.width / 2, y: r.y + r.height };\n  }\n}\n\nexport function layoutArchitecture(ir: ArchitectureDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n\n  const svcW = 130, svcH = 56;\n  const nodes: GraphNode[] = ir.services.map(s => ({ id: s.id, width: svcW, height: svcH }));\n  const edges: GraphEdge[] = ir.edges.map(e => ({ from: e.from, to: e.to }));\n  const laid = layeredLayout(nodes, edges, { direction: 'LR', layerGap: 90, nodeGap: 44, margin: margin + 26 });\n\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n  const rectOf = (id: string): Rect | undefined => { const b = laid.boxes.get(id); return b ? { x: b.x, y: b.y + yOff, width: b.width, height: b.height } : undefined; };\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title) elements.push(p.text(ir.metadata.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  // \u2500\u2500 Group boxes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.groups.forEach((g, gi) => {\n    const members = ir.services.filter(s => s.group === g.id).map(s => rectOf(s.id)).filter((r): r is Rect => !!r);\n    if (members.length === 0) return;\n    const pad = 20;\n    const minX = Math.min(...members.map(r => r.x)) - pad;\n    const minY = Math.min(...members.map(r => r.y)) - pad - 14;\n    const maxX = Math.max(...members.map(r => r.x + r.width)) + pad;\n    const maxY = Math.max(...members.map(r => r.y + r.height)) + pad;\n    const hue = categoricalHue(gi);\n    elements.push(p.rect({ x: rhu(minX), y: rhu(minY), width: rhu(maxX - minX), height: rhu(maxY - minY) }, hue + '14', hue, 1.4, { rx: 10 }));\n    elements.push(p.text(g.label, rhu(minX + 12), rhu(minY + 16), typography.smallFontSize, hue, { weight: 'bold' }));\n  });\n\n  // \u2500\u2500 Edges (side-anchored, obstacle-avoiding) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const e of ir.edges) {\n    const a = rectOf(e.from), b = rectOf(e.to);\n    if (!a || !b) continue;\n    const pa = port(a, e.fromSide), pb = port(b, e.toSide);\n    const fromDir: PortDirection = e.fromSide.toUpperCase() === 'L' ? 'W'\n      : e.fromSide.toUpperCase() === 'R' ? 'E'\n      : e.fromSide.toUpperCase() === 'T' ? 'N' : 'S';\n    const toDir: PortDirection = e.toSide.toUpperCase() === 'L' ? 'W'\n      : e.toSide.toUpperCase() === 'R' ? 'E'\n      : e.toSide.toUpperCase() === 'T' ? 'N' : 'S';\n    const obstacles: Rect[] = allBoxes\n      .filter(bx => bx.id !== e.from && bx.id !== e.to)\n      .map(bx => ({ x: bx.x, y: bx.y + yOff, width: bx.width, height: bx.height }));\n    const route = orthogonalRouter.route({\n      from: pa, to: pb, style: 'orthogonal',\n      obstacles, padding: 10,\n      fromDir, toDir,\n    });\n    elements.push(p.path(route.path, palette.primary, 1.6, { markerEnd: ARROW_ID }));\n  }\n\n  // \u2500\u2500 Service nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.services.forEach((s, i) => {\n    const r = rectOf(s.id)!;\n    const hue = categoricalHue(i);\n    elements.push(p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) }, palette.surface, palette.border, 1.4, { rx: 8 }));\n    elements.push(p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: 8 }, hue, hue, 0, { rx: 4 }));\n    elements.push(...iconGlyph(p, s.icon, r.x + r.width / 2, r.y + 24, hue, palette));\n    elements.push(p.text(s.label, rhuInt(r.x + r.width / 2), rhu(r.y + r.height - 9), font, palette.text, { weight: 'bold', anchor: 'middle' }));\n  });\n\n  const allR = ir.services.map(s => rectOf(s.id)!);\n  const totalW = rhuInt(Math.max(...allR.map(r => r.x + r.width)) + margin + 26);\n  const totalH = rhuInt(Math.max(...allR.map(r => r.y + r.height)) + margin + 26);\n  const defs = [`<marker id=\"${ARROW_ID}\" markerWidth=\"10\" markerHeight=\"8\" refX=\"9\" refY=\"4\" orient=\"auto\"><polygon points=\"0 0, 10 4, 0 8\" fill=\"${palette.primary}\" /></marker>`];\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n    defs,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n\n/** A small line glyph for a service icon name (server/database/cloud/internet/disk). */\nfunction iconGlyph(\n  p: ReturnType<typeof pen>,\n  icon: string,\n  cx: number,\n  cy: number,\n  hue: string,\n  palette: ResolvedTheme['palette'],\n): SceneElement[] {\n  const name = icon.toLowerCase();\n  const out: SceneElement[] = [];\n  const stroke = hue;\n  if (name.includes('server') || name.includes('compute')) {\n    for (let i = 0; i < 3; i++) out.push(p.rect({ x: rhu(cx - 10), y: rhu(cy - 9 + i * 7), width: 20, height: 5 }, palette.surface, stroke, 1.3, { rx: 1 }));\n  } else if (name.includes('database') || name.includes('db') || name.includes('datastore') || name.includes('storage') || name.includes('disk')) {\n    out.push(p.rect({ x: rhu(cx - 9), y: rhu(cy - 9), width: 18, height: 18 }, palette.surface, stroke, 1.3, { rx: 5 }));\n    out.push(p.path(`M ${rhu(cx - 9)} ${rhu(cy - 3)} Q ${rhu(cx)} ${rhu(cy + 1)}, ${rhu(cx + 9)} ${rhu(cy - 3)}`, stroke, 1.3));\n  } else if (name.includes('cloud')) {\n    out.push(p.circle({ x: rhu(cx - 6), y: rhu(cy + 2) }, 6, palette.surface, stroke, 1.3));\n    out.push(p.circle({ x: rhu(cx + 6), y: rhu(cy + 2) }, 6, palette.surface, stroke, 1.3));\n    out.push(p.circle({ x: rhu(cx), y: rhu(cy - 3) }, 7, palette.surface, stroke, 1.3));\n    out.push(p.rect({ x: rhu(cx - 10), y: rhu(cy + 2), width: 20, height: 6 }, palette.surface, palette.surface, 0));\n  } else if (name.includes('internet') || name.includes('globe') || name.includes('web') || name.includes('client')) {\n    out.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 9, palette.surface, stroke, 1.3));\n    out.push(p.path(`M ${rhu(cx)} ${rhu(cy - 9)} L ${rhu(cx)} ${rhu(cy + 9)} M ${rhu(cx - 9)} ${rhu(cy)} L ${rhu(cx + 9)} ${rhu(cy)}`, stroke, 1));\n    out.push(p.path(`M ${rhu(cx - 9)} ${rhu(cy)} Q ${rhu(cx)} ${rhu(cy - 11)}, ${rhu(cx + 9)} ${rhu(cy)} Q ${rhu(cx)} ${rhu(cy + 11)}, ${rhu(cx - 9)} ${rhu(cy)}`, stroke, 1));\n  } else {\n    out.push(p.rect({ x: rhu(cx - 9), y: rhu(cy - 9), width: 18, height: 18 }, palette.surface, stroke, 1.3, { rx: 4 }));\n  }\n  return out;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"architecture-beta\";\n  var peg$c1 = \"group\";\n  var peg$c2 = \"(\";\n  var peg$c3 = \")\";\n  var peg$c4 = \"[\";\n  var peg$c5 = \"]\";\n  var peg$c6 = \"service\";\n  var peg$c7 = \"in\";\n  var peg$c8 = \":\";\n  var peg$c9 = \"-->\";\n  var peg$c10 = \"--\";\n  var peg$c11 = \"<-->\";\n  var peg$c12 = \"\\r\";\n  var peg$c13 = \"\\n\";\n\n  var peg$r0 = /^[ \\t]/;\n  var peg$r1 = /^[^)\\n]/;\n  var peg$r2 = /^[^\\]\\n]/;\n  var peg$r3 = /^[LRTBlrtb]/;\n  var peg$r4 = /^[^\\n]/;\n  var peg$r5 = /^[A-Za-z0-9_]/;\n\n  var peg$e0 = peg$literalExpectation(\"architecture-beta\", true);\n  var peg$e1 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e2 = peg$literalExpectation(\"group\", true);\n  var peg$e3 = peg$literalExpectation(\"(\", false);\n  var peg$e4 = peg$classExpectation([\")\", \"\\n\"], true, false);\n  var peg$e5 = peg$literalExpectation(\")\", false);\n  var peg$e6 = peg$literalExpectation(\"[\", false);\n  var peg$e7 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e8 = peg$literalExpectation(\"]\", false);\n  var peg$e9 = peg$literalExpectation(\"service\", true);\n  var peg$e10 = peg$literalExpectation(\"in\", true);\n  var peg$e11 = peg$literalExpectation(\":\", false);\n  var peg$e12 = peg$literalExpectation(\"-->\", false);\n  var peg$e13 = peg$literalExpectation(\"--\", false);\n  var peg$e14 = peg$literalExpectation(\"<-->\", false);\n  var peg$e15 = peg$classExpectation([\"L\", \"R\", \"T\", \"B\", \"l\", \"r\", \"t\", \"b\"], false, false);\n  var peg$e16 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e17 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e18 = peg$literalExpectation(\"\\r\", false);\n  var peg$e19 = peg$literalExpectation(\"\\n\", false);\n  var peg$e20 = peg$anyExpectation();\n\n  var peg$f0 = function(lines) {\n      const groups = [];\n      const services = [];\n      const edges = [];\n      let curGroup, curIndent = -1;\n      for (const l of lines.filter(Boolean)) {\n        if (l.t === 'group') { groups.push({ id: l.id, label: l.label, icon: l.icon }); curGroup = l.id; curIndent = l.indent; }\n        else if (l.t === 'service') {\n          const group = l.inGroup || (l.indent > curIndent && curGroup ? curGroup : undefined);\n          services.push({ id: l.id, label: l.label, icon: l.icon, ...(group ? { group } : {}) });\n        } else if (l.t === 'edge') edges.push({ from: l.from, fromSide: l.fromSide, to: l.to, toSide: l.toSide });\n      }\n      return { version: '1.0', metadata: {}, groups, services, edges };\n    };\n  var peg$f1 = function(ind, id, icon, label) {\n      return { t: 'group', indent: ind.length, id, icon: icon.trim(), label: label.trim() };\n    };\n  var peg$f2 = function(ind, id, icon, label, g) { return g; };\n  var peg$f3 = function(ind, id, icon, label, inG) {\n      return { t: 'service', indent: ind.length, id, icon: icon.trim(), label: label.trim(), inGroup: inG || undefined };\n    };\n  var peg$f4 = function(from, fromSide, toSide, to) {\n      return { t: 'edge', from, fromSide, to, toSide };\n    };\n  var peg$f5 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 17);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 17;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseLine();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseLine();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    var s0;\n\n    s0 = peg$parseGroupLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseServiceLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseEdgeLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseBlankLine();\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseGroupLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r0.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c1) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 40) {\n            s5 = peg$c2;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r1.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r1.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e4); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 41) {\n              s7 = peg$c3;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s7 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 91) {\n                s8 = peg$c4;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e6); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$currPos;\n                s10 = [];\n                s11 = input.charAt(peg$currPos);\n                if (peg$r2.test(s11)) {\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                }\n                while (s11 !== peg$FAILED) {\n                  s10.push(s11);\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r2.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                  }\n                }\n                s9 = input.substring(s9, peg$currPos);\n                if (input.charCodeAt(peg$currPos) === 93) {\n                  s10 = peg$c5;\n                  peg$currPos++;\n                } else {\n                  s10 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                }\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseRestIgnore();\n                  s12 = peg$parseLineEnd();\n                  if (s12 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f1(s1, s4, s6, s9);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseServiceLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r0.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c6) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 40) {\n            s5 = peg$c2;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r1.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r1.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e4); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 41) {\n              s7 = peg$c3;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s7 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 91) {\n                s8 = peg$c4;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e6); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$currPos;\n                s10 = [];\n                s11 = input.charAt(peg$currPos);\n                if (peg$r2.test(s11)) {\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                }\n                while (s11 !== peg$FAILED) {\n                  s10.push(s11);\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r2.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                  }\n                }\n                s9 = input.substring(s9, peg$currPos);\n                if (input.charCodeAt(peg$currPos) === 93) {\n                  s10 = peg$c5;\n                  peg$currPos++;\n                } else {\n                  s10 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                }\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$currPos;\n                  s12 = peg$parse__();\n                  if (s12 !== peg$FAILED) {\n                    s13 = input.substr(peg$currPos, 2);\n                    if (s13.toLowerCase() === peg$c7) {\n                      peg$currPos += 2;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n                    }\n                    if (s13 !== peg$FAILED) {\n                      s14 = peg$parse__();\n                      if (s14 !== peg$FAILED) {\n                        s15 = peg$parseIdent();\n                        if (s15 !== peg$FAILED) {\n                          peg$savedPos = s11;\n                          s11 = peg$f2(s1, s4, s6, s9, s15);\n                        } else {\n                          peg$currPos = s11;\n                          s11 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s11;\n                        s11 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s11;\n                      s11 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s11;\n                    s11 = peg$FAILED;\n                  }\n                  if (s11 === peg$FAILED) {\n                    s11 = null;\n                  }\n                  s12 = peg$parseRestIgnore();\n                  s13 = peg$parseLineEnd();\n                  if (s13 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f3(s1, s4, s6, s9, s11);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c8;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseSide();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.substr(peg$currPos, 3) === peg$c9) {\n            s6 = peg$c9;\n            peg$currPos += 3;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s6 === peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c10) {\n              s6 = peg$c10;\n              peg$currPos += 2;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e13); }\n            }\n            if (s6 === peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c11) {\n                s6 = peg$c11;\n                peg$currPos += 4;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n            }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            s8 = peg$parseSide();\n            if (s8 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s9 = peg$c8;\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e11); }\n              }\n              if (s9 !== peg$FAILED) {\n                s10 = peg$parseIdent();\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseRestIgnore();\n                  s12 = peg$parseLineEnd();\n                  if (s12 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f4(s2, s4, s8, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSide() {\n    var s0;\n\n    s0 = input.charAt(peg$currPos);\n    if (peg$r3.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestIgnore() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r4.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r4.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n    }\n    s0 = input.substring(s0, peg$currPos);\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r5.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r5.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c12;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c13;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f5();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c13;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r0.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r0.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r0.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r0.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { ArchitectureDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutArchitecture } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { ArchitectureDocument, ArchService, ArchGroup, ArchEdge } from './ir.js';\n\nexport const architecture: DiagramModule<ArchitectureDocument> = {\n  parseMermaid(input: string): ArchitectureDocument {\n    return parser.parse(input) as ArchitectureDocument;\n  },\n\n  parseYaml(input: string): ArchitectureDocument {\n    return JSON.parse(input) as ArchitectureDocument;\n  },\n\n  layout(ir: ArchitectureDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutArchitecture(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/packet/layout.ts \u2014 Network packet / bit-field diagram.\n *\n * Bits lay out in rows of 32; each field spans its bit range (split across rows\n * when needed) as a labeled cell. Start/end bit numbers sit above row edges.\n * Field fills come from the categorical hue cycle.\n */\n\nimport type { PacketDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { truncateText } from '../../../text/wrap.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst BITS_PER_ROW = 32;\n\nexport function layoutPacket(ir: PacketDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const fields = [...ir.fields].sort((a, b) => a.start - b.start);\n  const maxBit = Math.max(0, ...fields.map(f => f.end));\n  const numRows = Math.floor(maxBit / BITS_PER_ROW) + 1;\n\n  const bitW   = 26;\n  const rowH   = 46;\n  const rowGap = 26;                    // room for bit-number labels above each row\n  const bitFont = typography.smallFontSize;\n  const labelFont = typography.smallFontSize;\n\n  const title  = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const gridLeft = margin;\n  const gridTop  = margin + titleH + rowGap;\n\n  const elements: SceneElement[] = [];\n  if (title) elements.push(p.text(title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  const rowTop = (r: number): number => gridTop + r * (rowH + rowGap);\n\n  // Per-row bit ticks (0 and 31 on each row plus multiples of 8).\n  for (let r = 0; r < numRows; r++) {\n    for (let c = 0; c <= BITS_PER_ROW; c += 8) {\n      const bit = r * BITS_PER_ROW + c;\n      const x = gridLeft + c * bitW;\n      if (c < BITS_PER_ROW) elements.push(p.text(String(bit), rhu(x + 2), rhu(rowTop(r) - 6), bitFont, palette.textMuted));\n    }\n  }\n\n  // Field cells (split across row boundaries).\n  fields.forEach((f, i) => {\n    const hue = categoricalHue(i);\n    for (let r = Math.floor(f.start / BITS_PER_ROW); r <= Math.floor(f.end / BITS_PER_ROW); r++) {\n      const rowStartBit = r * BITS_PER_ROW;\n      const cStart = Math.max(f.start, rowStartBit) - rowStartBit;\n      const cEnd   = Math.min(f.end, rowStartBit + BITS_PER_ROW - 1) - rowStartBit;\n      const x = gridLeft + cStart * bitW;\n      const w = (cEnd - cStart + 1) * bitW;\n      const y = rowTop(r);\n      elements.push(p.rect({ x: rhu(x), y: rhu(y), width: rhu(w), height: rowH }, hue + '33', hue, 1.4, { rx: 3 }));\n      const label = truncateText(f.label, labelFont, w - 6);\n      elements.push(p.text(label, rhuInt(x + w / 2), rhu(y + rowH / 2 + labelFont * 0.35), labelFont, palette.text, { weight: 'bold', anchor: 'middle' }));\n      // start bit number inside top-left of the cell\n      elements.push(p.text(String(f.start), rhu(x + 3), rhu(y + bitFont + 1), bitFont, palette.textMuted));\n    }\n  });\n\n  const totalW = rhuInt(gridLeft + BITS_PER_ROW * bitW + margin);\n  const totalH = rhuInt(rowTop(numRows - 1) + rowH + margin);\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"packet-beta\";\n  var peg$c1 = \"title\";\n  var peg$c2 = \"-\";\n  var peg$c3 = \":\";\n  var peg$c4 = \"\\\"\";\n  var peg$c5 = \"\\r\";\n  var peg$c6 = \"\\n\";\n\n  var peg$r0 = /^[^\"]/;\n  var peg$r1 = /^[^\\n]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"packet-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"title\", true);\n  var peg$e2 = peg$literalExpectation(\"-\", false);\n  var peg$e3 = peg$literalExpectation(\":\", false);\n  var peg$e4 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e5 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e6 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e7 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e8 = peg$literalExpectation(\"\\r\", false);\n  var peg$e9 = peg$literalExpectation(\"\\n\", false);\n  var peg$e10 = peg$anyExpectation();\n  var peg$e11 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(stmts) {\n      let title;\n      const fields = [];\n      for (const s of stmts.filter(Boolean)) {\n        if (s.t === 'title') title = s.v;\n        else if (s.t === 'field') fields.push({ start: s.start, end: s.end, label: s.label });\n      }\n      return { version: '1.0', metadata: { ...(title ? { title } : {}) }, fields };\n    };\n  var peg$f1 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f2 = function(start, e) { return e; };\n  var peg$f3 = function(start, end, label) {\n      return { t: 'field', start, end: end != null ? end : start, label };\n    };\n  var peg$f4 = function(s) { return s.trim(); };\n  var peg$f5 = function(s) { return s.trim(); };\n  var peg$f6 = function(n) { return parseInt(n, 10); };\n  var peg$f7 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 11);\n    if (s2.toLowerCase() === peg$c0) {\n      peg$currPos += 11;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$parseStatement();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseStatement();\n        }\n        s5 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitleLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseFieldLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c1) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f1(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFieldLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseInt();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 45) {\n        s4 = peg$c2;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseInt();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f2(s2, s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s5 = peg$c3;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseQuoted();\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseLineEnd();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s2, s3, s7);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r0.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r0.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c4;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f4(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r1.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r1.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f5(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInt() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r2.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r2.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f6(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r1.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f7();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { PacketDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutPacket } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { PacketDocument, PacketField } from './ir.js';\n\nexport const packet: DiagramModule<PacketDocument> = {\n  parseMermaid(input: string): PacketDocument {\n    return parser.parse(input) as PacketDocument;\n  },\n\n  parseYaml(input: string): PacketDocument {\n    return JSON.parse(input) as PacketDocument;\n  },\n\n  layout(ir: PacketDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutPacket(ir, theme);\n  },\n};\n", "/**\n * @file graph/tree.ts \u2014 Tidy hierarchical (tree) placement.\n *\n * Centered-parent subtree packing: every parent is centered over the block its\n * descendants occupy, sibling subtrees never overlap, and node sizes may vary.\n * Shared by the decorated-tree diagrams (avl, rbtree, btree, radix, segtree,\n * heap, plan). Edge routing is left to callers (connect the returned boxes).\n *\n * Deterministic: stable child order, no clock, no randomness.\n */\n\nexport interface TreeNodeInput {\n  readonly id: string;\n  readonly width: number;\n  readonly height: number;\n  /** Child node ids, in draw order (left\u2192right for TB, top\u2192bottom for LR). */\n  readonly children: readonly string[];\n}\n\nexport interface TreeOptions {\n  /** 'TB' stacks depth top\u2192bottom (siblings spread horizontally); 'LR' rotates. */\n  readonly direction?: 'TB' | 'LR';\n  /** Gap between consecutive depths (px). */\n  readonly levelGap?: number;\n  /** Gap between sibling subtrees (px). */\n  readonly siblingGap?: number;\n  /** Outer margin (px). */\n  readonly margin?: number;\n}\n\nexport interface TreeBox {\n  readonly id: string;\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface TreeResult {\n  readonly boxes: Map<string, TreeBox>;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport function treeLayout(nodes: readonly TreeNodeInput[], options: TreeOptions = {}): TreeResult {\n  const direction  = options.direction ?? 'TB';\n  const levelGap   = options.levelGap ?? 56;\n  const siblingGap = options.siblingGap ?? 28;\n  const margin     = options.margin ?? 32;\n  const horizontal = direction === 'LR';\n\n  if (nodes.length === 0) return { boxes: new Map(), width: margin * 2, height: margin * 2 };\n\n  const byId = new Map<string, TreeNodeInput>(nodes.map(n => [n.id, n]));\n  const crossOf = (n: TreeNodeInput): number => (horizontal ? n.height : n.width);\n  const alongOf = (n: TreeNodeInput): number => (horizontal ? n.width : n.height);\n\n  // Roots = nodes never referenced as a child.\n  const childIds = new Set<string>();\n  for (const n of nodes) for (const c of n.children) childIds.add(c);\n  const roots = nodes.filter(n => !childIds.has(n.id));\n\n  // Depth of every node (BFS from roots; stable).\n  const depth = new Map<string, number>();\n  const queue: string[] = roots.map(r => { depth.set(r.id, 0); return r.id; });\n  for (let i = 0; i < queue.length; i++) {\n    const id = queue[i]!;\n    const d = depth.get(id)!;\n    for (const c of byId.get(id)!.children) {\n      if (!depth.has(c)) { depth.set(c, d + 1); queue.push(c); }\n    }\n  }\n  const maxDepth = Math.max(...depth.values());\n\n  // Along-axis band per depth = max along-extent at that depth.\n  const levelAlong = Array.from({ length: maxDepth + 1 }, () => 0);\n  for (const n of nodes) {\n    const d = depth.get(n.id)!;\n    levelAlong[d] = Math.max(levelAlong[d]!, alongOf(n));\n  }\n  const levelStart: number[] = [];\n  let acc = margin;\n  for (let d = 0; d <= maxDepth; d++) { levelStart[d] = acc; acc += levelAlong[d]! + levelGap; }\n  const alongTotal = acc - levelGap + margin;\n\n  // Subtree cross-extent (memoized).\n  const subCross = new Map<string, number>();\n  const computeCross = (id: string): number => {\n    const cached = subCross.get(id);\n    if (cached !== undefined) return cached;\n    const node = byId.get(id)!;\n    let own = crossOf(node);\n    if (node.children.length > 0) {\n      const childrenCross = node.children.reduce((s, c, i) => s + computeCross(c) + (i > 0 ? siblingGap : 0), 0);\n      own = Math.max(own, childrenCross);\n    }\n    subCross.set(id, own);\n    return own;\n  };\n\n  const crossPos = new Map<string, number>(); // cross-axis top-left of each node\n  const assign = (id: string, u0: number): void => {\n    const node = byId.get(id)!;\n    const sc = computeCross(id);\n    const center = u0 + sc / 2;\n    crossPos.set(id, center - crossOf(node) / 2);\n    if (node.children.length === 0) return;\n    const childrenCross = node.children.reduce((s, c, i) => s + computeCross(c) + (i > 0 ? siblingGap : 0), 0);\n    let cursor = u0 + (sc - childrenCross) / 2;\n    for (const c of node.children) {\n      assign(c, cursor);\n      cursor += computeCross(c) + siblingGap;\n    }\n  };\n\n  // Place each root forest block left\u2192right (cross axis).\n  let cursor = margin;\n  for (const r of roots) {\n    assign(r.id, cursor);\n    cursor += computeCross(r.id) + siblingGap;\n  }\n  const crossTotal = cursor - siblingGap + margin;\n\n  const boxes = new Map<string, TreeBox>();\n  for (const n of nodes) {\n    const d = depth.get(n.id)!;\n    const u = crossPos.get(n.id)!;\n    const v = levelStart[d]! + (levelAlong[d]! - alongOf(n)) / 2;\n    const x = horizontal ? v : u;\n    const y = horizontal ? u : v;\n    boxes.set(n.id, { id: n.id, x, y, width: n.width, height: n.height });\n  }\n\n  return {\n    boxes,\n    width:  horizontal ? alongTotal : crossTotal,\n    height: horizontal ? crossTotal : alongTotal,\n  };\n}\n", "/**\n * @file diagrams/tree/layout.ts \u2014 Decorated tree layout.\n *\n * Sizes each node from its label/info, runs the shared tidy tree placement\n * (graph/tree), then renders nodes per their decoration kinds (circle / pill /\n * rect, with colour states, corner badges, info sub-lines) and links parents to\n * children with edge labels. Produces a node-anchor registry so trees are\n * linkable inside posters.\n */\n\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport type {\n  Scene, SceneElement, LayoutResult, NodeAnchorRegistry, ResolvedTheme, Color,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu } from '../../../../util/round.js';\n\nconst RB_RED = '#d64545';\n\ninterface NodeStyle {\n  readonly shape: 'circle' | 'pill' | 'rect' | 'strip';\n  readonly fill: Color;\n  readonly stroke: Color;\n  readonly text: Color;\n}\n\n/** Split a `a | b | c` strip label into per-key cells with measured widths. */\nfunction stripCells(label: string, font: number): { key: string; width: number }[] {\n  return label.split('|').map(s => s.trim()).map(key => ({\n    key, width: Math.max(measureText(key, font).width + 18, 34),\n  }));\n}\n\nfunction parseHex(c: Color): [number, number, number] | null {\n  const s = c.trim();\n  const m3 = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n  if (m3) return [parseInt(m3[1]! + m3[1]!, 16), parseInt(m3[2]! + m3[2]!, 16), parseInt(m3[3]! + m3[3]!, 16)];\n  const m6 = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n  if (m6) return [parseInt(m6[1]!, 16), parseInt(m6[2]!, 16), parseInt(m6[3]!, 16)];\n  return null;\n}\n\nfunction toHex(n: number): string {\n  return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0');\n}\n\nfunction mixHex(a: Color, b: Color, t: number): Color {\n  const ca = parseHex(a), cb = parseHex(b);\n  if (!ca || !cb) return a;\n  const r = ca[0] + (cb[0] - ca[0]) * t;\n  const g = ca[1] + (cb[1] - ca[1]) * t;\n  const bl = ca[2] + (cb[2] - ca[2]) * t;\n  return `#${toHex(r)}${toHex(g)}${toHex(bl)}`;\n}\n\nfunction relativeLuminance(c: Color): number | undefined {\n  const rgb = parseHex(c);\n  if (!rgb) return undefined;\n  const linear = (v: number): number => {\n    const s = v / 255;\n    return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n  };\n  return 0.2126 * linear(rgb[0]) + 0.7152 * linear(rgb[1]) + 0.0722 * linear(rgb[2]);\n}\n\nfunction contrastRatio(a: Color, b: Color): number {\n  const la = relativeLuminance(a), lb = relativeLuminance(b);\n  if (la === undefined || lb === undefined) return 1;\n  const hi = Math.max(la, lb), lo = Math.min(la, lb);\n  return (hi + 0.05) / (lo + 0.05);\n}\n\nfunction canvasColor(theme: ResolvedTheme): Color {\n  return parseHex(theme.palette.background) ? theme.palette.background : theme.palette.surface;\n}\n\nfunction isDarkTheme(theme: ResolvedTheme): boolean {\n  const lum = relativeLuminance(theme.palette.background) ?? relativeLuminance(theme.palette.surface);\n  return lum !== undefined ? lum < 0.5 : false;\n}\n\nfunction bestContrast(fill: Color, candidates: readonly Color[], fallback: Color): Color {\n  let best = fallback, score = contrastRatio(fallback, fill);\n  for (const c of candidates) {\n    if (!parseHex(c)) continue;\n    const next = contrastRatio(c, fill);\n    if (next > score) { best = c; score = next; }\n  }\n  return best;\n}\n\nfunction readableText(fill: Color, theme: ResolvedTheme): Color {\n  const themed = bestContrast(fill, [theme.palette.text, theme.palette.background], theme.palette.text);\n  if (contrastRatio(themed, fill) >= 4.5) return themed;\n  return bestContrast(fill, ['#ffffff', '#000000'], themed);\n}\n\nfunction outlineStroke(fill: Color, theme: ResolvedTheme): Color {\n  const canvas = canvasColor(theme);\n  const candidates = [theme.palette.text, theme.palette.border, theme.palette.textMuted, theme.palette.background];\n  let best = theme.palette.text, score = -Infinity;\n  for (const c of candidates) {\n    if (!parseHex(c)) continue;\n    const next = Math.min(contrastRatio(c, fill), contrastRatio(c, canvas)) + contrastRatio(c, canvas) * 0.15;\n    if (next > score) { best = c; score = next; }\n  }\n  return best;\n}\n\nfunction isRedHue(c: Color): boolean {\n  const rgb = parseHex(c);\n  return rgb !== null && rgb[0] > rgb[1] * 1.35 && rgb[0] > rgb[2] * 1.35;\n}\n\nfunction redNodeFill(theme: ResolvedTheme): Color {\n  const { palette } = theme;\n  if (isRedHue(palette.error)) return mixHex(RB_RED, palette.error, isDarkTheme(theme) ? 0.7 : 0.6);\n  return mixHex(RB_RED, palette.text, isDarkTheme(theme) ? 0.12 : 0.08);\n}\n\nfunction blackNodeFill(theme: ResolvedTheme): Color {\n  const { palette } = theme;\n  if (!isDarkTheme(theme)) return mixHex(palette.text, palette.background, 0.08);\n\n  const canvas = canvasColor(theme);\n  for (const source of [palette.text, palette.surface, palette.border, '#ffffff']) {\n    for (const t of [0.22, 0.26, 0.3, 0.34]) {\n      const fill = mixHex(canvas, source, t);\n      const lum = relativeLuminance(fill);\n      if (lum !== undefined && lum < 0.32 && contrastRatio(fill, canvas) >= 1.7) return fill;\n    }\n  }\n  return mixHex(canvas, '#ffffff', 0.28);\n}\n\nfunction nodeStyle(kinds: readonly string[], theme: ResolvedTheme): NodeStyle {\n  const { palette } = theme;\n  const has = (k: string): boolean => kinds.includes(k);\n  const shape: NodeStyle['shape'] =\n    has('strip') ? 'strip'\n    : has('leaf') || has('pill') ? 'pill'\n    : has('circle') || has('red') || has('black') || has('dot') ? 'circle'\n    : 'rect';\n  if (has('red')) {\n    const fill = redNodeFill(theme);\n    return { shape, fill, stroke: outlineStroke(fill, theme), text: readableText(fill, theme) };\n  }\n  if (has('black')) {\n    const fill = blackNodeFill(theme);\n    return { shape, fill, stroke: outlineStroke(fill, theme), text: readableText(fill, theme) };\n  }\n  if (has('active') || has('primary')) return { shape, fill: palette.primary, stroke: palette.primary, text: readableText(palette.primary, theme) };\n  if (has('scan'))   return { shape, fill: palette.surface, stroke: palette.primary, text: palette.text };\n  if (has('join'))   return { shape, fill: palette.surface, stroke: palette.secondary, text: palette.text };\n  if (has('build') || has('muted')) return { shape, fill: palette.surface, stroke: palette.textMuted, text: palette.text };\n  const fill = palette.surface;\n  return { shape, fill, stroke: palette.primary, text: palette.text };\n}\n\n/** Build the muted info sub-line from a node's parsed attributes. */\nfunction infoLine(node: TreeNode): string | undefined {\n  return node.info;\n}\n\nfunction badgeColor(badge: string, theme: ResolvedTheme): Color {\n  const n = Number(badge);\n  if (!Number.isNaN(n)) {\n    if (n === 0) return theme.palette.success;\n    if (Math.abs(n) === 1) return theme.palette.primary;\n    return theme.palette.error;\n  }\n  return theme.palette.primary;\n}\n\nexport function layoutTree(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = { viewBox: { x: 0, y: 0, width: 120, height: 80 }, background: palette.background, elements: [] };\n    return { scene, anchors: {} };\n  }\n\n  // \u2500\u2500\u2500 Size every node from its content \u2500\u2500\u2500\n  const style = new Map<string, NodeStyle>();\n  const sizes = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    const st = nodeStyle(node.kinds, theme);\n    style.set(node.id, st);\n    const info = infoLine(node);\n    const labelW = measureText(node.label, font).width;\n    const infoW = info ? measureText(info, smallFont).width : 0;\n    const contentW = Math.max(labelW, infoW);\n    if (st.shape === 'strip') {\n      const width = stripCells(node.label, font).reduce((s, c) => s + c.width, 0);\n      sizes.set(node.id, { width, height: font + 16 });\n    } else if (st.shape === 'circle') {\n      const side = Math.max(contentW + 18, font + 22, 42);\n      sizes.set(node.id, { width: side, height: side });\n    } else {\n      const width = contentW + 28;\n      const height = (info ? font + smallFont + 8 : font + 16);\n      sizes.set(node.id, { width, height });\n    }\n  }\n\n  const inputs: TreeNodeInput[] = ir.nodes.map(n => ({\n    id: n.id, width: sizes.get(n.id)!.width, height: sizes.get(n.id)!.height, children: n.children,\n  }));\n  const placed = treeLayout(inputs, { direction: ir.direction, levelGap: 52, siblingGap: 28, margin });\n\n  const titleH = ir.metadata['title'] ? typography.titleFontSize + 18 : 0;\n  const box = (id: string) => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n  if (titleH > 0) {\n    elements.push(p.text(String(ir.metadata['title']), placed.width / 2, margin + typography.titleFontSize,\n      typography.titleFontSize, palette.text, { anchor: 'middle', weight: 'bold' }));\n  }\n\n  // \u2500\u2500\u2500 Edges first (parent \u2192 child), so nodes draw over them \u2500\u2500\u2500\n  const byId = new Map(ir.nodes.map(n => [n.id, n]));\n  // Build active-edge set for highlighted paths (e.g. DFS/BFS traversal)\n  const activeEdgeSet = new Set<string>((ir.activePaths ?? []).map(([a, b]) => `${a}:${b}`));\n\n  /** For circle-shaped nodes, snap the edge endpoint to the circle perimeter. */\n  function circleBorder(\n    center: { x: number; y: number },\n    radius: number,\n    dir: { x: number; y: number },\n    sign: 1 | -1,           // +1 = move in dir (parent side), -1 = move against dir (child side)\n  ): { x: number; y: number } {\n    return { x: rhu(center.x + sign * radius * dir.x), y: rhu(center.y + sign * radius * dir.y) };\n  }\n\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    const parentShape = style.get(node.id)!.shape;\n    for (const cid of node.children) {\n      const cb = box(cid);\n      const childShape = style.get(cid)!.shape;\n\n      // Centers\n      const pc = { x: pb.x + pb.width / 2, y: pb.y + pb.height / 2 };\n      const cc = { x: cb.x + cb.width / 2, y: cb.y + cb.height / 2 };\n      const dx = cc.x - pc.x, dy = cc.y - pc.y;\n      const len = Math.hypot(dx, dy);\n      const dir = len > 0 ? { x: dx / len, y: dy / len } : { x: 0, y: 1 };\n\n      // Box-based fallback for non-circle shapes\n      const { start: boxStart, end: boxEnd } = connectSlots(pb, cb);\n\n      const start = parentShape === 'circle'\n        ? circleBorder(pc, pb.width / 2, dir, 1)\n        : boxStart;\n      const end = childShape === 'circle'\n        ? circleBorder(cc, cb.width / 2, dir, -1)\n        : boxEnd;\n\n      const isActive = activeEdgeSet.has(`${node.id}:${cid}`);\n      const edgeColor = isActive ? palette.primary : palette.textMuted;\n      const edgeWidth = isActive ? 2.5 : 1.5;\n      elements.push(p.path(`M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`, edgeColor, edgeWidth));\n      const child = byId.get(cid)!;\n      if (child.edgeLabel) {\n        const mx = (start.x + end.x) / 2, my = (start.y + end.y) / 2;\n        const w = measureText(child.edgeLabel, smallFont).width + 8;\n        elements.push(p.rect({ x: mx - w / 2, y: my - 9, width: w, height: 16 }, palette.background, palette.background, 0, { rx: 3 }));\n        elements.push(p.text(child.edgeLabel, mx, my + 3, smallFont, isActive ? palette.primary : palette.textMuted, { anchor: 'middle', weight: 'bold' }));\n      }\n    }\n  }\n\n  // \u2500\u2500\u2500 Nodes \u2500\u2500\u2500\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    const st = style.get(node.id)!;\n    const info = infoLine(node);\n    const cx = b.x + b.width / 2, cy = b.y + b.height / 2;\n\n    if (st.shape === 'strip') {\n      elements.push(p.rect(b, st.fill, st.stroke, 2, { rx: 4 }));\n      let sx = b.x;\n      stripCells(node.label, font).forEach((cell, idx) => {\n        if (idx > 0) elements.push(p.path(`M ${rhu(sx)} ${rhu(b.y)} L ${rhu(sx)} ${rhu(b.y + b.height)}`, st.stroke, 1));\n        elements.push(p.text(cell.key, rhu(sx + cell.width / 2), rhu(b.y + b.height / 2 + font * 0.35), font, st.text, { anchor: 'middle', weight: 'bold' }));\n        sx += cell.width;\n      });\n    } else if (st.shape === 'circle') {\n      elements.push(p.circle({ x: cx, y: cy }, b.width / 2, st.fill, st.stroke, 2));\n    } else {\n      const rx = st.shape === 'pill' ? b.height / 2 : 8;\n      elements.push(p.rect(b, st.fill, st.stroke, 2, { rx }));\n    }\n\n    if (st.shape !== 'strip') {\n      if (info) {\n        elements.push(p.text(node.label, cx, b.y + font + 4, font, st.text, { anchor: 'middle', weight: 'bold' }));\n        elements.push(p.text(info, cx, b.y + font + smallFont + 6, smallFont, st.fill === palette.surface ? palette.textMuted : st.text, { anchor: 'middle' }));\n      } else {\n        elements.push(p.text(node.label, cx, cy + font * 0.35, font, st.text, { anchor: 'middle', weight: 'bold' }));\n      }\n    }\n\n    if (node.badge !== undefined) {\n      const bc = badgeColor(node.badge, theme);\n      elements.push(p.circle({ x: b.x + b.width - 3, y: b.y + 3 }, 9, palette.surface, bc, 1.5));\n      elements.push(p.text(node.badge, b.x + b.width - 3, b.y + 7, smallFont, bc, { anchor: 'middle', weight: 'bold' }));\n    }\n  }\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  for (const node of ir.nodes) anchors[node.id] = { bounds: box(node.id) };\n\n  const scene: Scene = applyOverlays({\n    viewBox: { x: 0, y: 0, width: placed.width, height: placed.height + titleH },\n    background: palette.background,\n    elements,\n  }, ir.overlays, theme);\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function toObj(pairs) {\n    const o = {};\n    for (const [k, v] of pairs) o[k] = v;\n    return o;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Start: peg$parseStart };\n  var peg$startRuleFunction = peg$parseStart;\n\n  var peg$c0 = \"tree\";\n  var peg$c1 = \"plan\";\n  var peg$c2 = \"TD\";\n  var peg$c3 = \"TB\";\n  var peg$c4 = \"LR\";\n  var peg$c5 = \"title\";\n  var peg$c6 = \"\\r\";\n  var peg$c7 = \"\\n\";\n  var peg$c8 = \"|\";\n  var peg$c9 = \":\";\n  var peg$c10 = \"{\";\n  var peg$c11 = \"}\";\n  var peg$c12 = \",\";\n  var peg$c13 = \"\\\"\";\n  var peg$c14 = \".\";\n\n  var peg$r0 = /^[^\\r\\n]/;\n  var peg$r1 = /^[ \\t]/;\n  var peg$r2 = /^[^|\\r\\n]/;\n  var peg$r3 = /^[^ \\t:{|\\r\\n]/;\n  var peg$r4 = /^[^:{|\\r\\n]/;\n  var peg$r5 = /^[A-Za-z]/;\n  var peg$r6 = /^[A-Za-z0-9_\\-]/;\n  var peg$r7 = /^[A-Za-z_]/;\n  var peg$r8 = /^[^,}\\r\\n]/;\n  var peg$r9 = /^[^\"]/;\n  var peg$r10 = /^[0-9]/;\n\n  var peg$e0 = peg$literalExpectation(\"tree\", false);\n  var peg$e1 = peg$literalExpectation(\"plan\", false);\n  var peg$e2 = peg$literalExpectation(\"TD\", false);\n  var peg$e3 = peg$literalExpectation(\"TB\", false);\n  var peg$e4 = peg$literalExpectation(\"LR\", false);\n  var peg$e5 = peg$literalExpectation(\"title\", false);\n  var peg$e6 = peg$classExpectation([\"\\r\", \"\\n\"], true, false);\n  var peg$e7 = peg$literalExpectation(\"\\r\", false);\n  var peg$e8 = peg$literalExpectation(\"\\n\", false);\n  var peg$e9 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e10 = peg$literalExpectation(\"|\", false);\n  var peg$e11 = peg$classExpectation([\"|\", \"\\r\", \"\\n\"], true, false);\n  var peg$e12 = peg$classExpectation([\" \", \"\\t\", \":\", \"{\", \"|\", \"\\r\", \"\\n\"], true, false);\n  var peg$e13 = peg$classExpectation([\":\", \"{\", \"|\", \"\\r\", \"\\n\"], true, false);\n  var peg$e14 = peg$literalExpectation(\":\", false);\n  var peg$e15 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"]], false, false);\n  var peg$e16 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e17 = peg$literalExpectation(\"{\", false);\n  var peg$e18 = peg$literalExpectation(\"}\", false);\n  var peg$e19 = peg$literalExpectation(\",\", false);\n  var peg$e20 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], \"_\"], false, false);\n  var peg$e21 = peg$classExpectation([\",\", \"}\", \"\\r\", \"\\n\"], true, false);\n  var peg$e22 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e23 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e24 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e25 = peg$literalExpectation(\".\", false);\n\n  var peg$f0 = function(d) { return d; };\n  var peg$f1 = function(dir, title, lines) {\n      return {\n        version: \"1.0\",\n        metadata: title ? { title } : {},\n        direction: dir || \"TB\",\n        lines: lines.filter(l => l !== null),\n      };\n    };\n  var peg$f2 = function() { return \"TB\"; };\n  var peg$f3 = function() { return \"TB\"; };\n  var peg$f4 = function() { return \"LR\"; };\n  var peg$f5 = function(t) { return t.trim(); };\n  var peg$f6 = function() { return null; };\n  var peg$f7 = function(indent, content) {\n      return { indent: indent.length, ...content };\n    };\n  var peg$f8 = function(e) { return e; };\n  var peg$f9 = function(edge, label, kinds, a) { return a; };\n  var peg$f10 = function(edge, label, kinds, attrs) {\n      return {\n        edgeLabel: edge || undefined,\n        label: label.trim(),\n        kinds: kinds,\n        attrs: attrs || {},\n      };\n    };\n  var peg$f11 = function(t) { return t.trim(); };\n  var peg$f12 = function(name) { return name; };\n  var peg$f13 = function(pairs) { return pairs ? toObj(pairs) : {}; };\n  var peg$f14 = function(first, p) { return p; };\n  var peg$f15 = function(first, rest) { return [first, ...rest]; };\n  var peg$f16 = function(k, val) { return val; };\n  var peg$f17 = function(k, v) { return [k, v === null ? true : v]; };\n  var peg$f18 = function(n) { return n; };\n  var peg$f19 = function(r) { return r.trim(); };\n  var peg$f20 = function(s) { return s; };\n  var peg$f21 = function(n) { return parseFloat(n); };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseStart() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c0) {\n      s2 = peg$c0;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c1) {\n        s2 = peg$c1;\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseDirection();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f0(s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      s5 = peg$parseTitleLine();\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s6 = [];\n      s7 = peg$parseNodeLine();\n      if (s7 === peg$FAILED) {\n        s7 = peg$parseBlankLine();\n      }\n      while (s7 !== peg$FAILED) {\n        s6.push(s7);\n        s7 = peg$parseNodeLine();\n        if (s7 === peg$FAILED) {\n          s7 = peg$parseBlankLine();\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f1(s3, s5, s6);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirection() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f2();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c3) {\n        s1 = peg$c3;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f3();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c4) {\n          s1 = peg$c4;\n          peg$currPos += 2;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f4();\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 5) === peg$c5) {\n      s2 = peg$c5;\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          peg$savedPos = s0;\n          s0 = peg$f5(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c7;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f6();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r1.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = peg$parseNodeContent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      peg$savedPos = s0;\n      s0 = peg$f7(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeContent() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseEdgeLabel();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      peg$savedPos = s1;\n      s1 = peg$f8(s2);\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parseLabel();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseKind();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseKind();\n      }\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      s6 = peg$parseAttrBlock();\n      if (s6 !== peg$FAILED) {\n        peg$savedPos = s4;\n        s4 = peg$f9(s1, s2, s3, s6);\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f10(s1, s2, s3, s4);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s1 = peg$c8;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 124) {\n        s3 = peg$c8;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f11(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r4.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r4.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseKind() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 58) {\n      s1 = peg$c9;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = input.charAt(peg$currPos);\n      if (peg$r5.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r6.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = input.charAt(peg$currPos);\n          if (peg$r6.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n        }\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f12(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrBlock() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parseAttrPairs();\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 125) {\n        s5 = peg$c11;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrPairs() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseAttrPair();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 44) {\n        s5 = peg$c12;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseAttrPair();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f14(s1, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s5 = peg$c12;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e19); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseAttrPair();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s3 = peg$f14(s1, s7);\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f15(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrPair() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseKey();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c9;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseVal();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s2;\n          s2 = peg$f16(s1, s6);\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f17(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseKey() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r7.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r6.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r6.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseVal() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$parseQuotedString();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseNumber();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f18(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$currPos;\n        s2 = [];\n        s3 = input.charAt(peg$currPos);\n        if (peg$r8.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = input.charAt(peg$currPos);\n            if (peg$r8.test(s3)) {\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e21); }\n            }\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = input.substring(s1, peg$currPos);\n        } else {\n          s1 = s2;\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f19(s1);\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuotedString() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c13;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r9.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r9.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c13;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f20(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNumber() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r10.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r10.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s5 = peg$c14;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = input.charAt(peg$currPos);\n        if (peg$r10.test(s7)) {\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n        if (s7 !== peg$FAILED) {\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r10.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e24); }\n            }\n          }\n        } else {\n          s6 = peg$FAILED;\n        }\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f21(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s4 = peg$c7;\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s4 !== peg$FAILED) {\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s1 = [s1, s2];\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r1.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r1.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Start\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "/**\n * @file diagrams/tree/build.ts \u2014 Shared parsing helpers for the tree family.\n *\n * The indentation grammar (shared by `tree` and `plan`) is parsed here and the\n * raw lines are folded into a child-linked node list. Semantic front-ends\n * (plan) reuse this; value-driven front-ends (avl, \u2026) build nodes directly.\n */\n\nimport * as parser from './parser.js';\n\nexport interface RawLine {\n  indent: number;\n  label: string;\n  kinds: string[];\n  attrs: Record<string, unknown>;\n  edgeLabel?: string;\n}\n\nexport interface ParsedTree {\n  version: string;\n  metadata: Record<string, unknown>;\n  direction: 'TB' | 'LR';\n  lines: RawLine[];\n}\n\n/** A node with mutable arrays so front-ends can post-process before freezing. */\nexport interface MutableTreeNode {\n  id: string;\n  label: string;\n  kinds: string[];\n  children: string[];\n  info?: string;\n  badge?: string;\n  edgeLabel?: string;\n}\n\nexport function parseLines(input: string): ParsedTree {\n  return parser.parse(input) as ParsedTree;\n}\n\n/** Fold indentation-nested raw lines into a flat, child-linked node list. */\nexport function buildNodes(lines: readonly RawLine[]): MutableTreeNode[] {\n  const nodes: MutableTreeNode[] = [];\n  const byId = new Map<string, MutableTreeNode>();\n  const stack: { indent: number; id: string }[] = [];\n\n  lines.forEach((ln, i) => {\n    const id = `n${i}`;\n    while (stack.length > 0 && stack[stack.length - 1]!.indent >= ln.indent) stack.pop();\n    const parent = stack.length > 0 ? stack[stack.length - 1] : undefined;\n\n    const kinds = [...ln.kinds];\n    const infoParts: string[] = [];\n    let badge: string | undefined;\n    for (const [k, v] of Object.entries(ln.attrs ?? {})) {\n      if (v === true) { kinds.push(k); continue; }\n      if (k === 'badge') { badge = String(v); continue; }\n      infoParts.push(k === 'sub' || k === 'info' ? String(v) : `${k}: ${v}`);\n    }\n    const info = infoParts.length > 0 ? infoParts.join(' \u00B7 ') : undefined;\n\n    const node: MutableTreeNode = {\n      id, label: ln.label, kinds, children: [],\n      ...(info !== undefined ? { info } : {}),\n      ...(badge !== undefined ? { badge } : {}),\n      ...(ln.edgeLabel !== undefined ? { edgeLabel: ln.edgeLabel } : {}),\n    };\n    nodes.push(node);\n    byId.set(id, node);\n    if (parent) byId.get(parent.id)!.children.push(id);\n    stack.push({ indent: ln.indent, id });\n  });\n\n  return nodes;\n}\n", "import type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument } from './ir.js';\nimport { layoutTree } from './layout.js';\nimport { parseLines, buildNodes } from './build.js';\n\nexport type { TreeDocument, TreeNode, TreeDirection } from './ir.js';\n\n/** Pre-process `path A -> B -> C` directives, returning them separately. */\nfunction extractPathDirectives(input: string): { clean: string; paths: string[][] } {\n  const cleanLines: string[] = [];\n  const paths: string[][] = [];\n  const PATH_RE = /^[ \\t]*path[ \\t]+(.+)$/;\n\n  for (const line of input.split('\\n')) {\n    const m = line.match(PATH_RE);\n    if (m && m[1]!.includes('->')) {\n      const nodes = m[1]!.split('->').map(s => s.trim()).filter(Boolean);\n      if (nodes.length >= 2) { paths.push(nodes); continue; }\n    }\n    cleanLines.push(line);\n  }\n  return { clean: cleanLines.join('\\n'), paths };\n}\n\nexport const tree: DiagramModule<TreeDocument> = {\n  parseMermaid(input: string): TreeDocument {\n    const { clean, paths } = extractPathDirectives(input);\n    const raw = parseLines(clean);\n    const nodes = buildNodes(raw.lines);\n\n    // Map label \u2192 first node id\n    const labelToId = new Map<string, string>();\n    for (const node of nodes) {\n      if (!labelToId.has(node.label)) labelToId.set(node.label, node.id);\n    }\n\n    const activePairs: [string, string][] = [];\n    for (const seg of paths) {\n      for (let i = 0; i < seg.length - 1; i++) {\n        const fromId = labelToId.get(seg[i]!);\n        const toId   = labelToId.get(seg[i + 1]!);\n        if (fromId && toId) activePairs.push([fromId, toId]);\n      }\n    }\n\n    return {\n      version: raw.version,\n      metadata: raw.metadata ?? {},\n      direction: raw.direction,\n      nodes,\n      ...(activePairs.length > 0 ? { activePaths: activePairs } : {}),\n    };\n  },\n\n  parseYaml(input: string): TreeDocument {\n    return JSON.parse(input) as TreeDocument;\n  },\n\n  layout(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutTree(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/tree/plan.ts \u2014 Query-plan front-end over the tree engine.\n *\n * Same indentation source as `tree`, but operator nodes are auto-coloured by\n * kind inferred from their name (scan / join / build), so authors don't tag\n * every node by hand.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument } from './ir.js';\nimport { layoutTree } from './layout.js';\nimport { parseLines, buildNodes } from './build.js';\n\nconst COLOUR_KINDS = ['scan', 'join', 'build', 'red', 'black', 'active', 'primary', 'muted'];\n\n/** Infer an operator colour-kind from its label. */\nfunction inferKind(label: string): string | undefined {\n  const l = label.toLowerCase();\n  if (l.includes('join')) return 'join';\n  if (l.includes('scan')) return 'scan';\n  if (l.includes('hash') || l.includes('sort') || l.includes('aggregate')\n    || l.includes('group') || l.includes('materialize') || l.includes('gather')) return 'build';\n  return undefined;\n}\n\nexport const plan: DiagramModule<TreeDocument> = {\n  parseMermaid(input: string): TreeDocument {\n    const raw = parseLines(input);\n    const nodes = buildNodes(raw.lines);\n    for (const n of nodes) {\n      if (n.kinds.some(k => COLOUR_KINDS.includes(k))) continue;\n      const k = inferKind(n.label);\n      if (k) n.kinds.push(k);\n    }\n    return {\n      version: raw.version,\n      metadata: raw.metadata ?? {},\n      direction: raw.direction,\n      nodes,\n    };\n  },\n\n  parseYaml(input: string): TreeDocument {\n    return JSON.parse(input) as TreeDocument;\n  },\n\n  layout(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutTree(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/tree/avl.ts \u2014 AVL-tree front-end over the tree engine.\n *\n * Value-driven: the source is a list of integers (`avl insert 50 30 70 \u2026`); the\n * builder performs real BST insertion with AVL rotations and emits one circle\n * node per key with its balance-factor badge. The structure is always valid by\n * construction \u2014 you cannot author an unbalanced AVL tree.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ninterface AvlNode { key: number; left: AvlNode | null; right: AvlNode | null; height: number; }\n\nconst h = (n: AvlNode | null): number => (n ? n.height : 0);\nconst upd = (n: AvlNode): void => { n.height = 1 + Math.max(h(n.left), h(n.right)); };\nconst bf = (n: AvlNode): number => h(n.left) - h(n.right);\n\nfunction rotateRight(y: AvlNode): AvlNode {\n  const x = y.left!;\n  y.left = x.right;\n  x.right = y;\n  upd(y); upd(x);\n  return x;\n}\nfunction rotateLeft(x: AvlNode): AvlNode {\n  const y = x.right!;\n  x.right = y.left;\n  y.left = x;\n  upd(x); upd(y);\n  return y;\n}\n\nfunction insert(node: AvlNode | null, key: number): AvlNode {\n  if (!node) return { key, left: null, right: null, height: 1 };\n  if (key < node.key) node.left = insert(node.left, key);\n  else if (key > node.key) node.right = insert(node.right, key);\n  else return node; // ignore duplicates\n  upd(node);\n  const balance = bf(node);\n  if (balance > 1 && key < node.left!.key) return rotateRight(node);\n  if (balance < -1 && key > node.right!.key) return rotateLeft(node);\n  if (balance > 1 && key > node.left!.key) { node.left = rotateLeft(node.left!); return rotateRight(node); }\n  if (balance < -1 && key < node.right!.key) { node.right = rotateRight(node.right!); return rotateLeft(node); }\n  return node;\n}\n\n/** Build a valid AVL tree IR from the integers in the source. */\nexport function buildAvl(input: string): TreeDocument {\n  const keys = (input.match(/-?\\d+/g) ?? []).map(Number);\n  let root: AvlNode | null = null;\n  for (const k of keys) root = insert(root, k);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: AvlNode): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    nodes.push({ id, label: String(n.key), kinds: ['circle'], badge: String(bf(n)), children });\n    if (n.left) children.push(emit(n.left));\n    if (n.right) children.push(emit(n.right));\n    return id;\n  };\n  if (root) emit(root);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const avl: DiagramModule<TreeDocument> = {\n  parseMermaid(input: string): TreeDocument {\n    return buildAvl(input);\n  },\n  parseYaml(input: string): TreeDocument {\n    return JSON.parse(input) as TreeDocument;\n  },\n  layout(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutTree(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/tree/rbtree.ts \u2014 Red-black tree front-end over the tree engine.\n *\n * Value-driven via a left-leaning red-black tree (Sedgewick): real insertion\n * with rotations + colour flips yields a valid red-black colouring by\n * construction. Each key becomes a circle node tagged red or black.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\nconst RED = true, BLACK = false;\ninterface RbNode { key: number; left: RbNode | null; right: RbNode | null; color: boolean; }\n\nconst isRed = (n: RbNode | null): boolean => n !== null && n.color === RED;\n\nfunction rotateLeft(h: RbNode): RbNode {\n  const x = h.right!;\n  h.right = x.left;\n  x.left = h;\n  x.color = h.color;\n  h.color = RED;\n  return x;\n}\nfunction rotateRight(h: RbNode): RbNode {\n  const x = h.left!;\n  h.left = x.right;\n  x.right = h;\n  x.color = h.color;\n  h.color = RED;\n  return x;\n}\nfunction flip(h: RbNode): void {\n  h.color = !h.color;\n  if (h.left) h.left.color = !h.left.color;\n  if (h.right) h.right.color = !h.right.color;\n}\n\nfunction insert(h: RbNode | null, key: number): RbNode {\n  if (!h) return { key, left: null, right: null, color: RED };\n  if (key < h.key) h.left = insert(h.left, key);\n  else if (key > h.key) h.right = insert(h.right, key);\n  // duplicates ignored\n  if (isRed(h.right) && !isRed(h.left)) h = rotateLeft(h);\n  if (isRed(h.left) && isRed(h.left!.left)) h = rotateRight(h);\n  if (isRed(h.left) && isRed(h.right)) flip(h);\n  return h;\n}\n\nexport function buildRbtree(input: string): TreeDocument {\n  const keys = (input.match(/-?\\d+/g) ?? []).map(Number);\n  let root: RbNode | null = null;\n  for (const k of keys) { root = insert(root, k); root.color = BLACK; }\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: RbNode): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    nodes.push({ id, label: String(n.key), kinds: [n.color === RED ? 'red' : 'black'], children });\n    if (n.left) children.push(emit(n.left));\n    if (n.right) children.push(emit(n.right));\n    return id;\n  };\n  if (root) emit(root);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const rbtree: DiagramModule<TreeDocument> = {\n  parseMermaid: buildRbtree,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/btree.ts \u2014 B-tree front-end over the tree engine.\n *\n * Value-driven: `btree order 3 insert 10 20 \u2026` performs real B-tree insertion\n * with node splitting and emits multi-key strip nodes. Structure is valid by\n * construction (every non-root node holds between \u2308order/2\u2309\u22121 and order\u22121 keys).\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ninterface BNode { keys: number[]; children: BNode[]; leaf: boolean; }\n\ninterface Split { up: number; right: BNode; }\n\n/** Insert into a subtree; return a Split if this node overflowed and divided. */\nfunction insertRec(node: BNode, key: number, order: number): Split | null {\n  if (node.leaf) {\n    let i = node.keys.length - 1;\n    while (i >= 0 && key < node.keys[i]!) i--;\n    if (i >= 0 && node.keys[i] === key) return null; // dup\n    node.keys.splice(i + 1, 0, key);\n  } else {\n    let i = node.keys.length - 1;\n    while (i >= 0 && key < node.keys[i]!) i--;\n    if (i >= 0 && node.keys[i] === key) return null; // dup\n    i++;\n    const split = insertRec(node.children[i]!, key, order);\n    if (split) {\n      node.keys.splice(i, 0, split.up);\n      node.children.splice(i + 1, 0, split.right);\n    }\n  }\n  if (node.keys.length <= order - 1) return null;\n\n  // overflow: divide around the median\n  const mid = node.keys.length >> 1;\n  const up = node.keys[mid]!;\n  const right: BNode = {\n    keys: node.keys.slice(mid + 1),\n    children: node.leaf ? [] : node.children.slice(mid + 1),\n    leaf: node.leaf,\n  };\n  node.keys = node.keys.slice(0, mid);\n  node.children = node.leaf ? [] : node.children.slice(0, mid + 1);\n  return { up, right };\n}\n\nexport function buildBtree(input: string): TreeDocument {\n  const orderMatch = input.match(/order\\s+(\\d+)/i);\n  const order = Math.max(3, orderMatch ? Number(orderMatch[1]) : 3);\n  const afterOrder = input.replace(/order\\s+\\d+/i, '');\n  const keys = (afterOrder.match(/-?\\d+/g) ?? []).map(Number);\n\n  let root: BNode = { keys: [], children: [], leaf: true };\n  for (const k of keys) {\n    const split = insertRec(root, k, order);\n    if (split) root = { keys: [split.up], children: [root, split.right], leaf: false };\n  }\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: BNode): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    nodes.push({ id, label: n.keys.join(' | '), kinds: ['strip'], children });\n    for (const c of n.children) children.push(emit(c));\n    return id;\n  };\n  if (root.keys.length > 0 || root.children.length > 0) emit(root);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const btree: DiagramModule<TreeDocument> = {\n  parseMermaid: buildBtree,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/radix.ts \u2014 Radix (Patricia) trie front-end.\n *\n * Value-driven: `radix insert cat car card dog` inserts strings into a\n * prefix-compressed trie. Shared prefixes collapse onto single labelled edges;\n * branch nodes render as small dots, word-terminal nodes as filled pills.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ninterface RNode { edges: Map<string, RNode>; end: boolean; }\n\nconst newNode = (): RNode => ({ edges: new Map(), end: false });\n\nfunction commonPrefix(a: string, b: string): number {\n  let i = 0;\n  while (i < a.length && i < b.length && a[i] === b[i]) i++;\n  return i;\n}\n\nfunction insert(root: RNode, word: string): void {\n  let node = root;\n  let rest = word;\n  while (rest.length > 0) {\n    let matched: string | undefined;\n    for (const label of node.edges.keys()) {\n      if (label[0] === rest[0]) { matched = label; break; }\n    }\n    if (matched === undefined) {\n      const child = newNode();\n      child.end = true;\n      node.edges.set(rest, child);\n      return;\n    }\n    const cp = commonPrefix(matched, rest);\n    if (cp === matched.length) {\n      node = node.edges.get(matched)!;\n      rest = rest.slice(cp);\n      if (rest.length === 0) node.end = true;\n    } else {\n      // split the existing edge at cp\n      const existingChild = node.edges.get(matched)!;\n      node.edges.delete(matched);\n      const mid = newNode();\n      node.edges.set(matched.slice(0, cp), mid);\n      mid.edges.set(matched.slice(cp), existingChild);\n      if (cp === rest.length) {\n        mid.end = true;\n      } else {\n        const leaf = newNode();\n        leaf.end = true;\n        mid.edges.set(rest.slice(cp), leaf);\n      }\n      return;\n    }\n  }\n  node.end = true;\n}\n\nexport function buildRadix(input: string): TreeDocument {\n  // words = alphabetic tokens after the leading `radix`/`insert` keywords\n  const tokens = input.split(/\\s+/).filter(Boolean);\n  const words = tokens.filter(t => /^[A-Za-z]+$/.test(t) && t !== 'radix' && t !== 'insert');\n  const root = newNode();\n  for (const w of words) insert(root, w);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: RNode, prefix: string, edgeLabel?: string): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    const node: TreeNode = n.end\n      ? { id, label: prefix, kinds: ['leaf', 'active'], children, ...(edgeLabel !== undefined ? { edgeLabel } : {}) }\n      : { id, label: '', kinds: ['dot'], children, ...(edgeLabel !== undefined ? { edgeLabel } : {}) };\n    nodes.push(node);\n    for (const [label, child] of n.edges) children.push(emit(child, prefix + label, label));\n    return id;\n  };\n  emit(root, '');\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const radix: DiagramModule<TreeDocument> = {\n  parseMermaid: buildRadix,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/segtree.ts \u2014 Segment-tree front-end over the tree engine.\n *\n * Value-driven: `segtree over [1,2,3,4] reduce sum` builds a segment tree whose\n * nodes each carry a [lo,hi] range (info sub-line) and the reduced value.\n * Supported reducers: sum (default), min, max.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ntype Reducer = (a: number, b: number) => number;\n\nfunction pickReducer(input: string): Reducer {\n  const l = input.toLowerCase();\n  if (l.includes('min')) return Math.min;\n  if (l.includes('max')) return Math.max;\n  return (a, b) => a + b;\n}\n\nexport function buildSegtree(input: string): TreeDocument {\n  // numbers inside the array literal; ignore an `order`/`reduce` word's digits \u2014 there are none\n  const arr = (input.match(/-?\\d+/g) ?? []).map(Number);\n  const reduce = pickReducer(input);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const build = (lo: number, hi: number): { id: string; value: number } => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    const node: TreeNode = { id, label: '', kinds: ['box'], info: `[${lo},${hi}]`, children };\n    nodes.push(node);\n    let value: number;\n    if (lo === hi) {\n      value = arr[lo]!;\n    } else {\n      const mid = (lo + hi) >> 1;\n      const left = build(lo, mid);\n      const right = build(mid + 1, hi);\n      children.push(left.id, right.id);\n      value = reduce(left.value, right.value);\n    }\n    (node as { label: string }).label = String(value);\n    return { id, value };\n  };\n  if (arr.length > 0) build(0, arr.length - 1);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const segtree: DiagramModule<TreeDocument> = {\n  parseMermaid: buildSegtree,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/heap.ts \u2014 Binary-heap front-end over the tree engine.\n *\n * Value-driven: `heap max insert 50 30 70 \u2026` builds a binary heap (max by\n * default, `min` supported) with real sift-up, then renders the implicit tree\n * (children of i are 2i+1, 2i+2) as circle nodes.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\nexport function buildHeap(input: string): TreeDocument {\n  const isMin = /\\bmin\\b/i.test(input);\n  const keys = (input.match(/-?\\d+/g) ?? []).map(Number);\n  const higher = (a: number, b: number): boolean => (isMin ? a < b : a > b);\n\n  const heap: number[] = [];\n  for (const k of keys) {\n    heap.push(k);\n    let i = heap.length - 1;\n    while (i > 0) {\n      const parent = (i - 1) >> 1;\n      if (higher(heap[i]!, heap[parent]!)) {\n        [heap[i], heap[parent]] = [heap[parent]!, heap[i]!];\n        i = parent;\n      } else break;\n    }\n  }\n\n  const nodes: TreeNode[] = [];\n  const emit = (idx: number): string => {\n    const id = `n${idx}`;\n    const children: string[] = [];\n    nodes.push({ id, label: String(heap[idx]), kinds: ['circle'], children });\n    const l = 2 * idx + 1, r = 2 * idx + 2;\n    if (l < heap.length) children.push(emit(l));\n    if (r < heap.length) children.push(emit(r));\n    return id;\n  };\n  if (heap.length > 0) emit(0);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const heap: DiagramModule<TreeDocument> = {\n  parseMermaid: buildHeap,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/struct/linkedlist.ts \u2014 Singly linked list (slot + pointer).\n *\n * Value-driven:\n *   linkedlist 3 7 9          // head -> [3|\u00B7] -> [7|\u00B7] -> [9|/] (null)\n *   linkedlist\n *     title queue\n *     3 7 9\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\ninterface ListDoc {\n  title?: string;\n  values: string[];\n}\n\nfunction parse(input: string): ListDoc {\n  let title: string | undefined;\n  const values: string[] = [];\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t[0] === 'linkedlist') { values.push(...t.slice(1)); continue; }\n    if (t[0] === 'title') { title = t.slice(1).join(' '); continue; }\n    if (t[0] === 'values' || t[0] === 'nodes') { values.push(...t.slice(1)); continue; }\n    values.push(...t);\n  }\n  return { ...(title !== undefined ? { title } : {}), values };\n}\n\nexport function layoutList(doc: ListDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const nh = 40, nw = 26, gap = 46;\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const y = margin + titleH;\n\n  const headW = measureText('head', font).width;\n  const startX = margin + headW + 38;\n\n  const nodes: { x: number; vw: number; value: string }[] = [];\n  let cursor = startX;\n  for (const v of doc.values) {\n    const vw = Math.max(measureText(v, font).width + 18, 30);\n    nodes.push({ x: cursor, vw, value: v });\n    cursor += vw + nw + gap;\n  }\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // head\n  elements.push(p.text('head', margin, y + nh / 2 + font * 0.35, font, palette.textMuted, { weight: 'bold' }));\n  if (nodes.length > 0) {\n    elements.push(p.path(`M ${rhu(margin + headW + 6)} ${rhu(y + nh / 2)} L ${rhu(nodes[0]!.x - 4)} ${rhu(y + nh / 2)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n  }\n\n  nodes.forEach((node, i) => {\n    const nextX = node.x + node.vw;\n    elements.push(p.rect({ x: node.x, y, width: node.vw, height: nh }, palette.surface, palette.border, 1.5, { rx: 4 }));\n    elements.push(p.rect({ x: nextX, y, width: nw, height: nh }, '#f1f3f5', palette.border, 1.5, { rx: 4 }));\n    elements.push(p.path(`M ${rhu(nextX)} ${rhu(y)} L ${rhu(nextX)} ${rhu(y + nh)}`, palette.border, 1.5));\n    elements.push(p.text(node.value, rhu(node.x + node.vw / 2), rhu(y + nh / 2 + font * 0.35), font, palette.text, { anchor: 'middle', weight: 'bold' }));\n\n    const linkCx = nextX + nw / 2, linkCy = y + nh / 2;\n    if (i < nodes.length - 1) {\n      elements.push(p.circle({ x: linkCx, y: linkCy }, 3, palette.primary, palette.primary, 1));\n      elements.push(p.path(`M ${rhu(linkCx)} ${rhu(linkCy)} L ${rhu(nodes[i + 1]!.x - 4)} ${rhu(linkCy)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n    } else {\n      // null slash through the next cell\n      elements.push(p.path(`M ${rhu(nextX)} ${rhu(y + nh)} L ${rhu(nextX + nw)} ${rhu(y)}`, palette.textMuted, 1.5));\n    }\n  });\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  nodes.forEach((node, i) => { anchors[`n${i}`] = { bounds: { x: node.x, y, width: node.vw + nw, height: nh } }; });\n\n  const width = (nodes.length > 0 ? cursor - gap : startX) + margin;\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height: y + nh + margin },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.primary)],\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const linkedlist: DiagramModule<ListDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutList(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/struct/memory.ts \u2014 Memory regions with cross-region pointers.\n *\n * Value-driven mini-syntax:\n *   memory\n *     title Stack -> Heap\n *     region STACK\n *       var p -> obj            // a slot holding a reference\n *     region HEAP\n *       object obj : Point : x=1, y=2\n *\n * Exercises connectSlots across region boundaries (the slot-aware pointer).\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry, Rect,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\ninterface VarItem { kind: 'var'; name: string; target?: string; }\ninterface ObjItem { kind: 'object'; id: string; title: string; fields: { k: string; v: string }[]; }\ntype Item = VarItem | ObjItem;\ninterface Region { name: string; items: Item[]; }\ninterface MemoryDoc { title?: string; regions: Region[]; }\n\nfunction parse(input: string): MemoryDoc {\n  let title: string | undefined;\n  const regions: Region[] = [];\n  let cur: Region | undefined;\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t[0] === 'memory') continue;\n    if (t[0] === 'title') { title = t.slice(1).join(' '); continue; }\n    if (t[0] === 'region') { cur = { name: decodeLabel(line.slice(6)), items: [] }; regions.push(cur); continue; }\n    if (!cur) continue;\n    if (t[0] === 'var') {\n      const parsed = parseVarDirective(t);\n      if (parsed) cur.items.push({ kind: 'var', name: parsed.name, ...(parsed.target ? { target: parsed.target } : {}) });\n      continue;\n    }\n    if (t[0] === 'object') {\n      const parts = line.slice(6).split(':').map(s => s.trim());\n      const id = parts[0] ?? 'obj';\n      const titleO = parts[1] ? decodeLabel(parts[1]) : id;\n      const fields = (parts[2] ?? '').split(',').map(s => s.trim()).filter(Boolean).map(pair => {\n        const [k, v] = pair.split('=').map(x => x.trim());\n        return { k: k ?? '', v: v ?? '' };\n      });\n      cur.items.push({ kind: 'object', id, title: titleO, fields });\n    }\n  }\n  return { ...(title !== undefined ? { title } : {}), regions };\n}\n\nfunction decodeLabel(raw: string): string {\n  return tokenizeDirective(raw.trim()).join(' ');\n}\n\nfunction parseVarDirective(tokens: readonly string[]): { name: string; target?: string } | undefined {\n  const nameToken = tokens[1];\n  if (nameToken === undefined) return undefined;\n\n  const inlineArrow = nameToken.indexOf('->');\n  if (inlineArrow >= 0) {\n    const name = nameToken.slice(0, inlineArrow);\n    const target = nameToken.slice(inlineArrow + 2);\n    return { name, ...(target ? { target } : {}) };\n  }\n\n  if (tokens[2] === '->') {\n    return { name: nameToken, ...(tokens[3] ? { target: tokens[3] } : {}) };\n  }\n\n  if (tokens[2]?.startsWith('->')) {\n    const target = tokens[2].slice(2) || tokens[3];\n    return { name: nameToken, ...(target ? { target } : {}) };\n  }\n\n  return { name: nameToken };\n}\n\nexport function layoutMemory(doc: MemoryDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n\n  const HEADER = 26, PAD = 14, GAP = 14, REGION_GAP = 90;\n  const REGION_FILL_OPACITY = 0.26;\n  const VAR_FILL_OPACITY = 0.56;\n  const OBJECT_FILL_OPACITY = 0.62;\n\n  const itemSize = (item: Item): { w: number; h: number } => {\n    if (item.kind === 'var') {\n      return { w: Math.max(130, measureText(item.name, font).width + 56), h: 34 };\n    }\n    const titleW = measureText(item.title, font).width;\n    const fieldW = Math.max(0, ...item.fields.map(f => measureText(`${f.k}: ${f.v}`, small).width));\n    return { w: Math.max(120, titleW + 24, fieldW + 24), h: 24 + item.fields.length * 20 + 8 };\n  };\n\n  const elements: SceneElement[] = [];\n  if (doc.title) elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  const idBox = new Map<string, Rect>();\n  const anchors: Record<string, { bounds: Rect }> = {};\n  const pending: { from: Rect; target: string }[] = [];\n\n  let regionX = margin;\n  let maxBottom = margin + titleH;\n  const regionTop = margin + titleH;\n\n  for (const region of doc.regions) {\n    const sizes = region.items.map(itemSize);\n    const innerW = Math.max(80, ...sizes.map(s => s.w));\n    const regionW = Math.max(innerW + PAD * 2, measureText(region.name, small).width + 24);\n    const contentH = sizes.reduce((s, sz) => s + sz.h + GAP, 0) - (sizes.length ? GAP : 0);\n    const regionH = HEADER + PAD + contentH + PAD;\n\n    elements.push(p.rect(\n      { x: regionX, y: regionTop, width: regionW, height: regionH },\n      palette.surface,\n      palette.border,\n      1.5,\n      { rx: 8, fillOpacity: REGION_FILL_OPACITY },\n    ));\n    elements.push(p.text(region.name, regionX + 12, regionTop + 17, small, palette.textMuted, { weight: 'bold' }));\n\n    let iy = regionTop + HEADER + PAD;\n    region.items.forEach((item, i) => {\n      const { h } = sizes[i]!;\n      const box: Rect = { x: regionX + PAD, y: iy, width: innerW, height: h };\n      if (item.kind === 'var') {\n        elements.push(p.rect(box, palette.surface, palette.border, 1.5, { rx: 4, fillOpacity: VAR_FILL_OPACITY }));\n        elements.push(p.text(item.name, box.x + 12, box.y + h / 2 + font * 0.35, font, palette.text, { weight: 'bold' }));\n        idBox.set(item.name, box);\n        anchors[item.name] = { bounds: box };\n        if (item.target) {\n          elements.push(p.circle({ x: box.x + box.width - 12, y: box.y + h / 2 }, 3, palette.primary, palette.primary, 1));\n          pending.push({ from: box, target: item.target });\n        }\n      } else {\n        elements.push(p.rect(box, palette.surface, palette.primary, 2, { rx: 6, fillOpacity: OBJECT_FILL_OPACITY }));\n        elements.push(p.text(item.title, box.x + 12, box.y + 18, font, palette.primary, { weight: 'bold' }));\n        item.fields.forEach((f, fi) => {\n          elements.push(p.text(`${f.k}: ${f.v}`, box.x + 12, box.y + 24 + (fi + 1) * 18, small, palette.text));\n        });\n        idBox.set(item.id, box);\n        anchors[item.id] = { bounds: box };\n      }\n      iy += h + GAP;\n    });\n\n    maxBottom = Math.max(maxBottom, regionTop + regionH);\n    regionX += regionW + REGION_GAP;\n  }\n\n  // cross-region pointers (resolved after all boxes are placed)\n  for (const { from, target } of pending) {\n    const key = target.includes('.') ? target.slice(target.indexOf('.') + 1) : target;\n    const to = idBox.get(key);\n    if (!to) continue;\n    const origin: Rect = { x: from.x + from.width - 12, y: from.y + from.height / 2 - 1, width: 2, height: 2 };\n    const { start, end } = connectSlots(origin, to);\n    elements.push(p.path(`M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n  }\n\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: regionX - REGION_GAP + margin, height: maxBottom + margin },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.primary)],\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const memory: DiagramModule<MemoryDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutMemory(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/struct/page.ts \u2014 Slotted page (storage layout).\n *\n * Value-driven:\n *   page\n *     title heap page\n *     slots 4\n *     tuples (10,Ann) (40,Bob) (50,Cy)\n *\n * Line pointers (slots) indirect to tuples \u2014 the classic slotted-page layout\n * that lets tuples move without invalidating their slot ids.\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\ninterface PageDoc { title?: string; slots?: number; tuples: string[]; }\n\nfunction parse(input: string): PageDoc {\n  let title: string | undefined;\n  let slots: number | undefined;\n  const tuples: string[] = [];\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t[0] === 'page') continue;\n    if (t[0] === 'title') { title = t.slice(1).join(' '); continue; }\n    if (t[0] === 'slots') { slots = Number(t[1]); continue; }\n    if (t[0] === 'tuples') { tuples.push(...t.slice(1)); continue; }\n  }\n  return { ...(title !== undefined ? { title } : {}), ...(slots !== undefined ? { slots } : {}), tuples };\n}\n\nexport function layoutPage(doc: PageDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n\n  const slotCount = doc.slots ?? doc.tuples.length;\n  const PAD = 14, HEADER = 26, SLOT_W = 54, SLOT_H = 22, TUPLE_H = 28, TGAP = 18;\n  const SLOT_TOP_GAP = 12, FREE_BAND = 48, MIN_INNER_W = 240, SLOT_FILL_OPACITY = 0.14;\n\n  const tupleWidths = doc.tuples.map(t => Math.max(110, measureText(t, font).width + 24));\n  const columnCount = Math.max(slotCount, doc.tuples.length, 1);\n  const columnWidths = Array.from({ length: columnCount }, (_, i) => Math.max(SLOT_W, tupleWidths[i] ?? 0));\n  const contentW = columnWidths.reduce((sum, width) => sum + width, 0) + (columnCount - 1) * TGAP;\n  const innerW = Math.max(contentW, MIN_INNER_W);\n  const pageW = innerW + PAD * 2;\n  const pageH = HEADER + SLOT_TOP_GAP + SLOT_H + FREE_BAND + TUPLE_H + PAD;\n  const contentX = pxForCenteredContent(margin + PAD, innerW, contentW);\n\n  const px = margin, py = margin + titleH;\n  const elements: SceneElement[] = [];\n  if (doc.title) elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  elements.push(p.rect({ x: px, y: py, width: pageW, height: pageH }, palette.surface, palette.border, 1.5, { rx: 6 }));\n  elements.push(p.rect({ x: px, y: py, width: pageW, height: HEADER }, palette.primary, palette.primary, 0, { rx: 0 }));\n  elements.push(p.text('PageHeader    freeStart \u2192        \u2190 freeEnd', px + 12, py + 17, small, '#ffffff', { weight: 'bold' }));\n\n  const slotY = py + HEADER + SLOT_TOP_GAP;\n  const slotCx: number[] = [];\n  const tupleCx: number[] = [];\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  const columnX: number[] = [];\n  let x = contentX;\n  for (const width of columnWidths) {\n    columnX.push(x);\n    x += width + TGAP;\n  }\n\n  for (let i = 0; i < slotCount; i++) {\n    const sx = (columnX[i] ?? contentX) + ((columnWidths[i] ?? SLOT_W) - SLOT_W) / 2;\n    const box = { x: sx, y: slotY, width: SLOT_W, height: SLOT_H };\n    elements.push(p.rect(box, palette.primary, palette.primary, 1.5, { rx: 3, fillOpacity: SLOT_FILL_OPACITY }));\n    elements.push(p.text(`slot${i}`, sx + SLOT_W / 2, slotY + 15, small, palette.primary, { anchor: 'middle', weight: 'bold' }));\n    slotCx.push(sx + SLOT_W / 2);\n    anchors[`slot${i}`] = { bounds: box };\n  }\n\n  const tupleY = slotY + SLOT_H + FREE_BAND;\n  const freeLabel = 'free space';\n  const freeLabelY = slotY + SLOT_H + FREE_BAND / 2 + font * 0.35;\n  const freeLabelX = px + pageW / 2;\n  const freeLabelWidth = measureText(freeLabel, font).width;\n  const freeLabelBounds = {\n    x1: freeLabelX - freeLabelWidth / 2 - 6,\n    x2: freeLabelX + freeLabelWidth / 2 + 6,\n    y1: freeLabelY - font - 3,\n    y2: freeLabelY + 5,\n  };\n  elements.push(p.text(freeLabel, freeLabelX, freeLabelY, font, palette.textMuted, { anchor: 'middle' }));\n\n  doc.tuples.forEach((tuple, i) => {\n    const tupleW = tupleWidths[i]!;\n    const tx = (columnX[i] ?? contentX) + ((columnWidths[i] ?? tupleW) - tupleW) / 2;\n    const box = { x: tx, y: tupleY, width: tupleW, height: TUPLE_H };\n    const cx = tx + tupleW / 2;\n    tupleCx.push(cx);\n    elements.push(p.rect(box, palette.surface, palette.border, 1.5, { rx: 3 }));\n    elements.push(p.text(tuple, cx, tupleY + TUPLE_H / 2 + font * 0.35, font, palette.text, { anchor: 'middle', weight: 'bold' }));\n    anchors[`tuple${i}`] = { bounds: box };\n  });\n\n  for (let i = 0; i < Math.min(slotCx.length, tupleCx.length); i++) {\n    elements.push(p.path(verticalArrow(slotCx[i]!, slotY + SLOT_H, tupleY, freeLabelBounds), palette.textMuted, 1.5, { markerEnd: ARROW_ID }));\n  }\n\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: pageW + margin * 2, height: py + pageH + margin },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.textMuted)],\n  };\n  // Expose the PageHeader bar as chrome so the poster label de-collision pass\n  // keeps cross-link labels from landing on top of it.\n  const chromeRects = [{ x: px, y: py, width: pageW, height: HEADER }];\n  return { scene, anchors: anchors as NodeAnchorRegistry, chromeRects };\n}\n\nfunction pxForCenteredContent(innerLeft: number, innerW: number, contentW: number): number {\n  return innerLeft + Math.max(0, (innerW - contentW) / 2);\n}\n\nfunction verticalArrow(x: number, y1: number, y2: number, avoid?: { x1: number; x2: number; y1: number; y2: number }): string {\n  const rx = rhu(x);\n  if (avoid && x >= avoid.x1 && x <= avoid.x2 && y1 < avoid.y2 && y2 > avoid.y1) {\n    return `M ${rx} ${rhu(y1)} L ${rx} ${rhu(Math.max(y1, avoid.y1))} M ${rx} ${rhu(Math.min(y2, avoid.y2))} L ${rx} ${rhu(y2)}`;\n  }\n  return `M ${rx} ${rhu(y1)} L ${rx} ${rhu(y2)}`;\n}\n\nexport const page: DiagramModule<PageDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutPage(ir, theme);\n  },\n};\n", "/**\n * @file scene/strip.ts \u2014 Cell-strip construction.\n *\n * A strip is a contiguous (or gapped) run of equal-extent cells: arrays, heap\n * array-backings, ring/queue buffers, packet fields, B-tree key strips, slotted\n * pages. Returns the scene elements plus the bounding `slots` so pointer routing\n * (graph/connect) can clip arrows to individual cells.\n *\n * Deterministic: positions are pure functions of inputs.\n */\n\nimport type { SceneElement, Rect, Color, Point, ResolvedTheme } from '../contracts/index.js';\nimport type { Pen } from './build.js';\n\nexport interface StripCell {\n  /** Centered cell text. */\n  readonly label?: string;\n  /** Cell fill; defaults to theme surface. */\n  readonly fill?: Color;\n  /** Fill opacity override (e.g. 0.22 for a semi-transparent highlight). */\n  readonly fillOpacity?: number;\n  /** Stroke override; defaults to theme border. */\n  readonly stroke?: Color;\n  /** Optional label drawn just outside the strip (index / address). */\n  readonly index?: string;\n}\n\nexport interface StripOptions {\n  /** Top-left of the strip. */\n  readonly origin: Point;\n  readonly cellWidth: number;\n  readonly cellHeight: number;\n  /** 'horizontal' lays cells left\u2192right (default); 'vertical' top\u2192bottom. */\n  readonly orientation?: 'horizontal' | 'vertical';\n  /** Gap between cells; 0 = contiguous (default). */\n  readonly gap?: number;\n}\n\nexport interface StripResult {\n  readonly elements: SceneElement[];\n  /** Bounding rect of each cell, in input order \u2014 anchors for pointers. */\n  readonly slots: Rect[];\n  /** Overall bounding box of the strip cells (excludes index labels). */\n  readonly bounds: Rect;\n}\n\nexport function buildStrip(\n  pen: Pen,\n  theme: ResolvedTheme,\n  cells: readonly StripCell[],\n  options: StripOptions,\n): StripResult {\n  const { origin, cellWidth, cellHeight } = options;\n  const orientation = options.orientation ?? 'horizontal';\n  const gap = options.gap ?? 0;\n  const horizontal = orientation === 'horizontal';\n  const palette = theme.palette;\n\n  const elements: SceneElement[] = [];\n  const slots: Rect[] = [];\n\n  cells.forEach((cell, i) => {\n    const step = (horizontal ? cellWidth : cellHeight) + gap;\n    const x = origin.x + (horizontal ? i * step : 0);\n    const y = origin.y + (horizontal ? 0 : i * step);\n    const slot: Rect = { x, y, width: cellWidth, height: cellHeight };\n    slots.push(slot);\n    elements.push(pen.rect(slot, cell.fill ?? palette.surface, cell.stroke ?? palette.border, 1.5, { rx: 3, ...(cell.fillOpacity !== undefined ? { fillOpacity: cell.fillOpacity } : {}) }));\n    if (cell.label !== undefined) {\n      elements.push(pen.text(cell.label, x + cellWidth / 2, y + cellHeight / 2 + 5,\n        theme.typography.baseFontSize, palette.text, { anchor: 'middle', weight: 'bold' }));\n    }\n    if (cell.index !== undefined) {\n      // index sits just outside the strip on the leading cross edge\n      const ix = horizontal ? x + cellWidth / 2 : x - 6;\n      const iy = horizontal ? y - 6 : y + cellHeight / 2 + 4;\n      elements.push(pen.text(cell.index, ix, iy, theme.typography.smallFontSize, palette.textMuted,\n        { anchor: horizontal ? 'middle' : 'end' }));\n    }\n  });\n\n  const n = cells.length;\n  const totalAlong = n === 0 ? 0 : n * (horizontal ? cellWidth : cellHeight) + (n - 1) * gap;\n  const bounds: Rect = {\n    x: origin.x,\n    y: origin.y,\n    width:  horizontal ? totalAlong : cellWidth,\n    height: horizontal ? cellHeight : totalAlong,\n  };\n\n  return { elements, slots, bounds };\n}\n", "/**\n * @file diagrams/queue/shared.ts \u2014 Shared helpers for the queue family.\n *\n * Queue variants (linear, circular, deque, priority) are cell-strip diagrams\n * built on the same kernel (`scene/strip.buildStrip`). They share: two\n * fixed-direction arrowhead markers (forward + reverse, so a deque can draw a\n * double-headed arrow without relying on the renderer-specific\n * `auto-start-reverse` orientation), and a `front`/`rear` pointer-below-cell\n * helper. Pure + deterministic \u2014 geometry is a function of inputs only.\n */\n\nimport type { Scene, SceneElement, ResolvedTheme, Rect, TextAnchor } from '../../../../contracts/index.js';\nimport type { Pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\n\nexport { lines } from '../struct/shared.js';\n\nexport type StripOrientation = 'horizontal' | 'vertical';\nexport type PointerSide = 'top' | 'right' | 'bottom' | 'left';\n\n/** Forward arrowhead (apex along travel direction) \u2014 use as `markerEnd`. */\nexport const ARROW_FWD = 'queue-arrow-fwd';\n/** Reverse arrowhead (apex against travel direction) \u2014 use as `markerStart`. */\nexport const ARROW_REV = 'queue-arrow-rev';\n\nexport function parseAxisToken(token: string | undefined, fallback: StripOrientation): StripOrientation {\n  return token === 'horizontal' || token === 'vertical' ? token : fallback;\n}\n\n/**\n * Both arrowhead markers in the given colour.\n * `ARROW_FWD` points in the path's travel direction (markerEnd); `ARROW_REV`\n * points opposite it (markerStart) so a single straight segment can carry two\n * outward-pointing heads \u2014 the deque case.\n */\nexport function arrowDefs(color: string): string {\n  return (\n    `<marker id=\"${ARROW_FWD}\" markerWidth=\"9\" markerHeight=\"9\" refX=\"7\" refY=\"4\" orient=\"auto\">` +\n    `<path d=\"M0 0 L8 4 L0 8 z\" fill=\"${color}\" /></marker>` +\n    `<marker id=\"${ARROW_REV}\" markerWidth=\"9\" markerHeight=\"9\" refX=\"2\" refY=\"4\" orient=\"auto\">` +\n    `<path d=\"M8 0 L0 4 L8 8 z\" fill=\"${color}\" /></marker>`\n  );\n}\n\n/**\n * A labelled pointer beneath a strip cell: a short vertical arrow rising into\n * the cell's bottom edge with the name below it. Mirrors `array.ts` pointers.\n * `stack` shifts the label down a row so two pointers on the same cell (e.g.\n * front == rear on a one-element queue) do not collide.\n */\nexport function pointerBelow(\n  p: Pen,\n  theme: ResolvedTheme,\n  slot: Rect,\n  name: string,\n  color: string,\n  stack = 0,\n): { elements: SceneElement[]; bottom: number } {\n  const pointer = pointerToSlot(p, theme, slot, name, color, 'bottom', stack);\n  return { elements: pointer.elements, bottom: pointer.outerEdge };\n}\n\nexport function pointerToSlot(\n  p: Pen,\n  theme: ResolvedTheme,\n  slot: Rect,\n  name: string,\n  color: string,\n  side: PointerSide,\n  stack = 0,\n): { elements: SceneElement[]; outerEdge: number } {\n  const font = theme.typography.baseFontSize;\n  const laneGap = font + 6;\n  const arrowLen = 30;\n  const labelGap = 6;\n  const cx = slot.x + slot.width / 2;\n  const cy = slot.y + slot.height / 2;\n\n  if (side === 'bottom' || side === 'top') {\n    const s = side === 'bottom' ? 1 : -1;\n    const laneX = cx;\n    const edgeY = side === 'bottom' ? slot.y + slot.height + 4 : slot.y - 4;\n    const tailY = edgeY + s * (arrowLen + stack * laneGap);\n    const labelY = tailY + s * (labelGap + (s > 0 ? font : 0));\n    return {\n      elements: [\n        p.path(`M ${rhu(laneX)} ${rhu(tailY)} L ${rhu(laneX)} ${rhu(edgeY)}`, color, 1.5, { markerEnd: ARROW_FWD }),\n        p.text(name, laneX, labelY, font, color, { anchor: 'middle', weight: 'bold' }),\n      ],\n      outerEdge: s > 0 ? labelY + 4 : labelY - font - 4,\n    };\n  }\n\n  const s = side === 'right' ? 1 : -1;\n  const laneY = cy + stack * laneGap;\n  const edgeX = side === 'right' ? slot.x + slot.width + 4 : slot.x - 4;\n  const tailX = edgeX + s * arrowLen;\n  const labelX = tailX + s * labelGap;\n  const anchor: TextAnchor = s > 0 ? 'start' : 'end';\n  return {\n    elements: [\n      p.path(`M ${rhu(tailX)} ${rhu(laneY)} L ${rhu(edgeX)} ${rhu(laneY)}`, color, 1.5, { markerEnd: ARROW_FWD }),\n      p.text(name, labelX, laneY + 4, font, color, { anchor, weight: 'bold' }),\n    ],\n    outerEdge: labelX,\n  };\n}\n\nexport function finalizeStripScene(\n  elements: readonly SceneElement[],\n  anchors: Record<string, { bounds: Rect }>,\n  theme: ResolvedTheme,\n  defs?: readonly string[],\n): { scene: Scene; anchors: Record<string, { bounds: Rect }> } {\n  const margin = theme.spacing.diagramMargin;\n  const contentBounds = boundsForElements(elements);\n  const dx = margin - contentBounds.x;\n  const dy = margin - contentBounds.y;\n  const shiftedElements = translateElements(elements, dx, dy);\n  const shiftedAnchors = translateAnchors(anchors, dx, dy);\n  return {\n    scene: {\n      viewBox: {\n        x: 0,\n        y: 0,\n        width: rhu(contentBounds.width + margin * 2),\n        height: rhu(contentBounds.height + margin * 2),\n      },\n      background: theme.palette.background,\n      elements: shiftedElements,\n      ...(defs !== undefined ? { defs } : {}),\n    },\n    anchors: shiftedAnchors,\n  };\n}\n\nexport function boundsForElements(elements: readonly SceneElement[]): Rect {\n  const bounds = elements.map(boundsForElement).filter((b): b is Rect => b !== undefined);\n  if (bounds.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n  const minX = Math.min(...bounds.map(b => b.x));\n  const minY = Math.min(...bounds.map(b => b.y));\n  const maxX = Math.max(...bounds.map(b => b.x + b.width));\n  const maxY = Math.max(...bounds.map(b => b.y + b.height));\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction boundsForElement(element: SceneElement): Rect | undefined {\n  switch (element.type) {\n    case 'rect':\n      return element.bounds;\n    case 'circle':\n      return {\n        x: element.center.x - element.radius,\n        y: element.center.y - element.radius,\n        width: element.radius * 2,\n        height: element.radius * 2,\n      };\n    case 'path':\n      return boundsForPath(element.d, element.strokeWidth);\n    case 'text':\n      return boundsForText(element);\n    case 'group':\n      return boundsForElements(element.children);\n  }\n}\n\nfunction boundsForText(text: Extract<SceneElement, { type: 'text' }>): Rect {\n  const measured = measureText(text.content, text.fontSize);\n  const x = text.anchor === 'middle'\n    ? text.position.x - measured.width / 2\n    : text.anchor === 'end'\n      ? text.position.x - measured.width\n      : text.position.x;\n  return {\n    x,\n    y: text.position.y - text.fontSize,\n    width: measured.width,\n    height: text.fontSize * 1.25,\n  };\n}\n\nfunction boundsForPath(d: string, strokeWidth: number): Rect {\n  const nums = [...d.matchAll(/-?\\d+(?:\\.\\d+)?/g)].map(match => Number(match[0]));\n  if (nums.length < 2) return { x: 0, y: 0, width: 0, height: 0 };\n  const xs = nums.filter((_, i) => i % 2 === 0);\n  const ys = nums.filter((_, i) => i % 2 === 1);\n  const pad = strokeWidth / 2;\n  const minX = Math.min(...xs) - pad;\n  const minY = Math.min(...ys) - pad;\n  const maxX = Math.max(...xs) + pad;\n  const maxY = Math.max(...ys) + pad;\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction translateElements(elements: readonly SceneElement[], dx: number, dy: number): SceneElement[] {\n  return elements.map(element => translateElement(element, dx, dy));\n}\n\nfunction translateElement(element: SceneElement, dx: number, dy: number): SceneElement {\n  switch (element.type) {\n    case 'rect':\n      return { ...element, bounds: translateRect(element.bounds, dx, dy) };\n    case 'circle':\n      return { ...element, center: { x: rhu(element.center.x + dx), y: rhu(element.center.y + dy) } };\n    case 'path':\n      return { ...element, d: translatePathD(element.d, dx, dy) };\n    case 'text':\n      return { ...element, position: { x: rhu(element.position.x + dx), y: rhu(element.position.y + dy) } };\n    case 'group':\n      return { ...element, children: translateElements(element.children, dx, dy) };\n  }\n}\n\nfunction translateAnchors(anchors: Record<string, { bounds: Rect }>, dx: number, dy: number): Record<string, { bounds: Rect }> {\n  return Object.fromEntries(\n    Object.entries(anchors).map(([key, anchor]) => [key, { bounds: translateRect(anchor.bounds, dx, dy) }]),\n  );\n}\n\nfunction translateRect(rect: Rect, dx: number, dy: number): Rect {\n  return { x: rhu(rect.x + dx), y: rhu(rect.y + dy), width: rect.width, height: rect.height };\n}\n\nfunction translatePathD(d: string, dx: number, dy: number): string {\n  let i = 0;\n  return d.replace(/-?\\d+(?:\\.\\d+)?/g, value => {\n    const delta = i++ % 2 === 0 ? dx : dy;\n    return String(rhu(Number(value) + delta));\n  });\n}\n", "/**\n * @file diagrams/queue/queue.ts \u2014 Linear (FIFO) queue.\n *\n * A horizontal cell strip. Items enter at the REAR (right) via an `enqueue`\n * arrow and leave at the FRONT (left) via a `dequeue` arrow. `front`/`rear`\n * pointers sit beneath the filled cells; a `capacity` larger than the filled\n * count shows trailing empty slots.\n *\n * Value-driven mini-syntax:\n *   queue A B C                 // three filled cells\n *   queue\n *     title task queue\n *     cells A B C\n *     capacity 5                // 2 trailing empty slots\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport {\n  ARROW_FWD,\n  arrowDefs,\n  finalizeStripScene,\n  lines,\n  parseAxisToken,\n  pointerBelow,\n  pointerToSlot,\n  type StripOrientation,\n} from './shared.js';\n\nexport interface QueueDoc {\n  title?: string;\n  cells: string[];\n  capacity?: number;\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): QueueDoc {\n  let title: string | undefined;\n  let cells: string[] = [];\n  let capacity: number | undefined;\n  let axis: StripOrientation = 'horizontal';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'queue') { if (t.length > 1) cells = t.slice(1); continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'cells' || t[0] === 'items') { cells = t.slice(1); continue; }\n    if (t[0] === 'capacity') { const n = Number(t[1]); if (Number.isFinite(n)) capacity = n; continue; }\n    if (t[0] === 'axis') { axis = parseAxisToken(t[1], axis); continue; }\n  }\n  return { ...(title !== undefined ? { title } : {}), cells, ...(capacity !== undefined ? { capacity } : {}), axis };\n}\n\nexport function layoutQueue(doc: QueueDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 40;\n  const filled = doc.cells.length;\n  const total = Math.max(filled, doc.capacity ?? filled);\n  const cellW = Math.max(46, ...doc.cells.map(c => measureText(c, font).width + 24));\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const topH = font + 14;                 // room for enqueue / dequeue captions\n  const sideGap = 50;                     // room for the end arrows\n  const origin = horizontal\n    ? { x: margin + sideGap, y: margin + titleH + topH }\n    : { x: margin, y: margin + titleH + sideGap };\n\n  const cellInputs: StripCell[] = Array.from({ length: total }, (_, i) => (\n    i < filled ? { label: doc.cells[i]! } : { fill: palette.background }\n  ));\n  const strip = buildStrip(p, theme, cellInputs, { origin, cellWidth: cellW, cellHeight: cellH, orientation: axis });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  if (horizontal) {\n    const midY = origin.y + cellH / 2;\n    const leftEdge = origin.x;\n    const rightEdge = origin.x + total * cellW;\n\n    // dequeue \u2014 leaves at the FRONT (left), pointing out\n    elements.push(p.path(`M ${rhu(leftEdge)} ${rhu(midY)} L ${rhu(margin)} ${rhu(midY)}`, palette.primary, 1.5, { markerEnd: ARROW_FWD }));\n    elements.push(p.text('dequeue', leftEdge - sideGap / 2, origin.y - 8, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n\n    // enqueue \u2014 enters at the REAR (right), pointing in\n    elements.push(p.path(`M ${rhu(rightEdge + sideGap)} ${rhu(midY)} L ${rhu(rightEdge)} ${rhu(midY)}`, palette.primary, 1.5, { markerEnd: ARROW_FWD }));\n    elements.push(p.text('enqueue', rightEdge + sideGap / 2, origin.y - 8, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n  } else {\n    const midX = origin.x + cellW / 2;\n    const topEdge = origin.y;\n    const bottomEdge = origin.y + total * cellH;\n\n    // dequeue \u2014 leaves at the FRONT (top), pointing out\n    elements.push(p.path(`M ${rhu(midX)} ${rhu(topEdge)} L ${rhu(midX)} ${rhu(topEdge - sideGap)}`, palette.primary, 1.5, { markerEnd: ARROW_FWD }));\n    elements.push(p.text('dequeue', midX, topEdge - sideGap / 2 - 6, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n\n    // enqueue \u2014 enters at the REAR (bottom), pointing in\n    elements.push(p.path(`M ${rhu(midX)} ${rhu(bottomEdge + sideGap)} L ${rhu(midX)} ${rhu(bottomEdge)}`, palette.primary, 1.5, { markerEnd: ARROW_FWD }));\n    elements.push(p.text('enqueue', midX, bottomEdge + sideGap / 2 + font, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n  }\n\n  // front / rear pointers below the filled span\n  if (filled > 0) {\n    const frontSlot = strip.slots[0]!;\n    const rearSlot = strip.slots[filled - 1]!;\n    const same = filled === 1;\n    const front = horizontal\n      ? pointerBelow(p, theme, frontSlot, 'front', palette.secondary, 0)\n      : pointerToSlot(p, theme, frontSlot, 'front', palette.secondary, 'right', 0);\n    const rear = horizontal\n      ? pointerBelow(p, theme, rearSlot, 'rear', palette.primary, same ? 1 : 0)\n      : pointerToSlot(p, theme, rearSlot, 'rear', palette.primary, 'right', same ? 1 : 0);\n    elements.push(...front.elements, ...rear.elements);\n  }\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  strip.slots.forEach((slot, i) => { anchors[`c${i}`] = { bounds: slot }; });\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [arrowDefs(palette.primary)]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const queue: DiagramModule<QueueDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutQueue(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/queue/cqueue.ts \u2014 Circular (ring-buffer) queue.\n *\n * Same horizontal strip as the linear queue, but an orthogonal wrap-around\n * connector routes from the REAR cell back to the FRONT cell \u2014 the modular\n * (ring) continuity. `front`/`rear` markers sit beneath their cells and may\n * wrap independently. This is the strip-plus-wrap rendering (not a true radial\n * ring): the intended look of the reference's top-right panel.\n *\n * Value-driven mini-syntax:\n *   cqueue\n *     title ring buffer\n *     capacity 6\n *     cells _ B C D _ _       // `_` (or `.`) is an empty slot\n *     front 1\n *     rear 3\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry, Rect,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { routeConnectors } from '../../../../crosslink/connectors.js';\nimport {\n  ARROW_FWD,\n  arrowDefs,\n  finalizeStripScene,\n  lines,\n  parseAxisToken,\n  pointerBelow,\n  pointerToSlot,\n  type StripOrientation,\n} from './shared.js';\n\nexport interface CQueueDoc {\n  title?: string;\n  capacity: number;\n  cells: (string | null)[];\n  front?: number;\n  rear?: number;\n  axis?: StripOrientation;\n}\n\nconst EMPTY = new Set(['_', '.', '-']);\n\nfunction parse(input: string): CQueueDoc {\n  let title: string | undefined;\n  let cells: (string | null)[] = [];\n  let capacity: number | undefined;\n  let front: number | undefined;\n  let rear: number | undefined;\n  let axis: StripOrientation = 'horizontal';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'cqueue') { continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'capacity') { const n = Number(t[1]); if (Number.isFinite(n)) capacity = n; continue; }\n    if (t[0] === 'cells' || t[0] === 'items') { cells = t.slice(1).map(v => (EMPTY.has(v) ? null : v)); continue; }\n    if (t[0] === 'front') { const n = Number(t[1]); if (Number.isFinite(n)) front = n; continue; }\n    if (t[0] === 'rear') { const n = Number(t[1]); if (Number.isFinite(n)) rear = n; continue; }\n    if (t[0] === 'axis') { axis = parseAxisToken(t[1], axis); continue; }\n  }\n\n  const cap = capacity ?? cells.length;\n  // pad / clamp cells to capacity\n  const padded: (string | null)[] = Array.from({ length: cap }, (_, i) => cells[i] ?? null);\n  // infer front/rear from occupancy when not given\n  const firstFilled = padded.findIndex(c => c !== null);\n  let lastFilled = -1;\n  for (let i = 0; i < padded.length; i++) if (padded[i] !== null) lastFilled = i;\n  const f = front ?? (firstFilled >= 0 ? firstFilled : 0);\n  const r = rear ?? (lastFilled >= 0 ? lastFilled : 0);\n\n  return {\n    ...(title !== undefined ? { title } : {}),\n    capacity: cap,\n    cells: padded,\n    front: f,\n    rear: r,\n    axis,\n  };\n}\n\nexport function layoutCQueue(doc: CQueueDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 40;\n  const total = doc.capacity;\n  const labelW = doc.cells.map(c => (c ? measureText(c, font).width : 0));\n  const cellW = Math.max(46, ...labelW.map(w => w + 24));\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const arcH = 44;                        // room for the wrap arc above the strip\n  const origin = horizontal\n    ? { x: margin, y: margin + titleH + arcH }\n    : { x: margin + arcH, y: margin + titleH };\n\n  const cellInputs: StripCell[] = doc.cells.map((v, i) => (\n    v !== null\n      ? { label: v, index: String(i) }\n      : { fill: palette.background, index: String(i) }\n  ));\n  const strip = buildStrip(p, theme, cellInputs, { origin, cellWidth: cellW, cellHeight: cellH, orientation: axis });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  const rearSlot = strip.slots[doc.rear ?? 0];\n  const frontSlot = strip.slots[doc.front ?? 0];\n  const anchors: Record<string, { bounds: Rect }> = {};\n  strip.slots.forEach((slot, i) => { anchors[`c${i}`] = { bounds: slot }; });\n  if (frontSlot) anchors.front = { bounds: frontSlot };\n  if (rearSlot) anchors.rear = { bounds: rearSlot };\n\n  // Implicit wrap connector: rear slot \u2192 front slot, routed through the shared\n  // connector seam with wall hints that keep the channel outboard.\n  if (rearSlot && frontSlot) {\n    const selfLoop = (doc.front ?? 0) === (doc.rear ?? 0);\n    const connectorAnchors = selfLoop\n      ? selfLoopWrapAnchors(frontSlot, horizontal)\n      : strip.slots.reduce<Record<string, { bounds: Rect }>>((acc, slot, i) => {\n        acc[`c${i}`] = { bounds: slot };\n        return acc;\n      }, {});\n    const fromKey = selfLoop ? '__rearWrap' : `c${doc.rear ?? 0}`;\n    const toKey = selfLoop ? '__frontWrap' : `c${doc.front ?? 0}`;\n    const connectorResult = routeConnectors({\n      anchors: connectorAnchors,\n      connectors: [{\n        fromKey,\n        toKey,\n        direction: 'directed',\n        style: 'solid',\n        label: `mod ${total}`,\n        routing: 'orthogonal',\n        exitWall: horizontal ? 'N' : 'W',\n        entryWall: horizontal ? 'N' : 'W',\n        animation: 'none',\n        props: {\n          color: palette.primary,\n          routePadding: arcH - 8,\n          labelPlacement: 'path-midpoint',\n        },\n      }],\n      theme,\n    });\n    const connectorElements = connectorResult.elements.map(element =>\n      element.type === 'path' && element.markerEnd === 'triton-crosslink-arrow'\n        ? { ...element, markerEnd: ARROW_FWD, strokeWidth: 1.5 }\n        : element,\n    );\n    const linkPaths = connectorElements.filter(e => e.type !== 'text');\n    const linkLabels = connectorElements.filter(e => e.type === 'text');\n    elements.push(...linkPaths, ...linkLabels);\n  }\n\n  // front / rear pointers below\n  if (frontSlot && rearSlot) {\n    const same = (doc.front ?? 0) === (doc.rear ?? 0);\n    const front = horizontal\n      ? pointerBelow(p, theme, frontSlot, 'front', palette.secondary, 0)\n      : pointerToSlot(p, theme, frontSlot, 'front', palette.secondary, 'right', 0);\n    const rear = horizontal\n      ? pointerBelow(p, theme, rearSlot, 'rear', palette.primary, same ? 1 : 0)\n      : pointerToSlot(p, theme, rearSlot, 'rear', palette.primary, 'right', same ? 1 : 0);\n    elements.push(...front.elements, ...rear.elements);\n  }\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [arrowDefs(palette.primary)]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nfunction selfLoopWrapAnchors(slot: Rect, horizontal: boolean): Record<string, { bounds: Rect }> {\n  if (horizontal) {\n    return {\n      __rearWrap: { bounds: { x: slot.x + slot.width / 2, y: slot.y, width: slot.width / 2, height: slot.height } },\n      __frontWrap: { bounds: { x: slot.x, y: slot.y, width: slot.width / 2, height: slot.height } },\n    };\n  }\n  return {\n    __rearWrap: { bounds: { x: slot.x, y: slot.y + slot.height / 2, width: slot.width, height: slot.height / 2 } },\n    __frontWrap: { bounds: { x: slot.x, y: slot.y, width: slot.width, height: slot.height / 2 } },\n  };\n}\n\nexport const cqueue: DiagramModule<CQueueDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutCQueue(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/queue/deque.ts \u2014 Double-ended queue (deque).\n *\n * A horizontal cell strip with a double-headed arrow at BOTH ends: insert and\n * remove are legal at the front (left) and the rear (right). `front`/`rear`\n * markers sit beneath the end cells.\n *\n * Value-driven mini-syntax:\n *   deque A B C D\n *   deque\n *     title work-stealing deque\n *     cells A B C D\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport {\n  ARROW_FWD,\n  ARROW_REV,\n  arrowDefs,\n  finalizeStripScene,\n  lines,\n  parseAxisToken,\n  pointerBelow,\n  pointerToSlot,\n  type StripOrientation,\n} from './shared.js';\n\nexport interface DequeDoc {\n  title?: string;\n  cells: string[];\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): DequeDoc {\n  let title: string | undefined;\n  let cells: string[] = [];\n  let axis: StripOrientation = 'horizontal';\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'deque') { if (t.length > 1) cells = t.slice(1); continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'cells' || t[0] === 'items') { cells = t.slice(1); continue; }\n    if (t[0] === 'axis') { axis = parseAxisToken(t[1], axis); continue; }\n  }\n  return { ...(title !== undefined ? { title } : {}), cells, axis };\n}\n\nexport function layoutDeque(doc: DequeDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 40;\n  const n = doc.cells.length;\n  const cellW = Math.max(46, ...doc.cells.map(c => measureText(c, font).width + 24));\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const topH = font + 14;                  // room for the push/pop captions\n  const sideGap = 56;                      // room for the double-headed end arrows\n  const origin = horizontal\n    ? { x: margin + sideGap, y: margin + titleH + topH }\n    : { x: margin, y: margin + titleH + sideGap };\n\n  const cellInputs: StripCell[] = doc.cells.map(v => ({ label: v }));\n  const strip = buildStrip(p, theme, cellInputs, { origin, cellWidth: cellW, cellHeight: cellH, orientation: axis });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  if (horizontal) {\n    const midY = origin.y + cellH / 2;\n    const leftEdge = origin.x;\n    const rightEdge = origin.x + n * cellW;\n\n    // double-headed arrow at the FRONT (left)\n    elements.push(p.path(`M ${rhu(leftEdge)} ${rhu(midY)} L ${rhu(margin)} ${rhu(midY)}`, palette.primary, 1.5, { markerStart: ARROW_REV, markerEnd: ARROW_FWD }));\n    elements.push(p.text('push / pop', leftEdge - sideGap / 2, origin.y - 8, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n\n    // double-headed arrow at the REAR (right)\n    elements.push(p.path(`M ${rhu(rightEdge)} ${rhu(midY)} L ${rhu(rightEdge + sideGap)} ${rhu(midY)}`, palette.primary, 1.5, { markerStart: ARROW_REV, markerEnd: ARROW_FWD }));\n    elements.push(p.text('push / pop', rightEdge + sideGap / 2, origin.y - 8, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n  } else {\n    const midX = origin.x + cellW / 2;\n    const topEdge = origin.y;\n    const bottomEdge = origin.y + n * cellH;\n\n    // double-headed arrow at the FRONT (top)\n    elements.push(p.path(`M ${rhu(midX)} ${rhu(topEdge)} L ${rhu(midX)} ${rhu(topEdge - sideGap)}`, palette.primary, 1.5, { markerStart: ARROW_REV, markerEnd: ARROW_FWD }));\n    elements.push(p.text('push / pop', midX, topEdge - sideGap / 2 - 6, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n\n    // double-headed arrow at the REAR (bottom)\n    elements.push(p.path(`M ${rhu(midX)} ${rhu(bottomEdge)} L ${rhu(midX)} ${rhu(bottomEdge + sideGap)}`, palette.primary, 1.5, { markerStart: ARROW_REV, markerEnd: ARROW_FWD }));\n    elements.push(p.text('push / pop', midX, bottomEdge + sideGap / 2 + font, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n  }\n\n  // front / rear pointers\n  if (n > 0) {\n    const frontSlot = strip.slots[0]!;\n    const rearSlot = strip.slots[n - 1]!;\n    const same = n === 1;\n    const front = horizontal\n      ? pointerBelow(p, theme, frontSlot, 'front', palette.secondary, 0)\n      : pointerToSlot(p, theme, frontSlot, 'front', palette.secondary, 'right', 0);\n    const rear = horizontal\n      ? pointerBelow(p, theme, rearSlot, 'rear', palette.primary, same ? 1 : 0)\n      : pointerToSlot(p, theme, rearSlot, 'rear', palette.primary, 'right', same ? 1 : 0);\n    elements.push(...front.elements, ...rear.elements);\n  }\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  strip.slots.forEach((slot, i) => { anchors[`c${i}`] = { bounds: slot }; });\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [arrowDefs(palette.primary)]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const deque: DiagramModule<DequeDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutDeque(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/queue/pqueue.ts \u2014 Priority queue.\n *\n * A strip of cells ordered by priority (highest first). Each cell\n * is shaded by its priority \u2014 a deterministic tint of the theme's primary\n * accent (strongest first) \u2014 and shows its priority value on the right.\n *\n * Value-driven mini-syntax:\n *   pqueue\n *     title scheduler\n *     item Deploy 9\n *     item Build 5\n *     item Lint 2\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry, Color,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { finalizeStripScene, lines, parseAxisToken, type StripOrientation } from './shared.js';\n\nexport interface PQItem {\n  label: string;\n  priority: number;\n}\n\nexport interface PQueueDoc {\n  title?: string;\n  items: PQItem[];\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): PQueueDoc {\n  let title: string | undefined;\n  const items: PQItem[] = [];\n  let axis: StripOrientation = 'horizontal';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'pqueue') { continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'axis') { axis = parseAxisToken(t[1], axis); continue; }\n    if (t[0] === 'item') {\n      // `item <label words...> <priority>` \u2014 trailing token is the priority.\n      const rest = line.slice(4).trim();\n      const m = rest.match(/^(.*?)\\s+(-?\\d+(?:\\.\\d+)?)\\s*$/);\n      if (m) items.push({ label: m[1]!.trim(), priority: Number(m[2]) });\n      else if (rest) items.push({ label: rest, priority: 0 });\n    }\n  }\n  return { ...(title !== undefined ? { title } : {}), items, axis };\n}\n\n/** Parse `#rgb` / `#rrggbb` into [r,g,b], or null if not a hex colour. */\nfunction parseHex(c: string): [number, number, number] | null {\n  const s = c.trim();\n  const m3 = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n  if (m3) return [parseInt(m3[1]! + m3[1]!, 16), parseInt(m3[2]! + m3[2]!, 16), parseInt(m3[3]! + m3[3]!, 16)];\n  const m6 = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n  if (m6) return [parseInt(m6[1]!, 16), parseInt(m6[2]!, 16), parseInt(m6[3]!, 16)];\n  return null;\n}\n\nfunction toHex(n: number): string {\n  return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0');\n}\n\n/** Linear mix of two hex colours at t\u2208[0,1]; falls back to `a` if non-hex. */\nfunction mixHex(a: Color, b: Color, t: number): Color {\n  const ca = parseHex(a), cb = parseHex(b);\n  if (!ca || !cb) return a;\n  const r = ca[0] + (cb[0] - ca[0]) * t;\n  const g = ca[1] + (cb[1] - ca[1]) * t;\n  const bl = ca[2] + (cb[2] - ca[2]) * t;\n  return `#${toHex(r)}${toHex(g)}${toHex(bl)}`;\n}\n\nexport function layoutPQueue(doc: PQueueDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n\n  // Highest priority first; ties keep input order (stable).\n  const items = doc.items\n    .map((it, i) => ({ ...it, i }))\n    .sort((a, b) => (b.priority - a.priority) || (a.i - b.i));\n\n  const priorities = items.map(it => it.priority);\n  const max = priorities.length ? Math.max(...priorities) : 0;\n  const min = priorities.length ? Math.min(...priorities) : 0;\n  const span = max - min;\n\n  const labelW = Math.max(40, ...items.map(it => measureText(it.label, font).width));\n  const prioW = Math.max(24, ...items.map(it => measureText(String(it.priority), font).width));\n  const padX = 14;\n  const cellW = labelW + prioW + padX * 3;\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const origin = { x: margin, y: margin + titleH };\n\n  // Shade: highest \u2192 near primary (t small), lowest \u2192 near surface (t large).\n  const cellInputs: StripCell[] = items.map(it => {\n    const norm = span === 0 ? 1 : (it.priority - min) / span;\n    const t = 0.15 + (1 - norm) * 0.65;           // 0.15 (top) \u2026 0.80 (bottom)\n    return { fill: mixHex(palette.primary, palette.surface, t) };\n  });\n\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin, cellWidth: cellW, cellHeight: cellH, orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // Overlay: label (left) + priority value (right) per cell.\n  items.forEach((it, i) => {\n    const slot = strip.slots[i]!;\n    const cy = slot.y + slot.height / 2 + font * 0.35;\n    elements.push(p.text(it.label, slot.x + padX, cy, font, palette.text, { weight: 'bold' }));\n    elements.push(p.text(String(it.priority), slot.x + slot.width - padX, cy, font, palette.text, { anchor: 'end', weight: 'bold' }));\n  });\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  strip.slots.forEach((slot, i) => { anchors[`c${i}`] = { bounds: slot }; });\n\n  const finalized = finalizeStripScene(elements, anchors, theme);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const pqueue: DiagramModule<PQueueDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutPQueue(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/stack/stack.ts \u2014 LIFO stack (vertical cell strip + top marker).\n *\n * A vertical run of cells. The most-recently-pushed item sits at the TOP\n * (smallest y); push and pop both happen at the top. A `top` pointer points\n * into the top-of-stack cell from the left; a `capacity` larger than the\n * filled count shows empty slots above the top (the stack grows upward).\n *\n * Value-driven mini-syntax:\n *   stack A B C D                 // push order; D is on top\n *   stack\n *     title call stack\n *     cells main parse layout     // layout is on top\n *     capacity 6                  // 3 empty slots above\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { finalizeStripScene, parseAxisToken, pointerToSlot, type StripOrientation } from '../queue/shared.js';\nimport { ARROW_ID, arrowDef, lines } from '../struct/shared.js';\n\nexport interface StackDoc {\n  title?: string;\n  /** Push order \u2014 the last element is the top of the stack. */\n  cells: string[];\n  capacity?: number;\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): StackDoc {\n  let title: string | undefined;\n  let cells: string[] = [];\n  let capacity: number | undefined;\n  let axis: StripOrientation = 'vertical';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'stack') { if (t.length > 1) cells = t.slice(1); continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'cells' || t[0] === 'items') { cells = t.slice(1); continue; }\n    if (t[0] === 'capacity') { const n = Number(t[1]); if (Number.isFinite(n)) capacity = n; continue; }\n    if (t[0] === 'axis') { axis = parseAxisToken(t[1], axis); continue; }\n  }\n  return { ...(title !== undefined ? { title } : {}), cells, ...(capacity !== undefined ? { capacity } : {}), axis };\n}\n\nexport function layoutStack(doc: StackDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n  const filled = doc.cells.length;\n  const total = Math.max(filled, doc.capacity ?? filled, 1);\n  const empty = total - filled;\n  const cellW = Math.max(64, ...doc.cells.map(c => measureText(c, font).width + 28));\n  const axis: StripOrientation = doc.axis === 'horizontal' ? 'horizontal' : 'vertical';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const topH = font + 18;                  // room for the push / pop caption\n  const sideGap = 64;                      // room for the `top` pointer on the left\n  const origin = horizontal\n    ? { x: margin, y: margin + titleH + topH }\n    : { x: margin + sideGap, y: margin + titleH + topH };\n\n  // Top-of-stack drawn at the top: empty slots first, then filled cells in\n  // reverse push order (last pushed is topmost).\n  const display: (string | null)[] = [\n    ...Array.from({ length: empty }, () => null),\n    ...[...doc.cells].reverse(),\n  ];\n  const cellInputs: StripCell[] = display.map(v => (\n    v !== null ? { label: v } : { fill: palette.background }\n  ));\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin, cellWidth: cellW, cellHeight: cellH, orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  const topSlot = filled > 0 ? strip.slots[empty]! : strip.slots[0];\n  const actionX = topSlot ? topSlot.x + topSlot.width / 2 : origin.x + cellW / 2;\n  elements.push(p.text('push / pop', actionX, origin.y - 9, font, palette.primary, { anchor: 'middle', weight: 'bold' }));\n  elements.push(p.path(`M ${rhu(actionX)} ${rhu(origin.y - topH + 8)} L ${rhu(actionX)} ${rhu(origin.y)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n\n  // `top` pointer \u2014 points into the top-of-stack cell\n  if (filled > 0) {\n    if (horizontal) {\n      const top = pointerToSlot(p, theme, topSlot!, 'top', palette.secondary, 'bottom', 0);\n      elements.push(...top.elements);\n    } else {\n      const cyTop = topSlot!.y + topSlot!.height / 2;\n      elements.push(p.path(`M ${rhu(origin.x - sideGap + 8)} ${rhu(cyTop)} L ${rhu(origin.x)} ${rhu(cyTop)}`, palette.secondary, 1.5, { markerEnd: ARROW_ID }));\n      elements.push(p.text('top', origin.x - sideGap + 6, cyTop - 6, font, palette.secondary, { anchor: 'start', weight: 'bold' }));\n    }\n  }\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  strip.slots.forEach((slot, i) => { anchors[`c${i}`] = { bounds: slot }; });\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [arrowDef(palette.primary)]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const stack: DiagramModule<StackDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutStack(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/hashmap/hashmap.ts \u2014 Hash map with separate chaining.\n *\n * A vertical strip of buckets indexed 0..n-1. Each non-empty bucket points\n * right to a chain of key\u2192value entries (a singly linked list), reusing the\n * slot/pointer kernel idiom from the linked-list struct. Empty buckets show\n * just their index.\n *\n * Value-driven mini-syntax:\n *   hashmap\n *     title users\n *     buckets 5\n *     bucket 0: alice->1, bob->2     // two chained entries\n *     bucket 2: carol->3\n *     bucket 4: dave->4\n *\n * Entry separators: `,` between entries; `->`, `=>`, `:` or `=` between\n * key and value.\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines } from '../struct/shared.js';\n\nexport interface HashEntry { key: string; value: string; }\nexport interface HashChain { index: number; entries: HashEntry[]; }\n\nexport interface HashmapDoc {\n  title?: string;\n  buckets: number;\n  chains: HashChain[];\n}\n\nfunction parseEntries(spec: string): HashEntry[] {\n  return spec.split(',').map(s => s.trim()).filter(Boolean).map(pair => {\n    const m = pair.match(/^(.*?)\\s*(?:->|=>|:|=)\\s*(.*)$/);\n    if (m) return { key: m[1]!.trim(), value: m[2]!.trim() };\n    return { key: pair, value: '' };\n  });\n}\n\nfunction parse(input: string): HashmapDoc {\n  let title: string | undefined;\n  let bucketCount: number | undefined;\n  const chains: HashChain[] = [];\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'hashmap') { continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'buckets') { const n = Number(t[1]); if (Number.isFinite(n)) bucketCount = n; continue; }\n    if (t[0] === 'bucket') {\n      const m = line.match(/^bucket\\s+(\\d+)\\s*:\\s*(.*)$/);\n      if (m) chains.push({ index: Number(m[1]), entries: parseEntries(m[2]!) });\n    }\n  }\n\n  const maxIdx = chains.reduce((mx, c) => Math.max(mx, c.index), -1);\n  const buckets = Math.max(bucketCount ?? maxIdx + 1, maxIdx + 1, 1);\n  return { ...(title !== undefined ? { title } : {}), buckets, chains };\n}\n\nexport function layoutHashmap(doc: HashmapDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n  const idxW = 46;\n  const entryH = 30;\n  const entryGap = 30;\n  const chainGap = 36;                     // bucket strip \u2192 first entry\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const origin = { x: margin, y: margin + titleH };\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // bucket index column (vertical strip)\n  const slots: { x: number; y: number; width: number; height: number }[] = [];\n  for (let i = 0; i < doc.buckets; i++) {\n    const slot = { x: origin.x, y: origin.y + i * cellH, width: idxW, height: cellH };\n    slots.push(slot);\n    elements.push(p.rect(slot, palette.surface, palette.border, 1.5, { rx: 3 }));\n    elements.push(p.text(String(i), slot.x + slot.width / 2, slot.y + slot.height / 2 + font * 0.35, font, palette.textMuted, { anchor: 'middle', weight: 'bold' }));\n  }\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  slots.forEach((slot, i) => { anchors[`b${i}`] = { bounds: slot }; });\n\n  const chainStartX = origin.x + idxW + chainGap;\n  let maxRight = chainStartX;\n\n  for (const chain of doc.chains) {\n    const slot = slots[chain.index];\n    if (!slot || chain.entries.length === 0) continue;\n    const cy = slot.y + slot.height / 2;\n    let x = chainStartX;\n    let fromX = slot.x + slot.width;\n    chain.entries.forEach((e, j) => {\n      const label = e.value ? `${e.key} : ${e.value}` : e.key;\n      const w = measureText(label, font).width + 22;\n      const box = { x, y: cy - entryH / 2, width: w, height: entryH };\n      // pointer into this entry\n      elements.push(p.path(`M ${rhu(fromX)} ${rhu(cy)} L ${rhu(x - 3)} ${rhu(cy)}`, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n      elements.push(p.rect(box, palette.surface, palette.border, 1.5, { rx: 4 }));\n      elements.push(p.text(label, x + w / 2, cy + font * 0.35, font, palette.text, { anchor: 'middle', weight: 'bold' }));\n      anchors[`b${chain.index}e${j}`] = { bounds: box };\n      fromX = x + w;\n      x = fromX + entryGap;\n      maxRight = Math.max(maxRight, fromX);\n    });\n  }\n\n  const width = maxRight + margin;\n  const height = origin.y + doc.buckets * cellH + margin;\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.primary)],\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const hashmap: DiagramModule<HashmapDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutHashmap(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/matrix/matrix.ts \u2014 2D grid (rows \u00D7 cols) with indices.\n *\n * A grid of equal cells built by stacking horizontal cell strips \u2014 one per\n * row \u2014 and labelling the column indices across the top and the row indices\n * down the left. Ragged rows are padded with blanks so the grid stays\n * rectangular.\n *\n * Value-driven mini-syntax:\n *   matrix\n *     title weights\n *     row 1 2 3 4\n *     row 5 6 7 8\n *     row 9 10 11 12\n *\n *   matrix 3x4              // empty 3-row, 4-column grid\n *   matrix                  // `noindex` hides the row/column index labels\n *     noindex\n *     row a b\n *     row c d\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\n\nexport interface MatrixDoc {\n  title?: string;\n  rows: string[][];\n  showIndex: boolean;\n  /** Highlighted cell positions as [row, col] pairs (0-indexed). */\n  highlights?: [number, number][];\n}\n\nfunction parse(input: string): MatrixDoc {\n  let title: string | undefined;\n  const rows: string[][] = [];\n  let showIndex = true;\n\n  const highlights: [number, number][] = [];\n\n  for (const line of input.split(/\\r?\\n/).map(l => l.trimEnd())) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    const t = trimmed.split(/\\s+/);\n    if (t[0] === 'matrix') {\n      const dim = t[1]?.match(/^(\\d+)x(\\d+)$/i);\n      if (dim) {\n        const r = Number(dim[1]), c = Number(dim[2]);\n        for (let i = 0; i < r; i++) rows.push(Array.from({ length: c }, () => ''));\n      }\n      continue;\n    }\n    if (t[0] === 'title') { title = trimmed.slice(5).trim(); continue; }\n    if (t[0] === 'noindex') { showIndex = false; continue; }\n    if (t[0] === 'row') { rows.push(t.slice(1)); continue; }\n    if (t[0] === 'highlight') {\n      // Accepts space-separated r,c pairs: highlight 0,1 1,2 2,0\n      for (const tok of t.slice(1)) {\n        const m = tok.match(/^(\\d+),(\\d+)$/);\n        if (m) highlights.push([Number(m[1]), Number(m[2])]);\n      }\n      continue;\n    }\n  }\n  return { ...(title !== undefined ? { title } : {}), rows, showIndex, ...(highlights.length > 0 ? { highlights } : {}) };\n}\n\nexport function layoutMatrix(doc: MatrixDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n\n  const nRows = doc.rows.length;\n  const nCols = doc.rows.reduce((m, r) => Math.max(m, r.length), 0);\n  const grid = doc.rows.map(r => Array.from({ length: nCols }, (_, j) => r[j] ?? ''));\n  const cellW = Math.max(40, ...grid.flat().map(v => measureText(v, font).width + 20));\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const colIdxH = doc.showIndex ? typography.smallFontSize + 8 : 0;\n  const rowIdxW = doc.showIndex ? 22 : 0;\n  const origin = { x: margin + rowIdxW, y: margin + titleH + colIdxH };\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  grid.forEach((row, r) => {\n    const rowOrigin = { x: origin.x, y: origin.y + r * cellH };\n    const cellInputs: StripCell[] = row.map((v, c) => {\n      const isHighlit = doc.highlights?.some(([hr, hc]) => hr === r && hc === c) ?? false;\n      return isHighlit\n        ? { label: v, fill: palette.primary, fillOpacity: 0.22, stroke: palette.primary }\n        : { label: v };\n    });\n    const strip = buildStrip(p, theme, cellInputs, { origin: rowOrigin, cellWidth: cellW, cellHeight: cellH });\n    elements.push(...strip.elements);\n    strip.slots.forEach((slot, c) => { anchors[`r${r}c${c}`] = { bounds: slot }; });\n    if (doc.showIndex) {\n      elements.push(p.text(String(r), origin.x - 7, rowOrigin.y + cellH / 2 + font * 0.35, typography.smallFontSize, palette.textMuted, { anchor: 'end' }));\n    }\n  });\n\n  if (doc.showIndex) {\n    for (let c = 0; c < nCols; c++) {\n      const cx = origin.x + c * cellW + cellW / 2;\n      elements.push(p.text(String(c), cx, origin.y - 6, typography.smallFontSize, palette.textMuted, { anchor: 'middle' }));\n    }\n  }\n\n  const width = origin.x + nCols * cellW + margin;\n  const height = origin.y + nRows * cellH + margin;\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height },\n    background: palette.background,\n    elements,\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const matrix: DiagramModule<MatrixDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutMatrix(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/trie/trie.ts \u2014 Prefix tree (trie) front-end.\n *\n * Value-driven: `trie insert cat car card dog do` inserts strings into a\n * character trie. Unlike the radix/Patricia trie, edges are NOT compressed \u2014\n * every character gets its own edge and node. Shared prefixes share a path,\n * branch/intermediate nodes render as small dots, and word-terminal nodes\n * render as filled pills showing the full word.\n *\n * Compiles down to the shared decorated-tree IR (ir.ts) and reuses the tidy\n * tree placement kernel (graph/tree via layout.ts), exactly like radix.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from '../tree/ir.js';\nimport { layoutTree } from '../tree/layout.js';\n\ninterface TNode { edges: Map<string, TNode>; end: boolean; }\n\nconst newNode = (): TNode => ({ edges: new Map(), end: false });\n\nfunction insert(root: TNode, word: string): void {\n  let node = root;\n  for (const ch of word) {\n    let child = node.edges.get(ch);\n    if (child === undefined) { child = newNode(); node.edges.set(ch, child); }\n    node = child;\n  }\n  node.end = true;\n}\n\nexport function buildTrie(input: string): TreeDocument {\n  // words = non-keyword alphanumeric tokens after `trie`/`insert`\n  const tokens = input.split(/\\s+/).filter(Boolean);\n  const words = tokens.filter(t => t !== 'trie' && t !== 'insert' && /^[A-Za-z0-9]+$/.test(t));\n  const root = newNode();\n  for (const w of words) insert(root, w);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: TNode, prefix: string, edgeLabel?: string): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    // Terminal nodes (end of a word) \u2192 filled pill labelled with the full word.\n    // Intermediate/branch nodes \u2192 small dot; the character lives on the edge.\n    const node: TreeNode = n.end\n      ? { id, label: prefix, kinds: ['leaf', 'active'], children, ...(edgeLabel !== undefined ? { edgeLabel } : {}) }\n      : { id, label: '', kinds: ['dot'], children, ...(edgeLabel !== undefined ? { edgeLabel } : {}) };\n    nodes.push(node);\n    // Stable child order: insertion order of the Map (first-seen character).\n    for (const [ch, child] of n.edges) children.push(emit(child, prefix + ch, ch));\n    return id;\n  };\n  emit(root, '');\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const trie: DiagramModule<TreeDocument> = {\n  parseMermaid: buildTrie,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/ds/graph/graph.ts \u2014 Generic node/edge graph.\n *\n * A clean, themeable node-link graph (directed or undirected) built on the\n * shared layered placement kernel (graph/layered). Nodes are rounded boxes,\n * edges are straight connectors clipped to node borders; in directed mode each\n * edge carries an arrowhead, in undirected mode it does not.\n *\n * \u26A0\uFE0F Header keyword is `nodegraph` (alias `dsgraph`) \u2014 NOT `graph`, because\n * Mermaid's flowchart already owns `graph` (`graph TD`). Using a distinct token\n * keeps flowchart detection intact.\n *\n * Value-driven mini-syntax:\n *   nodegraph\n *     directed                 // or `undirected` (the default)\n *     title Dependency graph\n *     node A : Parser          // optional explicit label\n *     A -> B : calls           // edge with optional `: label`\n *     B -- C                   // edges may use -> or --\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry, Rect, BaseIR,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { layeredLayout, type GraphNode, type GraphEdge } from '../../../../graph/layered.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef } from '../struct/shared.js';\n\nexport interface GNode { id: string; label: string; }\nexport interface GEdge { from: string; to: string; label?: string; kind?: 'active' | 'dashed'; }\n\nexport interface GraphDoc extends BaseIR {\n  title?: string;\n  directed: boolean;\n  nodes: GNode[];\n  edges: GEdge[];\n}\n\nconst EDGE_RE = /^(\\S+)\\s*(<->|->|--)\\s*(\\S+)(?:\\s*:\\s*(.+))?$/;\n\nfunction parse(input: string): Omit<GraphDoc, keyof BaseIR> {\n  let title: string | undefined;\n  let directed = false;\n  const order: string[] = [];\n  const labels = new Map<string, string>();\n  const edges: GEdge[] = [];\n  const ensure = (id: string): void => { if (!labels.has(id)) { labels.set(id, id); order.push(id); } };\n\n  for (const raw of input.split(/\\r?\\n/)) {\n    const line = raw.trim();\n    if (!line) continue;\n    const t = line.split(/\\s+/);\n    if (t[0] === 'nodegraph' || t[0] === 'dsgraph') continue;\n    if (t[0] === 'directed') { directed = true; continue; }\n    if (t[0] === 'undirected') { directed = false; continue; }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'node') {\n      const parts = line.slice(4).split(':').map(s => s.trim());\n      const id = parts[0] ?? '';\n      if (id) { ensure(id); labels.set(id, parts[1] || id); }\n      continue;\n    }\n    const m = line.match(EDGE_RE);\n    if (m) {\n      const from = m[1]!, to = m[3]!;\n      const rawLabel = m[4]?.trim();\n      let label: string | undefined;\n      let kind: GEdge['kind'] | undefined;\n      if (rawLabel === 'active') kind = 'active';\n      else if (rawLabel === 'dashed') kind = 'dashed';\n      else label = rawLabel;\n      ensure(from); ensure(to);\n      edges.push({ from, to, ...(label ? { label } : {}), ...(kind ? { kind } : {}) });\n    }\n  }\n\n  const nodes: GNode[] = order.map(id => ({ id, label: labels.get(id)! }));\n  return { ...(title !== undefined ? { title } : {}), directed, nodes, edges };\n}\n\nexport function layoutGraph(doc: GraphDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const nodeH = 40;\n\n  const sizeOf = (n: GNode): number => Math.max(64, measureText(n.label, font).width + 28);\n  const gNodes: GraphNode[] = doc.nodes.map(n => ({ id: n.id, width: sizeOf(n), height: nodeH }));\n  const gEdges: GraphEdge[] = doc.edges.map(e => ({ from: e.from, to: e.to }));\n  const placed = layeredLayout(gNodes, gEdges, { direction: 'TB', layerGap: 64, nodeGap: 44, margin });\n\n  const box = (id: string): Rect => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n  }\n\n  // Edges first (under the nodes).\n  for (const e of doc.edges) {\n    const a = placed.boxes.has(e.from) ? box(e.from) : undefined;\n    const b = placed.boxes.has(e.to) ? box(e.to) : undefined;\n    if (!a || !b) continue;\n    const { start, end } = connectSlots(a, b);\n    const isActive = e.kind === 'active';\n    const edgeColor = isActive ? palette.primary : palette.textMuted;\n    const edgeWidth = isActive ? 2.5 : 1.5;\n    const pathOpts: Parameters<typeof p.path>[3] = {\n      ...(doc.directed ? { markerEnd: ARROW_ID } : {}),\n      ...(e.kind === 'dashed' ? { dash: '6 3' } : {}),\n    };\n    elements.push(p.path(`M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`, edgeColor, edgeWidth, pathOpts));\n    if (e.label) {\n      const mx = (start.x + end.x) / 2, my = (start.y + end.y) / 2;\n      const w = measureText(e.label, small).width + 8;\n      elements.push(p.rect({ x: mx - w / 2, y: my - 9, width: w, height: 16 }, palette.background, palette.background, 0, { rx: 3 }));\n      elements.push(p.text(e.label, mx, my + 3, small, isActive ? palette.primary : palette.textMuted, { anchor: 'middle', weight: 'bold' }));\n    }\n  }\n\n  // Nodes.\n  const anchors: Record<string, { bounds: Rect }> = {};\n  for (const n of doc.nodes) {\n    const b = box(n.id);\n    elements.push(p.rect(b, palette.surface, palette.primary, 2, { rx: 8 }));\n    elements.push(p.text(n.label, b.x + b.width / 2, b.y + b.height / 2 + font * 0.35, font, palette.text, { anchor: 'middle', weight: 'bold' }));\n    anchors[n.id] = { bounds: b };\n  }\n\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: placed.width + margin, height: placed.height + titleH + margin },\n    background: palette.background,\n    elements,\n    ...(doc.directed ? { defs: [arrowDef(palette.textMuted)] } : {}),\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const graph: DiagramModule<GraphDoc> = {\n  parseMermaid(input: string): GraphDoc {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string): GraphDoc {\n    return JSON.parse(input) as GraphDoc;\n  },\n  layout(ir: GraphDoc, theme: ResolvedTheme): LayoutResult {\n    return layoutGraph(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/unionfind/unionfind.ts \u2014 Disjoint Set Union (DSU) forest.\n *\n * A union-find structure is a forest of parent-pointer trees: each set is one\n * tree rooted at its representative. This renders the whole forest side by side\n * (the shared tidy-tree kernel places each root block left\u2192right), with the\n * representative of each set marked distinctly (filled) and the members drawn\n * as plain circles. Edges are parent pointers (child \u2192 parent, drawn top-down).\n *\n * Value-driven mini-syntax (header `unionfind` or alias `dsu`):\n *   unionfind 7\n *     parent 0 0 1 1 3 5 5        // parent[i]; parent[i]==i \u21D2 representative\n *\n *   dsu 7\n *     union 1 0                    // attach set(1) under set(0)\n *     union 3 1\n *     union 6 5\n *\n * Compiles to the shared decorated-tree IR and reuses layout.ts (graph/tree).\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from '../tree/ir.js';\nimport { layoutTree } from '../tree/layout.js';\n\nexport interface UnionFindDoc extends TreeDocument {\n  /** parent[i] is the parent of element i; parent[i] === i \u21D2 representative. */\n  readonly parent: readonly number[];\n  /** Indices of the set representatives (roots). */\n  readonly roots: readonly number[];\n  /** Number of disjoint sets (= roots.length). */\n  readonly count: number;\n}\n\nfunction find(parent: number[], x: number): number {\n  let r = x;\n  // Walk to the root without path compression (preserve the drawn shape),\n  // guarding against malformed cycles by capping iterations.\n  for (let guard = 0; guard < parent.length && parent[r] !== r; guard++) r = parent[r]!;\n  return r;\n}\n\nexport function buildUnionFind(input: string): UnionFindDoc {\n  const linesArr = input.split(/\\r?\\n/).map(l => l.trim()).filter(Boolean);\n  let count = 0;\n  let parent: number[] = [];\n  let title: string | undefined;\n  const unions: [number, number][] = [];\n\n  for (const line of linesArr) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'unionfind' || t[0] === 'dsu') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n) && n > 0) count = Math.floor(n);\n      continue;\n    }\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'parent') {\n      const vals = t.slice(1).map(Number).filter(Number.isFinite);\n      parent = vals;\n      count = Math.max(count, vals.length);\n      continue;\n    }\n    if (t[0] === 'union') {\n      const a = Number(t[1]); const b = Number(t[2]);\n      if (Number.isFinite(a) && Number.isFinite(b)) {\n        unions.push([a, b]);\n        count = Math.max(count, a + 1, b + 1);\n      }\n      continue;\n    }\n  }\n\n  // Seed parent[] as singletons, then apply any explicit array + union ops.\n  const par: number[] = Array.from({ length: count }, (_, i) => (parent[i] !== undefined ? parent[i]! : i));\n  for (const [a, b] of unions) {\n    const ra = find(par, a); const rb = find(par, b);\n    if (ra !== rb) par[ra] = rb;     // attach a's set under b's representative\n  }\n\n  const roots: number[] = [];\n  for (let i = 0; i < count; i++) if (par[i] === i) roots.push(i);\n\n  // Build the decorated-tree node list: each element points to its parent;\n  // representatives are roots (never referenced as a child of anyone else).\n  const nodes: TreeNode[] = [];\n  for (let i = 0; i < count; i++) {\n    const children: string[] = [];\n    for (let j = 0; j < count; j++) if (j !== i && par[j] === i) children.push(`e${j}`);\n    const isRoot = par[i] === i;\n    nodes.push({\n      id: `e${i}`,\n      label: String(i),\n      kinds: isRoot ? ['circle', 'active'] : ['circle'],\n      children,\n    });\n  }\n\n  return {\n    version: '1.0',\n    metadata: { ...(title !== undefined ? { title } : {}) },\n    direction: 'TB',\n    nodes,\n    parent: par,\n    roots,\n    count,\n  };\n}\n\nexport function layoutUnionFind(ir: UnionFindDoc, theme: ResolvedTheme): LayoutResult {\n  return layoutTree(ir, theme);\n}\n\nexport const unionfind: DiagramModule<UnionFindDoc> = {\n  parseMermaid: buildUnionFind,\n  parseYaml: (input) => JSON.parse(input) as UnionFindDoc,\n  layout: layoutUnionFind,\n};\n", "/**\n * @file style/cost.ts \u2014 Cost / latency tier styling.\n *\n * Maps a numeric edge weight (latency, bandwidth-inverse, hop distance, plan\n * cost) onto a discrete visual tier \u2014 colour + dash pattern \u2014 and builds a\n * legend block. Shared by any diagram with weighted edges (architecture/NUMA,\n * topology, query plans). Pure styling: no layout.\n */\n\nimport type { SceneElement, Color, Point, Rect, ResolvedTheme } from '../contracts/index.js';\nimport type { Pen } from '../scene/build.js';\n\nexport interface CostTier {\n  readonly name: string;\n  /** Inclusive upper bound for bucketing a weight into this tier. */\n  readonly maxWeight: number;\n  readonly color: Color;\n  /** Optional SVG stroke-dasharray (e.g. '5 4'). */\n  readonly dash?: string;\n}\n\nexport interface CostScale {\n  /** Unit label shown in the legend (e.g. 'ns', 'Gbps'). */\n  readonly unit?: string;\n  /** Tiers, ascending by maxWeight. */\n  readonly tiers: readonly CostTier[];\n}\n\n/** Bucket a weight into the first tier whose maxWeight \u2265 weight (else the last). */\nexport function classifyCost(scale: CostScale, weight: number): CostTier {\n  for (const t of scale.tiers) if (weight <= t.maxWeight) return t;\n  return scale.tiers[scale.tiers.length - 1]!;\n}\n\n/** Look up a tier by name (for explicit `-- tier -->` edges). */\nexport function tierByName(scale: CostScale, name: string): CostTier | undefined {\n  return scale.tiers.find(t => t.name === name);\n}\n\nexport interface LegendResult {\n  readonly elements: SceneElement[];\n  readonly bounds: Rect;\n}\n\n/** A small legend: one swatch + tier name + threshold per tier. */\nexport function buildLegend(pen: Pen, theme: ResolvedTheme, scale: CostScale, origin: Point): LegendResult {\n  const palette = theme.palette;\n  const pad = 14, rowH = 22, swatch = 16;\n  const rows = scale.tiers.length + 1;\n  const width = 220;\n  const height = pad + rows * rowH;\n  const elements: SceneElement[] = [];\n\n  elements.push(pen.rect({ x: origin.x, y: origin.y, width, height }, palette.background, palette.border, 1.5, { rx: 8 }));\n  const title = scale.unit ? `Cost (${scale.unit})` : 'Cost';\n  elements.push(pen.text(title, origin.x + pad, origin.y + pad + 8, theme.typography.baseFontSize, palette.text, { weight: 'bold' }));\n\n  scale.tiers.forEach((t, i) => {\n    const y = origin.y + pad + (i + 1) * rowH;\n    elements.push(pen.rect({ x: origin.x + pad, y: y - swatch + 4, width: swatch, height: swatch - 4 }, t.color, t.color, 1, { rx: 2 }));\n    elements.push(pen.text(t.name, origin.x + pad + swatch + 8, y, theme.typography.smallFontSize, palette.text));\n    elements.push(pen.text(`\u2264 ${t.maxWeight}`, origin.x + width - pad, y, theme.typography.smallFontSize, palette.textMuted, { anchor: 'end', weight: 'bold' }));\n  });\n\n  return { elements, bounds: { x: origin.x, y: origin.y, width, height } };\n}\n", "/**\n * @file diagrams/topology/topology.ts \u2014 Cost-weighted node graph (NUMA / network).\n *\n * Value-driven mini-syntax:\n *   topology\n *     title NUMA interconnect\n *     costs ns\n *       tier local 90 #27ae60\n *       tier hop1 140 #2f80ed\n *       tier hop2 200 #e2574c 5 4\n *     node N0 : Node 0 : CPU+RAM\n *     N0 -- N1 : 140\n *\n * Edges are coloured/dashed by the tier their weight falls into; a legend is\n * rendered from the `costs` block. Demonstrates style/cost end to end.\n */\n\nimport type {\n  DiagramModule, ResolvedTheme, LayoutResult, Scene, SceneElement, NodeAnchorRegistry, Rect,\n} from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { connectSlots } from '../../../graph/connect.js';\nimport { classifyCost, buildLegend, type CostScale, type CostTier } from '../../../style/cost.js';\nimport { rhu } from '../../../util/round.js';\n\ninterface TopoNode { id: string; label: string; sub?: string; group?: string; }\ninterface TopoGroup { id: string; label: string; }\ninterface TopoEdge { from: string; to: string; cost?: number; }\ninterface TopologyDoc { title?: string; scale: CostScale; groups: TopoGroup[]; nodes: TopoNode[]; edges: TopoEdge[]; }\n\nfunction parse(input: string): TopologyDoc {\n  let title: string | undefined;\n  let unit: string | undefined;\n  const tiers: CostTier[] = [];\n  const groups: TopoGroup[] = [];\n  const nodes: TopoNode[] = [];\n  const edges: TopoEdge[] = [];\n  let curGroup: string | undefined;\n\n  for (const raw of input.split(/\\r?\\n/)) {\n    const line = raw.trim();\n    if (!line) continue;\n    const t = line.split(/\\s+/);\n    if (t[0] === 'topology') continue;\n    if (t[0] === 'title') { title = line.slice(5).trim(); continue; }\n    if (t[0] === 'costs') { unit = t[1]; continue; }\n    if (t[0] === 'tier') {\n      const tier: CostTier = {\n        name: t[1] ?? '', maxWeight: Number(t[2]), color: t[3] ?? '#888',\n        ...(t[4] ? { dash: t.slice(4).join(' ') } : {}),\n      };\n      tiers.push(tier);\n      continue;\n    }\n    if (t[0] === 'group') {\n      const parts = line.slice(5).split(':').map(s => s.trim());\n      const id = parts[0] ?? '';\n      groups.push({ id, label: parts[1] || id });\n      curGroup = id;\n      continue;\n    }\n    if (t[0] === 'node') {\n      const parts = line.slice(4).split(':').map(s => s.trim());\n      const id = parts[0] ?? '';\n      nodes.push({ id, label: parts[1] || id, ...(parts[2] ? { sub: parts[2] } : {}), ...(curGroup ? { group: curGroup } : {}) });\n      continue;\n    }\n    if (line.includes('--')) {\n      const m = line.match(/^(\\S+)\\s*--\\s*(\\S+)(?:\\s*:\\s*(-?\\d+(?:\\.\\d+)?))?/);\n      if (m) edges.push({ from: m[1]!, to: m[2]!, ...(m[3] !== undefined ? { cost: Number(m[3]) } : {}) });\n    }\n  }\n  return {\n    ...(title !== undefined ? { title } : {}),\n    scale: { ...(unit !== undefined ? { unit } : {}), tiers },\n    groups, nodes, edges,\n  };\n}\n\nexport function layoutTopology(doc: TopologyDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n\n  const nodeWidth = (n: TopoNode): number => Math.max(96, Math.max(measureText(n.label, font).width, measureText(n.sub ?? '', small).width) + 28);\n  const nodeH = doc.nodes.some(n => n.sub) ? 52 : 40;\n\n  const elements: SceneElement[] = [];\n  if (doc.title) elements.push(p.text(doc.title, margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));\n\n  const box = new Map<string, Rect>();\n  const groupBox = new Map<string, Rect>();\n  const GHEADER = 26, GPAD = 14, CGAP = 18, GROUP_GAP = 70;\n\n  if (doc.groups.length > 0) {\n    let gx = margin;\n    const gy = margin + titleH;\n    let maxBottom = gy;\n    for (const g of doc.groups) {\n      const kids = doc.nodes.filter(n => n.group === g.id);\n      const childW = Math.max(96, ...kids.map(nodeWidth));\n      const cols = Math.max(1, Math.ceil(Math.sqrt(kids.length)));\n      const rows = Math.max(1, Math.ceil(kids.length / cols));\n      const innerW = cols * childW + (cols - 1) * CGAP;\n      const innerH = rows * nodeH + (rows - 1) * CGAP;\n      const gw = innerW + GPAD * 2;\n      const gh = GHEADER + GPAD + innerH + GPAD;\n      groupBox.set(g.id, { x: gx, y: gy, width: gw, height: gh });\n      kids.forEach((n, i) => {\n        const col = i % cols, row = Math.floor(i / cols);\n        box.set(n.id, { x: gx + GPAD + col * (childW + CGAP), y: gy + GHEADER + GPAD + row * (nodeH + CGAP), width: childW, height: nodeH });\n      });\n      maxBottom = Math.max(maxBottom, gy + gh);\n      gx += gw + GROUP_GAP;\n    }\n    let ux = margin;\n    const uy = maxBottom + 40;\n    for (const n of doc.nodes.filter(n => !n.group)) {\n      const w = nodeWidth(n);\n      box.set(n.id, { x: ux, y: uy, width: w, height: nodeH });\n      ux += w + 40;\n    }\n  } else {\n    const nodeW = Math.max(96, ...doc.nodes.map(nodeWidth));\n    const cols = Math.max(1, Math.ceil(Math.sqrt(doc.nodes.length)));\n    const colGap = 96, rowGap = 80;\n    doc.nodes.forEach((n, i) => {\n      const col = i % cols, row = Math.floor(i / cols);\n      box.set(n.id, { x: margin + col * (nodeW + colGap), y: margin + titleH + row * (nodeH + rowGap), width: nodeW, height: nodeH });\n    });\n  }\n\n  // group panels (under everything)\n  for (const g of doc.groups) {\n    const gb = groupBox.get(g.id)!;\n    elements.push(p.rect(gb, '#fbfbfd', palette.primary, 2, { rx: 10 }));\n    elements.push(p.text(g.label, gb.x + 12, gb.y + 17, small, palette.primary, { weight: 'bold' }));\n  }\n\n  // edges (over panels, under nodes); endpoints may be nodes or groups\n  const idBox = new Map<string, Rect>([...box, ...groupBox]);\n  for (const e of doc.edges) {\n    const a = idBox.get(e.from), b = idBox.get(e.to);\n    if (!a || !b) continue;\n    const tier: CostTier | undefined = e.cost !== undefined && doc.scale.tiers.length > 0 ? classifyCost(doc.scale, e.cost) : undefined;\n    const color = tier?.color ?? palette.textMuted;\n    const { start, end } = connectSlots(a, b);\n    elements.push(p.path(`M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`, color, 2, tier?.dash ? { dash: tier.dash } : {}));\n    if (e.cost !== undefined) {\n      const mx = (start.x + end.x) / 2, my = (start.y + end.y) / 2;\n      const label = doc.scale.unit ? `${e.cost} ${doc.scale.unit}` : String(e.cost);\n      const w = measureText(label, small).width + 8;\n      elements.push(p.rect({ x: mx - w / 2, y: my - 9, width: w, height: 16 }, palette.background, palette.background, 0, { rx: 3 }));\n      elements.push(p.text(label, mx, my + 3, small, color, { anchor: 'middle', weight: 'bold' }));\n    }\n  }\n\n  // nodes\n  const anchors: Record<string, { bounds: Rect }> = {};\n  for (const n of doc.nodes) {\n    const b = box.get(n.id)!;\n    elements.push(p.rect(b, palette.surface, palette.primary, 2, { rx: 8 }));\n    if (n.sub) {\n      elements.push(p.text(n.label, b.x + b.width / 2, b.y + 20, font, palette.text, { anchor: 'middle', weight: 'bold' }));\n      elements.push(p.text(n.sub, b.x + b.width / 2, b.y + 38, small, palette.textMuted, { anchor: 'middle' }));\n    } else {\n      elements.push(p.text(n.label, b.x + b.width / 2, b.y + b.height / 2 + font * 0.35, font, palette.text, { anchor: 'middle', weight: 'bold' }));\n    }\n    anchors[n.id] = { bounds: b };\n  }\n  for (const g of doc.groups) anchors[g.id] = { bounds: groupBox.get(g.id)! };\n\n  const allBoxes = [...box.values(), ...groupBox.values()];\n  const boxesRight = Math.max(margin, ...allBoxes.map(b => b.x + b.width));\n  const contentBottom = Math.max(margin + titleH, ...allBoxes.map(b => b.y + b.height));\n\n  let contentRight = boxesRight;\n  if (doc.scale.tiers.length > 0) {\n    const legend = buildLegend(p, theme, doc.scale, { x: boxesRight + 40, y: margin + titleH });\n    elements.push(...legend.elements);\n    contentRight = legend.bounds.x + legend.bounds.width;\n  }\n\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: contentRight + margin, height: contentBottom + margin },\n    background: palette.background,\n    elements,\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const topology: DiagramModule<TopologyDoc & { version: string; metadata: Record<string, unknown> }> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutTopology(ir, theme);\n  },\n};\n", "import type { Scene, SceneElement, Renderer, NodeAnchorRegistry } from '../contracts/index.js';\n\n/**\n * Render a fully-resolved Scene to an SVG string.\n *\n * Contract: the caller must have already incorporated all overlay geometry\n * into Scene.elements before calling this. The renderer is diagram-agnostic.\n */\nexport function renderSVG(scene: Scene): string {\n  const { viewBox, background, elements, defs } = scene;\n  const vb = `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`;\n  const markerMetrics = markerMetricsById(defs ?? []);\n\n  const lines: string[] = [\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${vb}\" width=\"${viewBox.width}\" height=\"${viewBox.height}\">`,\n  ];\n\n  if (defs && defs.length > 0) {\n    lines.push('  <defs>');\n    for (const def of defs) lines.push(`    ${def}`);\n    lines.push('  </defs>');\n  }\n\n  if (background) {\n    // Use explicit x/width to cover the full viewBox, including negative x origins.\n    lines.push(`  <rect x=\"${viewBox.x}\" y=\"${viewBox.y}\" width=\"${viewBox.width}\" height=\"${viewBox.height}\" fill=\"${background}\" />`);\n  }\n\n  for (const el of elements) {\n    lines.push(renderElement(el, 1, markerMetrics));\n  }\n\n  lines.push('</svg>');\n  return lines.join('\\n');\n}\n\n// \u2500\u2500\u2500 Element Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderElement(el: SceneElement, depth: number, markerMetrics: Map<string, MarkerMetrics>): string {\n  const pad = '  '.repeat(depth);\n\n  switch (el.type) {\n    case 'rect': {\n      const rx          = el.rx          != null ? ` rx=\"${el.rx}\"` : '';\n      const fillOpacity = el.fillOpacity != null ? ` fill-opacity=\"${el.fillOpacity}\"` : '';\n      const opacity     = el.opacity     != null ? ` opacity=\"${el.opacity}\"` : '';\n      return `${pad}<rect x=\"${el.bounds.x}\" y=\"${el.bounds.y}\" width=\"${el.bounds.width}\" height=\"${el.bounds.height}\" fill=\"${fillVal(el.fill)}\"${fillOpacity} stroke=\"${el.stroke}\" stroke-width=\"${el.strokeWidth}\"${rx}${opacity} />`;\n    }\n\n    case 'circle': {\n      const opacity = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n      return `${pad}<circle cx=\"${el.center.x}\" cy=\"${el.center.y}\" r=\"${el.radius}\" fill=\"${fillVal(el.fill)}\" stroke=\"${el.stroke}\" stroke-width=\"${el.strokeWidth}\"${opacity} />`;\n    }\n\n    case 'text': {\n      const anchor  = el.anchor    != null ? ` text-anchor=\"${el.anchor}\"` : '';\n      const weight  = el.fontWeight != null ? ` font-weight=\"${el.fontWeight}\"` : '';\n      const opacity = el.opacity   != null ? ` opacity=\"${el.opacity}\"` : '';\n      return `${pad}<text x=\"${el.position.x}\" y=\"${el.position.y}\" font-size=\"${el.fontSize}\" font-family=\"${escapeAttr(el.fontFamily)}\" fill=\"${fillVal(el.fill)}\"${anchor}${weight}${opacity}>${escapeXml(el.content)}</text>`;\n    }\n\n    case 'path': {\n      const drawLength = el.animated === 'draw' ? pathLengthApprox(el.d) : undefined;\n      const dashValue  = drawLength != null ? `${drawLength} ${drawLength}` : el.strokeDasharray;\n      const dash       = dashValue          != null ? ` stroke-dasharray=\"${escapeAttr(dashValue)}\"` : '';\n      const mEnd       = el.markerEnd       != null ? ` marker-end=\"url(#${escapeAttr(el.markerEnd)})\"` : '';\n      const mStart     = el.markerStart     != null ? ` marker-start=\"url(#${escapeAttr(el.markerStart)})\"` : '';\n      const fill       = ` fill=\"${fillVal(el.fill)}\"`;\n      const opacity    = el.opacity         != null ? ` opacity=\"${el.opacity}\"` : '';\n      const stroke     = el.animated === 'flow' ? `url(#${flowGradientId(el.d, el.stroke)})` : el.stroke;\n      const attrs      = `${pad}<path d=\"${escapeAttr(el.d)}\" stroke=\"${escapeAttr(stroke)}\" stroke-width=\"${el.strokeWidth}\"${fill}${dash}${mEnd}${mStart}${opacity}`;\n      if (el.animated === 'march' && el.strokeDasharray) {\n        const period  = parseDasharrayPeriod(el.strokeDasharray);\n        const animate = `<animate attributeName=\"stroke-dashoffset\" from=\"0\" to=\"-${period}\" dur=\"0.8s\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'draw') {\n        const animate = `<animate attributeName=\"stroke-dashoffset\" values=\"0;${drawLength};0\" dur=\"2s\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'pulse') {\n        const wide = formatNum(el.strokeWidth * 2);\n        const animate = `<animate attributeName=\"stroke-width\" values=\"${el.strokeWidth};${wide};${el.strokeWidth}\" dur=\"1.4s\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'glow') {\n        const animate = '<animate attributeName=\"stroke-opacity\" values=\"1;0.3;1\" dur=\"1.6s\" repeatCount=\"indefinite\"/>';\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'colorcycle') {\n        const animate = '<animate attributeName=\"stroke\" values=\"#4A90D9;#9b51e0;#e54444;#2ecc71;#4A90D9\" dur=\"3s\" repeatCount=\"indefinite\"/>';\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'flow') {\n        const gradient = renderFlowGradient(el, pad);\n        return `${gradient}\\n${attrs} />`;\n      }\n      if (el.animated === 'particle') {\n        const motionPath = trimMotionPathForArrowhead(el.d, motionArrowheadClearance(el, 4, markerMetrics));\n        const circle = renderMotionCircle(motionPath, el.stroke, 4, undefined, '1.5s', '0s', pad);\n        return `${attrs} />\\n${circle}`;\n      }\n      if (el.animated === 'comet') {\n        const motionPath = trimMotionPathForArrowhead(el.d, motionArrowheadClearance(el, 4.2, markerMetrics));\n        const circles = [\n          renderMotionCircle(motionPath, el.stroke, 4.2, 0.95, '1.8s', '0s', pad),\n          renderMotionCircle(motionPath, el.stroke, 3.1, 0.45, '1.8s', '-0.18s', pad),\n          renderMotionCircle(motionPath, el.stroke, 2.2, 0.22, '1.8s', '-0.36s', pad),\n        ].join('\\n');\n        return `${attrs} />\\n${circles}`;\n      }\n      if (el.animated === 'stream') {\n        const motionPath = trimMotionPathForArrowhead(el.d, motionArrowheadClearance(el, 3.2, markerMetrics));\n        const circles = [0, 1, 2, 3]\n          .map(i => renderMotionCircle(motionPath, el.stroke, 3.2, 0.9, '2s', i === 0 ? '0s' : `-${formatNum(i * 0.5)}s`, pad))\n          .join('\\n');\n        return `${attrs} />\\n${circles}`;\n      }\n      return `${attrs} />`;\n    }\n\n    case 'group': {\n      const id        = el.id        != null ? ` id=\"${escapeAttr(el.id)}\"` : '';\n      const transform = el.transform != null ? ` transform=\"${escapeAttr(el.transform)}\"` : '';\n      const opacity   = el.opacity   != null ? ` opacity=\"${el.opacity}\"` : '';\n      if (el.children.length === 0) {\n        return `${pad}<g${id}${transform}${opacity} />`;\n      }\n      const inner = el.children.map(c => renderElement(c, depth + 1, markerMetrics)).join('\\n');\n      return `${pad}<g${id}${transform}${opacity}>\\n${inner}\\n${pad}</g>`;\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Sum all values in a stroke-dasharray string \u2014 one full animation period. */\nfunction parseDasharrayPeriod(dasharray: string): number {\n  return dasharray\n    .trim()\n    .split(/[\\s,]+/)\n    .map(Number)\n    .filter(n => !isNaN(n) && n > 0)\n    .reduce((sum, n) => sum + n, 0);\n}\n\nfunction renderMotionCircle(\n  path: string,\n  fill: string,\n  radius: number,\n  opacity: number | undefined,\n  dur: string,\n  begin: string,\n  pad: string,\n): string {\n  const opacityAttr = opacity != null ? ` opacity=\"${opacity}\"` : '';\n  return `${pad}<circle r=\"${radius}\" fill=\"${escapeAttr(fill)}\"${opacityAttr}>\\n${pad}  <animateMotion dur=\"${dur}\" begin=\"${begin}\" repeatCount=\"indefinite\" rotate=\"auto\" path=\"${escapeAttr(path)}\"/>\\n${pad}</circle>`;\n}\n\ninterface MarkerMetrics {\n  readonly refX: number;\n  readonly markerUnits: 'strokeWidth' | 'userSpaceOnUse';\n}\n\nconst DEFAULT_MARKER_REF_X = 7;\nconst MIN_MOTION_SEGMENT_LENGTH = 1;\n\nfunction trimMotionPathForArrowhead(path: string, clearance: number): string {\n  if (clearance <= 0) return path;\n  const pts = pathPoints(path);\n  if (pts.length < 2) return path;\n\n  const end = pts[pts.length - 1]!;\n  const prev = pts[pts.length - 2]!;\n  const dx = end.x - prev.x;\n  const dy = end.y - prev.y;\n  const segmentLength = Math.hypot(dx, dy);\n  if (segmentLength === 0) return path;\n\n  const remainingLength = segmentLength > MIN_MOTION_SEGMENT_LENGTH\n    ? Math.max(MIN_MOTION_SEGMENT_LENGTH, segmentLength - clearance)\n    : segmentLength / 2;\n  const unitX = dx / segmentLength;\n  const unitY = dy / segmentLength;\n  const trimmedEnd = {\n    x: prev.x + unitX * remainingLength,\n    y: prev.y + unitY * remainingLength,\n  };\n  const motionPts = [...pts.slice(0, -1), trimmedEnd];\n  return motionPts\n    .map((pt, i) => `${i === 0 ? 'M' : 'L'} ${formatNum(pt.x)} ${formatNum(pt.y)}`)\n    .join(' ');\n}\n\nfunction motionArrowheadClearance(\n  el: Extract<SceneElement, { type: 'path' }>,\n  dotRadius: number,\n  markerMetrics: Map<string, MarkerMetrics>,\n): number {\n  if (el.markerEnd == null) return 0;\n  const marker = markerMetrics.get(el.markerEnd) ?? { refX: DEFAULT_MARKER_REF_X, markerUnits: 'strokeWidth' as const };\n  const markerBackOffset = marker.markerUnits === 'strokeWidth'\n    ? marker.refX * el.strokeWidth\n    : marker.refX;\n  return markerBackOffset + dotRadius;\n}\n\nfunction markerMetricsById(defs: readonly string[]): Map<string, MarkerMetrics> {\n  const markers = new Map<string, MarkerMetrics>();\n  for (const def of defs) {\n    for (const match of def.matchAll(/<marker\\b[^>]*>/g)) {\n      const marker = match[0];\n      const id = attrValue(marker, 'id');\n      const refX = attrNumber(marker, 'refX');\n      if (id == null || refX == null) continue;\n      const markerUnits = attrValue(marker, 'markerUnits') === 'userSpaceOnUse' ? 'userSpaceOnUse' : 'strokeWidth';\n      markers.set(id, { refX, markerUnits });\n    }\n  }\n  return markers;\n}\n\nfunction attrValue(text: string, name: string): string | undefined {\n  return text.match(new RegExp(`\\\\b${name}\\\\s*=\\\\s*\"([^\"]+)\"`))?.[1]\n    ?? text.match(new RegExp(`\\\\b${name}\\\\s*=\\\\s*'([^']+)'`))?.[1];\n}\n\nfunction attrNumber(text: string, name: string): number | undefined {\n  const value = attrValue(text, name);\n  if (value == null) return undefined;\n  const n = Number.parseFloat(value);\n  return Number.isFinite(n) ? n : undefined;\n}\n\nfunction renderFlowGradient(el: Extract<SceneElement, { type: 'path' }>, pad: string): string {\n  const id = flowGradientId(el.d, el.stroke);\n  const { start, end } = pathEndpoints(el.d);\n  const base = escapeAttr(el.stroke);\n  return [\n    `${pad}<defs>`,\n    `${pad}  <linearGradient id=\"${id}\" gradientUnits=\"userSpaceOnUse\" x1=\"${start.x}\" y1=\"${start.y}\" x2=\"${end.x}\" y2=\"${end.y}\">`,\n    `${pad}    <stop offset=\"0%\" stop-color=\"${base}\" stop-opacity=\"0.75\"/>`,\n    `${pad}    <stop offset=\"20%\" stop-color=\"${base}\" stop-opacity=\"0.85\">`,\n    `${pad}      <animate attributeName=\"offset\" values=\"0%;60%;100%\" dur=\"1.6s\" repeatCount=\"indefinite\"/>`,\n    `${pad}    </stop>`,\n    `${pad}    <stop offset=\"35%\" stop-color=\"#FFFFFF\" stop-opacity=\"1\">`,\n    `${pad}      <animate attributeName=\"offset\" values=\"10%;70%;100%\" dur=\"1.6s\" repeatCount=\"indefinite\"/>`,\n    `${pad}    </stop>`,\n    `${pad}    <stop offset=\"50%\" stop-color=\"${base}\" stop-opacity=\"0.85\">`,\n    `${pad}      <animate attributeName=\"offset\" values=\"20%;80%;100%\" dur=\"1.6s\" repeatCount=\"indefinite\"/>`,\n    `${pad}    </stop>`,\n    `${pad}    <stop offset=\"100%\" stop-color=\"${base}\" stop-opacity=\"0.75\"/>`,\n    `${pad}  </linearGradient>`,\n    `${pad}</defs>`,\n  ].join('\\n');\n}\n\nfunction flowGradientId(path: string, stroke: string): string {\n  return `triton-flow-${hashString(`${path}|${stroke}`)}`;\n}\n\nfunction pathLengthApprox(path: string): number {\n  const pts = pathPoints(path);\n  if (pts.length < 2) return 1000;\n  let length = 0;\n  for (let i = 1; i < pts.length; i++) {\n    length += Math.hypot(pts[i]!.x - pts[i - 1]!.x, pts[i]!.y - pts[i - 1]!.y);\n  }\n  return Math.max(1, Number(formatNum(length)));\n}\n\nfunction pathEndpoints(path: string): { start: { x: number; y: number }; end: { x: number; y: number } } {\n  const pts = pathPoints(path);\n  const start = pts[0] ?? { x: 0, y: 0 };\n  const end = pts[pts.length - 1] ?? { x: 1, y: 0 };\n  if (start.x === end.x && start.y === end.y) {\n    return { start, end: { x: end.x + 1, y: end.y } };\n  }\n  return { start, end };\n}\n\nfunction pathPoints(path: string): Array<{ x: number; y: number }> {\n  const nums = [...path.matchAll(/-?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?/gi)].map(m => Number(m[0]));\n  const pts: Array<{ x: number; y: number }> = [];\n  for (let i = 0; i + 1 < nums.length; i += 2) {\n    const x = nums[i]!;\n    const y = nums[i + 1]!;\n    if (Number.isFinite(x) && Number.isFinite(y)) pts.push({ x, y });\n  }\n  return pts;\n}\n\nfunction formatNum(value: number): string {\n  return Number.isFinite(value) ? String(Math.round(value * 1000) / 1000) : '0';\n}\n\nfunction hashString(value: string): string {\n  let hash = 0x811c9dc5;\n  for (let i = 0; i < value.length; i++) {\n    hash ^= value.charCodeAt(i);\n    hash = Math.imul(hash, 0x01000193);\n  }\n  return (hash >>> 0).toString(36);\n}\n\nfunction fillVal(fill: string | null | undefined): string {\n  return fill != null && fill.trim() !== '' ? fill : 'none';\n}\n\nfunction escapeXml(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nfunction escapeAttr(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\n// \u2500\u2500\u2500 Anchor manifest embed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Embed a JSON anchor manifest into an SVG string as an inert data script tag,\n * immediately before the closing `</svg>`.\n *\n * The JSON object has keys sorted deterministically so the output is stable\n * across invocations. Any `</` sequences inside the JSON are escaped as `<\\/`\n * so they cannot accidentally terminate the script element.\n */\nexport function embedAnchorManifest(svg: string, anchors: NodeAnchorRegistry): string {\n  const sorted: Record<string, unknown> = {};\n  for (const key of Object.keys(anchors).sort()) {\n    sorted[key] = anchors[key];\n  }\n  const json = JSON.stringify(sorted).replace(/<\\//g, '<\\\\/');\n  const block = `<script type=\"application/json\" id=\"triton-anchors\">${json}</script>`;\n  return svg.replace('</svg>', `${block}\\n</svg>`);\n}\n\n// \u2500\u2500\u2500 Renderer object \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** The built-in SVG renderer. Registered by default in frontend/index.ts. */\nexport const svgRenderer: Renderer<string> = {\n  name: 'svg',\n  render: renderSVG,\n};\n", "import type { Scene, ThemeInput, Result, BaseIR, LayoutResult, NodeAnchorRegistry } from '../contracts/index.js';\nimport { ok, err } from '../contracts/index.js';\nimport { detect } from './detect.js';\nimport { stripComments } from './preprocess.js';\nimport { registerDiagram, getModule } from './registry.js';\nimport { registerRenderer, getRenderer } from '../render/registry.js';\nimport { defaultTheme, getThemePreset } from '../theme/preset.js';\nimport { resolveTheme } from '../theme/resolver.js';\nimport { validateThemeInput, isBuiltinThemeName } from '../theme/validate.js';\nimport { flowchart } from '../diagrams/mermaid/flowchart/index.js';\nimport { timeline } from '../diagrams/mermaid/timeline/index.js';\nimport { poster } from '../diagrams/triton/poster/index.js';\nimport { pie } from '../diagrams/mermaid/pie/index.js';\nimport { xychart } from '../diagrams/mermaid/xychart/index.js';\nimport { quadrant } from '../diagrams/mermaid/quadrant/index.js';\nimport { radar } from '../diagrams/mermaid/radar/index.js';\nimport { gantt } from '../diagrams/mermaid/gantt/index.js';\nimport { journey } from '../diagrams/mermaid/journey/index.js';\nimport { kanban } from '../diagrams/mermaid/kanban/index.js';\nimport { sequence } from '../diagrams/mermaid/sequence/index.js';\nimport { classDiagram } from '../diagrams/mermaid/class/index.js';\nimport { state } from '../diagrams/mermaid/state/index.js';\nimport { er } from '../diagrams/mermaid/er/index.js';\nimport { block } from '../diagrams/triton/block/index.js';\nimport { requirement } from '../diagrams/mermaid/requirement/index.js';\nimport { sankey } from '../diagrams/mermaid/sankey/index.js';\nimport { mindmap } from '../diagrams/mermaid/mindmap/index.js';\nimport { gitgraph } from '../diagrams/mermaid/gitgraph/index.js';\nimport { c4 } from '../diagrams/mermaid/c4/index.js';\nimport { architecture } from '../diagrams/triton/architecture/index.js';\nimport { packet } from '../diagrams/triton/packet/index.js';\nimport { tree } from '../diagrams/triton/ds/tree/index.js';\nimport { plan } from '../diagrams/triton/ds/tree/plan.js';\nimport { avl } from '../diagrams/triton/ds/tree/avl.js';\nimport { rbtree } from '../diagrams/triton/ds/tree/rbtree.js';\nimport { btree } from '../diagrams/triton/ds/tree/btree.js';\nimport { radix } from '../diagrams/triton/ds/tree/radix.js';\nimport { segtree } from '../diagrams/triton/ds/tree/segtree.js';\nimport { heap } from '../diagrams/triton/ds/tree/heap.js';\nimport { array } from '../diagrams/triton/ds/struct/array.js';\nimport { linkedlist } from '../diagrams/triton/ds/struct/linkedlist.js';\nimport { memory } from '../diagrams/triton/ds/struct/memory.js';\nimport { page } from '../diagrams/triton/ds/struct/page.js';\nimport { queue } from '../diagrams/triton/ds/queue/queue.js';\nimport { cqueue } from '../diagrams/triton/ds/queue/cqueue.js';\nimport { deque } from '../diagrams/triton/ds/queue/deque.js';\nimport { pqueue } from '../diagrams/triton/ds/queue/pqueue.js';\nimport { stack } from '../diagrams/triton/ds/stack/stack.js';\nimport { hashmap } from '../diagrams/triton/ds/hashmap/hashmap.js';\nimport { matrix } from '../diagrams/triton/ds/matrix/matrix.js';\nimport { trie } from '../diagrams/triton/ds/trie/trie.js';\nimport { graph } from '../diagrams/triton/ds/graph/graph.js';\nimport { unionfind } from '../diagrams/triton/ds/unionfind/unionfind.js';\nimport { topology } from '../diagrams/triton/topology/topology.js';\nimport { svgRenderer, embedAnchorManifest } from '../render/svg.js';\nimport { registerRouter } from '../routing/registry.js';\nimport {\n  straightRouter,\n  orthogonalRouter,\n  bezierRouter,\n  polylineRouter,\n} from '../routing/router.js';\n\n// \u2500\u2500\u2500 Register built-ins \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nregisterDiagram('flowchart', flowchart);\nregisterDiagram('timeline', timeline);\nregisterDiagram('poster', poster);\nregisterDiagram('pie', pie);\nregisterDiagram('xychart', xychart);\nregisterDiagram('quadrant', quadrant);\nregisterDiagram('radar', radar);\nregisterDiagram('gantt', gantt);\nregisterDiagram('journey', journey);\nregisterDiagram('kanban', kanban);\nregisterDiagram('sequence', sequence);\nregisterDiagram('class', classDiagram);\nregisterDiagram('state', state);\nregisterDiagram('er', er);\nregisterDiagram('block', block);\nregisterDiagram('requirement', requirement);\nregisterDiagram('sankey', sankey);\nregisterDiagram('mindmap', mindmap);\nregisterDiagram('gitgraph', gitgraph);\nregisterDiagram('c4', c4);\nregisterDiagram('architecture', architecture);\nregisterDiagram('packet', packet);\nregisterDiagram('tree', tree);\nregisterDiagram('plan', plan);\nregisterDiagram('avl', avl);\nregisterDiagram('rbtree', rbtree);\nregisterDiagram('btree', btree);\nregisterDiagram('radix', radix);\nregisterDiagram('segtree', segtree);\nregisterDiagram('heap', heap);\nregisterDiagram('array', array);\nregisterDiagram('linkedlist', linkedlist);\nregisterDiagram('memory', memory);\nregisterDiagram('page', page);\nregisterDiagram('queue', queue);\nregisterDiagram('cqueue', cqueue);\nregisterDiagram('deque', deque);\nregisterDiagram('pqueue', pqueue);\nregisterDiagram('stack', stack);\nregisterDiagram('hashmap', hashmap);\nregisterDiagram('matrix', matrix);\nregisterDiagram('trie', trie);\nregisterDiagram('nodegraph', graph);\nregisterDiagram('unionfind', unionfind);\nregisterDiagram('topology', topology);\nregisterRenderer(svgRenderer);\nregisterRouter('straight', straightRouter);\nregisterRouter('orthogonal', orthogonalRouter);\nregisterRouter('bezier', bezierRouter);\nregisterRouter('polyline', polylineRouter);\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Compile input text to a LayoutResult (Scene + anchor registry) \u2014 synchronous.\n *\n * Every Triton layout engine is synchronous (no font I/O, WASM, or fetching),\n * so the whole parse \u2192 theme \u2192 layout pipeline runs without promises. This is\n * the canonical implementation; the async `compile()` is a thin wrapper.\n *\n * Theme resolution order (later overrides earlier):\n *   defaultTheme \u2190 themeInput \u2190 module.defaultThemeOverride \u2190 ir.themeOverride\n *\n * Returns a Result \u2014 never throws.\n */\nexport function compileSync(\n  input: string,\n  themeInput?: ThemeInput,\n  forcedThemeName?: string,\n): Result<LayoutResult> {\n  const cleaned = stripComments(input);\n  const { format, diagramType } = detect(cleaned);\n\n  const module = getModule(diagramType);\n  if (!module) {\n    return err('UNKNOWN_DIAGRAM', `No module registered for diagram type: ${diagramType}`);\n  }\n\n  try {\n    const ir: BaseIR = format === 'yaml'\n      ? module.parseYaml(cleaned)\n      : module.parseMermaid(cleaned);\n\n    // Build theme: forced preset \u2192 metadata preset \u2192 global input \u2192 module defaults \u2192 per-IR override\n    const themeName = typeof ir.metadata?.theme === 'string' ? ir.metadata.theme : undefined;\n    const base = resolveTheme(themeInput ?? {}, getThemePreset(forcedThemeName ?? themeName));\n    const withModuleDefaults = module.defaultThemeOverride\n      ? resolveTheme(module.defaultThemeOverride, base)\n      : base;\n    const finalTheme = ir.themeOverride\n      ? resolveTheme(ir.themeOverride, withModuleDefaults)\n      : withModuleDefaults;\n\n    const result = module.layout(ir, finalTheme);\n    return ok(result);\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('PARSE_ERROR', message, cause);\n  }\n}\n\n/**\n * Render input text to an output string (default: SVG) \u2014 synchronous.\n *\n * This is the canonical render path; the async `render()` is a thin wrapper.\n * Returns a Result \u2014 never throws.\n * Pass rendererName to use a non-default registered renderer.\n */\nexport function renderSync(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n): Result<string> {\n  const compileResult = compileSync(input, themeInput, forcedThemeName);\n  if (!compileResult.ok) return compileResult;\n\n  const renderer = getRenderer<string>(rendererName);\n  if (!renderer) {\n    return err('UNKNOWN_RENDERER', `No renderer registered: ${rendererName}`);\n  }\n\n  try {\n    return ok(renderer.render(compileResult.value.scene));\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('LAYOUT_ERROR', message, cause);\n  }\n}\n\n/**\n * Compile and render input text to SVG with an embedded anchor manifest.\n *\n * Identical parameter list to {@link renderSync}. Returns both the SVG string\n * (with the anchor manifest embedded as an inert `<script type=\"application/json\">`\n * element) and the raw anchor registry for callers that need programmatic access.\n *\n * Use this in interactive contexts (e.g. VS Code preview) where node-reference\n * discovery is desired. For plain SVG output (golden tests, markdown preview)\n * use {@link renderSync} \u2014 it is intentionally kept anchor-manifest-free.\n *\n * Returns a Result \u2014 never throws.\n */\nexport function compileAndRenderSync(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n): Result<{ svg: string; anchors: NodeAnchorRegistry }> {\n  const compileResult = compileSync(input, themeInput, forcedThemeName);\n  if (!compileResult.ok) return compileResult;\n\n  const renderer = getRenderer<string>(rendererName);\n  if (!renderer) {\n    return err('UNKNOWN_RENDERER', `No renderer registered: ${rendererName}`);\n  }\n\n  try {\n    const { scene, anchors } = compileResult.value;\n    const svg = renderer.render(scene);\n    return ok({ svg, anchors });\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('LAYOUT_ERROR', message, cause);\n  }\n}\n\n/**\n * Compile input text to a LayoutResult (Scene + anchor registry).\n *\n * Async wrapper over {@link compileSync} \u2014 the signature and behavior are\n * unchanged for existing callers. Theme resolution order (later overrides\n * earlier):\n *   defaultTheme \u2190 themeInput \u2190 module.defaultThemeOverride \u2190 ir.themeOverride\n *\n * Returns a Result \u2014 never throws.\n */\nexport async function compile(\n  input: string,\n  themeInput?: ThemeInput,\n  forcedThemeName?: string,\n): Promise<Result<LayoutResult>> {\n  return compileSync(input, themeInput, forcedThemeName);\n}\n\n/**\n * Render input text to an output string (default: SVG).\n *\n * Async wrapper over {@link renderSync} \u2014 the signature and behavior are\n * unchanged for existing callers.\n *\n * Returns a Result \u2014 never throws.\n * Pass rendererName to use a non-default registered renderer.\n */\nexport async function render(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n): Promise<Result<string>> {\n  return renderSync(input, themeInput, rendererName, forcedThemeName);\n}\n\n// \u2500\u2500\u2500 Theme validation (re-exported for npm consumers) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport { validateThemeInput, isBuiltinThemeName } from '../theme/validate.js';\n", "/**\n * SVG \u2192 vector PDF, pure-JS (pdfkit + svg-to-pdfkit). No system binaries.\n *\n * Triton's renderer emits an SVG string (see ../../src/render/svg.ts). LaTeX's\n * `\\includegraphics` cannot ingest SVG, so this module converts that SVG into a\n * single-page vector PDF whose page box is sized to the diagram's viewBox.\n *\n * Why these libraries:\n *   - `pdfkit` writes real vector PDF content streams (paths, text, fills) and\n *     embeds the base-14 fonts (Helvetica/Times/Courier) with NO external font\n *     file \u2014 so Triton text becomes selectable, scalable vector text with no\n *     font-drift between dev / CI / Overleaf.\n *   - `svg-to-pdfkit` walks the SVG DOM and replays it onto a pdfkit document:\n *     rects, circles, paths (incl. the `d=` data Triton emits), `<text>` with\n *     `text-anchor`, and `<marker>` arrowheads referenced via `marker-end`.\n *\n * SMIL animations (`<animate>`, `<animateMotion>`) are intentionally dropped \u2014\n * a PDF is static; the first frame is the correct print representation.\n */\n\n// pdfkit / svg-to-pdfkit are CJS and kept EXTERNAL by esbuild (real node_modules).\nimport PDFDocument from 'pdfkit';\nimport SVGtoPDF from 'svg-to-pdfkit';\n\nexport interface PdfOptions {\n  /** Uniform scale applied to the PDF page box (1 = SVG units \u2192 PDF points). */\n  readonly scale?: number;\n}\n\n/** Extract the intrinsic pixel size of a Triton SVG from width/height or viewBox. */\nexport function svgSize(svg: string): { width: number; height: number } {\n  const w = /\\bwidth=\"([\\d.]+)\"/.exec(svg);\n  const h = /\\bheight=\"([\\d.]+)\"/.exec(svg);\n  if (w && h) return { width: Number(w[1]), height: Number(h[1]) };\n\n  const vb = /viewBox=\"([\\d.\\s-]+)\"/.exec(svg);\n  if (vb) {\n    const parts = vb[1].trim().split(/[\\s,]+/).map(Number);\n    if (parts.length === 4) return { width: parts[2], height: parts[3] };\n  }\n  // Sensible fallback \u2014 keeps the converter from throwing on odd input.\n  return { width: 800, height: 600 };\n}\n\n/**\n * Convert a Triton SVG string to a vector PDF buffer.\n *\n * The PDF page is sized to (width \u00D7 scale) by (height \u00D7 scale) POINTS, with zero\n * margin, so the diagram fills the page edge-to-edge. `\\includegraphics` then\n * scales the whole page to the requested LaTeX width.\n */\nexport function svgToPdf(svg: string, opts: PdfOptions = {}): Promise<Buffer> {\n  const scale = opts.scale ?? 1;\n  const { width, height } = svgSize(svg);\n  const pageW = Math.max(1, width * scale);\n  const pageH = Math.max(1, height * scale);\n\n  return new Promise<Buffer>((resolvePromise, reject) => {\n    try {\n      const doc = new PDFDocument({\n        size: [pageW, pageH],\n        margin: 0,\n        // Compress the content stream \u2014 keeps committed PDFs small for Overleaf.\n        compress: true,\n      });\n\n      const chunks: Buffer[] = [];\n      doc.on('data', (c: Buffer) => chunks.push(c));\n      doc.on('end', () => resolvePromise(Buffer.concat(chunks)));\n      doc.on('error', reject);\n\n      SVGtoPDF(doc, svg, 0, 0, {\n        width: pageW,\n        height: pageH,\n        // Triton emits unit-less user coordinates that map 1:1 to points.\n        assumePt: true,\n        // Triton never relies on external CSS \u2014 attributes carry all style.\n        useCSS: false,\n      });\n\n      doc.end();\n    } catch (cause) {\n      reject(cause instanceof Error ? cause : new Error(String(cause)));\n    }\n  });\n}\n"],
  "mappings": "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",
  "names": ["module", "registry", "registry", "points", "path", "edges", "cp1p", "cp2p", "cp1n", "cp2n", "lines", "overlays", "opts", "toRect", "edges", "BLACK", "stack", "queue", "h", "start", "end", "span", "bow", "c1", "c2", "expected", "found", "lines", "text", "offset", "location", "h", "f", "wrapText", "lines", "wrapText", "leftOrd", "p", "sections", "lines", "wrapText", "wrapText", "slugify", "overlays", "reset", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "text", "offset", "location", "peg$parse", "dx", "dy", "len", "links", "h", "links", "ARROW_ID", "cells", "x", "ARROW_ID", "cells", "links", "elements", "module", "h", "cells", "slugify", "reset", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "block", "text", "location", "offset", "peg$parse", "cells", "module", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "location", "text", "offset", "peg$parse", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "range", "location", "text", "offset", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "location", "text", "offset", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "location", "text", "offset", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "sections", "location", "text", "offset", "peg$parse", "sections", "flat", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "sections", "location", "text", "offset", "peg$parse", "lines", "wrapText", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "text", "location", "offset", "peg$parse", "ARROW_ID", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "text", "location", "offset", "peg$parse", "assignLayers", "edges", "stack", "tree", "minimizeCrossings", "find", "toRect", "h", "edges", "wallPoint", "b", "labelAnchor", "a", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "ARROW_ID", "edges", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "h", "edges", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "ARROW_ID", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "edges", "location", "text", "offset", "peg$parse", "ARROW_ID", "lines", "f", "wrapText", "h", "edges", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "location", "text", "offset", "peg$parse", "totalH", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "links", "location", "text", "offset", "peg$parse", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "lines", "stack", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "location", "text", "offset", "peg$parse", "ARROW_ID", "NODE_W", "wrapText", "h", "edges", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "ARROW_ID", "edges", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "edges", "location", "text", "offset", "peg$parse", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "location", "text", "offset", "peg$parse", "queue", "maxDepth", "cursor", "fill", "scene", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "lines", "stack", "k", "rotateLeft", "h", "rotateRight", "insert", "insert", "heap", "parse", "ARROW_ID", "parse", "f", "h", "ARROW_ID", "parse", "ARROW_ID", "pen", "cells", "stack", "s", "boundsForElements", "translateElements", "translateAnchors", "boundsForElement", "boundsForPath", "boundsForText", "translateElement", "translateRect", "translatePathD", "parse", "cells", "parse", "cells", "f", "parse", "cells", "parse", "parseHex", "toHex", "mixHex", "parse", "cells", "ARROW_ID", "parse", "ARROW_ID", "parse", "newNode", "insert", "parse", "edges", "ARROW_ID", "pen", "parse", "edges", "n", "lines", "module", "h", "opts", "PDFDocument", "SVGtoPDF", "f"]
}
