SLOPSHOPPER

gfm-render

GitHub Flavored Markdown in the transcript: alerts (> [!NOTE]), task lists, strikethrough and Mermaid diagrams

newrowsprocess
★ 12v0.1.0MITupdated 2026-10-05briangtn/claude-gfm-render
A shopper browsing a rack in a slop shop
README

<img src="docs/hero.png" alt="claude-gfm-render: GitHub Flavored Markdown in Claude Code" width="100%">

reach validates

claude-gfm-render

Alerts, task lists, strikethrough and Mermaid diagrams, drawn inside Claude Code's replies.

Claude Code Mod Tests License: MIT

Install · Before / after · What it handles · How it works


Claude writes GitHub Flavored Markdown all day: > [!WARNING] callouts, - [ ] checklists, `mermaid diagrams. The terminal shows them as raw text. This mod draws them, without touching the message itself (ctrl+o still shows the original).

Install

git clone https://github.com/briangtn/claude-gfm-render.git ~/perso/claude-gfm-render
claude --plugin-dir ~/perso/claude-gfm-render

To load it in every session, terminal and desktop app alike, add it to ~/.claude/settings.json:

{
  "env": {
    "CLAUDE_CODE_PLUGIN_DIRS": "~/perso/claude-gfm-render"
  }
}

[!NOTE] Mods (function hooks) are an early-access API of Claude Code and may change between releases. Built and tested on Claude Code 2.1.286 and 2.1.287. No build step: the mod is plain files, and the folder is watched, so an edit reloads it in the running session.

Claude writes GFM on its own

Drawing GFM is half the job: Claude also has to write it. The mod ships GFM.md, a short note on what the transcript can draw (alerts, task lists, strikethrough, the Mermaid types that render), which a SessionStart hook adds to Claude's context at startup, after /clear and after a compaction. No CLAUDE.md to edit.

To turn it off and keep only the rendering, in ~/.claude/settings.json:

{
  "pluginConfigs": {
    "gfm-render": { "options": { "promptHint": false } }
  }
}

Before / after

Real claude sessions (100 columns, captured with tmux); before is the same reply without the mod.

<table> <tr> <th width="50%">Before</th> <th width="50%">With claude-gfm-render</th> </tr> <tr> <td><img src="docs/screenshots/native-alerts.png" alt="Alerts as raw blockquotes"></td> <td><img src="docs/screenshots/terminal-alerts.png" alt="Alerts drawn as colored boxes"></td> </tr> <tr> <td><img src="docs/screenshots/native-tasks.png" alt="Task list as raw brackets"></td> <td><img src="docs/screenshots/terminal-tasks.png" alt="Task list with checkboxes and strikethrough"></td> </tr> <tr> <td><img src="docs/screenshots/native-flow.png" alt="Mermaid as a code block"></td> <td><img src="docs/screenshots/terminal-flow.png" alt="Mermaid flowchart drawn in Unicode"></td> </tr> </table>

<img src="docs/screenshots/terminal-sequence.png" alt="Mermaid sequence diagram drawn in Unicode">

On desktop, VS Code and mobile

Alerts get a little more room, captured in the Claude desktop app (dark theme):

<img src="docs/screenshots/desktop-alerts-dark.png" alt="Alerts in the Claude desktop app">

Mermaid becomes a real SVG that follows the light or dark scheme. Below, the mod's own output rendered by Chrome (not a capture of the app):

<img alt="Flowchart SVG" src="docs/screenshots/desktop-flow-light.png">

LightDark
Sequence SVG, lightSequence SVG, dark

What it handles

MarkdownTerminalDesktop · VS Code · mobile
💬Alerts > [!NOTE] [!TIP] [!IMPORTANT] [!WARNING] [!CAUTION], any markdown inside✅ colored box✅ colored box
☑️Task lists - [ ] / - [x] (also *, +, 1.)✅ ☐ / ☑➖ native
SStrikethrough text✅➖ native
🔀Mermaid flowchart / graph✅ Unicode art✅ SVG
🧭Mermaid sequence, state, class, ER, xychart✅ Unicode art✅ SVG
🔒Code fences and inline codenever rewrittennever rewritten
📝Everything else (headings, tables, links, emphasis…)nativenative
CaseWhat you get
Mermaid gantt, pie, mindmap, gitGraph, journey, timeline, quadrantChart, sankey, C4…the code block, as written
Mermaid with a syntax error, or wider than the terminal even with tighter spacingthe code block
Mermaid on desktop without node on the session's PATHthe Unicode art in a code block
Single-line Mermaid (graph TD; A-->B)may fail to parse: write one statement per line
An alert nested in a list item or in another blockquote (> > [!NOTE])a plain blockquote
A reply still streaming inthe native rendering until the alert or the closing ` arrives
A single reply block over 10,000 charactersthe native rendering of that block
Footnotes, emoji shortcodes, #123 / @user autolinks, $math$, raw HTMLleft to the native renderer
Your own messages and tool outputuntouched: only Claude's replies are drawn

Known glitch: in the terminal, an edge label leaving a {decision} node can show a stray ├ (beautiful-mermaid's ASCII layout, visible in the flowchart above).

How it works

The mod hooks ui.render on AssistantMessage: every text block of a reply goes through it, gets split into markdown, alert and Mermaid segments, and comes back as a tree the surface draws. A block with nothing to draw goes to the native renderer untouched.

graph LR
  A[Reply block] --> B{GFM inside?}
  B -->|no| N[Native renderer]
  B -->|alert| C[Colored box]
  B -->|mermaid| D{Surface}
  D -->|terminal| E[Unicode art, in process]
  D -->|desktop| F[SVG via node]

Mermaid is rendered by beautiful-mermaid, split in two because a hooks module may not import a file over 1 MiB and has no eval, while the ELK layout engine the SVG needs weighs 1.6 MB:

  • Terminal: hooks/vendor/mermaid-ascii.js, the ASCII renderer alone (84 KB), imported by the mod.
  • Desktop / VS Code / mobile: renderer/svg.mjs run by node, once per diagram, then cached.

Develop

npm test                # claude plugin test .
npm run validate        # claude plugin validate .
npm run build:vendor    # rebuild both Mermaid bundles with bun
FileRole
hooks/register.tsxthe ui.render hook and the SVG process call
hooks/gfm.tssplits a reply into blocks; task-list and strikethrough rewrites
hooks/mermaid.tsUnicode art sized to the terminal, SVG theming
hooks/gfm.test.tsxtests, run on every surface
renderer/svg.mjsMermaid on stdin, SVG on stdout
GFM.mdwhat Claude is told it can write, loaded by the SessionStart hook in hooks/hooks.json

Issues and PRs welcome, especially screenshots from other terminals and the desktop app's light theme.

License

MIT. Vendored bundles keep their own licenses: beautiful-mermaid (MIT) and elkjs (EPL-2.0), in renderer/.

Source 5 files
hooks/register.tsx 154 lines
1import { atom, memberOf, read, update } from 'claude-code'
2import type { EngineInterface, Register } from 'claude-code'
3
4import { ALERTS, rewriteInline, splitBlocks } from './gfm'
5import type { Segment } from './gfm'
6import { mermaidArt, remember, themeSvg } from './mermaid'
7
8// What a Markdown element takes at most.
9const MAX_MARKDOWN = 10000
10
11const svgs = new Map<string, Promise<string | undefined>>()
12
13/** Whether each diagram shows its source instead of its drawing, by message and position. */
14const showCode = atom({ plugin: 'gfm-render', key: 'showCode' } as const, false)
15
16/** The diagram as an SVG, rendered once per source by node running renderer/svg.mjs. */
17function mermaidSvg($: EngineInterface, source: string): Promise<string | undefined> {
18  return remember(svgs, source, async () => {
19    try {
20      const { exitCode, stdout } = await $.process.run(['node', `${$.plugin.root}/renderer/svg.mjs`], {
21        stdin: source,
22        timeoutMs: 10000,
23      })
24      return exitCode === 0 ? themeSvg(stdout) : undefined
25    } catch {
26      return undefined
27    }
28  })
29}
30
31export const register: Register = on => {
32  on('ui.render', { component: 'AssistantMessage' }, async ($, e, next) => {
33    // The desktop, VS Code and mobile renderers already draw task lists and
34    // strikethrough; the terminal's may not, so only it gets the rewrite.
35    const text = e.surface === 'terminal' ? rewriteInline(e.props.text) : e.props.text
36    const segments = splitBlocks(text)
37
38    if (!segments.some(s => s.kind !== 'markdown') || segments.some(s => s.text.length > MAX_MARKDOWN)) {
39      return text === e.props.text ? next(e) : next({ ...e, props: { ...e.props, text } })
40    }
41
42    const { Box, Text, Markdown } = $.ui.resolve(e)
43    // Room left beside the terminal's bullet and the alert border.
44    const columns = (e.viewport?.columns ?? 80) - 4
45
46    // Rendered before drawing: an SVG takes a node process (cached per source).
47    const svgs = new Map<number, string | undefined>()
48    const codes = new Map<number, boolean>()
49    if (e.surface !== 'terminal') {
50      await Promise.all(
51        segments.map(async (s, i) => {
52          if (s.kind === 'mermaid') {
53            svgs.set(i, await mermaidSvg($, s.text))
54            codes.set(i, await read($, memberOf(showCode, { requestId: `${e.requestId}:${i}` })))
55          }
56        }),
57      )
58    }
59
60    const diagram = (s: Extract<Segment, { kind: 'mermaid' }>, i: number) => {
61      const key = `mermaid-${i}`
62      if (e.surface === 'terminal') {
63        const art = mermaidArt(s.text, columns)
64        if (art === undefined) {
65          return <Markdown key={key} text={s.fence} />
66        }
67        return (
68          <Box key={key} flexDirection="column" marginTop={i === 0 ? 0 : 1} marginBottom={1}>
69            {art.split('\n').map((line, j) => (
70              <Text key={`${key}-${j}`} wrap="truncate-end">
71                {line === '' ? ' ' : line}
72              </Text>
73            ))}
74          </Box>
75        )
76      }
77      const svg = svgs.get(i)
78      if (svg === undefined) {
79        // No node to draw the SVG: the text art in a code block, which scrolls.
80        const art = mermaidArt(s.text, 200)
81        return <Markdown key={key} text={art === undefined ? s.fence : `\`\`\`\n${art}\n\`\`\``} />
82      }
83      const { Svg, Code, Button } = $.ui.resolve(e)
84      const isCode = codes.get(i) === true
85      return (
86        <Box key={key} flexDirection="column" marginTop={i === 0 ? 0 : 1} marginBottom={1}>
87          <Box justifyContent="flex-end">
88            <Button
89              key={`${key}-toggle`}
90              label={isCode ? 'Diagramme' : 'Code'}
91              dimColor
92              onPress={() => update($, memberOf(showCode, { requestId: `${e.requestId}:${i}` }), shown => !shown)}
93            />
94          </Box>
95          {isCode ? (
96            <Code source={s.text} language="mermaid" />
97          ) : (
98            // A row sizes the SVG to its own width; the column would stretch it.
99            <Box>
100              <Svg source={svg} alt="Diagramme Mermaid" />
101            </Box>
102          )}
103        </Box>
104      )
105    }
106
107    const body = (
108      <Box flexDirection="column" flexGrow={1} flexShrink={1}>
109        {segments.map((s, i) => {
110          if (s.kind === 'markdown') {
111            return <Markdown key={`md-${i}`} text={s.text} />
112          }
113          if (s.kind === 'mermaid') {
114            return diagram(s, i)
115          }
116          const alert = ALERTS[s.type]
117          return (
118            <Box
119              key={`alert-${i}`}
120              flexDirection="column"
121              borderStyle="round"
122              borderColor={alert.color}
123              paddingX={1}
124              // The desktop's proportional text packs boxes tighter than the
125              // terminal's cells, so it gets room around and inside each one.
126              marginY={e.surface === 'terminal' ? 0 : 1}
127              paddingY={e.surface === 'terminal' ? 0 : 1}
128            >
129              <Text bold color={alert.color}>
130                {`${alert.icon} ${alert.label}`}
131              </Text>
132              {s.text.trim() !== '' && <Markdown text={s.text} />}
133            </Box>
134          )
135        })}
136      </Box>
137    )
138
139    // The terminal opens a reply with a bullet; keep it, since this tree
140    // replaces the engine's whole drawing of the block.
141    if (e.surface === 'terminal' && e.props.isFirstOfReply) {
142      return (
143        <Box flexDirection="row">
144          <Box width={2} flexShrink={0}>
145            <Text>⏺</Text>
146          </Box>
147          {body}
148        </Box>
149      )
150    }
151    return body
152  })
153}
154
hooks/gfm.ts 134 lines
1// Pure GFM helpers: split a reply into markdown, alert and mermaid blocks,
2// and rewrite the GFM bits a renderer may not draw (task lists, ~~strike~~).
3
4export type AlertType = 'NOTE' | 'TIP' | 'IMPORTANT' | 'WARNING' | 'CAUTION'
5
6export type Segment =
7  | { kind: 'markdown'; text: string }
8  | { kind: 'alert'; type: AlertType; text: string }
9  | { kind: 'mermaid'; text: string; fence: string }
10
11export const ALERTS: Record<AlertType, { label: string; icon: string; color: string }> = {
12  NOTE: { label: 'Note', icon: 'ℹ', color: '#4493f8' },
13  TIP: { label: 'Tip', icon: '✦', color: '#3fb950' },
14  IMPORTANT: { label: 'Important', icon: '‼', color: '#ab7df8' },
15  WARNING: { label: 'Warning', icon: '▲', color: '#d29922' },
16  CAUTION: { label: 'Caution', icon: '✖', color: '#f85149' },
17}
18
19const FENCE = /^\s{0,3}(`{3,}|~{3,})\s*(\S*)/
20const ALERT_START = /^\s{0,3}>\s?\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*$/i
21const QUOTED = /^\s{0,3}>/
22const UNQUOTE = /^\s{0,3}>\s?/
23
24function closes(line: string, fence: string): boolean {
25  const m = line.match(FENCE)
26  return m !== null && m[2] === '' && m[1][0] === fence[0] && m[1].length >= fence.length
27}
28
29/**
30 * Splits `text` into markdown, alert and closed ```mermaid segments; an alert
31 * is never looked for inside a code fence, and a fence still open (a reply
32 * streaming in) stays markdown.
33 */
34export function splitBlocks(text: string): Segment[] {
35  const segments: Segment[] = []
36  const lines = text.split('\n')
37  let plain: string[] = []
38  let fence: string | null = null
39
40  const flush = () => {
41    if (plain.join('\n').trim() !== '') {
42      segments.push({ kind: 'markdown', text: plain.join('\n') })
43    }
44    plain = []
45  }
46
47  for (let i = 0; i < lines.length; i++) {
48    const line = lines[i]
49    const fenceMatch = line.match(FENCE)
50
51    if (fence !== null) {
52      if (closes(line, fence)) {
53        fence = null
54      }
55      plain.push(line)
56      continue
57    }
58    if (fenceMatch && fenceMatch[2].toLowerCase() === 'mermaid') {
59      const end = lines.findIndex((l, j) => j > i && closes(l, fenceMatch[1]))
60      if (end !== -1) {
61        flush()
62        segments.push({
63          kind: 'mermaid',
64          text: lines.slice(i + 1, end).join('\n'),
65          fence: lines.slice(i, end + 1).join('\n'),
66        })
67        i = end
68        continue
69      }
70    }
71    if (fenceMatch) {
72      fence = fenceMatch[1]
73      plain.push(line)
74      continue
75    }
76
77    const alert = line.match(ALERT_START)
78    if (!alert) {
79      plain.push(line)
80      continue
81    }
82
83    const body: string[] = []
84    while (i + 1 < lines.length && QUOTED.test(lines[i + 1])) {
85      body.push(lines[++i].replace(UNQUOTE, ''))
86    }
87    flush()
88    segments.push({ kind: 'alert', type: alert[1].toUpperCase() as AlertType, text: body.join('\n') })
89  }
90  flush()
91
92  return segments
93}
94
95const TASK = /^(\s*(?:[-*+]|\d+[.)])\s+)\[([ xX])\](?=\s)/
96const STRIKE = /~~(?=\S)([^~\n]*?\S)~~/g
97const CODE_SPAN = /(`+)[^`]*?\1/g
98
99/** Draws a strike through each character with U+0336, for renderers without `del`. */
100function strike(text: string): string {
101  return Array.from(text).map(c => c + '̶').join('')
102}
103
104/** Rewrites task-list boxes as ☐/☑ and ~~text~~ as struck text, outside code. */
105export function rewriteInline(text: string): string {
106  let fence: string | null = null
107
108  return text
109    .split('\n')
110    .map(line => {
111      const fenceMatch = line.match(FENCE)
112      if (fence !== null) {
113        if (closes(line, fence)) {
114          fence = null
115        }
116        return line
117      }
118      if (fenceMatch) {
119        fence = fenceMatch[1]
120        return line
121      }
122
123      const tasked = line.replace(TASK, (_, lead: string, mark: string) => `${lead}${mark === ' ' ? '☐' : '☑'}`)
124      let out = ''
125      let last = 0
126      for (const m of tasked.matchAll(CODE_SPAN)) {
127        out += tasked.slice(last, m.index).replace(STRIKE, (_, inner: string) => strike(inner)) + m[0]
128        last = m.index! + m[0].length
129      }
130      return out + tasked.slice(last).replace(STRIKE, (_, inner: string) => strike(inner))
131    })
132    .join('\n')
133}
134
hooks/mermaid.ts 60 lines
1// Mermaid source to Unicode art (in process, vendored beautiful-mermaid ASCII
2// renderer) or to SVG (node running renderer/svg.mjs, since ELK's layout is
3// over the size a hooks module may import); undefined when it cannot draw.
4
5import { renderMermaidASCII } from './vendor/mermaid-ascii.js'
6
7// What a Svg element takes at most.
8const MAX_SVG = 131072
9
10// Light and dark backgrounds of the desktop transcript, so node fills blend in.
11const THEME = `<style>
12  svg { --bg: #FFFFFF; --fg: #27272A; }
13  @media (prefers-color-scheme: dark) { svg { --bg: #1F1F1E; --fg: #E4E4E7; } }
14</style>`
15
16const arts = new Map<string, string | undefined>()
17
18export function remember<T>(cache: Map<string, T>, key: string, make: () => T): T {
19  if (!cache.has(key)) {
20    if (cache.size > 100) {
21      cache.clear()
22    }
23    cache.set(key, make())
24  }
25  return cache.get(key)!
26}
27
28function width(art: string): number {
29  return Math.max(...art.split('\n').map(l => Array.from(l).length))
30}
31
32/** The diagram as text art at most `columns` wide, tightening the spacing to fit. */
33export function mermaidArt(source: string, columns: number): string | undefined {
34  for (const paddingX of [5, 3, 1]) {
35    const art = remember(arts, `${paddingX}:${source}`, () => {
36      try {
37        return renderMermaidASCII(source, { colorMode: 'none', paddingX }).replace(/\s+$/gm, '')
38      } catch {
39        return undefined
40      }
41    })
42    if (art === undefined) {
43      return undefined
44    }
45    if (width(art) <= columns) {
46      return art
47    }
48  }
49  return undefined
50}
51
52/** The SVG as drawn: no web font to fetch, colors that follow the light or dark scheme. */
53export function themeSvg(svg: string): string | undefined {
54  const themed = svg
55    .replace(/@import url\([^)]*\);?/, '')
56    .replace(/ style="--bg:[^"]*"/, '')
57    .replace(/^(<svg[^>]*>)/, `$1${THEME}`)
58  return themed.startsWith('<svg') && themed.length <= MAX_SVG ? themed : undefined
59}
60
hooks/vendor/mermaid-ascii.js 14 lines
1// beautiful-mermaid 1.1.3 ASCII renderer (MIT, lukilabs/Craft), bundled with bun build --minify.
2function FQ(Q){return(Q.startsWith('"')&&Q.endsWith('"')?Q.slice(1,-1):Q).replace(/<br\s*\/?>/gi,`
3`).replace(/\\n/g,`
4`).replace(/<\/?(?:sub|sup|small|mark)\s*>/gi,"").replace(/\*\*(.+?)\*\*/g,"<b>$1</b>").replace(/(?<!\*)\*([^\s*](?:[^*]*[^\s*])?)\*(?!\*)/g,"<i>$1</i>").replace(/~~(.+?)~~/g,"<s>$1</s>")}function A4(Q){let $=Q.split(`
5`).map((V)=>V.trim()).filter((V)=>V.length>0&&!V.startsWith("%%"));if($.length===0)throw new Error("Empty mermaid diagram");let Z=$[0];if(/^stateDiagram(-v2)?\s*$/i.test(Z))return d8($);return l8($)}function l8(Q){let $=Q[0].match(/^(?:graph|flowchart)\s+(TD|TB|LR|BT|RL)\s*$/i);if(!$)throw new Error(`Invalid mermaid header: "${Q[0]}". Expected "graph TD", "flowchart LR", "stateDiagram-v2", etc.`);let V={direction:$[1].toUpperCase(),nodes:new Map,edges:[],subgraphs:[],classDefs:new Map,classAssignments:new Map,nodeStyles:new Map,linkStyles:new Map},_=[];for(let K=1;K<Q.length;K++){let J=Q[K],G=J.match(/^classDef\s+(\w+)\s+(.+)$/);if(G){let O=G[1],B=G[2],W=tQ(B);V.classDefs.set(O,W);continue}let j=J.match(/^class\s+([\w,-]+)\s+(\w+)$/);if(j){let O=j[1].split(",").map((W)=>W.trim()),B=j[2];for(let W of O)V.classAssignments.set(W,B);continue}let F=J.match(/^style\s+([\w,-]+)\s+(.+)$/);if(F){let O=F[1].split(",").map((W)=>W.trim()),B=tQ(F[2]);for(let W of O)V.nodeStyles.set(W,{...V.nodeStyles.get(W),...B});continue}let z=J.match(/^linkStyle\s+(default|[\d,\s]+)\s+(.+)$/);if(z){let O=z[1].trim(),B=tQ(z[2]);if(O==="default")V.linkStyles.set("default",{...V.linkStyles.get("default"),...B});else{let W=O.split(",").map((H)=>parseInt(H.trim(),10));for(let H of W)if(!isNaN(H))V.linkStyles.set(H,{...V.linkStyles.get(H),...B})}continue}let U=J.match(/^direction\s+(TD|TB|LR|BT|RL)\s*$/i);if(U&&_.length>0){_[_.length-1].direction=U[1].toUpperCase();continue}let N=J.match(/^subgraph\s+(.+)$/);if(N){let O=N[1].trim(),B=O.match(/^([\w-]+)\s*\[(.+)\]$/),W,H;if(B)W=B[1],H=FQ(B[2]);else H=FQ(O),W=O.replace(/\s+/g,"_").replace(/[^\w]/g,"");let A={id:W,label:H,nodeIds:[],children:[]};_.push(A);continue}if(J==="end"){let O=_.pop();if(O)if(_.length>0)_[_.length-1].children.push(O);else V.subgraphs.push(O);continue}r8(J,V,_)}return V}function d8(Q){let $={direction:"TD",nodes:new Map,edges:[],subgraphs:[],classDefs:new Map,classAssignments:new Map,nodeStyles:new Map,linkStyles:new Map},Z=[],V=new Set,_=0,K=0;for(let J=1;J<Q.length;J++){let G=Q[J],j=G.match(/^direction\s+(TD|TB|LR|BT|RL)\s*$/i);if(j){if(Z.length>0)Z[Z.length-1].direction=j[1].toUpperCase();else $.direction=j[1].toUpperCase();continue}let F=G.match(/^linkStyle\s+(default|[\d,\s]+)\s+(.+)$/);if(F){let B=F[1].trim(),W=tQ(F[2]);if(B==="default")$.linkStyles.set("default",{...$.linkStyles.get("default"),...W});else{let H=B.split(",").map((A)=>parseInt(A.trim(),10));for(let A of H)if(!isNaN(A))$.linkStyles.set(A,{...$.linkStyles.get(A),...W})}continue}let z=G.match(/^state\s+(?:"([^"]+)"\s+as\s+)?([\w\p{L}]+)\s*\{$/u);if(z){let B=z[1]??z[2],W=z[2],H={id:W,label:B,nodeIds:[],children:[]};Z.push(H),V.add(W),$.nodes.delete(W);continue}if(G==="}"){let B=Z.pop();if(B)if(Z.length>0)Z[Z.length-1].children.push(B);else $.subgraphs.push(B);continue}let U=G.match(/^state\s+"([^"]+)"\s+as\s+([\w\p{L}]+)\s*$/u);if(U){let B=FQ(U[1]),W=U[2];dQ($,Z,{id:W,label:B,shape:"rounded"});continue}let N=G.match(/^(\[\*\]|[\w\p{L}-]+)\s*(-->)\s*(\[\*\]|[\w\p{L}-]+)(?:\s*:\s*(.+))?$/u);if(N){let B=N[1],W=N[3],H=N[4]?.trim(),A=H?FQ(H):void 0;if(B==="[*]")_++,B=`_start${_>1?_:""}`,dQ($,Z,{id:B,label:"",shape:"state-start"});else if(!V.has(B))I4($,Z,B);if(W==="[*]")K++,W=`_end${K>1?K:""}`,dQ($,Z,{id:W,label:"",shape:"state-end"});else if(!V.has(W))I4($,Z,W);$.edges.push({source:B,target:W,label:A,style:"solid",hasArrowStart:!1,hasArrowEnd:!0});continue}let O=G.match(/^([\w\p{L}-]+)\s*:\s*(.+)$/u);if(O){let B=O[1],W=FQ(O[2].trim());dQ($,Z,{id:B,label:W,shape:"rounded"});continue}}return $}function dQ(Q,$,Z){if(!Q.nodes.has(Z.id))Q.nodes.set(Z.id,Z);if($.length>0){let _=$[$.length-1];if(!_.nodeIds.includes(Z.id))_.nodeIds.push(Z.id)}}function I4(Q,$,Z){if(!Q.nodes.has(Z))dQ(Q,$,{id:Z,label:Z,shape:"rounded"});else if($.length>0){let V=$[$.length-1];if(!V.nodeIds.includes(Z))V.nodeIds.push(Z)}}function tQ(Q){let $=Q.replace(/;\s*$/,""),Z={};for(let V of $.split(",")){let _=V.indexOf(":");if(_>0){let K=V.slice(0,_).trim(),J=V.slice(_+1).trim();if(K&&J)Z[K]=J}}return Z}var n8=/^(<)?(-->|-.->|==>|---|-\.-|===)(?:\|([^|]*)\|)?/,s8=/^(<)?(--|-\.|==)\s+(.+?)\s+(-->|---|\.\->|-\.\-|==>|===)/,i8=[{regex:/^([\w-]+)\(\(\((.+?)\)\)\)/,shape:"doublecircle"},{regex:/^([\w-]+)\(\[(.+?)\]\)/,shape:"stadium"},{regex:/^([\w-]+)\(\((.+?)\)\)/,shape:"circle"},{regex:/^([\w-]+)\[\[(.+?)\]\]/,shape:"subroutine"},{regex:/^([\w-]+)\[\((.+?)\)\]/,shape:"cylinder"},{regex:/^([\w-]+)\[\/(.+?)\\\]/,shape:"trapezoid"},{regex:/^([\w-]+)\[\\(.+?)\/\]/,shape:"trapezoid-alt"},{regex:/^([\w-]+)>(.+?)\]/,shape:"asymmetric"},{regex:/^([\w-]+)\{\{(.+?)\}\}/,shape:"hexagon"},{regex:/^([\w-]+)\[(.+?)\]/,shape:"rectangle"},{regex:/^([\w-]+)\((.+?)\)/,shape:"rounded"},{regex:/^([\w-]+)\{(.+?)\}/,shape:"diamond"}],o8=/^([\w-]+)/,t8=/^:::([\w][\w-]*)/;function r8(Q,$,Z){let V=Q.trim(),_=T4(V,$,Z);if(!_||_.ids.length===0)return;V=_.remaining.trim();let K=_.ids;while(V.length>0){let J,G,j,F,z=V.match(n8);if(z){J=Boolean(z[1]);let N=z[2],O=z[3]?.trim();F=O?FQ(O):void 0,V=V.slice(z[0].length).trim(),G=e8(N),j=N.endsWith(">")}else{let N=V.match(s8);if(!N)break;J=Boolean(N[1]);let O=N[3].trim();F=O?FQ(O):void 0;let B=N[2],W=N[4];V=V.slice(N[0].length).trim(),G=Q9(B,W),j=W.endsWith(">")}let U=T4(V,$,Z);if(!U||U.ids.length===0)break;V=U.remaining.trim();for(let N of K)for(let O of U.ids)$.edges.push({source:N,target:O,label:F,style:G,hasArrowStart:J,hasArrowEnd:j});K=U.ids}}function T4(Q,$,Z){let V=k4(Q,$,Z);if(!V)return null;let _=[V.id],K=V.remaining.trim();while(K.startsWith("&")){K=K.slice(1).trim();let J=k4(K,$,Z);if(!J)break;_.push(J.id),K=J.remaining.trim()}return{ids:_,remaining:K}}function k4(Q,$,Z){let V=null,_=Q;for(let{regex:J,shape:G}of i8){let j=Q.match(J);if(j){V=j[1];let F=FQ(j[2]);Y4($,Z,{id:V,label:F,shape:G}),_=Q.slice(j[0].length);break}}if(V===null){let J=Q.match(o8);if(J){if(V=J[1],!$.nodes.has(V))Y4($,Z,{id:V,label:V,shape:"rectangle"});_=Q.slice(J[0].length)}}if(V===null)return null;let K=_.match(t8);if(K)$.classAssignments.set(V,K[1]),_=_.slice(K[0].length);return{id:V,remaining:_}}function Y4(Q,$,Z){if(!Q.nodes.has(Z.id))Q.nodes.set(Z.id,Z);a8($,Z.id)}function a8(Q,$){if(Q.length>0){let Z=Q[Q.length-1];if(!Z.nodeIds.includes($))Z.nodeIds.push($)}}function e8(Q){if(Q==="-.->")return"dotted";if(Q==="-.-")return"dotted";if(Q==="==>")return"thick";if(Q==="===")return"thick";return"solid"}function Q9(Q,$){if(Q==="-."||$===".->"||$==="-.-")return"dotted";if(Q==="=="||$==="==>"||$==="===")return"thick";return"solid"}var c={x:1,y:0},u={x:1,y:2},l={x:0,y:1},p={x:2,y:1},TQ={x:2,y:0},IQ={x:0,y:0},EQ={x:2,y:2},kQ={x:0,y:2},SQ={x:1,y:1};function G4(Q,$){return Q.x===$.x&&Q.y===$.y}function rQ(Q,$){return Q.x===$.x&&Q.y===$.y}function nQ(Q,$){return{x:Q.x+$.x,y:Q.y+$.y}}function wQ(Q){return`${Q.x},${Q.y}`}var M4={name:"",styles:{}};var eQ={fg:"#27272a",border:"#a1a1aa",line:"#71717a",arrow:"#52525b",corner:"#71717a",junction:"#a1a1aa"};function X4(){let Q=globalThis.process;if(Q){if(!Q.stdout?.isTTY)return"none";let $=Q.env?.COLORTERM?.toLowerCase()??"",Z=Q.env?.TERM?.toLowerCase()??"";if($==="truecolor"||$==="24bit")return"truecolor";if(Z.includes("256color")||Z.includes("256"))return"ansi256";if(Z&&Z!=="dumb")return"ansi16";return"none"}if(typeof document!=="undefined")return"html";return"none"}function F4(Q){let $=Q.replace("#","");if($.length===3)return{r:parseInt($[0]+$[0],16),g:parseInt($[1]+$[1],16),b:parseInt($[2]+$[2],16)};return{r:parseInt($.substring(0,2),16),g:parseInt($.substring(2,4),16),b:parseInt($.substring(4,6),16)}}var Q4="\x1B[",aQ=`${Q4}0m`;function E4(Q){let{r:$,g:Z,b:V}=F4(Q);return`${Q4}38;2;${$};${Z};${V}m`}function $9(Q,$,Z){let V=(Q+$+Z)/3;if(Math.max(Math.abs(Q-V),Math.abs($-V),Math.abs(Z-V))<10){let F=Math.round(V/255*23);return 232+Math.min(23,Math.max(0,F))}let K=(F)=>{if(F<48)return 0;if(F<115)return 1;return Math.min(5,Math.floor((F-35)/40))},J=K(Q),G=K($),j=K(Z);return 16+36*J+6*G+j}function R4(Q){let{r:$,g:Z,b:V}=F4(Q),_=$9($,Z,V);return`${Q4}38;5;${_}m`}function D4(Q){let{r:$,g:Z,b:V}=F4(Q),_=0.299*$+0.587*Z+0.114*V,K=_>100?0:60,J;if($>180&&Z<100&&V<100)J=31;else if(Z>180&&$<100&&V<100)J=32;else if($>150&&Z>150&&V<100)J=33;else if(V>180&&$<100&&Z<100)J=34;else if($>150&&V>150&&Z<100)J=35;else if(Z>150&&V>150&&$<100)J=36;else if(_>200)J=37;else if(_<50)J=30;else J=37;return`${Q4}${J+K}m`}function L4(Q){return Q.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function S4(Q,$){return`<span style="color:${Q}">${L4($)}</span>`}function w4(Q,$){switch(Q){case"text":return $.fg;case"border":return $.border;case"line":return $.line;case"arrow":return $.arrow;case"corner":return $.corner??$.line;case"junction":return $.junction??$.border;default:return $.fg}}function j4(Q,$,Z){if(Z==="none")return"";let V=w4(Q,$);switch(Z){case"truecolor":return E4(V);case"ansi256":return R4(V);case"ansi16":return D4(V);default:return""}}function y4(Q,$,Z,V){if(V==="none")return Q.join("");if(V==="html")return Z9(Q,$,Z);let _="",K=null,J="";for(let G=0;G<Q.length;G++){let j=Q[G],F=$[G]??null;if(j===" "){if(J.length>0){if(K!==null)_+=j4(K,Z,V)+J+aQ;else _+=J;J="",K=null}_+=j;continue}if(F===K){J+=j;continue}if(J.length>0)if(K!==null)_+=j4(K,Z,V)+J+aQ;else _+=J;J=j,K=F}if(J.length>0&&K!==null)_+=j4(K,Z,V)+J+aQ;else if(J.length>0)_+=J;return _}function Z9(Q,$,Z){let V="",_=null,K="",J=()=>{if(K.length===0)return;if(_!==null)V+=S4(w4(_,Z),K);else V+=L4(K);K="",_=null};for(let G=0;G<Q.length;G++){let j=Q[G],F=$[G]??null;if(j===" "){J(),V+=" ";continue}if(F===_){K+=j;continue}J(),K=j,_=F}return J(),V}function $4(Q,$,Z){if(Z==="none"||Q.length===0)return Q;if(Z==="html")return S4($,Q);let V;switch(Z){case"truecolor":V=E4($);break;case"ansi256":V=R4($);break;case"ansi16":V=D4($);break;default:return Q}return`${V}${Q}${aQ}`}function _Q(Q,$){let Z=[];for(let V=0;V<=Q;V++){let _=[];for(let K=0;K<=$;K++)_.push(" ");Z.push(_)}return Z}function OQ(Q){let[$,Z]=sQ(Q);return _Q($,Z)}function CQ(Q,$){let Z=[];for(let V=0;V<=Q;V++){let _=[];for(let K=0;K<=$;K++)_.push(null);Z.push(_)}return Z}function yQ(Q,$,Z){let V=Q.length-1,_=(Q[0]?.length??1)-1,K=Math.max($,V),J=Math.max(Z,_),G=CQ(K,J);for(let j=0;j<G.length;j++)for(let F=0;F<G[0].length;F++)if(j<Q.length&&F<Q[0].length)G[j][F]=Q[j][F];return Q.length=0,Q.push(...G),Q}function fQ(Q,$,Z,V){if($>=Q.length||Z>=(Q[0]?.length??0))yQ(Q,$,Z);Q[$][Z]=V}function sQ(Q){return[Q.length-1,(Q[0]?.length??1)-1]}function RQ(Q,$,Z){let[V,_]=sQ(Q),K=Math.max($,V),J=Math.max(Z,_),G=_Q(K,J);for(let j=0;j<G.length;j++)for(let F=0;F<G[0].length;F++)if(j<Q.length&&F<Q[0].length)G[j][F]=Q[j][F];return Q.length=0,Q.push(...G),Q}var K9=new Set(["─","│","┌","┐","└","┘","├","┤","┬","┴","┼","╴","╵","╶","╷"]);function v4(Q){return K9.has(Q)}function C4(Q){return/^[a-zA-Z0-9]$/.test(Q)}var J9={"─":{"│":"┼","┌":"┬","┐":"┬","└":"┴","┘":"┴","├":"┼","┤":"┼","┬":"┬","┴":"┴"},"│":{"─":"┼","┌":"├","┐":"┤","└":"├","┘":"┤","├":"├","┤":"┤","┬":"┼","┴":"┼"},"┌":{"─":"┬","│":"├","┐":"┬","└":"├","┘":"┼","├":"├","┤":"┼","┬":"┬","┴":"┼"},"┐":{"─":"┬","│":"┤","┌":"┬","└":"┼","┘":"┤","├":"┼","┤":"┤","┬":"┬","┴":"┼"},"└":{"─":"┴","│":"├","┌":"├","┐":"┼","┘":"┴","├":"├","┤":"┼","┬":"┼","┴":"┴"},"┘":{"─":"┴","│":"┤","┌":"┼","┐":"┤","└":"┴","├":"┼","┤":"┤","┬":"┼","┴":"┴"},"├":{"─":"┼","│":"├","┌":"├","┐":"┼","└":"├","┘":"┼","┤":"┼","┬":"┼","┴":"┼"},"┤":{"─":"┼","│":"┤","┌":"┼","┐":"┤","└":"┼","┘":"┤","├":"┼","┬":"┼","┴":"┼"},"┬":{"─":"┬","│":"┼","┌":"┬","┐":"┬","└":"┼","┘":"┼","├":"┼","┤":"┼","┴":"┼"},"┴":{"─":"┴","│":"┼","┌":"┼","┐":"┼","└":"┴","┘":"┴","├":"┼","┤":"┼","┬":"┼"}};function V9(Q,$){return J9[Q]?.[$]??Q}function DQ(Q,$,Z,...V){let[_,K]=sQ(Q);for(let G of V){let[j,F]=sQ(G);_=Math.max(_,j+$.x),K=Math.max(K,F+$.y)}let J=_Q(_,K);for(let G=0;G<=_;G++)for(let j=0;j<=K;j++)if(G<Q.length&&j<Q[0].length)J[G][j]=Q[G][j];for(let G of V)for(let j=0;j<G.length;j++)for(let F=0;F<G[0].length;F++){let z=G[j][F];if(z!==" "){let U=j+$.x,N=F+$.y,O=J[U][N];if(!Z&&v4(z)&&v4(O))J[U][N]=V9(O,z);else if(C4(O)&&C4(z));else J[U][N]=z}}return J}function xQ(Q,$){let[Z,V]=sQ(Q),_=[],K=$?.roleCanvas,J=$?.colorMode??"none",G=$?.theme??eQ;for(let j=0;j<=V;j++)if(J==="none"||!K){let F="";for(let z=0;z<=Z;z++)F+=Q[z][j];_.push(F)}else{let F=[],z=[];for(let U=0;U<=Z;U++)F.push(Q[U][j]),z.push(K[U]?.[j]??null);_.push(y4(F,z,G,J))}return _.join(`
6`)}var _9={"▲":"▼","▼":"▲","◤":"◣","◣":"◤","◥":"◢","◢":"◥","^":"v",v:"^","┌":"└","└":"┌","┐":"┘","┘":"┐","┬":"┴","┴":"┬","╵":"╷","╷":"╵"};function f4(Q){for(let $ of Q)$.reverse();for(let $ of Q)for(let Z=0;Z<$.length;Z++){let V=_9[$[Z]];if(V)$[Z]=V}return Q}function b4(Q){for(let $ of Q)$.reverse();return Q}function z4(Q,$,Z,V=!1){RQ(Q,$.x+Z.length,$.y);for(let _=0;_<Z.length;_++){let K=$.x+_,J=Q[K][$.y];if(V||J===" ")Q[K][$.y]=Z[_]}}function u4(Q,$,Z){let V=0,_=0;for(let K of $.values())V+=K;for(let K of Z.values())_+=K;RQ(Q,V-1,_-1)}function x4(Q,$,Z){let V=0,_=0;for(let K of $.values())V+=K;for(let K of Z.values())_+=K;yQ(Q,V-1,_-1)}function m4(Q,$){let Z=new Map,V=0;for(let[G,j]of Q.nodes){let F={name:G,displayLabel:j.label,shape:j.shape,index:V,gridCoord:null,drawingCoord:null,drawing:null,drawn:!1,styleClassName:"",styleClass:M4};Z.set(G,F),V++}let _=[...Z.values()],K=[];for(let G of Q.edges){let j=Z.get(G.source),F=Z.get(G.target);if(!j||!F)continue;K.push({from:j,to:F,text:G.label??"",path:[],labelLine:[],startDir:{x:0,y:0},endDir:{x:0,y:0},style:G.style,hasArrowStart:G.hasArrowStart,hasArrowEnd:G.hasArrowEnd})}let J=[];for(let G of Q.subgraphs)p4(G,null,Z,J);G9(Q.subgraphs,J,Z,Q);for(let[G,j]of Q.classAssignments){let F=Z.get(G),z=Q.classDefs.get(j);if(F&&z)F.styleClassName=j,F.styleClass={name:j,styles:z}}return{nodes:_,edges:K,canvas:_Q(0,0),roleCanvas:CQ(0,0),grid:new Map,columnWidth:new Map,rowHeight:new Map,subgraphs:J,config:$,offsetX:0,offsetY:0,bundles:[]}}function p4(Q,$,Z,V){let _;if(Q.direction)_=Q.direction==="LR"||Q.direction==="RL"?"LR":"TD";let K={name:Q.label,nodes:[],parent:$,children:[],minX:0,minY:0,maxX:0,maxY:0,direction:_};for(let J of Q.nodeIds){let G=Z.get(J);if(G)K.nodes.push(G)}V.push(K);for(let J of Q.children){let G=p4(J,K,Z,V);K.children.push(G);for(let j of G.nodes)if(!K.nodes.includes(j))K.nodes.push(j)}return K}function G9(Q,$,Z,V){let _=new Map;F9(Q,$,_);let K=new Map;function J(G){let j=_.get(G);if(!j)return;for(let F of G.children)J(F);for(let F of G.nodeIds)if(!K.has(F))K.set(F,j)}for(let G of Q)J(G);for(let G of $)G.nodes=G.nodes.filter((j)=>{let F;for(let[U,N]of Z)if(N===j){F=U;break}if(!F)return!1;let z=K.get(F);if(!z)return!0;return j9(G,z)})}function j9(Q,$){let Z=$;while(Z!==null){if(Z===Q)return!0;Z=Z.parent}return!1}function F9(Q,$,Z){let V=[];function _(K){for(let J of K)V.push(J),_(J.children)}_(Q);for(let K=0;K<V.length&&K<$.length;K++)Z.set(V[K],$[K])}class g4{items=[];get length(){return this.items.length}push(Q){this.items.push(Q),this.bubbleUp(this.items.length-1)}pop(){if(this.items.length===0)return;let Q=this.items[0],$=this.items.pop();if(this.items.length>0)this.items[0]=$,this.sinkDown(0);return Q}bubbleUp(Q){while(Q>0){let $=Q-1>>1;if(this.items[Q].priority<this.items[$].priority)[this.items[Q],this.items[$]]=[this.items[$],this.items[Q]],Q=$;else break}}sinkDown(Q){let $=this.items.length;while(!0){let Z=Q,V=2*Q+1,_=2*Q+2;if(V<$&&this.items[V].priority<this.items[Z].priority)Z=V;if(_<$&&this.items[_].priority<this.items[Z].priority)Z=_;if(Z!==Q)[this.items[Q],this.items[Z]]=[this.items[Z],this.items[Q]],Q=Z;else break}}}function z9(Q,$){let Z=Math.abs(Q.x-$.x),V=Math.abs(Q.y-$.y);if(Z===0||V===0)return Z+V;return Z+V+1}var N9=[{x:1,y:0},{x:-1,y:0},{x:0,y:1},{x:0,y:-1}];function O9(Q,$){if($.x<0||$.y<0)return!1;return!Q.has(wQ($))}function mQ(Q,$,Z){let V=new g4;V.push({coord:$,priority:0});let _=new Map;_.set(wQ($),0);let K=new Map;K.set(wQ($),null);while(V.length>0){let J=V.pop().coord;if(G4(J,Z)){let j=[],F=J;while(F!==null)j.unshift(F),F=K.get(wQ(F))??null;return j}let G=_.get(wQ(J));for(let j of N9){let F={x:J.x+j.x,y:J.y+j.y};if(!O9(Q,F)&&!G4(F,Z))continue;let z=G+1,U=wQ(F),N=_.get(U);if(N===void 0||z<N){_.set(U,z);let O=z+z9(F,Z);V.push({coord:F,priority:O}),K.set(U,J)}}}return null}function vQ(Q){if(Q.length<=2)return Q;let $=new Set,Z=Q[0],V=Q[1];for(let _=2;_<Q.length;_++){let K=Q[_],J=V.x-Z.x,G=V.y-Z.y,j=K.x-V.x,F=K.y-V.y;if(J===j&&G===F)$.add(_-1);Z=V,V=K}return Q.filter((_,K)=>!$.has(K))}function Z4(Q){if(Q===c)return u;if(Q===u)return c;if(Q===l)return p;if(Q===p)return l;if(Q===TQ)return kQ;if(Q===IQ)return EQ;if(Q===EQ)return IQ;if(Q===kQ)return TQ;return SQ}function P(Q,$){return Q.x===$.x&&Q.y===$.y}function WQ(Q,$){if(Q.x===$.x)return Q.y<$.y?u:c;else if(Q.y===$.y)return Q.x<$.x?p:l;else if(Q.x<$.x)return Q.y<$.y?EQ:TQ;else return Q.y<$.y?kQ:IQ}function U9(Q){if(Q==="LR")return[p,u,u,p];return[u,p,p,u]}function B9(Q,$){if(Q.from===Q.to)return U9($);let Z=WQ(Q.from.gridCoord,Q.to.gridCoord),V,_,K,J,G=$==="LR"?P(Z,l)||P(Z,IQ)||P(Z,kQ):P(Z,c)||P(Z,IQ)||P(Z,TQ);if(P(Z,EQ))if($==="LR")V=u,_=l,K=p,J=c;else V=p,_=c,K=u,J=l;else if(P(Z,TQ))if($==="LR")V=c,_=l,K=p,J=u;else V=p,_=u,K=c,J=l;else if(P(Z,kQ))if($==="LR")V=u,_=u,K=l,J=c;else V=l,_=c,K=u,J=p;else if(P(Z,IQ))if($==="LR")V=u,_=u,K=l,J=u;else V=p,_=p,K=c,J=p;else if(G)if($==="LR"&&P(Z,l))V=u,_=u,K=l,J=p;else if($==="TD"&&P(Z,c))V=p,_=p,K=c,J=u;else V=Z,_=Z4(Z),K=Z,J=Z4(Z);else V=Z,_=Z4(Z),K=Z,J=Z4(Z);return[V,_,K,J]}function h4(Q,$){let Z=HQ(Q,$.from),V=HQ(Q,$.to),_=Z&&Z===V&&Z.direction?Z.direction:Q.config.graphDirection,[K,J,G,j]=B9($,_),F=nQ($.from.gridCoord,K),z=nQ($.to.gridCoord,J),U=mQ(Q.grid,F,z),N=nQ($.from.gridCoord,G),O=nQ($.to.gridCoord,j),B=mQ(Q.grid,N,O);if(U!==null&&B!==null){if(U=vQ(U),B=vQ(B),U.length<=B.length)$.startDir=K,$.endDir=J,$.path=U;else $.startDir=G,$.endDir=j,$.path=B;return}if(U!==null){$.startDir=K,$.endDir=J,$.path=vQ(U);return}if(B!==null){$.startDir=G,$.endDir=j,$.path=vQ(B);return}$.startDir=K,$.endDir=J,$.path=[F,z]}function N4(Q,$){if($.text.length===0)return;let Z=$.text.length,V=$.path.length,_=Q.config.graphDirection==="TD",K=[];for(let N=1;N<V;N++){let O=$.path[N-1],B=$.path[N],W=[O,B],H=W9(Q,W),A=O.x===B.x;K.push({line:W,width:H,index:N,isVertical:A})}let J=K.filter((N)=>N.width>=Z&&N.index>1),G;if(J.length>0)J.sort((N,O)=>O.index-N.index),G=J[0].line;else{let N=K.filter((O)=>O.width>=Z);if(N.length>0)N.sort((O,B)=>B.index-O.index),G=N[0].line;else K.sort((O,B)=>B.width-O.width),G=K[0]?.line??[$.path[0],$.path[1]]}let j=Math.min(G[0].x,G[1].x),F=Math.max(G[0].x,G[1].x),z=j+Math.floor((F-j)/2),U=Q.columnWidth.get(z)??0;Q.columnWidth.set(z,Math.max(U,Z+2)),$.labelLine=[G[0],G[1]]}function W9(Q,$){let Z=0,V=Math.min($[0].x,$[1].x),_=Math.max($[0].x,$[1].x);for(let K=V;K<=_;K++)Z+=Q.columnWidth.get(K)??0;return Z}function l4(Q){if(Q.config.graphDirection!=="TD")return[];let $=[],Z=new Set,V=new Map;for(let K of Q.edges){if(K.from===K.to)continue;let J=V.get(K.to)??[];J.push(K),V.set(K.to,J)}for(let[K,J]of V){if(J.length<2)continue;if(!c4(J,Q))continue;if(J.some((j)=>Z.has(j)))continue;let G={type:"fan-in",edges:[...J],sharedNode:K,otherNodes:J.map((j)=>j.from),junctionPoint:null,sharedPath:[],junctionDir:SQ,sharedNodeDir:SQ};for(let j of J)j.bundle=G,Z.add(j);$.push(G)}let _=new Map;for(let K of Q.edges){if(K.from===K.to)continue;if(Z.has(K))continue;let J=_.get(K.from)??[];J.push(K),_.set(K.from,J)}for(let[K,J]of _){if(J.length<2)continue;if(!c4(J,Q))continue;let G={type:"fan-out",edges:[...J],sharedNode:K,otherNodes:J.map((j)=>j.to),junctionPoint:null,sharedPath:[],junctionDir:SQ,sharedNodeDir:SQ};for(let j of J)j.bundle=G,Z.add(j);$.push(G)}return $}function c4(Q,$){if(Q.length<2)return!1;let Z=Q[0].style,V=HQ($,Q[0].from),_=HQ($,Q[0].to);for(let K of Q){if(K.style!==Z)return!1;if(K.text.length>0)return!1;let J=HQ($,K.from),G=HQ($,K.to);if(J!==V||G!==_)return!1;if(J!==G)return!1}return!0}function P9(Q,$){let Z=Q.config.graphDirection,V=$.sharedNode.gridCoord,_=$.otherNodes.map((K)=>K.gridCoord);if($.type==="fan-in"){let K=Math.min(..._.map((F)=>F.x)),J=Math.max(..._.map((F)=>F.x)),G=Math.min(..._.map((F)=>F.y)),j=Math.max(..._.map((F)=>F.y));if(Z==="TD"){let F=V.y-1,z=Math.floor((K+J)/2)+1;return{x:V.x+1,y:F}}else{let F=V.x-1,z=V.y+1;return{x:F,y:z}}}else{let K=Math.min(..._.map((F)=>F.x)),J=Math.max(..._.map((F)=>F.x)),G=Math.min(..._.map((F)=>F.y)),j=Math.max(..._.map((F)=>F.y));if(Z==="TD"){let F=V.y+3;return{x:V.x+1,y:F}}else{let F=V.x+3,z=V.y+1;return{x:F,y:z}}}}function q9(Q,$){let Z=Q.config.graphDirection;$.junctionPoint=P9(Q,$);let V=$.junctionPoint;if($.type==="fan-in"){$.junctionDir=Z==="TD"?c:l,$.sharedNodeDir=Z==="TD"?u:p;let _=$.sharedNode.gridCoord,K=Z==="TD"?{x:_.x+1,y:_.y}:{x:_.x,y:_.y+1},J=mQ(Q.grid,V,K);$.sharedPath=J?vQ(J):[V,K];for(let G of $.edges){let j=G.from.gridCoord,F=Z==="TD"?{x:j.x+1,y:j.y+2}:{x:j.x+2,y:j.y+1},z=mQ(Q.grid,F,V);G.pathToJunction=z?vQ(z):[F,V],G.startDir=Z==="TD"?u:p,G.endDir=Z==="TD"?c:l,G.path=[...G.pathToJunction,...$.sharedPath.slice(1)]}}else{$.junctionDir=Z==="TD"?u:p,$.sharedNodeDir=Z==="TD"?c:l;let _=$.sharedNode.gridCoord,K=Z==="TD"?{x:_.x+1,y:_.y+2}:{x:_.x+2,y:_.y+1},J=mQ(Q.grid,K,V);$.sharedPath=J?vQ(J):[K,V];for(let G of $.edges){let j=G.to.gridCoord,F=Z==="TD"?{x:j.x+1,y:j.y}:{x:j.x,y:j.y+1},z=mQ(Q.grid,V,F);G.pathToJunction=z?vQ(z):[V,F],G.startDir=Z==="TD"?u:p,G.endDir=Z==="TD"?c:l,G.path=[...$.sharedPath,...G.pathToJunction.slice(1)]}}}function d4(Q){for(let $ of Q.bundles)q9(Q,$)}function VQ(Q){return Q.split(`
7`)}function K4(Q){let $=VQ(Q);return Math.max(...$.map((Z)=>Z.length),0)}function O4(Q){return VQ(Q).length}var n4={rectangle:{unicode:{tl:"┌",tr:"┐",bl:"└",br:"┘"},ascii:{tl:"+",tr:"+",bl:"+",br:"+"}},rounded:{unicode:{tl:"╭",tr:"╮",bl:"╰",br:"╯"},ascii:{tl:".",tr:".",bl:"'",br:"'"}},circle:{unicode:{tl:"◯",tr:"◯",bl:"◯",br:"◯"},ascii:{tl:"o",tr:"o",bl:"o",br:"o"}},doublecircle:{unicode:{tl:"◎",tr:"◎",bl:"◎",br:"◎"},ascii:{tl:"@",tr:"@",bl:"@",br:"@"}},diamond:{unicode:{tl:"◇",tr:"◇",bl:"◇",br:"◇"},ascii:{tl:"<",tr:">",bl:"<",br:">"}},hexagon:{unicode:{tl:"⌜",tr:"⌝",bl:"⌞",br:"⌟"},ascii:{tl:"*",tr:"*",bl:"*",br:"*"}},stadium:{unicode:{tl:"(",tr:")",bl:"(",br:")"},ascii:{tl:"(",tr:")",bl:"(",br:")"}},subroutine:{unicode:{tl:"╟",tr:"╢",bl:"╟",br:"╢"},ascii:{tl:"|",tr:"|",bl:"|",br:"|"}},cylinder:{unicode:{tl:"╭",tr:"╮",bl:"╰",br:"╯"},ascii:{tl:".",tr:".",bl:"'",br:"'"}},asymmetric:{unicode:{tl:"▷",tr:"┐",bl:"▷",br:"┘"},ascii:{tl:">",tr:"+",bl:">",br:"+"}},trapezoid:{unicode:{tl:"/",tr:"\\",bl:"└",br:"┘"},ascii:{tl:"/",tr:"\\",bl:"+",br:"+"}},"trapezoid-alt":{unicode:{tl:"┌",tr:"┐",bl:"\\",br:"/"},ascii:{tl:"+",tr:"+",bl:"\\",br:"/"}},"state-start":{unicode:{tl:"●",tr:"●",bl:"●",br:"●"},ascii:{tl:"*",tr:"*",bl:"*",br:"*"}},"state-end":{unicode:{tl:"◉",tr:"◉",bl:"◉",br:"◉"},ascii:{tl:"@",tr:"@",bl:"@",br:"@"}}};function PQ(Q,$){let Z=n4[Q]??n4.rectangle;return $?Z.ascii:Z.unicode}function YQ(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((z)=>z.length),0),_=Z.length,K=2*$.padding+V,J=K+2,G=_+2*$.padding,j=G%2===0?G+1:G,F=j+2;return{width:J,height:F,labelArea:{x:1+$.padding,y:1+$.padding,width:V,height:_},gridColumns:[1,K,1],gridRows:[1,j,1]}}function AQ(Q,$,Z,V){let{width:_,height:K}=$,J=_Q(_-1,K-1),G={x:0,y:0},j={x:_-1,y:K-1},F=V?"-":"─",z=V?"|":"│";for(let H=G.x+1;H<j.x;H++)J[H][G.y]=F,J[H][j.y]=F;for(let H=G.y+1;H<j.y;H++)J[G.x][H]=z,J[j.x][H]=z;J[G.x][G.y]=Z.tl,J[j.x][G.y]=Z.tr,J[G.x][j.y]=Z.bl,J[j.x][j.y]=Z.br;let U=VQ(Q),N=_-1,O=K-1,W=Math.floor(O/2)-Math.floor((U.length-1)/2);for(let H=0;H<U.length;H++){let A=U[H],b=Math.floor(N/2)-Math.ceil(A.length/2)+1;for(let M=0;M<A.length;M++){let g=b+M,D=W+H;if(g>=0&&g<J.length&&D>=0&&D<J[0].length)J[g][D]=A[M]}}return J}function BQ(Q,$,Z){let{width:V,height:_}=$,K=Z.x+Math.floor(V/2),J=Z.y+Math.floor(_/2);if(P(Q,c))return{x:K,y:Z.y};if(P(Q,u))return{x:K,y:Z.y+_-1};if(P(Q,l))return{x:Z.x,y:J};if(P(Q,p))return{x:Z.x+V-1,y:J};if(P(Q,IQ))return{x:Z.x,y:Z.y};if(P(Q,TQ))return{x:Z.x+V-1,y:Z.y};if(P(Q,kQ))return{x:Z.x,y:Z.y+_-1};if(P(Q,EQ))return{x:Z.x+V-1,y:Z.y+_-1};return{x:K,y:J}}var U4={getDimensions:YQ,render(Q,$,Z){let V=PQ("rectangle",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var s4={getDimensions:YQ,render(Q,$,Z){let V=PQ("diamond",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var i4={getDimensions:YQ,render(Q,$,Z){let V=PQ("circle",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var o4={getDimensions(Q,$){return{width:5,height:3,labelArea:{x:2,y:1,width:1,height:1},gridColumns:[1,3,1],gridRows:[1,1,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Math.floor(V/2);if(!Z.useAscii)K[0][0]="╭",K[1][0]="─",K[2][0]="─",K[3][0]="─",K[4][0]="╮",K[0][1]="│",K[J][1]="●",K[4][1]="│",K[0][2]="╰",K[1][2]="─",K[2][2]="─",K[3][2]="─",K[4][2]="╯";else K[0][0]=".",K[1][0]="-",K[2][0]="-",K[3][0]="-",K[4][0]=".",K[0][1]="|",K[J][1]="*",K[4][1]="|",K[0][2]="'",K[1][2]="-",K[2][2]="-",K[3][2]="-",K[4][2]="'";return K},getAttachmentPoint(Q,$,Z){let{width:V,height:_}=$,K=Z.x+Math.floor(V/2),J=Z.y+Math.floor(_/2);if(P(Q,c))return{x:K,y:Z.y};if(P(Q,u))return{x:K,y:Z.y+_-1};if(P(Q,l))return{x:Z.x,y:J};if(P(Q,p))return{x:Z.x+V-1,y:J};return{x:K,y:J}}},t4={getDimensions(Q,$){return{width:5,height:3,labelArea:{x:2,y:1,width:1,height:1},gridColumns:[1,3,1],gridRows:[1,1,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Math.floor(V/2);if(!Z.useAscii)K[0][0]="╔",K[1][0]="═",K[2][0]="═",K[3][0]="═",K[4][0]="╗",K[0][1]="║",K[J][1]="◎",K[4][1]="║",K[0][2]="╚",K[1][2]="═",K[2][2]="═",K[3][2]="═",K[4][2]="╝";else K[0][0]="#",K[1][0]="=",K[2][0]="=",K[3][0]="=",K[4][0]="#",K[0][1]="#",K[J][1]="*",K[4][1]="#",K[0][2]="#",K[1][2]="=",K[2][2]="=",K[3][2]="=",K[4][2]="#";return K},getAttachmentPoint(Q,$,Z){let{width:V,height:_}=$,K=Z.x+Math.floor(V/2),J=Z.y+Math.floor(_/2);if(P(Q,c))return{x:K,y:Z.y};if(P(Q,u))return{x:K,y:Z.y+_-1};if(P(Q,l))return{x:Z.x,y:J};if(P(Q,p))return{x:Z.x+V-1,y:J};return{x:K,y:J}}};var r4={getDimensions:YQ,render(Q,$,Z){let V=PQ("rounded",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var a4={getDimensions(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((F)=>F.length),0),_=Z.length,K=2*$.padding+V,J=K+4,G=_+2*$.padding,j=Math.max(G+2,3);return{width:J,height:j,labelArea:{x:2+$.padding,y:1+$.padding,width:V,height:_},gridColumns:[2,K,2],gridRows:[1,G,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Math.floor(_/2),G=Z.useAscii?"-":"─";if(_===3)K[0][J]="(",K[V-1][J]=")";else if(!Z.useAscii){K[0][0]="╭";for(let z=1;z<V-1;z++)K[z][0]=G;K[V-1][0]="╮";for(let z=1;z<_-1;z++)K[0][z]="│",K[V-1][z]="│";K[0][_-1]="╰";for(let z=1;z<V-1;z++)K[z][_-1]=G;K[V-1][_-1]="╯"}else{for(let z=0;z<_;z++)K[0][z]="(",K[V-1][z]=")";for(let z=1;z<V-1;z++)K[z][0]=G,K[z][_-1]=G}let j=VQ(Q),F=J-Math.floor((j.length-1)/2);for(let z=0;z<j.length;z++){let U=j[z],N=Math.floor(V/2)-Math.floor(U.length/2);for(let O=0;O<U.length;O++){let B=N+O,W=F+z;if(B>0&&B<V-1&&W>=0&&W<_)K[B][W]=U[O]}}return K},getAttachmentPoint:BQ};var e4={getDimensions:YQ,render(Q,$,Z){let V=PQ("hexagon",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var Q8={getDimensions(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((F)=>F.length),0),_=Z.length,K=2*$.padding+V,J=K+4,G=_+2*$.padding,j=G+2;return{width:J,height:j,labelArea:{x:2+$.padding,y:1+$.padding,width:V,height:_},gridColumns:[2,K,2],gridRows:[1,G,1]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Z.useAscii?"-":"─",G=Z.useAscii?"|":"│";K[0][0]=Z.useAscii?"+":"┌",K[1][0]=Z.useAscii?"+":"┬";for(let U=2;U<V-2;U++)K[U][0]=J;K[V-2][0]=Z.useAscii?"+":"┬",K[V-1][0]=Z.useAscii?"+":"┐";for(let U=1;U<_-1;U++)K[0][U]=G,K[1][U]=G,K[V-2][U]=G,K[V-1][U]=G;K[0][_-1]=Z.useAscii?"+":"└",K[1][_-1]=Z.useAscii?"+":"┴";for(let U=2;U<V-2;U++)K[U][_-1]=J;K[V-2][_-1]=Z.useAscii?"+":"┴",K[V-1][_-1]=Z.useAscii?"+":"┘";let j=VQ(Q),z=Math.floor(_/2)-Math.floor((j.length-1)/2);for(let U=0;U<j.length;U++){let N=j[U],O=Math.floor(V/2)-Math.floor(N.length/2);for(let B=0;B<N.length;B++){let W=O+B,H=z+U;if(W>1&&W<V-2&&H>0&&H<_-1)K[W][H]=N[B]}}return K},getAttachmentPoint:BQ},$8={getDimensions:YQ,render(Q,$,Z){let V=PQ("doublecircle",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ},Z8={getDimensions(Q,$){let Z=VQ(Q),V=Math.max(...Z.map((F)=>F.length),0),_=Z.length,K=2*$.padding+V,J=K+2,G=_+2*$.padding+2,j=G+2;return{width:J,height:j,labelArea:{x:1+$.padding,y:2+$.padding,width:V,height:_},gridColumns:[1,K,1],gridRows:[2,G-2,2]}},render(Q,$,Z){let{width:V,height:_}=$,K=_Q(V-1,_-1),J=Z.useAscii?"-":"─",G=Z.useAscii?"|":"│";K[0][0]=Z.useAscii?".":"╭";for(let U=1;U<V-1;U++)K[U][0]=J;K[V-1][0]=Z.useAscii?".":"╮",K[0][1]=G;for(let U=1;U<V-1;U++)K[U][1]=J;K[V-1][1]=G;for(let U=2;U<_-2;U++)K[0][U]=G,K[V-1][U]=G;K[0][_-2]=G;for(let U=1;U<V-1;U++)K[U][_-2]=J;K[V-1][_-2]=G,K[0][_-1]=Z.useAscii?"'":"╰";for(let U=1;U<V-1;U++)K[U][_-1]=J;K[V-1][_-1]=Z.useAscii?"'":"╯";let j=VQ(Q),z=Math.floor(_/2)-Math.floor((j.length-1)/2);for(let U=0;U<j.length;U++){let N=j[U],O=Math.floor(V/2)-Math.floor(N.length/2);for(let B=0;B<N.length;B++){let W=O+B,H=z+U;if(W>0&&W<V-1&&H>1&&H<_-2)K[W][H]=N[B]}}return K},getAttachmentPoint:BQ},K8={getDimensions:YQ,render(Q,$,Z){let V=PQ("asymmetric",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ},J8={getDimensions:YQ,render(Q,$,Z){let V=PQ("trapezoid",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ},V8={getDimensions:YQ,render(Q,$,Z){let V=PQ("trapezoid-alt",Z.useAscii);return AQ(Q,$,V,Z.useAscii)},getAttachmentPoint:BQ};var H9=new Map([["rectangle",U4],["rounded",r4],["diamond",s4],["stadium",a4],["circle",i4],["subroutine",Q8],["doublecircle",$8],["hexagon",e4],["cylinder",Z8],["asymmetric",K8],["trapezoid",J8],["trapezoid-alt",V8],["state-start",o4],["state-end",t4]]);function _8(Q){return H9.get(Q)??U4}function G8(Q,$,Z){return _8(Q).getDimensions($,Z)}function j8(Q,$,Z,V){return _8(Q).getAttachmentPoint($,Z,V)}function I9(Q,$){return T9(Q,$)}function T9(Q,$){let Z=Q.gridCoord,V=$.config.useAscii,_=0;for(let M=0;M<2;M++)_+=$.columnWidth.get(Z.x+M)??0;let K=0;for(let M=0;M<2;M++)K+=$.rowHeight.get(Z.y+M)??0;let J={x:0,y:0},G={x:_,y:K},j=_Q(Math.max(J.x,G.x),Math.max(J.y,G.y)),F=PQ(Q.shape,V),z=Q.shape==="state-end",U=V?z?"=":"-":z?"═":"─",N=V?z?"‖":"|":z?"║":"│",B=z?V?{tl:"#",tr:"#",bl:"#",br:"#"}:{tl:"╔",tr:"╗",bl:"╚",br:"╝"}:F;for(let M=J.x+1;M<G.x;M++)j[M][J.y]=U;for(let M=J.x+1;M<G.x;M++)j[M][G.y]=U;for(let M=J.y+1;M<G.y;M++)j[J.x][M]=N;for(let M=J.y+1;M<G.y;M++)j[G.x][M]=N;j[J.x][J.y]=B.tl,j[G.x][J.y]=B.tr,j[J.x][G.y]=B.bl,j[G.x][G.y]=B.br;let W=Q.displayLabel,H=VQ(W),b=J.y+Math.floor(K/2)-Math.floor((H.length-1)/2);for(let M=0;M<H.length;M++){let g=H[M],D=J.x+Math.floor(_/2)-Math.ceil(g.length/2)+1;for(let i=0;i<g.length;i++)if(D+i>=0&&D+i<j.length&&b+M>=0&&b+M<j[0].length)j[D+i][b+M]=g[i]}return j}function z8(Q,$){return I9(Q,$)}function J4(Q,$,Z=1){let V=0;for(let M of Q)for(let g of M)V=Math.max(V,g.length);let K=V+2*Z+2,J=0;for(let M of Q)J+=Math.max(M.length,1);let G=Q.length-1,j=J+G+2,F=$?"-":"─",z=$?"|":"│",U=$?"+":"┌",N=$?"+":"┐",O=$?"+":"└",B=$?"+":"┘",W=$?"+":"├",H=$?"+":"┤",A=_Q(K-1,j-1);A[0][0]=U;for(let M=1;M<K-1;M++)A[M][0]=F;A[K-1][0]=N,A[0][j-1]=O;for(let M=1;M<K-1;M++)A[M][j-1]=F;A[K-1][j-1]=B;for(let M=1;M<j-1;M++)A[0][M]=z,A[K-1][M]=z;let b=1;for(let M=0;M<Q.length;M++){let g=Q[M],D=g.length>0?g:[""];for(let i of D){let UQ=1+Z;for(let x=0;x<i.length;x++)A[UQ+x][b]=i[x];b++}if(M<Q.length-1){A[0][b]=W;for(let i=1;i<K-1;i++)A[i][b]=F;A[K-1][b]=H,b++}}return A}var k9={solid:{h:{unicode:"─",ascii:"-"},v:{unicode:"│",ascii:"|"}},dotted:{h:{unicode:"┄",ascii:"."},v:{unicode:"┆",ascii:":"}},thick:{h:{unicode:"━",ascii:"="},v:{unicode:"┃",ascii:"‖"}}};function W4(Q,$,Z,V,_,K,J="solid"){let G=WQ($,Z),j=[],F=k9[J],z=K?F.h.ascii:F.h.unicode,U=K?F.v.ascii:F.v.unicode;if(P(G,c))for(let N=$.y-V;N>=Z.y-_;N--)j.push({x:$.x,y:N}),Q[$.x][N]=U;else if(P(G,u))for(let N=$.y+V;N<=Z.y+_;N++)j.push({x:$.x,y:N}),Q[$.x][N]=U;else if(P(G,l))for(let N=$.x-V;N>=Z.x-_;N--)j.push({x:N,y:$.y}),Q[N][$.y]=z;else if(P(G,p))for(let N=$.x+V;N<=Z.x+_;N++)j.push({x:N,y:$.y}),Q[N][$.y]=z;else if(P(G,IQ)){for(let N=$.x-V;N>=Z.x;N--)j.push({x:N,y:$.y}),Q[N][$.y]=z;for(let N=$.y-1;N>=Z.y-_;N--)j.push({x:Z.x,y:N}),Q[Z.x][N]=U}else if(P(G,TQ)){for(let N=$.x+V;N<=Z.x;N++)j.push({x:N,y:$.y}),Q[N][$.y]=z;for(let N=$.y-1;N>=Z.y-_;N--)j.push({x:Z.x,y:N}),Q[Z.x][N]=U}else if(P(G,kQ)){for(let N=$.x-V;N>=Z.x;N--)j.push({x:N,y:$.y}),Q[N][$.y]=z;for(let N=$.y+1;N<=Z.y+_;N++)j.push({x:Z.x,y:N}),Q[Z.x][N]=U}else if(P(G,EQ))if(Z.x-$.x<=1)for(let O=$.y+V;O<=Z.y+_;O++)j.push({x:$.x,y:O}),Q[$.x][O]=U;else{for(let O=$.x+V;O<=Z.x;O++)j.push({x:O,y:$.y}),Q[O][$.y]=z;for(let O=$.y+1;O<=Z.y+_;O++)j.push({x:Z.x,y:O}),Q[Z.x][O]=U}return j}function Y9(Q,$){if($.path.length===0){let z=OQ(Q.canvas);return[z,z,z,z,z,z]}let Z=R9(Q,$),[V,_,K]=M9(Q,$.path,$.style),J=X9(Q,$.path,_[0],$.from.shape),G;if($.hasArrowEnd)G=F8(Q,_[_.length-1],K[K.length-1]);else G=OQ(Q.canvas);let j;if($.hasArrowStart&&_.length>0){let U=_[0][0],N=A9(K[0]),O={x:U.x,y:U.y};if(P(K[0],p))O.x=U.x-1;else if(P(K[0],l))O.x=U.x+1;else if(P(K[0],u))O.y=U.y-1;else if(P(K[0],c))O.y=U.y+1;j=F8(Q,[U,O],N)}else j=OQ(Q.canvas);let F=E9(Q,$.path);return[V,J,G,j,F,Z]}function A9(Q){if(P(Q,c))return u;if(P(Q,u))return c;if(P(Q,l))return p;if(P(Q,p))return l;if(P(Q,IQ))return EQ;if(P(Q,TQ))return kQ;if(P(Q,kQ))return TQ;if(P(Q,EQ))return IQ;return SQ}function M9(Q,$,Z="solid"){let V=OQ(Q.canvas),_=$[0],K=[],J=[];for(let G=1;G<$.length;G++){let j=$[G],F=LQ(Q,_),z=LQ(Q,j);if(rQ(F,z)){_=j;continue}let U=WQ(_,j),N=W4(V,F,z,1,-1,Q.config.useAscii,Z);if(N.length===0)N.push(F);K.push(N),J.push(U),_=j}return[V,K,J]}function X9(Q,$,Z,V){let _=OQ(Q.canvas);if(Q.config.useAscii)return _;if(V==="state-start"||V==="state-end")return _;let K=Z[0],J=WQ($[0],$[1]);if(P(J,c))_[K.x][K.y+1]="┴";else if(P(J,u))_[K.x][K.y-1]="┬";else if(P(J,l))_[K.x+1][K.y]="┤";else if(P(J,p))_[K.x-1][K.y]="├";return _}function F8(Q,$,Z){let V=OQ(Q.canvas);if($.length===0)return V;let _=$[0],K=$[$.length-1],J=WQ(_,K);if($.length===1||P(J,SQ))J=Z;let G;if(!Q.config.useAscii)if(P(J,c))G="▲";else if(P(J,u))G="▼";else if(P(J,l))G="◄";else if(P(J,p))G="►";else if(P(J,TQ))G="◥";else if(P(J,IQ))G="◤";else if(P(J,EQ))G="◢";else if(P(J,kQ))G="◣";else if(P(Z,c))G="▲";else if(P(Z,u))G="▼";else if(P(Z,l))G="◄";else if(P(Z,p))G="►";else if(P(Z,TQ))G="◥";else if(P(Z,IQ))G="◤";else if(P(Z,EQ))G="◢";else if(P(Z,kQ))G="◣";else G="●";else if(P(J,c))G="^";else if(P(J,u))G="v";else if(P(J,l))G="<";else if(P(J,p))G=">";else if(P(Z,c))G="^";else if(P(Z,u))G="v";else if(P(Z,l))G="<";else if(P(Z,p))G=">";else G="*";return V[K.x][K.y]=G,V}function E9(Q,$){let Z=OQ(Q.canvas);for(let V=1;V<$.length-1;V++){let _=$[V],K=LQ(Q,_),J=WQ($[V-1],_),G=WQ(_,$[V+1]),j;if(!Q.config.useAscii)if(P(J,p)&&P(G,u)||P(J,c)&&P(G,l))j="┐";else if(P(J,p)&&P(G,c)||P(J,u)&&P(G,l))j="┘";else if(P(J,l)&&P(G,u)||P(J,c)&&P(G,p))j="┌";else if(P(J,l)&&P(G,c)||P(J,u)&&P(G,p))j="└";else j="+";else j="+";Z[K.x][K.y]=j}return Z}function R9(Q,$){let Z=OQ(Q.canvas);if($.text.length===0)return Z;let V=O8(Q,$.labelLine),_;if($.path.length>=2){let K=$.path[0].y,J=$.path[$.path.length-1].y;if(J<K)_=!0;else if(J>K)_=!1}return D9(Z,V,$.text,_),Z}function D9(Q,$,Z,V){if($.length<2)return;let _=Math.min($[0].x,$[1].x),K=Math.max($[0].x,$[1].x),J=Math.min($[0].y,$[1].y),G=Math.max($[0].y,$[1].y),j=_+Math.floor((K-_)/2),F=J+Math.floor((G-J)/2);if(V!==void 0&&_===K){let N=G-J,O=Math.max(1,Math.floor(N/4));if(V)F=F+O;else F=F-O}let z=VQ(Z),U=F-Math.floor((z.length-1)/2);for(let N=0;N<z.length;N++){let O=z[N],B=j-Math.floor(O.length/2);z4(Q,{x:B,y:U+N},O)}}function cQ(Q,$,Z){let V=$.gridCoord,_=0;for(let j=0;j<2;j++)_+=Q.columnWidth.get(V.x+j)??0;let K=0;for(let j=0;j<2;j++)K+=Q.rowHeight.get(V.y+j)??0;let J={width:_+1,height:K+1,labelArea:{x:0,y:0,width:0,height:0},gridColumns:[0,0,0],gridRows:[0,0,0]},G=$.drawingCoord;return j8($.shape,Z,J,G)}function L9(Q,$,Z){let V=OQ(Q.canvas);if(!$.pathToJunction||$.pathToJunction.length===0)return[V,V,V,V,V,V];let _=OQ(Q.canvas),K=Q.config.useAscii,J=$.pathToJunction.map((z,U)=>{if(Z.type==="fan-in"&&U===0)return cQ(Q,$.from,$.startDir);if(Z.type==="fan-out"&&U===$.pathToJunction.length-1)return cQ(Q,$.to,$.endDir);return LQ(Q,z)});for(let z=1;z<J.length;z++){let U=J[z-1],N=J[z];if(!rQ(U,N))W4(_,U,N,1,-1,K,$.style)}let G=OQ(Q.canvas);for(let z=1;z<$.pathToJunction.length-1;z++){let U=$.pathToJunction[z],N=LQ(Q,U),O=WQ($.pathToJunction[z-1],U),B=WQ(U,$.pathToJunction[z+1]),W;if(!K)if(P(O,p)&&P(B,u)||P(O,c)&&P(B,l))W="┐";else if(P(O,p)&&P(B,c)||P(O,u)&&P(B,l))W="┘";else if(P(O,l)&&P(B,u)||P(O,c)&&P(B,p))W="┌";else if(P(O,l)&&P(B,c)||P(O,u)&&P(B,p))W="└";else W="+";else W="+";G[N.x][N.y]=W}let j=OQ(Q.canvas);if(Z.type==="fan-in"&&$.pathToJunction.length>=2){let z=J[0],U=WQ($.pathToJunction[0],$.pathToJunction[1]);if(!K){if(P(U,c))j[z.x][z.y]="┴";else if(P(U,u))j[z.x][z.y]="┬";else if(P(U,l))j[z.x][z.y]="┤";else if(P(U,p))j[z.x][z.y]="├"}}let F=OQ(Q.canvas);return[_,j,V,V,G,F]}function S9(Q,$){let Z=OQ(Q.canvas),V=OQ(Q.canvas);if($.sharedPath.length<2)return[Z,V];let _=Q.config.useAscii,K=$.edges[0]?.style??"solid",J=Q.config.graphDirection,G=$.sharedPath.map((j,F)=>{if($.type==="fan-in"&&F===$.sharedPath.length-1){let z=J==="TD"?c:l;return cQ(Q,$.sharedNode,z)}if($.type==="fan-out"&&F===0){let z=J==="TD"?u:p;return cQ(Q,$.sharedNode,z)}return LQ(Q,j)});for(let j=1;j<G.length;j++){let F=G[j-1],z=G[j];if(!rQ(F,z))W4(Z,F,z,1,-1,_,K)}for(let j=1;j<$.sharedPath.length-1;j++){let F=$.sharedPath[j],z=LQ(Q,F),U=WQ($.sharedPath[j-1],F),N=WQ(F,$.sharedPath[j+1]),O;if(!_)if(P(U,p)&&P(N,u)||P(U,c)&&P(N,l))O="┐";else if(P(U,p)&&P(N,c)||P(U,u)&&P(N,l))O="┘";else if(P(U,l)&&P(N,u)||P(U,c)&&P(N,p))O="┌";else if(P(U,l)&&P(N,c)||P(U,u)&&P(N,p))O="└";else O="+";else O="+";V[z.x][z.y]=O}return[Z,V]}function w9(Q,$){let Z=OQ(Q.canvas);if($.sharedPath.length<2)return Z;let V=$.sharedPath.length-1,_=$.sharedPath[V-1],K=$.sharedPath[V],J=WQ(_,K),G=Q.config.graphDirection,j=G==="TD"?c:l,F=cQ(Q,$.sharedNode,j);if(G==="TD")F.y-=1;else F.x-=1;let z;if(!Q.config.useAscii)if(P(J,c))z="▲";else if(P(J,u))z="▼";else if(P(J,l))z="◄";else if(P(J,p))z="►";else z="▼";else if(P(J,c))z="^";else if(P(J,u))z="v";else if(P(J,l))z="<";else if(P(J,p))z=">";else z="v";return Z[F.x][F.y]=z,Z}function y9(Q,$){let Z=OQ(Q.canvas);if(!$.pathToJunction||$.pathToJunction.length<2)return Z;let V=$.pathToJunction.length-1,_=$.pathToJunction[V-1],K=$.pathToJunction[V],J=WQ(_,K),G=Q.config.graphDirection,j=G==="TD"?c:l,F=cQ(Q,$.to,j);if(G==="TD")F.y-=1;else F.x-=1;let z;if(!Q.config.useAscii)if(P(J,c))z="▲";else if(P(J,u))z="▼";else if(P(J,l))z="◄";else if(P(J,p))z="►";else z="▼";else if(P(J,c))z="^";else if(P(J,u))z="v";else if(P(J,l))z="<";else if(P(J,p))z=">";else z="v";return Z[F.x][F.y]=z,Z}function v9(Q,$){let Z=OQ(Q.canvas);if(!$.junctionPoint)return Z;let V=LQ(Q,$.junctionPoint),_=Q.config.useAscii,K=!1,J=!1,G=!1,j=!1;if($.sharedPath.length>=2){let z=$.type==="fan-in"?0:$.sharedPath.length-1,U=$.type==="fan-in"?1:$.sharedPath.length-2,N=WQ($.sharedPath[z],$.sharedPath[U]);if(P(N,u))J=!0;else if(P(N,c))K=!0;else if(P(N,p))j=!0;else if(P(N,l))G=!0}for(let z of $.edges)if(z.pathToJunction&&z.pathToJunction.length>=2){let U=$.type==="fan-in"?z.pathToJunction.length-1:0,N=$.type==="fan-in"?z.pathToJunction.length-2:1,O=WQ(z.pathToJunction[N],z.pathToJunction[U]);if(P(O,u))K=!0;else if(P(O,c))J=!0;else if(P(O,p))G=!0;else if(P(O,l))j=!0}let F;if(!_)if(K&&J&&G&&j)F="┼";else if(J&&G&&j&&!K)F="┬";else if(K&&G&&j&&!J)F="┴";else if(K&&J&&j&&!G)F="├";else if(K&&J&&G&&!j)F="┤";else if(G&&j)F="─";else if(K&&J)F="│";else if(J&&j)F="┌";else if(J&&G)F="┐";else if(K&&j)F="└";else if(K&&G)F="┘";else F="┼";else F="+";return Z[V.x][V.y]=F,Z}function C9(Q,$){let Z=Q.maxX-Q.minX,V=Q.maxY-Q.minY;if(Z<=0||V<=0)return _Q(0,0);let _={x:0,y:0},K={x:Z,y:V},J=_Q(Z,V);if(!$.config.useAscii){for(let G=_.x+1;G<K.x;G++)J[G][_.y]="─";for(let G=_.x+1;G<K.x;G++)J[G][K.y]="─";for(let G=_.y+1;G<K.y;G++)J[_.x][G]="│";for(let G=_.y+1;G<K.y;G++)J[K.x][G]="│";J[_.x][_.y]="┌",J[K.x][_.y]="┐",J[_.x][K.y]="└",J[K.x][K.y]="┘"}else{for(let G=_.x+1;G<K.x;G++)J[G][_.y]="-";for(let G=_.x+1;G<K.x;G++)J[G][K.y]="-";for(let G=_.y+1;G<K.y;G++)J[_.x][G]="|";for(let G=_.y+1;G<K.y;G++)J[K.x][G]="|";J[_.x][_.y]="+",J[K.x][_.y]="+",J[_.x][K.y]="+",J[K.x][K.y]="+"}return J}function f9(Q,$){let Z=Q.maxX-Q.minX,V=Q.maxY-Q.minY;if(Z<=0||V<=0)return[_Q(0,0),{x:0,y:0}];let _=_Q(Z,V),K=VQ(Q.name);for(let J=0;J<K.length;J++){let G=K[J],j=1+J,F=Math.floor(Z/2)-Math.floor(G.length/2);if(F<1)F=1;for(let z=0;z<G.length;z++)if(F+z<Z&&j<V)_[F+z][j]=G[z]}return[_,{x:Q.minX,y:Q.minY}]}function b9(Q){function $(V){return V.parent===null?0:1+$(V.parent)}let Z=[...Q];return Z.sort((V,_)=>$(V)-$(_)),Z}function B4(Q,$,Z,V){for(let _=0;_<$.length;_++)for(let K=0;K<($[0]?.length??0);K++){let J=$[_]?.[K];if(J&&J!==" "){let G=_+Z.x,j=K+Z.y;if(G>=0&&j>=0)fQ(Q,G,j,V)}}}function gQ(Q,$,Z,V){for(let _ of $)B4(Q,_,Z,V)}function u9(Q,$,Z){let V=(_)=>/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|.':]$/.test(_);for(let _=0;_<$.length;_++)for(let K=0;K<($[0]?.length??0);K++){let J=$[_]?.[K];if(J&&J!==" "){let G=_+Z.x,j=K+Z.y;if(G>=0&&j>=0)fQ(Q,G,j,V(J)?"border":"text")}}}function N8(Q){let $=Q.config.useAscii,Z={x:0,y:0},V=b9(Q.subgraphs);for(let N of V){let O=C9(N,Q),B={x:N.minX,y:N.minY};Q.canvas=DQ(Q.canvas,B,$,O),B4(Q.roleCanvas,O,B,"border")}for(let N of Q.nodes)if(!N.drawn&&N.drawingCoord&&N.drawing)Q.canvas=DQ(Q.canvas,N.drawingCoord,$,N.drawing),u9(Q.roleCanvas,N.drawing,N.drawingCoord),N.drawn=!0;let _=[],K=[],J=[],G=[],j=[],F=[],z=[],U=new Set;for(let N of Q.edges)if(N.bundle&&N.pathToJunction){let O=N.bundle,[B,W,,,H,A]=L9(Q,N,O);if(_.push(B),K.push(H),j.push(W),F.push(A),!U.has(O)){U.add(O);let[b,M]=S9(Q,O);if(_.push(b),K.push(M),O.type==="fan-in"){let D=w9(Q,O);J.push(D)}let g=v9(Q,O);z.push(g)}if(O.type==="fan-out"&&N.hasArrowEnd){let b=y9(Q,N);J.push(b)}}else{let[O,B,W,H,A,b]=Y9(Q,N);_.push(O),K.push(A),J.push(W),G.push(H),j.push(B),F.push(b)}Q.canvas=DQ(Q.canvas,Z,$,..._),gQ(Q.roleCanvas,_,Z,"line"),Q.canvas=DQ(Q.canvas,Z,$,...K),gQ(Q.roleCanvas,K,Z,"corner"),Q.canvas=DQ(Q.canvas,Z,$,...z),gQ(Q.roleCanvas,z,Z,"junction"),Q.canvas=DQ(Q.canvas,Z,$,...J),gQ(Q.roleCanvas,J,Z,"arrow"),Q.canvas=DQ(Q.canvas,Z,$,...j),gQ(Q.roleCanvas,j,Z,"junction"),Q.canvas=DQ(Q.canvas,Z,$,...G),gQ(Q.roleCanvas,G,Z,"arrow"),Q.canvas=DQ(Q.canvas,Z,$,...F),gQ(Q.roleCanvas,F,Z,"text");for(let N of Q.subgraphs){if(N.nodes.length===0)continue;let[O,B]=f9(N,Q);Q.canvas=DQ(Q.canvas,B,$,O),B4(Q.roleCanvas,O,B,"text")}return Q.canvas}function LQ(Q,$,Z){let V=Z?{x:$.x+Z.x,y:$.y+Z.y}:$,_=0;for(let j=0;j<V.x;j++)_+=Q.columnWidth.get(j)??0;let K=0;for(let j=0;j<V.y;j++)K+=Q.rowHeight.get(j)??0;let J=Q.columnWidth.get(V.x)??0,G=Q.rowHeight.get(V.y)??0;return{x:_+Math.floor(J/2)+Q.offsetX,y:K+Math.floor(G/2)+Q.offsetY}}function O8(Q,$){return $.map((Z)=>LQ(Q,Z))}function iQ(Q,$,Z,V){let _=V??p9(Q,$);if(Q.grid.has(wQ(Z)))if(_==="LR")return iQ(Q,$,{x:Z.x,y:Z.y+4},_);else return iQ(Q,$,{x:Z.x+4,y:Z.y},_);for(let K=0;K<3;K++)for(let J=0;J<3;J++){let G={x:Z.x+K,y:Z.y+J};Q.grid.set(wQ(G),$)}return $.gridCoord=Z,Z}function x9(Q,$){let Z=$.gridCoord,V=Q.config.boxBorderPadding,_=G8($.shape,$.displayLabel,{useAscii:Q.config.useAscii,padding:V}),K=_.gridColumns,J=_.gridRows;for(let G=0;G<K.length;G++){let j=Z.x+G,F=Q.columnWidth.get(j)??0;Q.columnWidth.set(j,Math.max(F,K[G]))}for(let G=0;G<J.length;G++){let j=Z.y+G,F=Q.rowHeight.get(j)??0;Q.rowHeight.set(j,Math.max(F,J[G]))}if(Z.x>0){let G=Q.columnWidth.get(Z.x-1)??0;Q.columnWidth.set(Z.x-1,Math.max(G,Q.config.paddingX))}if(Z.y>0){let G=Q.config.paddingY;if(g9(Q,$))G+=4;let j=Q.rowHeight.get(Z.y-1)??0;Q.rowHeight.set(Z.y-1,Math.max(j,G))}}function U8(Q,$){for(let Z of $){if(!Q.columnWidth.has(Z.x))Q.columnWidth.set(Z.x,Math.floor(Q.config.paddingX/2));if(!Q.rowHeight.has(Z.y))Q.rowHeight.set(Z.y,Math.floor(Q.config.paddingY/2))}}function P4(Q,$){return Q.subgraphs.some((Z)=>Z.nodes.includes($))}function HQ(Q,$){let Z=null;for(let V of Q.subgraphs)if(V.nodes.includes($)){if(!Z||m9(Z,V))Z=V}return Z}function m9(Q,$){let Z=$;while(Z!==null){if(Z===Q)return!0;Z=Z.parent}return!1}function p9(Q,$){let Z=HQ(Q,$);if(Z?.direction)return Z.direction;return Q.config.graphDirection}function g9(Q,$){let Z=HQ(Q,$);if(!Z)return!1;let V=!1;for(let _ of Q.edges)if(_.to===$){if(HQ(Q,_.from)!==Z){V=!0;break}}if(!V)return!1;for(let _ of Z.nodes){if(_===$||!_.gridCoord)continue;let K=!1;for(let J of Q.edges)if(J.to===_){if(HQ(Q,J.from)!==Z){K=!0;break}}if(K&&_.gridCoord.y<$.gridCoord.y)return!1}return!0}function B8(Q,$){if($.nodes.length===0)return;let Z=1e6,V=1e6,_=-1e6,K=-1e6;for(let j of $.children)if(B8(Q,j),j.nodes.length>0)Z=Math.min(Z,j.minX),V=Math.min(V,j.minY),_=Math.max(_,j.maxX),K=Math.max(K,j.maxY);for(let j of $.nodes){if(!j.drawingCoord||!j.drawing)continue;let F=j.drawingCoord.x,z=j.drawingCoord.y,U=F+j.drawing.length-1,N=z+j.drawing[0].length-1;Z=Math.min(Z,F),V=Math.min(V,z),_=Math.max(_,U),K=Math.max(K,N)}let J=2,G=2;$.minX=Z-J,$.minY=V-J-G,$.maxX=_+J,$.maxY=K+J}function h9(Q){let Z=Q.subgraphs.filter((V)=>V.parent===null&&V.nodes.length>0);for(let V=0;V<Z.length;V++)for(let _=V+1;_<Z.length;_++){let K=Z[V],J=Z[_];if(K.minX<J.maxX&&K.maxX>J.minX){if(K.maxY>=J.minY-1&&K.minY<J.minY)J.minY=K.maxY+1+1;else if(J.maxY>=K.minY-1&&J.minY<K.minY)K.minY=J.maxY+1+1}if(K.minY<J.maxY&&K.maxY>J.minY){if(K.maxX>=J.minX-1&&K.minX<J.minX)J.minX=K.maxX+1+1;else if(J.maxX>=K.minX-1&&J.minX<K.minX)K.minX=J.maxX+1+1}}}function c9(Q){for(let $ of Q.subgraphs)B8(Q,$);h9(Q)}function l9(Q){if(Q.subgraphs.length===0)return;let $=0,Z=0;for(let K of Q.subgraphs)$=Math.min($,K.minX),Z=Math.min(Z,K.minY);let V=-$,_=-Z;if(V===0&&_===0)return;Q.offsetX=V,Q.offsetY=_;for(let K of Q.subgraphs)K.minX+=V,K.minY+=_,K.maxX+=V,K.maxY+=_;for(let K of Q.nodes)if(K.drawingCoord)K.drawingCoord.x+=V,K.drawingCoord.y+=_}function W8(Q){let $=Q.config.graphDirection,Z=new Array(100).fill(0),V=new Set,_=[];for(let N of Q.nodes){if(!V.has(N.name))_.push(N);V.add(N.name);for(let O of q4(Q,N))V.add(O.name)}let K=_.filter((N)=>{let O=HQ(Q,N);if(!O)return!0;for(let B of Q.edges)if(B.to===N){if(HQ(Q,B.from)!==O)return!1}return!0}),J=!1,G=!1;for(let N of K)if(P4(Q,N)){if(q4(Q,N).length>0)G=!0}else J=!0;let j=$==="LR"&&J&&G,F,z=[];if(j)F=K.filter((N)=>!P4(Q,N)),z=K.filter((N)=>P4(Q,N));else F=K;for(let N of F){let O=$==="LR"?{x:0,y:Z[0]}:{x:Z[0],y:0};iQ(Q,Q.nodes[N.index],O),Z[0]=Z[0]+4}if(j&&z.length>0)for(let O of z){let B=$==="LR"?{x:4,y:Z[4]}:{x:Z[4],y:4};iQ(Q,Q.nodes[O.index],B),Z[4]=Z[4]+4}let U=F.length+z.length;while(U<Q.nodes.length){let N=U;for(let O of Q.nodes){if(O.gridCoord===null)continue;let B=O.gridCoord;for(let W of q4(Q,O)){if(W.gridCoord!==null)continue;let H=HQ(Q,O),A=HQ(Q,W),b=H&&H===A&&H.direction?H.direction:Q.config.graphDirection,M=b==="LR"?B.x+4:B.y+4,g;if(b!==Q.config.graphDirection)g=b==="LR"?B.y:B.x;else g=Z[M];let D=b==="LR"?{x:M,y:g}:{x:g,y:M};if(iQ(Q,Q.nodes[W.index],D,b),b===Q.config.graphDirection)Z[M]=g+4;U++}}if(U===N)break}for(let N of Q.nodes)x9(Q,N);Q.bundles=l4(Q),d4(Q);for(let N of Q.edges){if(N.bundle&&N.path.length>0){U8(Q,N.path),N4(Q,N);continue}h4(Q,N),U8(Q,N.path),N4(Q,N)}for(let N of Q.nodes)N.drawingCoord=LQ(Q,N.gridCoord),N.drawing=z8(N,Q);u4(Q.canvas,Q.columnWidth,Q.rowHeight),x4(Q.roleCanvas,Q.columnWidth,Q.rowHeight),c9(Q),l9(Q)}function d9(Q,$){return Q.edges.filter((Z)=>Z.from.name===$.name)}function q4(Q,$){return d9(Q,$).map((Z)=>Z.to)}function P8(Q){let $={actors:[],messages:[],blocks:[],notes:[]},Z=new Set,V=[];for(let _=1;_<Q.length;_++){let K=Q[_],J=K.match(/^(participant|actor)\s+(\S+?)(?:\s+as\s+(.+))?$/);if(J){let N=J[1],O=J[2],B=J[3]?.trim()??O,W=FQ(B);if(!Z.has(O))Z.add(O),$.actors.push({id:O,label:W,type:N});continue}let G=K.match(/^Note\s+(left of|right of|over)\s+([^:]+):\s*(.+)$/i);if(G){let N=G[1].toLowerCase(),O=G[2].trim(),B=FQ(G[3].trim()),W=O.split(",").map((A)=>A.trim());for(let A of W)oQ($,Z,A);let H="over";if(N==="left of")H="left";else if(N==="right of")H="right";$.notes.push({actorIds:W,text:B,position:H,afterIndex:$.messages.length-1});continue}let j=K.match(/^(loop|alt|opt|par|critical|break|rect)\s*(.*)$/);if(j){let N=j[1],O=j[2]?.trim()??"",B=FQ(O);V.push({type:N,label:B,startIndex:$.messages.length,dividers:[]});continue}let F=K.match(/^(else|and)\s*(.*)$/);if(F&&V.length>0){let N=F[2]?.trim()??"",O=FQ(N);V[V.length-1].dividers.push({index:$.messages.length,label:O});continue}if(K==="end"&&V.length>0){let N=V.pop();$.blocks.push({type:N.type,label:N.label,startIndex:N.startIndex,endIndex:Math.max($.messages.length-1,N.startIndex),dividers:N.dividers});continue}let z=K.match(/^(\S+?)\s*(--?>?>|--?[)x]|--?>>|--?>)\s*([+-]?)(\S+?)\s*:\s*(.+)$/);if(z){let N=z[1],O=z[2],B=z[3],W=z[4],H=FQ(z[5].trim());oQ($,Z,N),oQ($,Z,W);let A=O.startsWith("--")?"dashed":"solid",b=O.includes(">>")||O.includes("x")?"filled":"open",M={from:N,to:W,label:H,lineStyle:A,arrowHead:b};if(B==="+")M.activate=!0;if(B==="-")M.deactivate=!0;$.messages.push(M);continue}let U=K.match(/^(\S+?)\s*(->>|-->>|-\)|--\)|-x|--x|->|-->)\s*([+-]?)(\S+?)\s*:\s*(.+)$/);if(U){let N=U[1],O=U[2],B=U[3],W=U[4],H=FQ(U[5].trim());oQ($,Z,N),oQ($,Z,W);let A=O.startsWith("--")?"dashed":"solid",b=O.includes(">>")||O.includes("x")?"filled":"open",M={from:N,to:W,label:H,lineStyle:A,arrowHead:b};if(B==="+")M.activate=!0;if(B==="-")M.deactivate=!0;$.messages.push(M);continue}}return $}function oQ(Q,$,Z){if(!$.has(Z))$.add(Z),Q.actors.push({id:Z,label:Z,type:"participant"})}function q8(Q,$,Z,V){let _=Q.split(`
8`).map((q)=>q.trim()).filter((q)=>q.length>0&&!q.startsWith("%%")),K=P8(_);if(K.actors.length===0)return"";let J=$.useAscii,G=J?"-":"─",j=J?"|":"│",F=J?"+":"┌",z=J?"+":"┐",U=J?"+":"└",N=J?"+":"┘",O=J?"+":"┬",B=J?"+":"┴",W=J?"+":"├",H=J?"+":"┤",A=new Map;K.actors.forEach((q,T)=>A.set(q.id,T));let b=1,g=K.actors.map((q)=>K4(q.label)+2*b+2).map((q)=>Math.ceil(q/2)),D=K.actors.map((q)=>O4(q.label)+2),i=Math.max(...D,3),UQ=new Array(Math.max(K.actors.length-1,0)).fill(0);for(let q of K.messages){let T=A.get(q.from),S=A.get(q.to);if(T===S)continue;let L=Math.min(T,S),f=Math.max(T,S),E=K4(q.label)+4,s=f-L,v=Math.ceil(E/s);for(let X=L;X<f;X++)UQ[X]=Math.max(UQ[X],v)}let x=[g[0]];for(let q=1;q<K.actors.length;q++){let T=Math.max(g[q-1]+g[q]+2,UQ[q-1]+2,10);x[q]=x[q-1]+T}let ZQ=[],y=[],t=new Map,I=new Map,a=new Map,o=[],r=i;for(let q=0;q<K.messages.length;q++){for(let f=0;f<K.blocks.length;f++)if(K.blocks[f].startIndex===q)r+=2,t.set(f,r-1);for(let f=0;f<K.blocks.length;f++)for(let E=0;E<K.blocks[f].dividers.length;E++)if(K.blocks[f].dividers[E].index===q)r+=1,a.set(`${f}:${E}`,r),r+=1;r+=1;let T=K.messages[q],S=T.from===T.to,L=O4(T.label);if(S)y[q]=r+1,ZQ[q]=r,r+=2+L;else y[q]=r,ZQ[q]=r+L,r+=L+1;for(let f=0;f<K.notes.length;f++)if(K.notes[f].afterIndex===q){r+=1;let E=K.notes[f],s=VQ(E.text),v=Math.max(...s.map((h)=>h.length))+4,X=s.length+2,n=A.get(E.actorIds[0])??0,R;if(E.position==="left")R=x[n]-v-1;else if(E.position==="right")R=x[n]+2;else if(E.actorIds.length>=2){let h=A.get(E.actorIds[1])??n;R=Math.floor((x[n]+x[h])/2)-Math.floor(v/2)}else R=x[n]-Math.floor(v/2);R=Math.max(0,R),o.push({x:R,y:r,width:v,height:X,lines:s}),r+=X}for(let f=0;f<K.blocks.length;f++)if(K.blocks[f].endIndex===q)r+=1,I.set(f,r),r+=1}r+=1;let w=r,e=w+i,GQ=x[x.length-1]??0,jQ=g[g.length-1]??0,k=GQ+jQ+2;for(let q=0;q<K.messages.length;q++){let T=K.messages[q];if(T.from===T.to){let S=A.get(T.from),L=x[S]+6+2+T.label.length;k=Math.max(k,L+1)}}for(let q of o)k=Math.max(k,q.x+q.width+1);let m=_Q(k,e-1),C=CQ(k,e-1);function Y(q,T,S,L){if(q>=0&&q<m.length&&T>=0&&T<(m[0]?.length??0))m[q][T]=S,fQ(C,q,T,L)}function d(q,T,S){let L=VQ(S),f=K4(S),E=f+2*b+2,s=L.length+2,v=q-Math.floor(E/2);Y(v,T,F,"border");for(let n=1;n<E-1;n++)Y(v+n,T,G,"border");Y(v+E-1,T,z,"border");for(let n=0;n<L.length;n++){let R=T+1+n;Y(v,R,j,"border"),Y(v+E-1,R,j,"border");let h=L[n],JQ=v+1+b+Math.floor((f-h.length)/2);for(let $Q=0;$Q<h.length;$Q++)Y(JQ+$Q,R,h[$Q],"text")}let X=T+s-1;Y(v,X,U,"border");for(let n=1;n<E-1;n++)Y(v+n,X,G,"border");Y(v+E-1,X,N,"border")}for(let q=0;q<K.actors.length;q++){let T=x[q];for(let S=i;S<=w;S++)Y(T,S,j,"line")}for(let q=0;q<K.actors.length;q++){let T=K.actors[q];if(d(x[q],0,T.label),d(x[q],w,T.label),!J)Y(x[q],i-1,O,"junction"),Y(x[q],w,B,"junction")}for(let q=0;q<K.messages.length;q++){let T=K.messages[q],S=A.get(T.from),L=A.get(T.to),f=x[S],E=x[L],s=S===L,v=T.lineStyle==="dashed",X=T.arrowHead==="filled",n=v?J?".":"╌":G;if(s){let R=ZQ[q],h=Math.max(4,4);Y(f,R,W,"junction");for(let KQ=f+1;KQ<f+h;KQ++)Y(KQ,R,n,"line");Y(f+h,R,J?"+":"┐","corner"),Y(f+h,R+1,j,"line");let JQ=f+h+2;for(let KQ=0;KQ<T.label.length;KQ++)if(JQ+KQ<k)Y(JQ+KQ,R+1,T.label[KQ],"text");let $Q=X?J?"<":"◀":J?"<":"◁";Y(f,R+2,$Q,"arrow");for(let KQ=f+1;KQ<f+h;KQ++)Y(KQ,R+2,n,"line");Y(f+h,R+2,J?"+":"┘","corner")}else{let R=y[q],h=ZQ[q],JQ=f<E,$Q=Math.floor((f+E)/2),KQ=VQ(T.label);for(let zQ=0;zQ<KQ.length;zQ++){let NQ=KQ[zQ],MQ=$Q-Math.floor(NQ.length/2),uQ=R+zQ;for(let XQ=0;XQ<NQ.length;XQ++){let hQ=MQ+XQ;if(hQ>=0&&hQ<k)Y(hQ,uQ,NQ[XQ],"text")}}if(JQ){for(let NQ=f+1;NQ<E;NQ++)Y(NQ,h,n,"line");Y(E,h,X?J?">":"▶":J?">":"▷","arrow")}else{for(let NQ=E+1;NQ<f;NQ++)Y(NQ,h,n,"line");Y(E,h,X?J?"<":"◀":J?"<":"◁","arrow")}}}for(let q=0;q<K.blocks.length;q++){let T=K.blocks[q],S=t.get(q),L=I.get(q);if(S===void 0||L===void 0)continue;let f=k,E=0;for(let R=T.startIndex;R<=T.endIndex;R++){if(R>=K.messages.length)break;let h=K.messages[R],JQ=A.get(h.from)??0,$Q=A.get(h.to)??0;f=Math.min(f,x[Math.min(JQ,$Q)]),E=Math.max(E,x[Math.max(JQ,$Q)])}let s=Math.max(0,f-4),v=Math.min(k-1,E+4);Y(s,S,F,"border");for(let R=s+1;R<v;R++)Y(R,S,G,"border");Y(v,S,z,"border");let X=T.label?`${T.type} [${T.label}]`:T.type,n=VQ(X);for(let R=0;R<n.length&&S+R<L;R++){let h=n[R];for(let JQ=0;JQ<h.length&&s+1+JQ<v;JQ++)Y(s+1+JQ,S+R,h[JQ],"text")}Y(s,L,U,"border");for(let R=s+1;R<v;R++)Y(R,L,G,"border");Y(v,L,N,"border");for(let R=S+1;R<L;R++)Y(s,R,j,"border"),Y(v,R,j,"border");for(let R=0;R<T.dividers.length;R++){let h=a.get(`${q}:${R}`);if(h===void 0)continue;let JQ=QQ();Y(s,h,W,"junction");for(let KQ=s+1;KQ<v;KQ++)Y(KQ,h,JQ,"line");Y(v,h,H,"junction");let $Q=T.dividers[R].label;if($Q){let KQ=`[${$Q}]`;for(let zQ=0;zQ<KQ.length&&s+1+zQ<v;zQ++)Y(s+1+zQ,h,KQ[zQ],"text")}}}for(let q of o){RQ(m,q.x+q.width,q.y+q.height),yQ(C,q.x+q.width,q.y+q.height),Y(q.x,q.y,F,"border");for(let S=1;S<q.width-1;S++)Y(q.x+S,q.y,G,"border");Y(q.x+q.width-1,q.y,z,"border");for(let S=0;S<q.lines.length;S++){let L=q.y+1+S;Y(q.x,L,j,"border"),Y(q.x+q.width-1,L,j,"border");for(let f=0;f<q.lines[S].length;f++)Y(q.x+2+f,L,q.lines[S][f],"text")}let T=q.y+q.height-1;Y(q.x,T,U,"border");for(let S=1;S<q.width-1;S++)Y(q.x+S,T,G,"border");Y(q.x+q.width-1,T,N,"border")}return xQ(m,{roleCanvas:C,colorMode:Z,theme:V});function QQ(){return J?"-":"╌"}}function I8(Q){let $={classes:[],relationships:[],namespaces:[]},Z=new Map,V=null,_=null,K=0;for(let J=1;J<Q.length;J++){let G=Q[J];if(_&&K>0){if(G==="}"){if(K--,K===0)_=null;continue}let B=G.match(/^<<(\w+)>>$/);if(B){_.annotation=B[1];continue}let W=H8(G);if(W)if(W.isMethod)_.methods.push(W.member);else _.attributes.push(W.member);continue}let j=G.match(/^namespace\s+(\S+)\s*\{$/);if(j){V={name:j[1],classIds:[]};continue}if(G==="}"&&V){$.namespaces.push(V),V=null;continue}let F=G.match(/^class\s+(\S+?)(?:\s*~(\w+)~)?\s*\{$/);if(F){let B=F[1],W=F[2],H=lQ(Z,B);if(W)H.label=`${B}<${W}>`;if(_=H,K=1,V)V.classIds.push(B);continue}let z=G.match(/^class\s+(\S+?)(?:\s*~(\w+)~)?\s*$/);if(z){let B=z[1],W=z[2],H=lQ(Z,B);if(W)H.label=`${B}<${W}>`;if(V)V.classIds.push(B);continue}let U=G.match(/^class\s+(\S+?)\s*\{\s*<<(\w+)>>\s*\}$/);if(U){let B=lQ(Z,U[1]);B.annotation=U[2];continue}let N=G.match(/^(\S+?)\s*:\s*(.+)$/);if(N){let B=N[2];if(!B.match(/<\|--|--|\*--|o--|-->|\.\.>|\.\.\|>/)){let W=lQ(Z,N[1]),H=H8(B);if(H)if(H.isMethod)W.methods.push(H.member);else W.attributes.push(H.member);continue}}let O=n9(G);if(O){lQ(Z,O.from),lQ(Z,O.to),$.relationships.push(O);continue}}return $.classes=[...Z.values()],$}function lQ(Q,$){let Z=Q.get($);if(!Z)Z={id:$,label:$,attributes:[],methods:[]},Q.set($,Z);return Z}function H8(Q){let $=Q.trim().replace(/;$/,"");if(!$)return null;let Z="",V=$;if(/^[+\-#~]/.test(V))Z=V[0],V=V.slice(1).trim();let _=V.match(/^(.+?)\(([^)]*)\)(?:\s*(.+))?$/);if(_){let z=_[1].trim(),U=_[2]?.trim()||void 0,N=_[3]?.trim(),O=z.endsWith("$")||V.includes("$"),B=z.endsWith("*")||V.includes("*");return{member:{visibility:Z,name:z.replace(/[$*]$/,""),type:N||void 0,isStatic:O,isAbstract:B,isMethod:!0,params:U},isMethod:!0}}let K=V.split(/\s+/),J,G;if(K.length>=2)G=K[0],J=K.slice(1).join(" ");else J=K[0]??V;let j=J.endsWith("$"),F=J.endsWith("*");return{member:{visibility:Z,name:J.replace(/[$*]$/,""),type:G||void 0,isStatic:j,isAbstract:F,isMethod:!1},isMethod:!1}}function n9(Q){let $=Q.match(/^(\S+?)\s+(?:"([^"]*?)"\s+)?(<\|--|<\|\.\.|\*--|o--|-->|--\*|--o|--\|>|\.\.>|\.\.\|>|<--|<\.\.?|--)\s+(?:"([^"]*?)"\s+)?(\S+?)(?:\s*:\s*(.+))?$/);if(!$)return null;let Z=$[1],V=$[2],_=V?FQ(V):void 0,K=$[3].trim(),J=$[4],G=J?FQ(J):void 0,j=$[5],F=$[6]?.trim(),z=F?FQ(F):void 0,U=s9(K);if(!U)return null;return{from:Z,to:j,type:U.type,markerAt:U.markerAt,label:z,fromCardinality:_,toCardinality:G}}function s9(Q){switch(Q.trim()){case"<|--":return{type:"inheritance",markerAt:"from"};case"--|>":return{type:"inheritance",markerAt:"to"};case"<|..":return{type:"realization",markerAt:"from"};case"..|>":return{type:"realization",markerAt:"to"};case"*--":return{type:"composition",markerAt:"from"};case"--*":return{type:"composition",markerAt:"to"};case"o--":return{type:"aggregation",markerAt:"from"};case"--o":return{type:"aggregation",markerAt:"to"};case"-->":return{type:"association",markerAt:"to"};case"<--":return{type:"association",markerAt:"from"};case"..>":return{type:"dependency",markerAt:"to"};case"<..":return{type:"dependency",markerAt:"from"};case"--":return{type:"association",markerAt:"to"};default:return null}}function i9(Q){if(/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|]$/.test(Q))return"border";return"text"}function T8(Q){let $=Q.visibility||"",Z=Q.type?`: ${Q.type}`:"";return`${$}${Q.name}${Z}`}function o9(Q){let $=[];if(Q.annotation)$.push(`<<${Q.annotation}>>`);let Z=VQ(Q.label);$.push(...Z);let V=Q.attributes.map(T8),_=Q.methods.map(T8);if(V.length===0&&_.length===0)return[$];if(_.length===0)return[$,V];return[$,V,_]}function t9(Q,$){return{type:Q,markerAt:$,dashed:Q==="dependency"||Q==="realization"}}function pQ(Q,$,Z){switch(Q){case"inheritance":case"realization":if(Z==="down")return $?"^":"△";else if(Z==="up")return $?"v":"▽";else if(Z==="left")return $?">":"◁";else return $?"<":"▷";case"composition":return $?"*":"◆";case"aggregation":return $?"o":"◇";case"association":case"dependency":if(Z==="down")return $?"v":"▼";else if(Z==="up")return $?"^":"▲";else if(Z==="left")return $?"<":"◀";else return $?">":"▶"}}function k8(Q,$,Z,V){let _=Q.split(`
9`).map((k)=>k.trim()).filter((k)=>k.length>0&&!k.startsWith("%%")),K=I8(_);if(K.classes.length===0)return"";let J=$.useAscii,G=4,j=3,F=new Map,z=new Map,U=new Map;for(let k of K.classes){let m=o9(k);F.set(k.id,m);let C=0;for(let q of m)for(let T of q)C=Math.max(C,T.length);let Y=C+4,d=0;for(let q of m)d+=Math.max(q.length,1);let QQ=d+(m.length-1)+2;z.set(k.id,Y),U.set(k.id,QQ)}let N=new Map;for(let k of K.classes)N.set(k.id,k);let O=new Map,B=new Map;for(let k of K.relationships){let m=k.type==="inheritance"||k.type==="realization",C=m&&k.markerAt==="to"?k.to:k.from,Y=m&&k.markerAt==="to"?k.from:k.to;if(!O.has(Y))O.set(Y,new Set);if(O.get(Y).add(C),!B.has(C))B.set(C,new Set);B.get(C).add(Y)}let W=new Map,A=K.classes.filter((k)=>!O.has(k.id)||O.get(k.id).size===0).map((k)=>k.id);for(let k of A)W.set(k,0);let b=K.classes.length-1,M=0;while(M<A.length){let k=A[M++],m=B.get(k);if(!m)continue;for(let C of m){let Y=(W.get(k)??0)+1;if(Y>b)continue;if(!W.has(C)||W.get(C)<Y)W.set(C,Y),A.push(C)}}for(let k of K.classes)if(!W.has(k.id))W.set(k.id,0);let g=Math.max(...[...W.values()],0),D=Array.from({length:g+1},()=>[]);for(let k of K.classes)D[W.get(k.id)].push(k.id);let i=new Map,UQ=0;for(let k=0;k<=g;k++){let m=D[k];if(m.length===0)continue;let C=0,Y=0;for(let d of m){let QQ=N.get(d),q=z.get(d),T=U.get(d);i.set(d,{cls:QQ,sections:F.get(d),x:C,y:UQ,width:q,height:T}),C+=q+G,Y=Math.max(Y,T)}UQ+=Y+j}let x=0,ZQ=0;for(let k of i.values())x=Math.max(x,k.x+k.width),ZQ=Math.max(ZQ,k.y+k.height);x+=4,ZQ+=2;let y=_Q(x-1,ZQ-1),t=CQ(x-1,ZQ-1);function I(k,m,C,Y){if(k>=0&&k<y.length&&m>=0&&m<(y[0]?.length??0))y[k][m]=C,fQ(t,k,m,Y)}for(let k of i.values()){let m=J4(k.sections,J);for(let C=0;C<m.length;C++)for(let Y=0;Y<m[0].length;Y++){let d=m[C][Y];if(d!==" "){let QQ=k.x+C,q=k.y+Y;if(QQ<x&&q<ZQ)I(QQ,q,d,i9(d))}}}let a=[];for(let k of i.values())a.push({x1:k.x,x2:k.x+k.width-1,y1:k.y,y2:k.y+k.height-1});function o(k,m,C){for(let[Y,d]of i.entries()){if(C?.has(Y))continue;if(k>=d.x&&k<=d.x+d.width-1&&m>=d.y&&m<=d.y+d.height-1)return!0}return!1}function r(k,m,C,Y){let d=!0;for(let QQ=Math.min(m,C);QQ<=Math.max(m,C);QQ++)if(o(k,QQ,Y)){d=!1;break}if(d)return k;for(let QQ=1;QQ<x+10;QQ++){let q=k+QQ;d=!0;for(let S=Math.min(m,C);S<=Math.max(m,C);S++)if(o(q,S,Y)){d=!1;break}if(d)return q;let T=k-QQ;if(T>=0){d=!0;for(let S=Math.min(m,C);S<=Math.max(m,C);S++)if(o(T,S,Y)){d=!1;break}if(d)return T}}return x+2}let w=J?"-":"─",e=J?"|":"│",GQ=J?".":"╌",jQ=J?":":"┊";for(let k of K.relationships){let m=i.get(k.from),C=i.get(k.to);if(!m||!C)continue;let Y=t9(k.type,k.markerAt),d=Y.dashed?GQ:w,QQ=Y.dashed?jQ:e,q=new Set([k.from,k.to]),T=m.x+Math.floor(m.width/2),S=m.y+m.height-1,L=C.x+Math.floor(C.width/2),f=C.y;if(S<f){let E=r(T,S+1,f-1,q),s=E!==T;if(E>=x)RQ(y,E+2,ZQ);if(s){let v=S+1,X=f-1,n=Math.min(T,E),R=Math.max(T,E);for(let h=n;h<=R;h++)I(h,v,d,"line");if(!J&&v<(y[0]?.length??0))if(T<E)I(T,v,"└","corner"),I(E,v,"┐","corner");else I(T,v,"┘","corner"),I(E,v,"┌","corner");for(let h=v+1;h<=X;h++)I(E,h,QQ,"line");if(E!==L){let h=Math.min(E,L),JQ=Math.max(E,L);for(let $Q=h;$Q<=JQ;$Q++)I($Q,X,d,"line");if(!J&&X<(y[0]?.length??0))if(E<L)I(E,X,"└","corner"),I(L,X,"┐","corner");else I(E,X,"┘","corner"),I(L,X,"┌","corner")}if(Y.markerAt==="to"){let h=pQ(Y.type,J,"down");I(L,X,h,"arrow")}if(Y.markerAt==="from"){let h=pQ(Y.type,J,"down");I(T,S+1,h,"arrow")}}else{let v=S+Math.floor((f-S)/2);for(let X=S+1;X<=v;X++)I(T,X,QQ,"line");if(T!==L&&v<(y[0]?.length??0)){let X=Math.min(T,L),n=Math.max(T,L);for(let R=X;R<=n;R++)I(R,v,d,"line");if(!J)I(T,v,T<L?"└":"┘","corner"),I(L,v,T<L?"┐":"┌","corner")}for(let X=v+1;X<f;X++)I(L,X,QQ,"line");if(Y.markerAt==="to")I(L,f-1,pQ(Y.type,J,"down"),"arrow");if(Y.markerAt==="from")I(T,S+1,pQ(Y.type,J,"down"),"arrow")}}else if(C.y+C.height-1<m.y){let E=m.y,s=C.y+C.height-1,v=s+Math.floor((E-s)/2);for(let X=E-1;X>=v;X--)I(T,X,QQ,"line");if(T!==L){let X=Math.min(T,L),n=Math.max(T,L);for(let R=X;R<=n;R++)I(R,v,d,"line");if(!J&&v>=0&&v<ZQ)I(T,v,T<L?"┌":"┐","corner"),I(L,v,T<L?"┘":"└","corner")}for(let X=v-1;X>s;X--)I(L,X,QQ,"line");if(Y.markerAt==="from"){let X=pQ(Y.type,J,"up"),n=E-1;for(let R=0;R<X.length;R++)I(T-Math.floor(X.length/2)+R,n,X[R],"arrow")}if(Y.markerAt==="to"){let n=Y.type==="inheritance"||Y.type==="realization"?"down":"up",R=pQ(Y.type,J,n),h=s+1;for(let JQ=0;JQ<R.length;JQ++)I(L-Math.floor(R.length/2)+JQ,h,R[JQ],"arrow")}}else{let E=Math.max(S,C.y+C.height-1)+2;RQ(y,x,E+1),yQ(t,x,E+1);for(let X=S+1;X<=E;X++)I(T,X,QQ,"line");let s=Math.min(T,L),v=Math.max(T,L);for(let X=s;X<=v;X++)I(X,E,d,"line");for(let X=E-1;X>=C.y+C.height;X--)I(L,X,QQ,"line");if(Y.markerAt==="from"){let X=pQ(Y.type,J,"down"),n=S+1;for(let R=0;R<X.length;R++)I(T-Math.floor(X.length/2)+R,n,X[R],"arrow")}if(Y.markerAt==="to"){let X=pQ(Y.type,J,"up"),n=C.y+C.height;for(let R=0;R<X.length;R++)I(L-Math.floor(X.length/2)+R,n,X[R],"arrow")}}if(k.label){let E=VQ(k.label),s=Math.max(...E.map(($Q)=>$Q.length))+2,v,X;if(S<f)v=Math.floor((S+1+f-1)/2),X=Math.floor((T+L)/2);else if(C.y+C.height-1<m.y){let $Q=C.y+C.height-1;v=Math.floor(($Q+1+m.y-1)/2),X=Math.floor((T+L)/2)}else v=Math.max(S,C.y+C.height-1)+2,X=Math.floor((T+L)/2);let n=v,R=Math.floor(E.length/2),h=!1;for(let $Q=0;$Q<E.length;$Q++){let KQ=n-R+$Q,zQ=X-Math.floor(s/2),NQ=Math.max(0,zQ);for(let MQ=NQ;MQ<NQ+s;MQ++)if(o(MQ,KQ,q)){h=!0;break}if(h)break}if(h){let $Q=S+1,KQ=f-1;for(let zQ=$Q;zQ<=KQ;zQ++){let NQ=!0,MQ=X-Math.floor(s/2),uQ=Math.max(0,MQ);for(let XQ=uQ;XQ<uQ+s;XQ++)if(o(XQ,zQ,q)){NQ=!1;break}if(NQ){n=zQ;break}}}let JQ=n-R;for(let $Q=0;$Q<E.length;$Q++){let KQ=` ${E[$Q]} `,zQ=X-Math.floor(KQ.length/2),NQ=Math.max(0,zQ),MQ=JQ+$Q,uQ=NQ+KQ.length;if(uQ>0&&MQ>=0)RQ(y,Math.max(uQ,1),Math.max(MQ+1,1)),yQ(t,Math.max(uQ,1),Math.max(MQ+1,1));for(let XQ=0;XQ<KQ.length;XQ++){let hQ=NQ+XQ;if(hQ>=0&&MQ>=0)I(hQ,MQ,KQ[XQ],"text")}}}}return xQ(y,{roleCanvas:t,colorMode:Z,theme:V})}function A8(Q){let $={entities:[],relationships:[]},Z=new Map,V=null;for(let _=1;_<Q.length;_++){let K=Q[_];if(V){if(K==="}"){V=null;continue}let j=r9(K);if(j)V.attributes.push(j);continue}let J=K.match(/^(\S+)\s*\{$/);if(J){let j=J[1];V=H4(Z,j);continue}let G=a9(K);if(G){H4(Z,G.entity1),H4(Z,G.entity2),$.relationships.push(G);continue}}return $.entities=[...Z.values()],$}function H4(Q,$){let Z=Q.get($);if(!Z)Z={id:$,label:$,attributes:[]},Q.set($,Z);return Z}function r9(Q){let $=Q.match(/^(\S+)\s+(\S+)(?:\s+(.+))?$/);if(!$)return null;let Z=$[1],V=$[2],_=$[3]?.trim()??"",K=[],J,G=_.match(/"([^"]*)"/);if(G)J=FQ(G[1]);let j=_.replace(/"[^"]*"/,"").trim();for(let F of j.split(/\s+/)){let z=F.toUpperCase();if(z==="PK"||z==="FK"||z==="UK")K.push(z)}return{type:Z,name:V,keys:K,comment:J}}function a9(Q){let $=Q.match(/^(\S+)\s+([|o}{]+(?:--|\.\.)[|o}{]+)\s+(\S+)\s*:\s*(.+)$/);if(!$)return null;let Z=$[1],V=$[2],_=$[3],K=$[4].trim().replace(/^["']|["']$/g,""),J=FQ(K),G=V.match(/^([|o}{]+)(--|\.\.?)([|o}{]+)$/);if(!G)return null;let j=G[1],F=G[2],z=G[3],U=Y8(j),N=Y8(z),O=F==="--";if(!U||!N)return null;return{entity1:Z,entity2:_,cardinality1:U,cardinality2:N,label:J,identifying:O}}function Y8(Q){let $=Q.split("").sort().join("");if($==="||")return"one";if($==="o|")return"zero-one";if($==="|}"||$==="{|")return"many";if($==="{o"||$==="o{")return"zero-many";return null}function e9(Q){if(/^[┌┐└┘├┤┬┴┼│─╭╮╰╯+\-|]$/.test(Q))return"border";return"text"}function Q$(Q){return`${Q.keys.length>0?Q.keys.join(",")+" ":"   "}${Q.type} ${Q.name}`}function $$(Q){let $=VQ(Q.label),Z=Q.attributes.map(Q$);if(Z.length===0)return[$];return[$,Z]}function V4(Q,$,Z=!1){if($)switch(Q){case"one":return"|";case"zero-one":return"o|";case"many":return Z?"<":">";case"zero-many":return Z?"o<":">o"}else switch(Q){case"one":return"│";case"zero-one":return"○│";case"many":return Z?"╟":"╢";case"zero-many":return Z?"○╟":"╢○"}}function Z$(Q){let $=new Set,Z=[],V=new Map;for(let K of Q.entities)V.set(K.id,new Set);for(let K of Q.relationships)V.get(K.entity1)?.add(K.entity2),V.get(K.entity2)?.add(K.entity1);function _(K,J){let G=[K];while(G.length>0){let j=G.pop();if($.has(j))continue;$.add(j),J.add(j);for(let F of V.get(j)??[])if(!$.has(F))G.push(F)}}for(let K of Q.entities)if(!$.has(K.id)){let J=new Set;if(_(K.id,J),J.size>0)Z.push(J)}return Z}function M8(Q,$,Z,V){let _=Q.split(`
10`).map((y)=>y.trim()).filter((y)=>y.length>0&&!y.startsWith("%%")),K=A8(_);if(K.entities.length===0)return"";let J=$.useAscii,G=6,j=4,F=6,z=new Map,U=new Map,N=new Map,O=new Map;for(let y of K.entities){O.set(y.id,y);let t=$$(y);z.set(y.id,t);let I=0;for(let w of t)for(let e of w)I=Math.max(I,e.length);let a=I+4,o=0;for(let w of t)o+=Math.max(w.length,1);let r=o+(t.length-1)+2;U.set(y.id,a),N.set(y.id,r)}let B=Z$(K),W=new Map,H=0;for(let y of B){let t=K.entities.filter((e)=>y.has(e.id)),I=Math.max(2,Math.ceil(Math.sqrt(t.length))),a=0,o=0,r=0,w=H;for(let e of t){let GQ=U.get(e.id),jQ=N.get(e.id);if(r>=I)H+=o+j,a=0,o=0,r=0;W.set(e.id,{entity:e,sections:z.get(e.id),x:a,y:H,width:GQ,height:jQ}),a+=GQ+G,o=Math.max(o,jQ),r++}H+=o+F}let A=0,b=0;for(let y of W.values())A=Math.max(A,y.x+y.width),b=Math.max(b,y.y+y.height);A+=4,b+=2;let M=_Q(A-1,b-1),g=CQ(A-1,b-1);function D(y,t,I,a){if(y>=0&&y<M.length&&t>=0&&t<(M[0]?.length??0))M[y][t]=I,fQ(g,y,t,a)}for(let y of W.values()){let t=J4(y.sections,J);for(let I=0;I<t.length;I++)for(let a=0;a<t[0].length;a++){let o=t[I][a];if(o!==" "){let r=y.x+I,w=y.y+a;if(r<A&&w<b)D(r,w,o,e9(o))}}}let i=J?"-":"─",UQ=J?"|":"│",x=J?".":"╌",ZQ=J?":":"┊";for(let y of K.relationships){let t=W.get(y.entity1),I=W.get(y.entity2);if(!t||!I)continue;let a=y.identifying?i:x,o=y.identifying?UQ:ZQ,r=t.x+Math.floor(t.width/2),w=t.y+Math.floor(t.height/2),e=I.x+Math.floor(I.width/2),GQ=I.y+Math.floor(I.height/2);if(Math.abs(w-GQ)<Math.max(t.height,I.height)){let[k,m]=r<e?[t,I]:[I,t],[C,Y]=r<e?[y.cardinality1,y.cardinality2]:[y.cardinality2,y.cardinality1],d=k.x+k.width,QQ=m.x-1,q=k.y+Math.floor(k.height/2);for(let L=d;L<=QQ;L++)D(L,q,a,"line");let T=V4(C,J,!1);for(let L=0;L<T.length;L++)D(d+L,q,T[L],"arrow");let S=V4(Y,J,!0);for(let L=0;L<S.length;L++)D(QQ-S.length+1+L,q,S[L],"arrow");if(y.label){let L=VQ(y.label),f=Math.floor((d+QQ)/2);for(let E=0;E<L.length;E++){let s=L[E],v=Math.max(d,f-Math.floor(s.length/2)),X=q+1+E;RQ(M,Math.max(v+s.length,1),Math.max(X+1,1)),yQ(g,Math.max(v+s.length,1),Math.max(X+1,1));for(let n=0;n<s.length;n++){let R=v+n;if(R>=d&&R<=QQ)D(R,X,s[n],"text")}}}}else{let[k,m]=w<GQ?[t,I]:[I,t],[C,Y]=w<GQ?[y.cardinality1,y.cardinality2]:[y.cardinality2,y.cardinality1],d=k.y+k.height,QQ=m.y-1,q=k.x+Math.floor(k.width/2);for(let E=d;E<=QQ;E++)D(q,E,o,"line");let T=m.x+Math.floor(m.width/2);if(q!==T){let E=Math.floor((d+QQ)/2),s=Math.min(q,T),v=Math.max(q,T);for(let X=s;X<=v;X++)D(X,E,a,"line");for(let X=E+1;X<=QQ;X++)D(T,X,o,"line")}let S=V4(C,J,!1);for(let E=0;E<S.length;E++)D(q-Math.floor(S.length/2)+E,d,S[E],"arrow");let L=q!==T?T:q,f=V4(Y,J,!0);for(let E=0;E<f.length;E++)D(L-Math.floor(f.length/2)+E,QQ,f[E],"arrow");if(y.label){let E=VQ(y.label),v=Math.floor((d+QQ)/2)-Math.floor((E.length-1)/2);for(let X=0;X<E.length;X++){let n=E[X],R=q+2,h=v+X;if(h>=0)for(let JQ=0;JQ<n.length;JQ++){let $Q=R+JQ;if($Q>=0)RQ(M,$Q+1,h+1),yQ(g,$Q+1,h+1),D($Q,h,n[JQ],"text")}}}}}return xQ(M,{roleCanvas:g,colorMode:Z,theme:V})}function E8(Q){let $={},Z={},V=[],_,K=!1;for(let J of Q){if(/^xychart(-beta)?\b/i.test(J)){if(/\bhorizontal\b/i.test(J))K=!0;continue}let G=J.match(/^title\s+"([^"]+)"/);if(G){_=G[1];continue}let j=J.match(/^x-axis\s+(?:"([^"]*)"\s*)?\[([^\]]+)\]/);if(j){if(j[1])$.title=j[1];$.categories=j[2].split(",").map((B)=>B.trim());continue}let F=J.match(/^x-axis\s+(?:"([^"]*)"\s+)?(-?\d+(?:\.\d+)?)\s*-->\s*(-?\d+(?:\.\d+)?)/);if(F){if(F[1])$.title=F[1];$.range={min:parseFloat(F[2]),max:parseFloat(F[3])};continue}let z=J.match(/^y-axis\s+(?:"([^"]*)"\s+)?(-?\d+(?:\.\d+)?)\s*-->\s*(-?\d+(?:\.\d+)?)/);if(z){if(z[1])Z.title=z[1];Z.range={min:parseFloat(z[2]),max:parseFloat(z[3])};continue}let U=J.match(/^y-axis\s+"([^"]+)"\s*$/);if(U){Z.title=U[1];continue}let N=J.match(/^bar\s+\[([^\]]+)\]/);if(N){V.push({type:"bar",data:X8(N[1])});continue}let O=J.match(/^line\s+\[([^\]]+)\]/);if(O){V.push({type:"line",data:X8(O[1])});continue}}if(!Z.range&&V.length>0){let J=V.flatMap((z)=>z.data),G=Math.min(...J),j=Math.max(...J),F=j-G||1;if(G=G-F*0.1,j=j+F*0.1,G>0&&G<F*0.5)G=0;Z.range={min:G,max:j}}if(!Z.range)Z.range={min:0,max:100};return{title:_,horizontal:K,xAxis:$,yAxis:Z,series:V}}function X8(Q){return Q.split(",").map(($)=>parseFloat($.trim()))}var D8="#3b82f6";function L8(Q){let $=Q.replace("#",""),Z=parseInt($.substring(0,2),16)/255,V=parseInt($.substring(2,4),16)/255,_=parseInt($.substring(4,6),16)/255,K=Math.max(Z,V,_),J=Math.min(Z,V,_),G=(K+J)/2;if(K===J)return[0,0,G*100];let j=K-J,F=G>0.5?j/(2-K-J):j/(K+J),z;if(K===Z)z=((V-_)/j+(V<_?6:0))/6;else if(K===V)z=((_-Z)/j+2)/6;else z=((Z-V)/j+4)/6;return[z*360,F*100,G*100]}function K$(Q,$,Z){let V=$/100,_=Z/100,K=(1-Math.abs(2*_-1))*V,J=K*(1-Math.abs(Q/60%2-1)),G=_-K/2,j,F,z;if(Q<60)j=K,F=J,z=0;else if(Q<120)j=J,F=K,z=0;else if(Q<180)j=0,F=K,z=J;else if(Q<240)j=0,F=J,z=K;else if(Q<300)j=J,F=0,z=K;else j=K,F=0,z=J;let U=(N)=>Math.round((N+G)*255).toString(16).padStart(2,"0");return`#${U(j)}${U(F)}${U(z)}`}function R8(Q){return/^#[0-9a-fA-F]{6}$/.test(Q)}function J$(Q){return L8(Q)[2]<50}function S8(Q,$,Z){if(Q===0)return $;let V=R8($)?$:"#3b82f6",_=Z&&R8(Z)?Z:void 0,[K,J]=L8(V),G=Math.max(55,Math.min(85,J)),j=Math.ceil(Q/2),F=Q%2===1,z=_&&J$(_)?!F:F,U=z?Math.max(25,48-j*13):Math.min(78,55+j*11),N=(z?-8:12)*j,O=((K+N)%360+360)%360;return K$(O,G,U)}var w8=60,y8=20,V$={hLine:"─",vLine:"│",origin:"┼",yTick:"┤",xTick:"┬",bar:"█",grid:"·",cornerTL:"╭",cornerTR:"╮",cornerBL:"╰",cornerBR:"╯"},_$={hLine:"-",vLine:"|",origin:"+",yTick:"+",xTick:"+",bar:"#",grid:".",cornerTL:"+",cornerTR:"+",cornerBL:"+",cornerBR:"+"};function v8(Q,$){let Z=$.accent??D8;if(Q<=1)return[Z];return Array.from({length:Q},(V,_)=>S8(_,Z,$.bg))}function G$(Q,$){switch(Q){case"text":return $.fg;case"border":return $.border;case"line":return $.line;case"arrow":return $.arrow;case"corner":return $.corner??$.line;case"junction":return $.junction??$.border;default:return $.fg}}function C8(Q,$,Z,V){let _=Q.split(`
11`).map((G)=>G.trim()).filter((G)=>G.length>0&&!G.startsWith("%%")),K=E8(_),J=$.useAscii?_$:V$;if(K.horizontal)return F$(K,J,Z,V);return j$(K,J,Z,V)}function j$(Q,$,Z,V){let _=g8(Q);if(_===0)return"";let K=Q.yAxis.range,J=c8(K.min,K.max),G=J.map((w)=>_4(w)),j=Math.max(...G.map((w)=>w.length))+1,F=Math.max(w8,_*6),z=y8,U=Math.floor(F/_),N=h8(Q,_),O=!!Q.title,B=!!Q.xAxis.title,W=Q.series.length>1,H=O?0:-1,A=(O?2:0)+(W?1:0),b=j+1,M=b+U*_+2,g=A+z,D=g+1,i=B?D+1:-1,UQ=D+1+(B?1:0)+(W&&!O?0:0),x=b8(M,UQ),ZQ=u8(M,UQ),y=x8(M,UQ),t=v8(Q.series.length,V),I=(w)=>{let e=(w-K.min)/(K.max-K.min||1);return Math.round(e*(z-1))},a=(w)=>b+Math.floor(U*(w+0.5));if(O&&H>=0)bQ(x,ZQ,H,Math.floor(M/2-Q.title.length/2),Q.title,"text");if(W)f8(x,ZQ,y,Q,O?1:0,M,$,t);for(let w=0;w<z;w++){let e=A+(z-1-w);qQ(x,ZQ,e,b-1,$.vLine,"border")}qQ(x,ZQ,g,b-1,$.origin,"border");for(let w of J){let e=I(w);if(e<0||e>=z)continue;let GQ=A+(z-1-e),jQ=_4(w);qQ(x,ZQ,GQ,b-1,e===0?$.origin:$.yTick,"border");let k=j-jQ.length;bQ(x,ZQ,GQ,Math.max(0,k),jQ,"text")}for(let w=b;w<b+U*_;w++)qQ(x,ZQ,g,w,$.hLine,"border");for(let w=0;w<_;w++){let e=a(w);qQ(x,ZQ,g,e,$.xTick,"border");let GQ=N[w],jQ=e-Math.floor(GQ.length/2);bQ(x,ZQ,D,Math.max(0,jQ),GQ,"text")}if(B&&i>=0){let w=Q.xAxis.title;bQ(x,ZQ,i,Math.floor(M/2-w.length/2),w,"text")}for(let w of J){let e=I(w);if(e<0||e>=z)continue;let GQ=A+(z-1-e);for(let jQ=b;jQ<b+U*_;jQ++)if(m8(x,GQ,jQ)===" ")qQ(x,ZQ,GQ,jQ,$.grid,"line")}let o=[];for(let w=0;w<Q.series.length;w++)if(Q.series[w].type==="bar")o.push({data:Q.series[w].data,globalIdx:w});if(o.length>0){let w=o.length,e=Math.max(1,U-2),GQ=Math.max(1,Math.min(Math.floor(e/w),8)),jQ=GQ*w+(w-1),k=I(Math.max(0,K.min));for(let m=0;m<o.length;m++){let C=o[m],Y=t[C.globalIdx];for(let d=0;d<C.data.length;d++){let T=a(d)-Math.floor(jQ/2)+m*(GQ+1),S=I(C.data[d]),L=Math.min(k,S),f=Math.max(k,S);for(let E=L;E<=f;E++){let s=A+(z-1-E);for(let v=T;v<T+GQ;v++)qQ(x,ZQ,s,v,$.bar,"arrow",y,Y)}}}}let r=[];for(let w=0;w<Q.series.length;w++)if(Q.series[w].type==="line")r.push({data:Q.series[w].data,globalIdx:w});for(let w of r){if(w.data.length===0)continue;let e=t[w.globalIdx];z$(x,ZQ,w.data,a,I,A,z,b,U*_,$,y,e)}return p8(x,ZQ,y,Z,V)}function F$(Q,$,Z,V){let _=g8(Q);if(_===0)return"";let K=Q.yAxis.range,J=c8(K.min,K.max),G=h8(Q,_),j=Math.max(...G.map((I)=>I.length))+1,F=Math.max(w8,40),z=Math.max(2,Math.floor(y8/_)),U=z*_,N=!!Q.title,O=!!Q.yAxis.title,B=Q.series.length>1,W=(N?2:0)+(B?1:0),H=j+1,A=H+F+2,b=W+U+2+(O?1:0),M=W+U,g=b8(A,b),D=u8(A,b),i=x8(A,b),UQ=v8(Q.series.length,V),x=(I)=>{let a=(I-K.min)/(K.max-K.min||1);return H+Math.round(a*(F-1))},ZQ=(I)=>W+Math.floor(z*(I+0.5));if(N)bQ(g,D,0,Math.floor(A/2-Q.title.length/2),Q.title,"text");if(B)f8(g,D,i,Q,N?1:0,A,$,UQ);for(let I=W;I<W+U;I++)qQ(g,D,I,H-1,$.vLine,"border");qQ(g,D,M,H-1,$.origin,"border");for(let I=0;I<_;I++){let a=ZQ(I),o=G[I],r=j-o.length;bQ(g,D,a,Math.max(0,r),o,"text")}for(let I=H;I<H+F;I++)qQ(g,D,M,I,$.hLine,"border");for(let I of J){let a=x(I);if(a<H||a>=H+F)continue;qQ(g,D,M,a,$.xTick,"border");let o=_4(I);bQ(g,D,M+1,a-Math.floor(o.length/2),o,"text")}if(O){let I=Q.yAxis.title;bQ(g,D,b-1,Math.floor(A/2-I.length/2),I,"text")}for(let I of J){let a=x(I);if(a<H||a>=H+F)continue;for(let o=W;o<W+U;o++)if(m8(g,o,a)===" ")qQ(g,D,o,a,$.grid,"line")}let y=[];for(let I=0;I<Q.series.length;I++)if(Q.series[I].type==="bar")y.push({data:Q.series[I].data,globalIdx:I});if(y.length>0){let I=y.length,a=1,o=1*I+(I-1),r=x(Math.max(0,K.min));for(let w=0;w<y.length;w++){let e=y[w],GQ=UQ[e.globalIdx];for(let jQ=0;jQ<e.data.length;jQ++){let C=ZQ(jQ)-Math.floor(o/2)+w*2,Y=x(e.data[jQ]),d=Math.min(r,Y),QQ=Math.max(r,Y);for(let q=C;q<C+1;q++)for(let T=d;T<=QQ;T++)qQ(g,D,q,T,$.bar,"arrow",i,GQ)}}}let t=[];for(let I=0;I<Q.series.length;I++)if(Q.series[I].type==="line")t.push({data:Q.series[I].data,globalIdx:I});for(let I of t){if(I.data.length===0)continue;let a=UQ[I.globalIdx];N$(g,D,I.data,ZQ,x,W,U,H,F,$,i,a)}return p8(g,D,i,Z,V)}function z$(Q,$,Z,V,_,K,J,G,j,F,z,U){if(Z.length===0)return;let N=Z.map((B,W)=>({col:V(W),row:_(B)})),O=(B,W,H)=>{let A=K+(J-1-W);if(A>=0&&B>=G&&B<G+j)qQ(Q,$,A,B,H,"arrow",z,U)};if(N.length===1){O(N[0].col,N[0].row,F.hLine);return}for(let B=0;B<N.length-1;B++){let W=N[B],H=N[B+1];if(W.row===H.row){for(let D=W.col;D<=H.col;D++)O(D,W.row,F.hLine);continue}let A=Math.round((W.col+H.col)/2),b=H.row>W.row;for(let D=W.col;D<A;D++)O(D,W.row,F.hLine);if(b)O(A,W.row,F.cornerBR);else O(A,W.row,F.cornerTR);let M=Math.min(W.row,H.row),g=Math.max(W.row,H.row);for(let D=M+1;D<g;D++)O(A,D,F.vLine);if(b)O(A,H.row,F.cornerTL);else O(A,H.row,F.cornerBL);for(let D=A+1;D<=H.col;D++)O(D,H.row,F.hLine);if(B===0){let D=Math.max(G,W.col-Math.floor((H.col-W.col)/4));for(let i=D;i<W.col;i++)O(i,W.row,F.hLine)}if(B===N.length-2){let D=Math.min(G+j-1,H.col+Math.floor((H.col-W.col)/4));for(let i=H.col+1;i<=D;i++)O(i,H.row,F.hLine)}}}function N$(Q,$,Z,V,_,K,J,G,j,F,z,U){if(Z.length===0)return;let N=Z.map((B,W)=>({row:V(W),col:_(B)})),O=(B,W,H)=>{if(B>=K&&B<K+J&&W>=G&&W<G+j)qQ(Q,$,B,W,H,"arrow",z,U)};if(N.length===1){O(N[0].row,N[0].col,F.vLine);return}for(let B=0;B<N.length-1;B++){let W=N[B],H=N[B+1];if(W.col===H.col){for(let D=W.row;D<=H.row;D++)O(D,W.col,F.vLine);continue}let A=Math.round((W.row+H.row)/2),b=H.col>W.col;for(let D=W.row;D<A;D++)O(D,W.col,F.vLine);if(b)O(A,W.col,F.cornerBL);else O(A,W.col,F.cornerBR);let M=Math.min(W.col,H.col),g=Math.max(W.col,H.col);for(let D=M+1;D<g;D++)O(A,D,F.hLine);if(b)O(A,H.col,F.cornerTR);else O(A,H.col,F.cornerTL);for(let D=A+1;D<=H.row;D++)O(D,H.col,F.vLine)}}function f8(Q,$,Z,V,_,K,J,G){let j=[],F=0,z=0;for(let B=0;B<V.series.length;B++)if(V.series[B].type==="bar")j.push({symbol:J.bar,label:`Bar ${F+1}`,globalIdx:B}),F++;else j.push({symbol:J.hLine,label:`Line ${z+1}`,globalIdx:B}),z++;let U=0;for(let B=0;B<j.length;B++){if(B>0)U+=2;U+=2+j[B].label.length}let O=Math.max(0,Math.floor(K/2-U/2));for(let B=0;B<j.length;B++){if(B>0)O+=2;let W=j[B];qQ(Q,$,_,O,W.symbol,"arrow",Z,G[W.globalIdx]),O+=1,O+=1,bQ(Q,$,_,O,W.label,"text"),O+=W.label.length}}function b8(Q,$){return Array.from({length:Q},()=>Array.from({length:$},()=>" "))}function u8(Q,$){return Array.from({length:Q},()=>Array.from({length:$}).fill(null))}function x8(Q,$){return Array.from({length:Q},()=>Array.from({length:$}).fill(null))}function qQ(Q,$,Z,V,_,K,J,G){if(V>=0&&V<Q.length&&Z>=0&&Z<Q[0].length){if(Q[V][Z]=_,$[V][Z]=K,J&&G)J[V][Z]=G}}function m8(Q,$,Z){if(Z>=0&&Z<Q.length&&$>=0&&$<Q[0].length)return Q[Z][$];return" "}function bQ(Q,$,Z,V,_,K){for(let J=0;J<_.length;J++)qQ(Q,$,Z,V+J,_[J],K)}function p8(Q,$,Z,V,_){if(Q.length===0)return"";let K=Q[0].length,J=Q.length,G=[];for(let j=0;j<K;j++){let F=[],z=[],U=[];for(let O=0;O<J;O++)F.push(Q[O][j]),z.push($[O][j]),U.push(Z[O][j]);let N=F.length-1;while(N>=0&&F[N]===" ")N--;if(N<0)G.push("");else G.push(O$(F.slice(0,N+1),z.slice(0,N+1),U.slice(0,N+1),_,V))}while(G.length>0&&G[G.length-1]==="")G.pop();return G.join(`
12`)}function O$(Q,$,Z,V,_){if(_==="none")return Q.join("");let K="",J=null,G="";for(let j=0;j<Q.length;j++){let F=Q[j];if(F===" "){if(G.length>0)K+=J?$4(G,J,_):G,G="",J=null;K+=" ";continue}let z=Z[j]??null,U=$[j]??null,N=z??(U?G$(U,V):null);if(N===J)G+=F;else{if(G.length>0)K+=J?$4(G,J,_):G;G=F,J=N}}if(G.length>0)K+=J?$4(G,J,_):G;return K}function g8(Q){if(Q.xAxis.categories)return Q.xAxis.categories.length;for(let $ of Q.series)if($.data.length>0)return $.data.length;return 0}function h8(Q,$){if(Q.xAxis.categories)return Q.xAxis.categories;if(Q.xAxis.range){let{min:Z,max:V}=Q.xAxis.range,_=$>1?(V-Z)/($-1):0;return Array.from({length:$},(K,J)=>_4(Z+_*J))}return Array.from({length:$},(Z,V)=>String(V+1))}function c8(Q,$){let Z=$-Q;if(Z<=0)return[Q];let V=Z/6,_=Math.pow(10,Math.floor(Math.log10(V))),K=V/_,J;if(K<=1.5)J=_;else if(K<=3)J=2*_;else if(K<=7)J=5*_;else J=10*_;let G=Math.ceil(Q/J)*J,j=[];for(let F=G;F<=$+J*0.001;F+=J)j.push(Math.round(F*10000000000)/10000000000);return j}function _4(Q){if(Number.isInteger(Q))return String(Q);return Q.toFixed(Math.abs(Q)<10?1:0)}function U$(Q){let $=Q.trim().split(`
13`)[0]?.trim().toLowerCase()??"";if(/^xychart(-beta)?\b/.test($))return"xychart";if(/^sequencediagram\s*$/.test($))return"sequence";if(/^classdiagram\s*$/.test($))return"class";if(/^erdiagram\s*$/.test($))return"er";return"flowchart"}function B$(Q,$={}){let Z={useAscii:$.useAscii??!1,paddingX:$.paddingX??5,paddingY:$.paddingY??5,boxBorderPadding:$.boxBorderPadding??1,graphDirection:"TD"},V=$.colorMode==="auto"||$.colorMode===void 0?X4():$.colorMode,_={...eQ,...$.theme};switch(U$(Q)){case"xychart":return C8(Q,Z,V,_);case"sequence":return q8(Q,Z,V,_);case"class":return k8(Q,Z,V,_);case"er":return M8(Q,Z,V,_);case"flowchart":default:{let J=A4(Q);if(J.direction==="LR"||J.direction==="RL")Z.graphDirection="LR";else Z.graphDirection="TD";let G=m4(J,Z);if(W8(G),N8(G),J.direction==="BT")f4(G.canvas),b4(G.roleCanvas);return xQ(G.canvas,{roleCanvas:G.roleCanvas,colorMode:V,theme:_})}}}export{B$ as renderMermaidASCII};
14
types/index.d.ts 12 lines
1/** Whether a diagram shows its source instead of its drawing. */
2export type ShowCode = boolean
3
4declare module 'claude-code' {
5  interface PluginState {
6    'gfm-render': {
7      /** Per message and position of the diagram in it. */
8      showCode: StateFamily<ShowCode>
9    }
10  }
11}
12