@ai-matrx/content-ir 0.19.18 → 0.19.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../source/offsets.ts","../source/constants.ts","../source/fence-nesting.ts","../source/code-ranges.ts","../source/math-pairs.ts","../source/math.ts","../source/xml-tag.ts","../source/gfm-table.ts","../source/tokenize.ts","../source/splice.ts","../source/link-references.ts"],"names":["k","scan","oldCursor","newCursor"],"mappings":"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","file":"source.cjs","sourcesContent":["/**\n * UTF-16 ⇄ code-point offset conversion.\n *\n * JavaScript strings are indexed in UTF-16 code units; Postgres `position()`,\n * `substring()` and `length()` count code points. Every offset this module\n * emits is given in BOTH units so an anchor captured on either side of the\n * wire can be mapped without re-deriving the text.\n */\n\n/** Indexes the surrogate pairs of one text so conversion is O(log pairs). */\nexport interface CodePointIndex {\n /** Code-point offset of a UTF-16 offset. */\n toCodePoint(utf16: number): number;\n /** UTF-16 offset of a code-point offset. */\n toUtf16(codePoint: number): number;\n /** Code-point length of the text. */\n readonly lengthCp: number;\n}\n\nfunction isHigh(code: number): boolean {\n return code >= 0xd800 && code <= 0xdbff;\n}\nfunction isLow(code: number): boolean {\n return code >= 0xdc00 && code <= 0xdfff;\n}\n\n/** True when `offset` sits between the two halves of a surrogate pair. */\nexport function splitsSurrogatePair(text: string, offset: number): boolean {\n if (offset <= 0 || offset >= text.length) return false;\n return isHigh(text.charCodeAt(offset - 1)) && isLow(text.charCodeAt(offset));\n}\n\nexport function buildCodePointIndex(text: string): CodePointIndex {\n // UTF-16 offsets of every high surrogate that starts a valid pair.\n const pairStarts: number[] = [];\n for (let i = 0; i < text.length - 1; i++) {\n if (isHigh(text.charCodeAt(i)) && isLow(text.charCodeAt(i + 1))) {\n pairStarts.push(i);\n i++;\n }\n }\n\n /** Number of pair starts strictly less than `limit`. */\n const countBelow = (limit: number): number => {\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((pairStarts[mid] as number) < limit) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n\n const toCodePoint = (utf16: number): number => {\n // Every pair fully before `utf16` counts one code unit too many; a pair\n // whose low half sits exactly at `utf16 - 1` is also fully before it.\n return utf16 - countBelow(utf16 - 1);\n };\n\n const toUtf16 = (codePoint: number): number => {\n // Smallest u with toCodePoint(u) >= codePoint, walked by pair count.\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n // Code point of the pair start `pairStarts[mid]`.\n const start = pairStarts[mid] as number;\n if (start - mid < codePoint) lo = mid + 1;\n else hi = mid;\n }\n return codePoint + lo;\n };\n\n return {\n toCodePoint,\n toUtf16,\n lengthCp: text.length - pairStarts.length,\n };\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toCodePointOffset(text: string, utf16: number): number {\n return buildCodePointIndex(text).toCodePoint(utf16);\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toUtf16Offset(text: string, codePoint: number): number {\n return buildCodePointIndex(text).toUtf16(codePoint);\n}\n","/**\n * The protected-construct vocabulary the source tokenizer recognises.\n *\n * Each list mirrors a live list in matrx-frontend's renderer splitter\n * (`content-splitter-v2.ts`) or its raw-HTML sanitizer (`rehypeSafeRawHtml.ts`);\n * the source is named on every constant. Inventory:\n * common-docs `projects/rich-content-unification/evidence/r2-protected-syntax.md`.\n */\n\n/** `XML_TAG_BLOCKS` — line-leading, attribute-less XML regions. */\nexport const XML_TAG_BLOCK_NAMES: readonly string[] = [\n \"thinking\",\n \"think\",\n \"reasoning\",\n \"info\",\n \"task\",\n \"database\",\n \"private\",\n \"plan\",\n \"event\",\n \"tool\",\n \"questionnaire\",\n \"flashcards\",\n \"cooking_recipe\",\n \"timeline\",\n \"progress_tracker\",\n \"troubleshooting\",\n \"resources\",\n \"research\",\n];\n\n/** The thinking family — the only XML regions recognised mid-line and as orphan closers. */\nexport const THINKING_FAMILY: readonly string[] = [\"thinking\", \"think\", \"reasoning\"];\n\n/** `ATTRIBUTE_XML_BLOCKS` — attribute-bearing XML, also detected mid-line. */\nexport const ATTRIBUTE_XML_NAMES: readonly string[] = [\n \"decision\",\n \"artifact\",\n \"editor_error\",\n \"editor_code_snippet\",\n \"audiocite\",\n];\n\nexport const KNOWN_XML_TAG_NAMES: ReadonlySet<string> = new Set([\n ...XML_TAG_BLOCK_NAMES,\n ...ATTRIBUTE_XML_NAMES,\n]);\n\n/** `ALLOWED_RAW_HTML_TAGS` (rehypeSafeRawHtml.ts) — raw HTML the renderer honours. */\nexport const ALLOWED_RAW_HTML_TAGS: ReadonlySet<string> = new Set([\n \"img\", \"a\", \"br\", \"hr\", \"span\", \"p\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"s\",\n \"del\", \"ins\", \"sup\", \"sub\", \"mark\", \"kbd\", \"abbr\", \"small\", \"code\", \"pre\",\n \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\",\n]);\n\n/**\n * CommonMark HTML-block type 6 names within the allow-list: a line opening\n * with one of these starts an HTML block that runs to the next blank line.\n */\nexport const HTML_BLOCK_LEVEL_TAGS: ReadonlySet<string> = new Set([\n \"p\", \"hr\", \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\",\n \"h6\", \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\",\n]);\n\n/** `SPECIAL_CODE_LANGUAGES` — fence languages the renderer promotes to kinds. */\nexport const SPECIAL_CODE_LANGUAGES: ReadonlySet<string> = new Set([\n \"transcript\", \"tasks\", \"structured_info\", \"questionnaire\", \"flashcards\",\n \"cooking_recipe\", \"mermaid\", \"svg\", \"chart\", \"map\", \"stats\", \"diff\",\n \"html\", \"react\", \"matrx\",\n]);\n\n/** `CODE_LANGUAGE_ALIASES`. */\nexport const CODE_LANGUAGE_ALIASES: Readonly<Record<string, string>> = {\n mmd: \"mermaid\",\n jsx: \"react\",\n tsx: \"react\",\n};\n\n/** `JSON_BLOCK_PATTERNS` root keys → typed JSON block type. */\nexport const TYPED_JSON_ROOT_KEYS: Readonly<Record<string, string>> = {\n quiz_title: \"quiz\",\n presentation: \"presentation\",\n decision_tree: \"decision_tree\",\n comparison: \"comparison_table\",\n diagram: \"diagram\",\n math_problem: \"math_problem\",\n item_presentation: \"item_presentation\",\n name: \"schema_proposal\",\n};\n\n/** Box-drawing glyphs that mark a tree diagram (`TREE_CHARS`). */\nexport const TREE_GLYPHS = /[├└│┌┐┘┬┴┤┼─]/;\n\n/** A pinned annotation anchor (STORE-DESIGN §3.19): `<!--@a:k3f9-->`. */\nexport const PINNED_ANCHOR_RE = /^<!--@a:([A-Za-z0-9_-]+)-->$/;\n\n/** remarkMatrxVariable's strict variable token. */\nexport const STRICT_VARIABLE_RE = /^\\{\\{([a-zA-Z_][a-zA-Z0-9_.]*)\\}\\}$/;\n\n/** remarkMatrxCite's citation marker, anchored at the cursor. */\nexport const CITE_RE = /^<matrxcite\\s+n=\"(\\d+)\"\\s*\\/>/;\n\nexport function normalizeFenceLanguage(language: string): string {\n const lower = language.toLowerCase();\n return CODE_LANGUAGE_ALIASES[lower] ?? lower;\n}\n","// ─────────────────────────────────────────────────────────────────────────\n// THE ONE NESTED-FENCE RULE for a ```markdown / ```md / ```mdx fence.\n//\n// Source of truth (moved here from matrx-frontend\n// components/markdown-core/fence-nesting.ts, 2026-09-25). Consumers: the\n// source tokenizer (source/tokenize.ts), matrx-frontend's static splitter and\n// live StreamBlockAccumulator, and — by conformance, since Python cannot\n// import this — aidream matrx-ai `processing/blocks/fence_nesting.py`, which\n// runs the SAME generated vectors (`__tests__/fence-nesting-vectors.json`,\n// byte-identical copy at packages/matrx-ai/tests/fixtures/).\n//\n// Models write a markdown document inside a ```markdown fence and put their\n// own ```python … ``` blocks inside it with the SAME three backticks. Under\n// strict CommonMark the first inner bare ``` closes the outer fence: the\n// document ends mid-way, the rest leaks out as prose, and the outer closing\n// ``` opens a phantom code block that swallows everything after it.\n//\n// The rule, for MARKDOWN-language fences only (every other language keeps\n// strict CommonMark — a ```bash heredoc is code, not a document):\n// - a fence line WITH an info string (```python) opens a nested fence;\n// - a bare fence line (``` with at least the opener's tick count) closes\n// the innermost nested fence while one is open, and closes the outer\n// fence only when none is;\n// - a longer outer fence (````markdown) keeps working exactly as before —\n// an inner ``` is shorter than the opener, so it is plain content;\n// - if the text ENDS with a nested fence still open, the extraction is\n// redone under strict CommonMark (an unclosed inner fence must not eat\n// the outer closer and the rest of the message).\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Fence languages whose body is itself a markdown document. */\nexport const NESTING_FENCE_LANGUAGES: ReadonlySet<string> = new Set([\n \"markdown\",\n \"md\",\n \"mdx\",\n]);\n\n/** True when a fence opened with this info-string language nests inner fences. */\nexport function fenceNestsInnerFences(language: string | undefined | null): boolean {\n return !!language && NESTING_FENCE_LANGUAGES.has(language.toLowerCase());\n}\n\nexport type InnerFenceLine =\n /** Not a fence line — ordinary content of the outer fence. */\n | \"content\"\n /** ```lang inside a markdown fence — content, and one level deeper. */\n | \"open-nested\"\n /** Bare ``` that closes the innermost nested fence — content, one level up. */\n | \"close-nested\"\n /** Bare ``` that closes the OUTER fence. */\n | \"close-outer\";\n\n/**\n * Classify one line inside an open backtick fence, already trimmed with\n * {@link trimFenceLine} (never a language's own `trim()`).\n *\n * @param trimmed the line with surrounding whitespace removed\n * @param openTicks backtick count of the outer fence's opener\n * @param nests whether the outer fence follows the nesting rule\n * @param nestedDepth how many nested fences are open right now\n */\n/**\n * The whitespace a fence line may carry around its backticks and info string:\n * CommonMark's ASCII whitespace — space, tab, LF, CR, form feed, vertical tab.\n * Defined HERE, not by a language's `trim()`: JavaScript's `trim()` also strips\n * U+FEFF, U+00A0 and the Unicode spaces, while Python's `strip()` also strips\n * U+0085 and U+001C–U+001F — which made the two twins disagree on lines such\n * as ```` ```\\uFEFF ```` (verify-RC-B3 residual R4). Every caller trims a line\n * with `trimFenceLine` before classifying it; the Python twin mirrors both.\n */\nexport const FENCE_WHITESPACE = \" \\t\\n\\r\\f\\v\";\n\nfunction isFenceWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_WHITESPACE.includes(ch);\n}\n\n/** Strip {@link FENCE_WHITESPACE} (and nothing else) from both ends of a line. */\nexport function trimFenceLine(line: string): string {\n let start = 0;\n let end = line.length;\n while (start < end && isFenceWhitespace(line[start])) start++;\n while (end > start && isFenceWhitespace(line[end - 1])) end--;\n return start === 0 && end === line.length ? line : line.slice(start, end);\n}\n\n/**\n * The whitespace around a fence OPENER and inside its info string. The\n * renderer finds openers with JavaScript's `String#trim()` and splits the info\n * string on `/\\s/`; this set IS that definition, written out so the Python\n * twin can match it exactly — ECMAScript WhiteSpace + LineTerminator. It\n * differs from Python's `str.split()` on U+0085 and U+001C–U+001F (not JS\n * whitespace) and U+FEFF (JS whitespace) — verify-RC-B3 residual R4′.\n */\nexport const FENCE_OPENER_WHITESPACE =\n \"\\t\\n\\v\\f\\r \\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\";\n\nfunction isOpenerWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_OPENER_WHITESPACE.includes(ch);\n}\n\n/**\n * Parse a backtick fence OPENER line the way the renderer does: trim the line,\n * count the backtick run (3+), trim the rest, and take the first\n * whitespace-separated word as the language. null when the line opens nothing —\n * including when the info string holds a backtick (GFM / CommonMark 4.5:\n * \"```` code ````\" and \"``` `x` | b\" are code spans, never fences).\n */\nexport function parseFenceOpener(line: string): { ticks: number; lang: string } | null {\n let start = 0;\n let end = line.length;\n while (start < end && isOpenerWhitespace(line[start])) start++;\n while (end > start && isOpenerWhitespace(line[end - 1])) end--;\n let ticks = 0;\n while (start + ticks < end && line[start + ticks] === \"`\") ticks++;\n if (ticks < 3) return null;\n if (line.slice(start + ticks, end).includes(\"`\")) return null;\n let infoStart = start + ticks;\n while (infoStart < end && isOpenerWhitespace(line[infoStart])) infoStart++;\n let langEnd = infoStart;\n while (langEnd < end && !isOpenerWhitespace(line[langEnd])) langEnd++;\n return { ticks, lang: line.slice(infoStart, langEnd) };\n}\n\nexport function classifyInnerFenceLine(\n trimmed: string,\n openTicks: number,\n nests: boolean,\n nestedDepth: number,\n): InnerFenceLine {\n let ticks = 0;\n while (ticks < trimmed.length && trimmed[ticks] === \"`\") ticks++;\n if (ticks < 3) return \"content\";\n const info = trimFenceLine(trimmed.slice(ticks));\n if (info === \"\") {\n if (ticks < openTicks) return \"content\";\n if (nests && nestedDepth > 0) return \"close-nested\";\n return \"close-outer\";\n }\n // A fence line with an info string never closes anything (CommonMark).\n // Inside a markdown fence it opens a nested one — unless the outer opener is\n // LONGER, in which case CommonMark already treats the inner fence as content\n // and its bare closer can never reach the outer fence.\n if (nests && ticks >= openTicks && !info.includes(\"`\")) return \"open-nested\";\n return \"content\";\n}\n","/**\n * THE ONE CODE-RANGE RULE — where code is in markdown source, for every surface.\n *\n * Ruling (RC-B10, 2026-09-25, REGISTER rulings ledger): the rule is the\n * RENDERER's rule — what the chat renderer's splitter, the source tokenizer\n * and the Python block detector already agree on — made container-aware only\n * where the renderer hands a block to remark:\n * - a BACKTICK fence opens on a line whose whitespace-trimmed text starts\n * with ``` at ANY indent (so a fence inside a list item opens at any\n * depth), after stripping blockquote `>` prefixes;\n * - a TILDE fence opens at ≤ 3 spaces relative to its container (a list\n * item's content column, inside any `>` prefixes);\n * - a backtick fence closes by THE nested-fence rule (`fence-nesting.ts`,\n * with the strict-CommonMark retry when a nested fence is left open) or by\n * the renderer's line-end closer (`code```` with nothing after it); inside\n * a ```json fence a backtick run inside a JSON string is text;\n * - a fence inside a blockquote ends where the blockquote ends;\n * - strict CommonMark's \"4+ spaces is not a fence\" is rejected on purpose:\n * users see what the renderer's splitter draws.\n * Inline code spans pair equal-length backtick runs inside one paragraph.\n *\n * Order is the renderer's: phase 1 is the splitter — every raw line whose\n * trimmed text starts with ``` opens a block, before remark sees anything\n * (so `- ```` can never close on a later raw ``` line; that line opens a\n * splitter block instead). Phase 2 is remark inside each prose segment the\n * splitter left: blockquote fences, fences on a list-marker line, tilde\n * fences, and code spans — none can run past its segment. A ``` line inside a\n * tilde fence is therefore drawn as code up to ITS closer (the splitter does\n * not know ~~~), exactly the tokenizer's `rendererOverflow`.\n *\n * Consumers: `findCodeRanges` (math pairing, kit's delimiter guard, chat's\n * speakable text, print, every matrx-frontend walker), and the line-level\n * primitives `fenceOpenerOf` / `closeFence`, which the tokenizer and the\n * renderer's splitters drive line by line. A private copy of fence or\n * code-span detection anywhere fails `__tests__/one-code-range-rule.test.ts`.\n */\nimport { classifyInnerFenceLine, fenceNestsInnerFences, parseFenceOpener, trimFenceLine } from \"./fence-nesting\";\n\nexport interface CodeRange {\n /** UTF-16 offset of the first character (the fence line start, or the opening backtick run). */\n start: number;\n /** Offset just past the closing fence line's content / closing backtick run (the fence's last line when unclosed). */\n end: number;\n kind: \"fence\" | \"span\";\n}\n\nexport interface FenceOpener {\n char: \"`\" | \"~\";\n /** Length of the opening run. */\n ticks: number;\n /** The info string's first word (\"\" when none). */\n lang: string;\n}\n\n/**\n * THE opener rule for one line's content (container prefixes already\n * removed; for a tilde fence, `content` starts at the container's column).\n */\nexport function fenceOpenerOf(content: string): FenceOpener | null {\n const t = content.trimStart();\n if (t.startsWith(\"```\")) {\n // THE opener parse: a backtick in the info string opens nothing (CommonMark 4.5).\n const parsed = parseFenceOpener(t);\n if (!parsed) return null;\n return { char: \"`\", ticks: parsed.ticks, lang: parsed.lang };\n }\n if (content.length - t.length <= 3 && t.startsWith(\"~~~\")) {\n const open = /^(~{3,})(.*)$/.exec(t);\n if (!open) return null;\n return { char: \"~\", ticks: (open[1] as string).length, lang: (open[2] as string).trim().split(/\\s/)[0] ?? \"\" };\n }\n return null;\n}\n\n/**\n * Does this line START a fenced code block? THE opener rule (`fenceOpenerOf`),\n * which follows CommonMark 4.5: a `~~~` run, or a backtick run whose info string\n * holds no backtick. Kept as a named predicate for block-boundary readers (a\n * table's end, source/gfm-table.ts).\n */\nexport function opensStrictFence(line: string): boolean {\n return fenceOpenerOf(line) !== null;\n}\n\n/** The lines a fence is read from. */\nexport interface FenceLines {\n count: number;\n /** Line `k`'s content (no terminator), or null when the fence's container has ended before it. */\n line(k: number): string | null;\n /** Streaming: line `k` has not ended yet, so it closes nothing. */\n openTail?(k: number): boolean;\n /**\n * Streaming: more lines may still arrive. The strict-CommonMark retry\n * applies only while the nested reading ends inside a nested fence — a\n * later line can close that nested fence, so a retry's closer is\n * undecided and the fence stays open (verify-RC-B3 F3).\n */\n streaming?: boolean;\n}\n\nexport interface FenceEnd {\n /** The closing line when `closed`; otherwise the fence's last line (text end, or the line before its container ended). */\n line: number;\n closed: boolean;\n}\n\n/**\n * THE closer rule, read line by line — the one implementation behind\n * `closeFence` and every streaming walker. Feed each following line\n * (container prefixes removed); `feed` returns true on the line that closes\n * the fence. A backtick fence closes by the nested-fence rule or the\n * renderer's line-end closer (`code````), and inside ```json a backtick run in\n * a JSON string is text; a tilde fence closes on `~~~` (≥ its length, ≤ 3\n * spaces). `nesting: false` forces strict CommonMark (the retry `closeFence`\n * makes when a nested fence is left open at the end; a streaming reader\n * cannot look ahead, so it reads with nesting and never retries).\n */\nexport class FenceReader {\n readonly opener: FenceOpener;\n private state = { inString: false, escaped: false };\n private depth = 0;\n /** A nested fence was opened at some point. */\n sawNested = false;\n private readonly isJson: boolean;\n private readonly nesting: boolean;\n private readonly tildeCloser: RegExp | null;\n\n constructor(\n opener: FenceOpener,\n options: { nesting?: boolean } = {},\n ) {\n this.opener = opener;\n this.isJson = opener.char === \"`\" && opener.lang === \"json\";\n this.nesting = opener.char === \"`\" && (options.nesting ?? fenceNestsInnerFences(opener.lang));\n this.tildeCloser = opener.char === \"~\" ? new RegExp(`^ {0,3}~{${opener.ticks},}[ \\\\t]*$`) : null;\n }\n\n /** How many nested fences are open right now. */\n get nestedDepth(): number {\n return this.depth;\n }\n\n feed(line: string): boolean {\n if (this.tildeCloser) return this.tildeCloser.test(line);\n const trimmedLine = trimFenceLine(line);\n const at = line.indexOf(\"```\");\n if (at === -1) {\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n if (this.isJson) {\n const probe = jsonStringState(line, 0, at, this.state);\n if (probe.inString) {\n this.state = jsonStringState(line, at, line.length, probe);\n return false;\n }\n }\n if (trimmedLine.startsWith(\"```\")) {\n const kind = classifyInnerFenceLine(trimmedLine, this.opener.ticks, this.nesting, this.depth);\n if (kind === \"close-outer\") return true;\n if (kind === \"open-nested\") {\n this.depth++;\n this.sawNested = true;\n }\n if (kind === \"close-nested\") this.depth--;\n } else {\n // The renderer's line-end closer: `code```` with nothing after the run.\n const closeTicks = backtickRunLength(line, at);\n const after = trimFenceLine(line.slice(at + closeTicks));\n if (closeTicks >= this.opener.ticks && after === \"\" && this.depth === 0) return true;\n }\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n}\n\n/** Where the fence opened on line `open` ends. */\nexport function closeFence(src: FenceLines, open: number, opener: FenceOpener): FenceEnd {\n const first = readFence(src, open, new FenceReader(opener));\n if (first.closed || !first.reader.sawNested || first.reader.nestedDepth <= 0) return { line: first.line, closed: first.closed };\n if (src.streaming) return { line: first.line, closed: false };\n const strict = readFence(src, open, new FenceReader(opener, { nesting: false }));\n return { line: strict.line, closed: strict.closed };\n}\n\nfunction readFence(src: FenceLines, open: number, reader: FenceReader): FenceEnd & { reader: FenceReader } {\n for (let k = open + 1; k < src.count; k++) {\n // Streaming: a bare ``` on the unfinished last line may still grow into ```bash.\n if (src.openTail?.(k)) continue;\n const line = src.line(k);\n if (line === null) return { line: k - 1, closed: false, reader };\n if (reader.feed(line)) return { line: k, closed: true, reader };\n }\n return { line: src.count - 1, closed: false, reader };\n}\n\n/** JSON-string state after scanning `line[from, upTo)` from the given state. */\nexport function jsonStringState(\n line: string,\n from: number,\n upTo: number,\n state: { inString: boolean; escaped: boolean },\n): { inString: boolean; escaped: boolean } {\n let { inString, escaped } = state;\n for (let idx = from; idx < upTo; idx++) {\n const ch = line[idx];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\" && inString) {\n escaped = true;\n continue;\n }\n if (ch === '\"') inString = !inString;\n }\n return { inString, escaped };\n}\n\nexport function backtickRunLength(str: string, pos: number): number {\n let n = 0;\n while (pos + n < str.length && str[pos + n] === \"`\") n++;\n return n;\n}\n\n// ── the whole-text scan ────────────────────────────────────────────────────\n\n/** Blockquote prefix: how many `>` markers open the line, and where its content starts. */\nfunction quotePrefix(line: string): { depth: number; offset: number } {\n let depth = 0;\n let offset = 0;\n for (;;) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return { depth, offset };\n depth++;\n offset += m[0].length;\n }\n}\n\n/** Strip exactly `depth` blockquote markers; null when the line has fewer (the blockquote ended). */\nfunction stripQuotes(line: string, depth: number): string | null {\n let offset = 0;\n for (let d = 0; d < depth; d++) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return null;\n offset += m[0].length;\n }\n return line.slice(offset);\n}\n\nconst LIST_ITEM = /^( *)([-*+]|\\d{1,9}[.)])( +|\\t|$)/;\n\nfunction leadingSpaces(s: string): number {\n let i = 0;\n while (i < s.length && s[i] === \" \") i++;\n return i;\n}\n\ninterface Scan {\n ranges: CodeRange[];\n /** Every fence as lines: [opener line, last line, closed]. */\n fences: Array<[number, number, boolean]>;\n /** Paragraph runs outside fences, [start, end), for code-span pairing. */\n paragraphs: Array<[number, number]>;\n /** Text ends inside an open fence. */\n endsInFence: boolean;\n /** Start of the final, still-growing paragraph (streaming rule), -1 if none. */\n pendingPara: number;\n}\n\nfunction scan(text: string): Scan {\n const starts: number[] = [];\n const ends: number[] = [];\n for (let pos = 0; ; ) {\n const nl = text.indexOf(\"\\n\", pos);\n const lineEnd = nl === -1 ? text.length : nl;\n starts.push(pos);\n ends.push(lineEnd > pos && text.charCodeAt(lineEnd - 1) === 13 ? lineEnd - 1 : lineEnd);\n if (nl === -1) break;\n pos = nl + 1;\n }\n const count = starts.length;\n const raw = (k: number) => text.slice(starts[k] as number, ends[k] as number);\n const out: Scan = { ranges: [], fences: [], paragraphs: [], endsInFence: false, pendingPara: -1 };\n\n // Phase 1 — the renderer's splitter: every line whose trimmed text starts\n // with ``` opens a code block at ANY indent, before remark sees anything.\n const rawLines: FenceLines = { count, line: raw };\n let segment = 0;\n for (let k = 0; k < count; k++) {\n const opener = fenceOpenerOf(raw(k));\n if (!opener || opener.char !== \"`\") continue;\n prose(text, starts, ends, raw, segment, k, out);\n const end = closeFence(rawLines, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n out.pendingPara = -1;\n if (!end.closed && end.line === count - 1) out.endsInFence = true;\n k = end.line;\n segment = k + 1;\n }\n prose(text, starts, ends, raw, segment, count, out);\n return out;\n}\n\n/**\n * Phase 2 — remark, inside one prose segment [from, to) the splitter left:\n * fences in blockquotes, on a list-marker line, and tilde fences (relative to\n * their container), plus the paragraphs whose backtick runs pair as spans. A\n * fence here can never run past its segment: the splitter's block begins there.\n */\nfunction prose(\n text: string,\n starts: number[],\n ends: number[],\n raw: (k: number) => string,\n from: number,\n to: number,\n out: Scan,\n): void {\n let para = -1;\n let quoteDepth = 0;\n let lists: number[] = []; // content columns of the open list items (inside the quote prefix)\n const closePara = (at: number) => {\n if (para !== -1) out.paragraphs.push([para, at]);\n para = -1;\n };\n for (let k = from; k < to; k++) {\n const line = raw(k);\n const { depth, offset } = quotePrefix(line);\n if (depth !== quoteDepth) {\n quoteDepth = depth;\n lists = [];\n }\n let content = line.slice(offset);\n if (content.trim() === \"\") {\n closePara(starts[k] as number);\n // The empty \"line\" after a final newline is not a blank line: the next\n // line may still join this paragraph.\n if (!(k === starts.length - 1 && line === \"\")) out.pendingPara = -1;\n continue;\n }\n const indent = leadingSpaces(content);\n while (lists.length && indent < (lists[lists.length - 1] as number)) lists.pop();\n const item = LIST_ITEM.exec(content);\n let column = lists.length ? (lists[lists.length - 1] as number) : 0;\n if (item) {\n const gap = (item[3] as string).length;\n column = (item[1] as string).length + (item[2] as string).length + (gap >= 1 && gap <= 4 ? gap : 1);\n lists.push(column);\n content = content.slice(Math.min(column, content.length));\n } else {\n content = content.slice(Math.min(indent, column));\n }\n const opener = fenceOpenerOf(content);\n if (!opener) {\n if (para === -1) para = starts[k] as number;\n if (out.pendingPara === -1) out.pendingPara = starts[k] as number;\n continue;\n }\n closePara(starts[k] as number);\n out.pendingPara = -1;\n const col = column;\n const src: FenceLines = {\n count: to,\n line: (j) => {\n const inner = stripQuotes(raw(j), depth);\n if (inner === null) return null;\n if (opener.char === \"~\" && col > 0) {\n const ind = leadingSpaces(inner);\n if (inner.trim() !== \"\" && ind < col) return null; // the list item ended\n return inner.slice(Math.min(ind, col));\n }\n return inner;\n },\n };\n const end = closeFence(src, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n if (!end.closed && end.line === starts.length - 1) out.endsInFence = true;\n k = end.line;\n }\n closePara(to < starts.length ? (starts[to] as number) : text.length);\n}\n\n/**\n * THE code-span pairing table for one paragraph, text[from, to): a backtick\n * run closes at the first LATER run of exactly its length; a run with none is\n * literal text. `findCodeRanges` pairs runs in order; the tokenizer's inline\n * scanner asks `next` in the renderer's leftmost-first inline order.\n */\nexport class BacktickRuns {\n /** Every run, in order: [start, length]. */\n readonly all: Array<[number, number]> = [];\n private readonly byLength = new Map<number, number[]>();\n private readonly indexOf = new Map<number, number>();\n\n constructor(text: string, from: number, to: number) {\n for (let k = from; k < to; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < to && text.charCodeAt(k + len) === 96) len++;\n this.indexOf.set(k, this.all.length);\n this.all.push([k, len]);\n const list = this.byLength.get(len);\n if (list) list.push(k);\n else this.byLength.set(len, [k]);\n k += len;\n }\n }\n\n /** Start of the first run of exactly `n` backticks at or after `after`, or -1. */\n next(n: number, after: number): number {\n const list = this.byLength.get(n);\n if (!list) return -1;\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < after) lo = mid + 1;\n else hi = mid;\n }\n return list[lo] ?? -1;\n }\n\n /** Index of the run starting at `start` in `all`. */\n index(start: number): number {\n return this.indexOf.get(start) ?? -1;\n }\n}\n\nfunction codeSpans(text: string, from: number, to: number, out: CodeRange[]): void {\n // Left to right, exactly as the renderer (remark) and the tokenizer's inline\n // scanner read: a backslash escapes the next character, so an escaped\n // backtick opens nothing; a run closes at the first LATER run of exactly its\n // length (inside code a backslash is literal, so a closer may follow one).\n let runs: BacktickRuns | null = null;\n for (let i = from; i < to; ) {\n const ch = text.charCodeAt(i);\n if (ch === 92) {\n i += 2;\n continue;\n }\n if (ch !== 96) {\n i++;\n continue;\n }\n const n = backtickRunLength(text, i);\n const len = Math.min(n, to - i);\n runs ??= new BacktickRuns(text, from, to);\n const close = runs.next(len, i + len);\n if (close === -1) {\n i += len;\n continue;\n }\n out.push({ start: i, end: close + len, kind: \"span\" });\n i = close + len;\n }\n}\n\n/**\n * Every code range in the text — fences (by the renderer's rule above) and\n * inline code spans — sorted by start. Linear: one pass over lines, one over\n * each paragraph's backtick runs.\n */\nexport function findCodeRanges(text: string): CodeRange[] {\n const s = scan(text);\n const ranges = [...s.ranges];\n for (const [from, to] of s.paragraphs) codeSpans(text, from, to, ranges);\n return ranges.sort((a, b) => a.start - b.start);\n}\n\n/**\n * Rewrite every code range (fences and spans, by THE rule) through `fn`; text\n * outside code is kept byte for byte. The one way to strip, replace or\n * placeholder code in markdown — never a private /```…```/ regex.\n */\nexport function mapCodeRanges(text: string, fn: (range: CodeRange, raw: string) => string): string {\n let out = \"\";\n let at = 0;\n for (const r of findCodeRanges(text)) {\n if (r.start < at) continue;\n out += text.slice(at, r.start) + fn(r, text.slice(r.start, r.end));\n at = r.end;\n }\n return out + text.slice(at);\n}\n\n/**\n * The code SPANS in one piece of INLINE content — a table cell, a heading's\n * text, a link label — where no block structure exists, so a line opening with\n * three or more backticks is a code span, never a fence (```` `` code `` ```` in a\n * GFM cell). Same scanner and escape rules as `findCodeRanges`' span pass.\n */\nexport function findInlineCodeSpans(text: string): CodeRange[] {\n const ranges: CodeRange[] = [];\n codeSpans(text, 0, text.length, ranges);\n return ranges.sort((a, b) => a.start - b.start);\n}\n\n/** Rewrite every code SPAN of inline content through `fn` (see `findInlineCodeSpans`); other text is kept byte for byte. */\nexport function mapInlineCodeSpans(text: string, fn: (range: CodeRange, raw: string) => string): string {\n let out = \"\";\n let at = 0;\n for (const r of findInlineCodeSpans(text)) {\n if (r.start < at) continue;\n out += text.slice(at, r.start) + fn(r, text.slice(r.start, r.end));\n at = r.end;\n }\n return out + text.slice(at);\n}\n\n/** A code span's text (CommonMark): the backtick runs off, then one padding space each side when both are there and the content is not all spaces. */\nexport function codeSpanText(raw: string): string {\n const ticks = backtickRunLength(raw, 0);\n const inner = raw.slice(ticks, raw.length - ticks);\n return inner.length >= 2 && inner.startsWith(\" \") && inner.endsWith(\" \") && inner.trim() !== \"\" ? inner.slice(1, -1) : inner;\n}\n\n/**\n * A fence range's parts: its opener, its body (the lines between the opener\n * and the closer, blockquote prefixes kept), and whether it closed. Reads\n * `raw` exactly as `findCodeRanges` returned it.\n */\nexport function fenceParts(raw: string): { opener: FenceOpener; body: string; closed: boolean } | null {\n const lines = raw.split(\"\\n\").map((l) => (l.endsWith(\"\\r\") ? l.slice(0, -1) : l));\n const { offset } = quotePrefix(lines[0] ?? \"\");\n const opener = fenceOpenerOf((lines[0] ?? \"\").slice(offset).replace(/^ *(?:[-*+]|\\d{1,9}[.)])(?= |\\t|$) ?/, \"\"));\n if (!opener) return null;\n const rest = lines.slice(1);\n const closed = rest.length > 0 && new FenceReader(opener, { nesting: false }).feed(rest[rest.length - 1] as string);\n if (!closed) return { opener, body: rest.join(\"\\n\"), closed };\n const last = rest[rest.length - 1] as string;\n // The renderer's line-end closer (`code````): the text before the run is code.\n const before = trimFenceLine(last).startsWith(\"```\") ? \"\" : last.slice(0, last.indexOf(\"```\"));\n return { opener, body: [...rest.slice(0, -1), ...(before.trim() ? [before] : [])].join(\"\\n\"), closed };\n}\n\nexport type FenceLineKind = \"prose\" | \"open\" | \"body\" | \"close\";\n\n/**\n * Where each line (the text split on \"\\n\") sits relative to the fences\n * `findCodeRanges` finds: its opener, its body, its closer, or prose. For a\n * line walker that must skip code — one rule, never a private `inFence` toggle.\n */\nexport function fenceLineKinds(text: string): FenceLineKind[] {\n const s = scan(text);\n let count = 1;\n for (let i = text.indexOf(\"\\n\"); i !== -1; i = text.indexOf(\"\\n\", i + 1)) count++;\n const kinds = new Array<FenceLineKind>(count).fill(\"prose\");\n for (const [open, last, closed] of s.fences) {\n kinds[open] = \"open\";\n for (let k = open + 1; k <= last; k++) kinds[k] = \"body\";\n if (closed && last > open) kinds[last] = \"close\";\n }\n return kinds;\n}\n\n/**\n * STREAMING: where the last, still-growing paragraph (no blank line or fence\n * after it) holds a backtick run that a later run could still close — a run\n * with no later run of its length, or the run touching the end of the text\n * (it may still lengthen). Such a code span can yet swallow any `$$` after it,\n * so a streaming tokenizer treats text from there as provisional. -1 if none.\n */\nexport function pendingCodeSpanStart(text: string): number {\n const n = text.length;\n if (n === 0 || /\\n[ \\t]*\\n[ \\t]*$/.test(text)) return -1;\n // An open last line that is only whitespace or blockquote markers SO FAR is\n // not a blank line yet: its next byte may continue the paragraph\n // (verify-RC-B3 F3: `\\n ` + `and\\``, `\\n>` + `<\\`\\`\\``).\n const lastLine = text.slice(text.lastIndexOf(\"\\n\") + 1);\n if (lastLine && /^(?: {0,3}>[ \\t]?)*[ \\t\\r]*$/.test(lastLine)) return pendingCodeSpanStart(`${text}x`);\n const s = scan(text);\n const para = s.pendingPara;\n if (s.endsInFence || para === -1) return -1;\n const runs: Array<[number, number]> = [];\n for (let k = para; k < n; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < n && text.charCodeAt(k + len) === 96) len++;\n runs.push([k, len]);\n k += len;\n }\n // Pair runs the way findCodeRanges does, treating a run that touches the end\n // as still growing (it matches nothing yet); the first run left open is pending.\n const growing = (r: number) => {\n const [start, len] = runs[r] as [number, number];\n return start + len === n;\n };\n for (let r = 0; r < runs.length; ) {\n if (growing(r)) return (runs[r] as [number, number])[0];\n const len = (runs[r] as [number, number])[1];\n let j = r + 1;\n while (j < runs.length && ((runs[j] as [number, number])[1] !== len || growing(j))) j++;\n if (j >= runs.length) return (runs[r] as [number, number])[0];\n r = j + 1;\n }\n return -1;\n}\n","import { findCodeRanges } from \"./code-ranges\";\n\n/**\n * `$$` pairing — the core's rule for which `$$` delimiters are real math.\n *\n * Ported from `@ai-matrx/kit/delimiter-guard` (`guardMathDelimiters`), which\n * every math-capable renderer runs before remark-math. Its decisions:\n * - `$$` tokens outside code (``` / ~~~ fences, `inline code`) pair in\n * document order, open → close;\n * - a pair whose inside reads as prose or carries markdown structure is NOT\n * math: the renderer neutralizes its opener and the closer is retried as\n * the next opener;\n * - an unpaired `$$` is inert — it renders as literal text.\n * So the tokenizer protects exactly the pairs the renderer shows as math, and\n * a lone `$$` (a stray closer, or an opener that never closed) never locks\n * anything. Linear time: one regex pass per code shape, one sweep.\n */\n\nconst MAX_MATH_SPAN = 600;\nconst STRUCTURAL_MARKDOWN =\n /\\]\\(|https?:\\/\\/|\\*\\*|(?:^|\\n)[ \\t]{0,3}#{1,6}[ \\t]|(?:^|\\n)[ \\t]*[-*+][ \\t]+|(?:^|\\n)[ \\t]*\\d+[.)][ \\t]/;\nconst LATEX_COMMAND = /\\\\[a-zA-Z]/;\nconst PROSE_WORD = /[A-Za-z]{3,}/g;\nconst PROSE_WORD_LIMIT = 6;\n\n/**\n * `$$...$$`, `$$…$$`, `$$ · $$`: a PLACEHOLDER — prose describing the syntax,\n * never a formula. The pair is consumed whole as literal text (neither `$$`\n * may open the next span).\n */\nexport function isMathPlaceholder(inner: string): boolean {\n return /^[\\s.…·⋯_-]*$/.test(inner) && /[.…·⋯]/.test(inner);\n}\n\n/** A `$$` alone on its line opens a flow block (like a fence). */\nfunction opensFlowBlock(text: string, open: number): boolean {\n // Only whitespace between the line start and the opener, and after it to\n // the line end. Scans just that whitespace, so a line full of `$$` stays linear.\n for (let k = open - 1; k >= 0 && text[k] !== \"\\n\"; k--) if (text[k] !== \" \" && text[k] !== \"\\t\") return false;\n for (let k = open + 2; k < text.length && text[k] !== \"\\n\"; k++) if (text[k] !== \" \" && text[k] !== \"\\t\" && text[k] !== \"\\r\") return false;\n return true;\n}\n\n/**\n * The guard's `looksLikeMath`. `flow` = the opener is alone on its line: a\n * flow block may span blank lines (like a fence); a `$$` with text beside it\n * never crosses one — TeX's rule, and what keeps a stray prose `$$` from\n * pairing with the next paragraph's formula.\n */\nexport function looksLikeDisplayMath(inner: string, flow = false): boolean {\n const s = inner.trim();\n if (!s) return false;\n if (STRUCTURAL_MARKDOWN.test(s)) return false;\n if (s.length > MAX_MATH_SPAN) return false;\n // TeX's rule: display math never contains a blank line — a stray prose `$$`\n // never pairs with the next paragraph's formula, LaTeX in between or not.\n // On the UNtrimmed span: the blank line is often right before the closer.\n if (!flow && /\\n[ \\t]*\\n/.test(inner)) return false;\n if (LATEX_COMMAND.test(s)) {\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT * 3;\n }\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT;\n}\n\n/** Code ranges as `[start, end)` tuples — the ONE CommonMark rule (`./code-ranges`). */\nfunction codeRanges(text: string): Array<[number, number]> {\n return findCodeRanges(text).map((r) => [r.start, r.end]);\n}\n\nexport { pendingCodeSpanStart } from \"./code-ranges\";\n\n/**\n * STREAMING: the last `$$` token that is still unpaired AND could still pair\n * with a `$$` not yet arrived — its span so far is short enough, carries no\n * markdown structure, not too many prose words, and (unless it opens a flow\n * block) no blank line. Everything after it may yet become math, so a\n * streaming tokenizer treats it as provisional. -1 when there is none.\n */\nexport function pendingDisplayMathOpener(text: string): number {\n if (!text.includes(\"$$\")) return -1;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2;\n }\n const paired = new Set<number>();\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n paired.add(open);\n paired.add(close);\n j += 2;\n continue;\n }\n j += 1;\n }\n // The EARLIEST unpaired token that could still pair: a later token can yet\n // vanish into an inline code span whose closer has not arrived, which would\n // hand an earlier token a new partner.\n // Trailing whitespace is trimmed from every candidate's span; measure it once.\n let trail = 0;\n while (trail < text.length && /\\s/.test(text[text.length - 1 - trail] as string)) trail++;\n for (const token of tokens) {\n if (paired.has(token)) continue;\n // Cheap bound first (keeps this linear): a span to the end longer than the\n // math limit plus its surrounding whitespace can never pair.\n let lead = 0;\n while (lead <= MAX_MATH_SPAN && /\\s/.test(text[token + 2 + lead] ?? \"x\")) lead++;\n if (text.length - (token + 2) - lead - trail > MAX_MATH_SPAN) continue;\n const inner = text.slice(token + 2);\n const s = inner.trim();\n if (STRUCTURAL_MARKDOWN.test(s) || s.length > MAX_MATH_SPAN) continue;\n if (!opensFlowBlock(text, token) && /\\n[ \\t]*\\n/.test(inner)) continue;\n if ((s.match(PROSE_WORD) ?? []).length >= PROSE_WORD_LIMIT * 3) continue;\n return token;\n }\n return -1;\n}\n\n/** Map of `$$` opener offset → closer offset for every pair the renderer shows as math. */\nexport function pairDisplayMath(text: string): Map<number, number> {\n const pairs = new Map<number, number>();\n if (!text.includes(\"$$\")) return pairs;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2; // never treat the second `$` of a pair as a new opener\n }\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n pairs.set(open, close);\n j += 2;\n continue;\n }\n j += 1;\n }\n return pairs;\n}\n","import { isMathPlaceholder } from \"./math-pairs\";\n\nconst TEX_SIGNAL = /\\\\[A-Za-z]+|[\\\\^_{}=<>+]/;\nconst LONE_VARIABLE = /^[A-Za-z](?:'|[0-9])?$/;\nconst MATH_SHAPE_CHARS = /^[A-Za-z0-9'\\s(),.*\\/-]+$/;\n\n/**\n * THE single-dollar math rule — the one predicate that decides whether a\n * CLOSED `$…$` is inline math or currency, on screen, in every export and in\n * the editor's islands (the renderer's normalizer, the source tokenizer and\n * print all ask it).\n *\n * Pandoc's `tex_math_dollars` delimiters (what remark-math approximates, and\n * how ChatGPT and Claude render): the opening `$` is followed by a\n * non-space, the closing `$` is preceded by a non-space and not followed by a\n * digit — so `$5 and $10`, `$5-$10`, `$5/$10` stay currency while `$FC$`,\n * `$AB$`, `$5$` and `$(0, 0)$` are math. On top of that, content that reads as\n * something other than a formula is refused — each guard is a false positive\n * measured in stored answers (matrx-frontend\n * `scripts/measure-single-dollar-rule.ts`, 2026-09-25: over 85k assistant\n * messages and 4k notes the widening adds 128 spans, every one a formula\n * (`$FC$`, `$(0, 0)$`, `$3x + 6 = 15$`), and drops 22 the old rule drew as\n * math that were code, template literals, a printf or broken TeX):\n * - an unescaped `%` — TeX's comment character, and a percentage\n * (`$\\ge$20% owners**…**$`, a printf `%1$s`);\n * - a closing bracket or `/` first, or an opening bracket last\n * (`[$X] plus [$Y]`, `($/SF/Yr) | High-Cost Market ($`, a regex\n * `/…/, '').replace(/…$`), or a straight quote at either end (`[\"$\", \"$\"]`\n * in data);\n * - `:` `;` `,` `/` last — a separator between two `$` words\n * (`$HOME/.local/bin:$PATH`, `$AAPL/$TSLA`);\n * - a number glued to a following letter (`$10$N9qo…`, a bcrypt cost);\n * - a placeholder (`$...$`);\n * - prose, unless a TeX command or operator says otherwise: two plain\n * words (`$Tipping (fee)$`), a contraction (`$I'm$`, never `$X'Y$`), an\n * abbreviation (`$e.g. (x)$`);\n * - a shell or template variable chain (`$USER$HOSTNAME`, `$name.$ext`,\n * `${a}${b}`) — {@link isVariableChain}.\n *\n * `after` is the text right after the closing `$` — {@link singleDollarAfter}\n * (up to {@link AFTER_WINDOW} characters; `\\n` marks the end of the text). A single character still\n * applies the Pandoc digit rule, but the variable-chain guard needs the\n * whole following name.\n */\nexport function isSingleDollarMath(\n content: string,\n after: string | undefined,\n): boolean {\n if (!content || content.length > 400) return false;\n if (/^\\s/.test(content) || /\\s$/.test(content)) return false;\n if (after !== undefined && /^[0-9]/.test(after)) return false;\n if (isVariableChain(content, after)) return false;\n if (/(?:^|[^\\\\])%/.test(content)) return false;\n if (/^[)\\]}\"/]/.test(content) || /[(\\[{\":;,/]$/.test(content)) return false;\n if (/^[0-9]/.test(content) && after !== undefined && /^[A-Za-z]/.test(after)) return false;\n if (isMathPlaceholder(content)) return false;\n return TEX_SIGNAL.test(content) || !readsAsProse(content);\n}\n\nconst IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n/** What may follow a closing `$` glued on in math prose: `$n$th`, `$x_i$s`, `$AB$'s`. */\nconst MATH_SUFFIX = /^(?:s|es|th|st|nd|rd)$/i;\n\n/**\n * Shell and template variables written outside backticks, not a formula:\n * the closing `$` is glued to the NEXT variable (`$USER$HOSTNAME`, `A=$A$B`,\n * R's `df$col$sub`), to a variable after one separator (`$name.$ext`,\n * `PS1='$USER@$HOST'`, PHP/Perl `$this->$prop`, `$class::$instance`), or the\n * span is a template placeholder (`${a}${b}`,\n * `${name}`). Measured before it shipped (matrx-frontend\n * `scripts/measure-single-dollar-rule.ts`, classes `shell-variable-chain` and\n * `template-literal`). Math keeps its glued suffixes: `$n$th`, `$x_i$s`.\n */\nfunction isVariableChain(content: string, after: string | undefined): boolean {\n if (/^\\{[A-Za-z_][\\w.]*\\}$/.test(content)) return true;\n // Shell arithmetic expansion `$((1+2))` and PowerShell's pipeline variable\n // `$_.Name` / `$_[0]` (verify-RC-B3 round 4, D5).\n if (/^\\(\\(.*\\)\\)$/.test(content) || /^_[.[]/.test(content)) return true;\n if (!after) return false;\n if (after[0] === \"{\") return IDENTIFIER.test(content);\n const run = /^[A-Za-z0-9_]+/.exec(after)?.[0];\n if (!run) return false;\n // A caller that passes one character cannot tell `$n$t…` (`th`) from the\n // next variable — no verdict from so little (older callers).\n if (after.length === 1) return false;\n // One separator between two names: `$name.$ext`, `$USER@$HOST`, PHP/Perl\n // member access `$this->$prop`, `$obj->$method`, `$class::$instance`.\n if (/^[A-Za-z_][A-Za-z0-9_]*(?:[.@-]|->|::)$/.test(content)) return true;\n return IDENTIFIER.test(content) && !MATH_SUFFIX.test(run);\n}\n\nconst FUNCTION_NAMES = new Set([\n \"sin\", \"cos\", \"tan\", \"sec\", \"csc\", \"cot\", \"log\", \"ln\", \"exp\",\n \"lim\", \"max\", \"min\", \"det\", \"gcd\", \"mod\", \"arg\", \"sinh\", \"cosh\", \"tanh\",\n]);\n\n/**\n * Words, not symbols: two plain words of three or more letters (standard\n * function names aside) with a space between them, a contraction (`I'm` — a\n * prime is never followed by a lowercase letter; `X'Y` is Boolean algebra), or an abbreviation (`e.g.` — a letter\n * is never followed by a period; `x.y` inside parentheses is fine).\n */\nfunction readsAsProse(content: string): boolean {\n if (/[A-Za-z]'[a-z]/.test(content)) return true;\n if (/(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return true;\n if (!/\\s/.test(content)) return false;\n const words = (content.match(/[A-Za-z]{3,}/g) ?? []).filter((w) => !FUNCTION_NAMES.has(w.toLowerCase()));\n return words.length >= 2;\n}\n\n/**\n * Whether an UNCLOSED `$…` already reads as a formula — for a stream that\n * must decide before the closing `$` arrives (matrx-frontend `stream-heal`\n * holds such a tail back instead of printing raw TeX). Stricter than\n * {@link isSingleDollarMath} on purpose: with no closer there are no Pandoc\n * delimiter facts yet, so it needs a math SIGNAL — a TeX command or operator\n * (`\\alpha`, `^`, `_`, `{`, `=`, …), a lone variable (`x`, `x'`), or a\n * single-letter math shape (`f(g(x))`, `u v`). Content that opens with a digit\n * needs a real TeX command, so `$35 per stop` keeps showing while it streams.\n */\nexport function looksLikeOpenInlineMath(partial: string): boolean {\n if (!partial || partial.length > 400) return false;\n if (/^\\s/.test(partial) || /\\s$/.test(partial)) return false;\n if (LONE_VARIABLE.test(partial)) return true;\n if (/^[0-9]/.test(partial)) return /\\\\[A-Za-z]+|[\\\\^_{}]/.test(partial);\n return TEX_SIGNAL.test(partial) || isMathShape(partial);\n}\n\n/**\n * A math SHAPE with no TeX command or operator: single-letter identifiers\n * (optionally primed, optionally a standard function name) applied,\n * juxtaposed or listed — `f(g(x))`, `u v`, `f'(x)`, `(x, y)`, `ln(x)`.\n */\nfunction isMathShape(content: string): boolean {\n if (!MATH_SHAPE_CHARS.test(content)) return false;\n const words = content.match(/[A-Za-z]+/g);\n if (!words) return false;\n if (!words.every((w) => w.length === 1 || FUNCTION_NAMES.has(w))) return false;\n if (/[A-Za-z]'+[A-Za-z]/.test(content) || /(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return false;\n return /[A-Za-z]'*\\(|[A-Za-z]'|\\b[A-Za-z]\\s+[A-Za-z]\\b|\\([^)]*[A-Za-z][^)]*\\)/.test(content);\n}\n\n/**\n * Where a single-dollar math span opened at `open` (a lone `$`) closes, or -1.\n * Same scan the normalizer uses: same line, backslash-escapes skipped, the\n * closer is a `$` not followed by another `$`, and the content passes\n * {@link isSingleDollarMath}. Returns the offset just past the closing `$`.\n */\n/** How much text after a closing `$` the rule reads (a glued suffix or the next variable name). */\nexport const AFTER_WINDOW = 32;\n\n/**\n * The `after` argument of {@link isSingleDollarMath} for the closing `$` at\n * `close`: the next {@link AFTER_WINDOW} characters, with a `\\n` standing for\n * the end of the text (so `$A$B` at the very end reads the whole name `B`).\n */\nexport function singleDollarAfter(text: string, close: number): string {\n const rest = text.slice(close + 1, close + 1 + AFTER_WINDOW);\n return rest.length < AFTER_WINDOW ? `${rest}\\n` : rest;\n}\n\nexport function singleDollarMathEnd(text: string, open: number, limit = text.length): number {\n // Content over 400 characters is never math, so the scan never needs to go\n // further — this keeps a line full of `$` linear.\n const bound = Math.min(limit, open + 403);\n let close = -1;\n for (let k = open + 1; k < bound; k += 1) {\n const c = text[k];\n if (c === \"\\n\") break;\n if (c === \"\\\\\") {\n k += 1;\n continue;\n }\n if (c === \"$\") {\n close = k;\n break;\n }\n }\n if (close === -1 || text[close + 1] === \"$\") return -1;\n const content = text.slice(open + 1, close);\n return isSingleDollarMath(content, singleDollarAfter(text, close)) ? close + 1 : -1;\n}\n\n/** TeX that no prose carries: a command, a superscript, a brace, a relation or `+`, a subscript on a letter. */\nconst BRACKET_TEX_SIGNAL = /\\\\[A-Za-z]+|[\\^{}=<>+]|_\\{|(?:^|[^A-Za-z0-9])[A-Za-z]_[A-Za-z0-9](?![A-Za-z0-9])/;\n\n/**\n * THE escaped-bracket rule — whether a closed `\\[ … \\]` is display math or\n * CommonMark's escaped brackets (literal `[ … ]`). The tokenizer, the\n * renderer's normalizer and the editor all ask it.\n *\n * Math only when the content is real TeX (BRACKET_TEX_SIGNAL) and the `\\[`\n * is not an index on an identifier (`arr\\[i+1\\]`, `f(x)\\[k\\]`).\n * Everything a person writes with escaped brackets stays text: citations\n * `\\[1\\]`, dates `\\[2026-09-25\\]`, task boxes `- \\[x\\]`, editorial\n * insertions `\\[was\\]`, placeholders `\\[site name\\]` (verify-RC-B4 R3-2).\n * `before` is the character just before the `\\[` (undefined at the start).\n */\nexport function isEscapedBracketMath(content: string, before: string | undefined): boolean {\n if (!content.trim()) return false;\n if (before !== undefined && /[A-Za-z0-9_)\\]]/.test(before)) return false;\n return BRACKET_TEX_SIGNAL.test(content);\n}\n","/**\n * XML tag reading + the generic-container balance scanner.\n *\n * Ported VERBATIM (behaviour) from matrx-frontend\n * `components/mardown-display/blocks/xml/readXmlTag.ts` and the\n * `XmlContainerTracker` in\n * `components/mardown-display/markdown-classification/processors/utils/content-splitter-v2.ts`\n * so the source tokenizer ends a generic XML section exactly where the\n * renderer does. Fences inside the section are found by THE one code-range\n * rule (source/code-ranges.ts `fenceOpenerOf` + `FenceReader`), which the\n * renderer's splitter imports too (RC-B10).\n */\nimport { FenceReader, fenceOpenerOf } from \"./code-ranges\";\n\nexport interface ReadXmlTag {\n tagName: string;\n raw: string;\n isClosing: boolean;\n isSelfClosing: boolean;\n attributes: Array<{ name: string; value: string }>;\n}\n\nconst XML_NAME_START = /[A-Za-z_]/;\nconst XML_NAME_CHARACTER = /[\\w.:-]/;\nconst WHITESPACE = /\\s/;\n\n/**\n * `find(needle, from)` must behave like `content.indexOf(needle, from)`; the\n * tokenizer passes a cached occurrence index so a text full of unclosed\n * attribute quotes stays linear. Behaviour is identical either way.\n */\nexport function readXmlTag(\n content: string,\n start: number,\n find: (needle: string, from: number) => number = (needle, from) => content.indexOf(needle, from),\n): ReadXmlTag | null {\n let cursor = start + 1;\n const isClosing = content[cursor] === \"/\";\n if (isClosing) cursor++;\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const nameStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const tagName = content.slice(nameStart, cursor);\n const attributes: Array<{ name: string; value: string }> = [];\n if (isClosing) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n }\n while (cursor < content.length) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] === \">\")\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n if (content[cursor] === \"/\") {\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: true,\n attributes,\n };\n }\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const attributeStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const name = content.slice(attributeStart, cursor);\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \"=\") return null;\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n const quote = content[cursor];\n if (quote !== '\"' && quote !== \"'\") return null;\n const valueStart = ++cursor;\n const valueEnd = find(quote, valueStart);\n if (valueEnd === -1) return null;\n cursor = valueEnd;\n attributes.push({ name, value: content.slice(valueStart, cursor) });\n cursor++;\n }\n return null;\n}\n\nfunction isEscapedBacktick(line: string, offset: number): boolean {\n let slashes = 0;\n for (let i = offset - 1; line[i] === \"\\\\\"; i--) slashes++;\n return slashes % 2 === 1;\n}\n\n/**\n * Balances ONE unknown root tag line by line, ignoring lookalike tags inside\n * fenced code, inline code spans, comments and CDATA. `consumeLine` returns\n * the offset (within that line) just past the root's closing tag, or null.\n */\nexport class XmlContainerTracker {\n readonly rootTag: string;\n private depth = 0;\n private inComment = false;\n private inCdata = false;\n private inlineTicks = 0;\n /** The open fence, read by THE one closer (source/code-ranges.ts). */\n private fence: FenceReader | null = null;\n\n constructor(rootTag: string) {\n this.rootTag = rootTag;\n }\n\n consumeLine(line: string, startOffset = 0): number | null {\n if (this.fence) {\n if (this.fence.feed(line)) this.fence = null;\n return null;\n }\n if (!this.inComment && !this.inCdata && this.inlineTicks === 0) {\n const opener = fenceOpenerOf(line);\n if (opener) {\n this.fence = new FenceReader(opener);\n return null;\n }\n }\n\n for (let i = startOffset; i < line.length; i++) {\n if (this.inlineTicks > 0) {\n if (line[i] === \"`\") {\n let end = i;\n while (line[end] === \"`\") end++;\n if (end - i === this.inlineTicks) this.inlineTicks = 0;\n i = end - 1;\n }\n continue;\n }\n if (this.inComment) {\n const end = line.indexOf(\"-->\", i);\n if (end === -1) return null;\n this.inComment = false;\n i = end + 2;\n continue;\n }\n if (this.inCdata) {\n const end = line.indexOf(\"]]>\", i);\n if (end === -1) return null;\n this.inCdata = false;\n i = end + 2;\n continue;\n }\n if (line.startsWith(\"<!--\", i)) {\n this.inComment = true;\n i += 3;\n continue;\n }\n if (line.startsWith(\"<![CDATA[\", i)) {\n this.inCdata = true;\n i += 8;\n continue;\n }\n if (line[i] === \"`\" && !isEscapedBacktick(line, i)) {\n let end = i;\n while (line[end] === \"`\") end++;\n this.inlineTicks = end - i;\n i = end - 1;\n continue;\n }\n if (line[i] !== \"<\") continue;\n const tag = readXmlTag(line, i);\n if (!tag) continue;\n const tagEnd = i + tag.raw.length;\n if (tag.tagName === this.rootTag) {\n if (tag.isClosing) this.depth--;\n else if (!tag.isSelfClosing) this.depth++;\n if (this.depth === 0) return tagEnd;\n }\n i = tagEnd - 1;\n }\n return null;\n }\n}\n","/**\n * THE GFM table rule — one splitter, one cell-pipe rule, one \"where does a\n * table start and run\" — for every surface that reads a markdown table: the\n * chat splitter and live stream, the table renderers and editors, the rich\n * editor's writer, the print package, and (by shared vectors) the Python block\n * detector. verify-RC-B4 R4/R5/R6.\n *\n * - A `|` is a cell boundary unless an ODD run of backslashes precedes it\n * (`\\|` is a pipe inside the cell; `\\\\|` is an escaped backslash and then a\n * boundary). Code spans get no special treatment: GFM splits rows before\n * inline parsing, so an unescaped `|` inside backticks is a boundary too.\n * - A cell's `\\|` shows as `|` — inside code spans too (spec example 200).\n * - A table starts at a header line whose NEXT line is a delimiter row (`--- |\n * :-:`, edge pipes optional, never a list item such as `- | -`) of the SAME\n * width; the header needs no pipe of its own (`Notes` over `|---|` is a\n * one-column table), is not indented code, and is not a lazy continuation of a\n * list item's or quote's paragraph. It runs to a blank line, a\n * line that starts another block (`- x`, `> y`, `# z`, `1.`, a fence, a rule,\n * an HTML block — CommonMark 4.6's seven start conditions), or a line indented\n * four or more columns past the table's container (indented code); every other\n * line is a row, with or without a pipe (spec example 202), a lone `|` included\n * (an empty row).\n *\n * Pure TS, no dependencies.\n */\n\nimport { opensStrictFence } from \"./code-ranges\";\n\n/** The row's bytes between boundaries (edge segments included). */\nexport function splitRowSegments(line: string): string[] {\n const segments: string[] = [];\n let start = 0;\n for (let i = 0; i < line.length; i += 1) {\n const ch = line[i];\n if (ch === \"\\\\\") {\n i += 1; // the escaped character — never a boundary\n continue;\n }\n if (ch === \"|\") {\n segments.push(line.slice(start, i));\n start = i + 1;\n }\n }\n segments.push(line.slice(start));\n return segments;\n}\n\n/** A row's cell texts as GFM reads them (source bytes, trimmed; edge pipes dropped). */\nexport function rowCells(line: string): string[] {\n const cells = splitRowSegments(line).map((cell) => cell.trim());\n if (cells.length > 1 && cells[0] === \"\") cells.shift();\n if (cells.length > 1 && cells[cells.length - 1] === \"\") cells.pop();\n // A line with no cell at all is no row; a lone `|` IS a row — one empty cell,\n // as GFM reads it (a hidden row is a screen that lies).\n else if (cells.length === 1 && cells[0] === \"\" && !line.includes(\"|\")) cells.pop();\n return cells;\n}\n\n/** GFM's table-level unescape: a cell's `\\|` is a pipe, in code spans too. */\nexport function unescapeCellPipes(cell: string): string {\n return cell.replace(/\\\\\\|/g, \"|\");\n}\n\n/** A line GFM reads as the start of another block (list item, quote, heading, fence, rule, HTML block). */\n// Fences are judged by THE code-range rule (opensStrictFence): a `~~~` run, or a\n// backtick run whose info string holds no backtick (CommonMark 4.5).\n// A footnote definition (`[^1]: …`, GFM) is a block start too: it ends a table.\nconst BLOCK_START = /^(?:[-+*](?:\\s|$)|\\d{1,9}[.)](?:\\s|$)|>|#{1,6}(?:\\s|$)|(?:-\\s*){3,}$|(?:\\*\\s*){3,}$|(?:_\\s*){3,}$|\\[\\^[^\\]\\s]+\\]:)/;\nconst startsBlock = (trimmed: string): boolean =>\n BLOCK_START.test(trimmed) || opensStrictFence(trimmed) || startsHtmlBlock(trimmed);\n\n// CommonMark 4.6 HTML block start conditions (0.31, as micromark reads them).\n// 1: <script|pre|style|textarea then whitespace, `>` or end of line.\nconst HTML_RAW = /^<(?:script|pre|style|textarea)(?:[\\s>]|$)/i;\n// 2: <!-- 3: <? 4: <! then an ASCII letter 5: <![CDATA[\nconst HTML_COMMENT_ETC = /^(?:<!--|<\\?|<![A-Za-z]|<!\\[CDATA\\[)/;\n// 6: < or </ then a block tag name, then whitespace, end of line, `>` or `/>`.\nconst HTML_BLOCK_NAMES =\n \"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\";\nconst HTML_BLOCK_TAG = new RegExp(`^</?(?:${HTML_BLOCK_NAMES})(?:[\\\\s>]|/>|$)`, \"i\");\n// 7: one complete open tag or closing tag (any other name), then only whitespace.\nconst ATTRIBUTE = `\\\\s+[A-Za-z_:][A-Za-z0-9_.:-]*(?:\\\\s*=\\\\s*(?:[^\\\\s\"'=<>\\`]+|'[^']*'|\"[^\"]*\"))?`;\nconst HTML_COMPLETE_TAG = new RegExp(`^(?:<[A-Za-z][A-Za-z0-9-]*(?:${ATTRIBUTE})*\\\\s*/?>|</[A-Za-z][A-Za-z0-9-]*\\\\s*>)\\\\s*$`);\n\nconst HTML_BLOCK_NAME_SET: ReadonlySet<string> = new Set([\n // Condition 1 (raw text) and condition 6 (block) tag names — CommonMark 0.31.\n \"script\", \"pre\", \"style\", \"textarea\",\n ...HTML_BLOCK_NAMES.replace(\"h[1-6]\", \"h1|h2|h3|h4|h5|h6\").split(\"|\"),\n]);\n\n/**\n * A tag name CommonMark reads as an HTML BLOCK when it opens a line (conditions\n * 1 and 6: `div`, `details`, `section`, `script`, …; case-insensitive). A\n * line-leading tag with such a name is HTML — the markdown renderer's, ending\n * where GFM ends it — never a custom XML container that owns what follows.\n * verify-RC-B4 round 9.\n */\nexport function isHtmlBlockTagName(name: string): boolean {\n return HTML_BLOCK_NAME_SET.has(name.toLowerCase());\n}\n\n/** The trimmed line starts an HTML block (any of CommonMark 4.6's seven conditions). */\nexport function startsHtmlBlock(trimmed: string): boolean {\n if (!trimmed.startsWith(\"<\")) return false;\n return HTML_RAW.test(trimmed) || HTML_COMMENT_ETC.test(trimmed) || HTML_BLOCK_TAG.test(trimmed) || HTML_COMPLETE_TAG.test(trimmed);\n}\n\n/** The column a line's content starts at: spaces count 1, a tab runs to the next multiple of 4. */\nexport function lineIndent(line: string): number {\n let column = 0;\n for (const ch of line) {\n if (ch === \" \") column += 1;\n else if (ch === \"\\t\") column += 4 - (column % 4);\n else break;\n }\n return column;\n}\n\nconst LIST_MARKER = /^([ \\t]*)([-+*]|\\d{1,9}[.)])([ \\t]+|$)/;\n\n/** A list item's content column: after the marker and 1–4 spaces (1 when 5+, or when the item is empty). */\nfunction markerContentColumn(marker: RegExpExecArray): number {\n const markerEnd = lineIndent(marker[1] ?? \"\") + (marker[2] ?? \"\").length;\n const gap = marker[3] ? lineIndent(\" \".repeat(markerEnd) + marker[3]) - markerEnd : 1;\n return markerEnd + (gap >= 1 && gap <= 4 ? gap : 1);\n}\n\n/**\n * The content column of the container a table at `start` sits in: the list item\n * whose content the header line belongs to (the nearest list-marker line above,\n * past blank and continuation lines, whose content column is at or left of the\n * header's), or 0 at top level. Indentation past it by 4+ columns is indented\n * code, which ends the table.\n */\nexport function tableContainerIndent(lines: readonly string[], start: number): number {\n return tableContainerIndentOf(lines, start, false);\n}\n\n/** The content column of the list item line `start` belongs to — its own item when `ownItem` and it is a marker line. */\nfunction tableContainerIndentOf(lines: readonly string[], start: number, ownItem: boolean): number {\n const own = ownItem ? LIST_MARKER.exec(lines[start] ?? \"\") : null;\n if (own) return markerContentColumn(own);\n const header = lineIndent(lines[start] ?? \"\");\n if (header === 0) return 0;\n for (let k = start - 1; k >= 0; k -= 1) {\n const line = lines[k] ?? \"\";\n if (!line.trim()) continue;\n const indent = lineIndent(line);\n const marker = LIST_MARKER.exec(line);\n if (marker && indent < header) {\n const content = markerContentColumn(marker);\n if (content <= header) return content;\n continue;\n }\n if (indent === 0) return 0;\n }\n return 0;\n}\n\nconst DELIMITER_CELL = /^:?-+:?$/;\n\n/** A GFM delimiter row: every cell `---`, `:--`, `--:` or `:-:`, with at least one pipe. */\nexport function isGfmDelimiterRow(line: string): boolean {\n const trimmed = line.trim();\n if (!trimmed.includes(\"|\")) return false;\n const cells = rowCells(trimmed);\n return cells.length > 0 && cells.every((cell) => DELIMITER_CELL.test(cell));\n}\n\n/** A pipe-led row: `|` first, and another `|` after it. */\nexport function isPipeLedRow(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.startsWith(\"|\") && trimmed.includes(\"|\", 1);\n}\n\n/** A delimiter row GFM reads as one: `|`-bearing dashes and colons, never a list item (`- | -`). */\nfunction isTableDelimiter(line: string | undefined): line is string {\n if (line === undefined || !isGfmDelimiterRow(line)) return false;\n return !BLOCK_START.test(line.trim());\n}\n\n/**\n * True when `header` + `delimiter` open a table whose header is NOT a pipe-led\n * row: `a | b` (no edge pipes), `| a` (one pipe), or even `Notes` (no pipe — a\n * one-column table over `|---|`). The delimiter must match the header's width.\n */\nexport function startsPipelessTable(header: string, delimiter: string | undefined): boolean {\n const head = header.trim();\n if (!head || isPipeLedRow(head) || (!head.startsWith(\"|\") && startsBlock(head))) return false;\n if (!isTableDelimiter(delimiter)) return false;\n return rowCells(head).length === rowCells(delimiter.trim()).length;\n}\n\n/**\n * A line that continues an open table — GFM's rule (spec example 202): the table\n * runs to the first blank line, the first line that starts another block (an\n * HTML block included), or the first line indented 4+ columns past the table's\n * container (`containerIndent`, from `tableContainerIndent`; indented code). Any\n * other line is a row, even one without a pipe (`bar` → a one-cell row) and a\n * lone `|` (an empty row). verify-RC-B4 R7-2 / round 9.\n */\nexport function continuesTable(line: string, containerIndent = 0): boolean {\n const trimmed = line.trim();\n if (!trimmed) return false;\n if (lineIndent(line) - containerIndent >= 4) return false;\n return trimmed.startsWith(\"|\") || !startsBlock(trimmed);\n}\n\n/** Line `index` opens a table: a pipe-led row, or a pipe-less GFM header over its delimiter row. */\nexport function opensTable(lines: readonly string[], index: number): boolean {\n const line = lines[index] ?? \"\";\n if (!isPipeLedRow(line) && !startsPipelessTable(line, lines[index + 1])) return false;\n return !isLazyContinuation(lines, index) && !insideHtmlBlock(lines, index);\n}\n\nconst QUOTE_LINE = /^ {0,3}>/;\nconst THEMATIC_BREAK = /^(?:(?:-[ \\t]*){3,}|(?:\\*[ \\t]*){3,}|(?:_[ \\t]*){3,})$/;\n/** A line that ends a paragraph above it without being part of it: heading, rule, fence, HTML block. */\nconst breaksParagraph = (trimmed: string): boolean =>\n /^#{1,6}(?:\\s|$)/.test(trimmed) || THEMATIC_BREAK.test(trimmed) || opensStrictFence(trimmed) || startsHtmlBlock(trimmed);\n\n/**\n * Line `index` is a LAZY continuation of a paragraph inside a list item or block\n * quote (CommonMark 5.1/5.2): the paragraph runs right above it (no blank line)\n * and the line is not indented to that container's content column (or lacks the\n * quote's `>`). GFM reads such a line as more paragraph text — never a table\n * header (`- item` then `| a | b |` on the next line is no table). verify-RC-B4 round 9.\n */\n/** The end marker of HTML block types 1–5 (CommonMark 4.6); types 6 and 7 end at a blank line. */\nfunction htmlBlockEnd(trimmed: string): RegExp | null | undefined {\n if (HTML_RAW.test(trimmed)) return /<\\/(?:script|pre|style|textarea)>/i;\n if (trimmed.startsWith(\"<!--\")) return /-->/;\n if (trimmed.startsWith(\"<?\")) return /\\?>/;\n if (trimmed.startsWith(\"<![CDATA[\")) return /\\]\\]>/;\n if (/^<![A-Za-z]/.test(trimmed)) return />/;\n if (HTML_BLOCK_TAG.test(trimmed)) return null;\n if (HTML_COMPLETE_TAG.test(trimmed)) return null;\n return undefined;\n}\n\n/**\n * Line `index` sits INSIDE an HTML block that opened above it in the same run of\n * lines (no blank line between): `<details>` then `| a | b |` is raw HTML to GFM,\n * never a table. Types 1–5 end at their marker (`-->`, `</script>`, …) — a\n * closed `<!-- note -->` line leaves the next line free; types 6 and 7 run to the\n * blank line; type 7 (any other complete tag) cannot interrupt a paragraph.\n * verify-RC-B4 round 9 (R9-5).\n */\nfunction insideHtmlBlock(lines: readonly string[], index: number): boolean {\n let start = index;\n while (start > 0 && (lines[start - 1] ?? \"\").trim()) start -= 1;\n let open: RegExp | null | undefined; // undefined = not in an HTML block\n let paragraph = false;\n for (let k = start; k < index; k += 1) {\n const line = lines[k] ?? \"\";\n if (open !== undefined) {\n if (open && open.test(line)) open = undefined;\n continue;\n }\n const trimmed = line.trim();\n const end = lineIndent(line) < 4 ? htmlBlockEnd(trimmed) : undefined;\n const type7 = end === null && !HTML_BLOCK_TAG.test(trimmed);\n const interrupts = end !== undefined && !(paragraph && type7);\n if (!interrupts) {\n paragraph = true;\n continue;\n }\n paragraph = false;\n // A type 1–5 block whose end marker is on its own first line is already closed.\n open = end && end.test(trimmed.slice(2)) ? undefined : end;\n }\n return open !== undefined;\n}\n\nfunction isLazyContinuation(lines: readonly string[], index: number): boolean {\n const header = lines[index] ?? \"\";\n let first = -1;\n for (let k = index - 1; k >= 0; k -= 1) {\n const line = lines[k] ?? \"\";\n const trimmed = line.trim();\n if (!trimmed) break;\n if (breaksParagraph(trimmed)) break;\n const marker = LIST_MARKER.exec(line);\n if (marker) {\n const rest = line.slice(marker[0].length).trim();\n if (!rest || breaksParagraph(rest)) break; // an empty item, or one holding no paragraph\n first = k;\n break;\n }\n first = k;\n if (QUOTE_LINE.test(line)) break;\n }\n if (first < 0) return false;\n const start = lines[first] ?? \"\";\n if (QUOTE_LINE.test(start)) return !QUOTE_LINE.test(header);\n return lineIndent(header) < tableContainerIndentOf(lines, first, true);\n}\n\n/** A WHOLE table header at `index`: a table opens here AND its next line is a GFM delimiter row. */\nexport function tableStartsAt(lines: readonly string[], index: number): boolean {\n const header = lines[index] ?? \"\";\n const delimiter = lines[index + 1];\n if (!opensTable(lines, index) || !isTableDelimiter(delimiter)) return false;\n // GFM: the delimiter row matches the header's width, and a header indented 4+\n // columns past its container is indented code.\n if (rowCells(header).length !== rowCells(delimiter).length) return false;\n return lineIndent(header) - tableContainerIndent(lines, index) < 4;\n}\n\n/** Index of the first line at or after `from` that opens a table; -1 when none. */\nexport function findTableStart(lines: readonly string[], from = 0): number {\n for (let i = Math.max(0, from); i < lines.length; i += 1) if (opensTable(lines, i)) return i;\n return -1;\n}\n\n/** Index just past the table whose header is at `start` (header, delimiter, then continuation rows). */\nexport function findTableEnd(lines: readonly string[], start: number): number {\n const container = tableContainerIndent(lines, start);\n let end = Math.min(lines.length, start + 2);\n while (end < lines.length && continuesTable(lines[end] ?? \"\", container)) end += 1;\n return end;\n}\n","/**\n * THE OFFSET-PRESERVING SOURCE TOKENIZER (rich-content PLAN decision 6).\n *\n * Cuts stored markdown into blocks that cover the text EXACTLY: the\n * concatenation of every block's `raw` is the input, always, byte for byte.\n * Nothing is trimmed, normalized, or re-serialized here — the tokenizer only\n * draws boundaries. Every custom construct the platform stores (kinds and\n * `__kind` JSON, typed JSON blocks, special fences, XML sections including\n * attribute-bearing, mid-line and unknown containers, `{{variables}}`,\n * `<matrxcite/>`, math, raw HTML, code fences, HTML comments and pinned\n * anchors `<!--@a:…-->`) is an ISLAND: an atomic span no editor may parse\n * into its own model. Islands that sit inside running prose (a variable, a\n * citation, inline math) stay inside their paragraph as `inlines`, so a\n * visual editor keeps the paragraph whole and holds the island as an atom.\n *\n * Block kinds:\n * - `prose` — a markdown paragraph run (headings, lists, tables…): the only\n * thing a visual editor may re-serialize, and only when edited.\n * - `island` — a protected construct; `islandType` says which.\n * - `gap` — the line terminator(s) and blank lines between blocks. Never\n * edited; they keep the document's exact spacing.\n *\n * Streaming-tolerant: never throws on partial input. A construct whose\n * closer has not arrived yet becomes an island running to the end of the text\n * with `complete: false` — the same ownership rule the renderer's splitter\n * applies, so a half-streamed fence or XML section is never reflowed.\n *\n * Boundaries follow matrx-frontend's renderer splitter (`content-splitter-v2.ts`)\n * wherever it decides where a construct ends, so the editor and the renderer\n * agree on what is locked. Offsets are UTF-16 (`start`/`end`) and code points\n * (`startCp`/`endCp`).\n */\n\nimport { buildCodePointIndex } from \"./offsets\";\nimport {\n ALLOWED_RAW_HTML_TAGS,\n ATTRIBUTE_XML_NAMES,\n CITE_RE,\n HTML_BLOCK_LEVEL_TAGS,\n KNOWN_XML_TAG_NAMES,\n PINNED_ANCHOR_RE,\n SPECIAL_CODE_LANGUAGES,\n STRICT_VARIABLE_RE,\n THINKING_FAMILY,\n TREE_GLYPHS,\n TYPED_JSON_ROOT_KEYS,\n XML_TAG_BLOCK_NAMES,\n normalizeFenceLanguage,\n} from \"./constants\";\nimport { BacktickRuns, backtickRunLength, closeFence, fenceOpenerOf, type FenceLines, type FenceOpener } from \"./code-ranges\";\nimport { isEscapedBracketMath, singleDollarMathEnd } from \"./math\";\nimport { pairDisplayMath, pendingCodeSpanStart, pendingDisplayMathOpener } from \"./math-pairs\";\nimport { XmlContainerTracker, readXmlTag } from \"./xml-tag\";\nimport { isHtmlBlockTagName } from \"./gfm-table\";\n\nexport type SourceBlockKind = \"prose\" | \"island\" | \"gap\";\n\n/** Island types that own whole blocks. */\nexport type BlockIslandType =\n /** ``` / ~~~ fenced code of any language (meta.lang, meta.special). */\n | \"fence\"\n /** A bare JSON object block — typed JSON, `__kind` instances, directives. */\n | \"json\"\n /** A known attribute-less XML region (`<thinking>`, `<flashcards>`, …). */\n | \"xml_region\"\n /** An attribute-bearing XML element (`<artifact …>`, `<decision …>`, …). */\n | \"xml_attr\"\n /** Any other line-leading, balanced XML element. */\n | \"xml_container\"\n /** Allow-listed raw HTML block. */\n | \"html_block\"\n /** `<!-- … -->` comment. */\n | \"html_comment\"\n /** A pinned annotation anchor `<!--@a:id-->`. */\n | \"anchor\"\n /** `$$ … $$` display math on its own lines. */\n | \"math_block\"\n /** YAML (`---`) or TOML (`+++`) front matter at the start of the text (meta.format). */\n | \"front_matter\"\n /** A box-drawing tree diagram. */\n | \"tree\"\n /**\n * A generic-directive container `:::name[label]{attrs}` … `:::` (tabs,\n * columns, details, figures, callouts, TOC — meta.name), a leaf directive\n * `::name` on its own line (meta.leaf), or a MkDocs admonition\n * `!!! type \"Title\"` / `??? type` with its indented body (meta.syntax \"mkdocs\").\n */\n | \"directive\"\n /** A GitHub alert / Obsidian callout: a blockquote opening `> [!TYPE]` (meta.name). */\n | \"callout\"\n /** A footnote definition `[^id]: …` with its indented continuation lines (meta.id). */\n | \"footnote_def\";\n\n/** Island types that live inside a prose block. */\nexport type InlineIslandType =\n | \"variable\"\n | \"cite\"\n | \"math_inline\"\n | \"html_tag\"\n | \"xml_tag\"\n | \"xml_inline\"\n | \"html_comment\"\n | \"anchor\"\n | \"kind_json\"\n | \"media_ref\"\n /** `[[Page]]`, `[[Page|alias]]` (meta.target) — or `![[Page]]` (meta.embed). */\n | \"wikilink\";\n\nexport type IslandType = BlockIslandType | InlineIslandType;\n\nexport type IslandMeta = Readonly<Record<string, string | number | boolean>>;\n\nexport interface SourceSpan {\n /** UTF-16 offset of the first code unit. */\n readonly start: number;\n /** UTF-16 offset just past the last code unit. */\n readonly end: number;\n /** Code-point offset of `start`. */\n readonly startCp: number;\n /** Code-point offset of `end`. */\n readonly endCp: number;\n /** Exactly `text.slice(start, end)`. */\n readonly raw: string;\n}\n\nexport interface SourceIsland extends SourceSpan {\n readonly islandType: IslandType;\n /** True when the island sits inside a prose block. */\n readonly inline: boolean;\n /** False when the construct's closer never arrived (streaming / malformed). */\n readonly complete: boolean;\n readonly meta: IslandMeta;\n}\n\nexport interface SourceBlock extends SourceSpan {\n readonly kind: SourceBlockKind;\n /** Set only on `island` blocks. */\n readonly islandType: BlockIslandType | null;\n readonly complete: boolean;\n readonly meta: IslandMeta;\n /** Inline islands of a `prose` block, in document order. Empty otherwise. */\n readonly inlines: readonly SourceIsland[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// helpers\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface RawIsland {\n type: IslandType;\n start: number;\n end: number;\n complete: boolean;\n meta: Record<string, string | number | boolean>;\n /** Cut out of a paragraph's lines (an orphan-closer rescue, a spilled inline). */\n fromParagraph?: boolean;\n}\n\ninterface RawBlock {\n kind: SourceBlockKind;\n start: number;\n end: number;\n island: RawIsland | null;\n inlines: RawIsland[];\n}\n\nconst NOT_WHITESPACE = /\\S/;\n/** `:::name`, `::name` (leaf) — a name right after the colons. */\nconst DIRECTIVE_OPEN = /^(:{2,})([A-Za-z][\\w-]*)/;\nconst MKDOCS_OPEN = /^(!!!|\\?\\?\\?\\+?)[ \\t]+([A-Za-z][\\w-]*)/;\nconst CALLOUT_OPEN = /^>[ \\t]*\\[!([A-Za-z][\\w-]*)\\]([+-])?/;\n/**\n * Every callout spelling the renderer resolves (matrx-frontend\n * components/markdown-core/syntax/callout-types.ts ALIASES — keep in step).\n */\nexport const CALLOUT_NAMES: ReadonlySet<string> = new Set([\n \"note\", \"seealso\", \"example\", \"tip\", \"hint\", \"important\", \"warning\", \"warn\", \"attention\",\n \"caution\", \"danger\", \"error\", \"failure\", \"fail\", \"missing\", \"bug\", \"info\", \"abstract\",\n \"summary\", \"tldr\", \"todo\", \"success\", \"check\", \"done\", \"question\", \"help\", \"faq\", \"quote\", \"cite\",\n]);\nconst FOOTNOTE_DEF = /^\\[\\^([^\\]\\s]+)\\]:/;\n\nfunction countStructuralBraces(source: string): { opens: number; closes: number } {\n let opens = 0;\n let closes = 0;\n let inString = false;\n let escaped = false;\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') inString = true;\n else if (char === \"{\") opens++;\n else if (char === \"}\") closes++;\n }\n return { opens, closes };\n}\n\nfunction firstJsonKey(content: string): string | null {\n const match = /^\\{\\s*\"([^\"]+)\"/.exec(content.trimStart());\n return match ? (match[1] as string) : null;\n}\n\n/** Describe a JSON object's platform identity for island meta. */\nfunction jsonMeta(content: string): Record<string, string | number | boolean> {\n const meta: Record<string, string | number | boolean> = {};\n const key = firstJsonKey(content);\n if (key) meta.firstKey = key;\n try {\n const parsed: unknown = JSON.parse(content.trim());\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const kind = (parsed as Record<string, unknown>).__kind;\n if (typeof kind === \"string\" && kind.trim()) meta.kind = kind;\n }\n } catch {\n // partial or malformed — identity from the head only\n const head = /^\\{\\s*\"__kind\"\\s*:\\s*\"([^\"]*)\"/.exec(content.trimStart());\n if (head) meta.kind = head[1] as string;\n }\n if (typeof meta.kind === \"string\" && meta.kind.startsWith(\"directive_v\")) {\n meta.directive = true;\n }\n if (key === \"matrx_version\") meta.directive = true;\n if (key && TYPED_JSON_ROOT_KEYS[key]) meta.typed = TYPED_JSON_ROOT_KEYS[key] as string;\n return meta;\n}\n\n/** A JSON object head the renderer already treats as a typed/kind block mid-stream. */\nfunction isRecognizedJsonHead(content: string): boolean {\n const key = firstJsonKey(content);\n if (!key) return false;\n return key === \"__kind\" || key === \"matrx_version\" || key in TYPED_JSON_ROOT_KEYS;\n}\n\nfunction matchingJsonObjectEnd(source: string, start: number, limit: number): number | null {\n if (source[start] !== \"{\") return null;\n const stack: string[] = [\"{\"];\n let inString = false;\n let escaped = false;\n for (let index = start + 1; index < limit; index++) {\n const char = source[index];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') {\n inString = true;\n continue;\n }\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n if (char !== \"}\" && char !== \"]\") continue;\n const opening = stack.pop();\n if ((char === \"}\" && opening !== \"{\") || (char === \"]\" && opening !== \"[\")) return null;\n if (stack.length === 0) return index + 1;\n }\n return null;\n}\n\nfunction declaredKind(candidate: string): string | null {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return null;\n const kind = (parsed as Record<string, unknown>).__kind;\n return typeof kind === \"string\" && kind.trim() ? kind : null;\n } catch {\n return null;\n }\n}\n\n/** Splitter's `isUnclosedGenericXmlOpening`: an unknown opening tag still arriving. */\nfunction isUnclosedGenericXmlOpening(source: string): boolean {\n const text = source.trimStart();\n const prefix = /^<([A-Za-z_][\\w.:-]*)(?=\\s|\\/|$)/.exec(text);\n if (\n !prefix ||\n KNOWN_XML_TAG_NAMES.has(prefix[1] as string) ||\n ALLOWED_RAW_HTML_TAGS.has((prefix[1] as string).toLowerCase())\n )\n return false;\n let quote: string | null = null;\n for (let i = prefix[0].length; i < text.length; i++) {\n if (quote) {\n if (text[i] === quote) quote = null;\n } else if (text[i] === \"'\" || text[i] === '\"') quote = text[i] as string;\n else if (text[i] === \">\") return false;\n }\n return true;\n}\n\n/** The renderer splitter's `isTreeLine` (box glyphs OR ASCII connectors) — used only to stop a root walk-back. */\nfunction isSplitterTreeLine(line: string): boolean {\n return TREE_GLYPHS.test(line) || /^[\\s│|]*[├└+|][\\s─\\-]+/.test(line);\n}\n\nconst MEDIA_REF_PREFIXES = [\"[Image URL:\", \"[Video URL:\", \"[Audio URL:\"] as const;\n\n// ─────────────────────────────────────────────────────────────────────────\n// the tokenizer\n// ─────────────────────────────────────────────────────────────────────────\n\nclass Tokenizer {\n private readonly text: string;\n private readonly streaming: boolean;\n private readonly meter: { work: number } | undefined;\n private readonly n: number;\n private readonly lineStarts: number[] = [];\n private readonly contentEnds: number[] = [];\n private readonly lineEnds: number[] = [];\n private readonly blocks: RawBlock[] = [];\n private readonly blockCache = new Map<number, RawIsland | null>();\n /** Lazily built: for line i, first line j >= i where brace net from i drops to <= 0. */\n private braceStop: Int32Array | null = null;\n private braceNet: Int32Array | null = null;\n /** Every occurrence offset of each needle searched so far (overlapping, like indexOf). */\n private readonly occurrences = new Map<string, number[]>();\n /** `$$` opener → closer for the pairs the core renders as math. */\n private readonly mathPairs: Map<number, number>;\n private readonly finder = (needle: string, from: number): number => this.next(needle, from);\n\n constructor(\n text: string,\n streaming = false,\n meter: { work: number } | undefined = undefined,\n ) {\n this.text = text;\n this.streaming = streaming;\n this.meter = meter;\n this.n = text.length;\n this.tick(text.length); // the line split below walks the whole text\n this.mathPairs = pairDisplayMath(text);\n // Streaming: a `$$` still waiting for its partner may yet turn what follows\n // into math, so nothing at or after it is an island yet (G5).\n this.provisionalFrom = streaming ? pendingDisplayMathOpener(text) : -1;\n if (this.provisionalFrom === -1) this.provisionalFrom = Number.POSITIVE_INFINITY;\n // Streaming: the pairing rule's code ranges depend on backtick / tilde runs\n // the next bytes can still complete (`` → ```, an inline span's closing `),\n // which can re-pair `$$` tokens already read. Pair the text as if each\n // completion had arrived; any `$$` paired differently is not settled.\n if (streaming && text.includes(\"$$\")) {\n // A code span the final paragraph may still close can swallow any `$$`\n // after its opener (the pairing rule's code spans run across lines).\n // Only `$$` readings can change: the first token after the span's opener,\n // and the opener of any pair whose closer lies after it.\n const span = pendingCodeSpanStart(text);\n if (span !== -1) {\n const firstToken = text.indexOf(\"$$\", span);\n if (firstToken !== -1) this.provisionalFrom = Math.min(this.provisionalFrom, firstToken);\n for (const [open, close] of this.mathPairs) {\n if (close >= span) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n // `$`: a trailing single `$` may be the first half of a `$$` (round 3, B3).\n for (const pad of [\"`\", \"``\", \"```\", \"~~~\", \"$\"]) {\n const alt = pairDisplayMath(text + pad);\n for (const [open, close] of this.mathPairs) {\n if (alt.get(open) !== close) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n for (const [open, close] of alt) {\n if (close < text.length && this.mathPairs.get(open) !== close) {\n this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n }\n }\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) {\n this.lineStarts.push(start);\n this.contentEnds.push(i > start && text.charCodeAt(i - 1) === 13 ? i - 1 : i);\n this.lineEnds.push(i + 1);\n start = i + 1;\n }\n }\n if (start < text.length || text.length === 0) {\n // Streaming: a final lone CR is the first half of a CRLF still arriving —\n // it is not content (once the LF lands it never is), so a construct\n // ending on this line does not shrink by one when it does (G5).\n this.pendingCR = streaming && text.length > start && text.charCodeAt(text.length - 1) === 13;\n this.lineStarts.push(start);\n this.contentEnds.push(this.pendingCR ? text.length - 1 : text.length);\n this.lineEnds.push(text.length);\n }\n }\n\n /** Streaming: where provisional text starts (a pending `$$`), or +∞. */\n private provisionalFrom = Number.POSITIVE_INFINITY;\n\n /** Streaming: the text ends in a lone CR whose LF has not arrived yet. */\n private pendingCR = false;\n\n /**\n * `text.indexOf(needle, from)` in O(log k): the first query for a needle\n * indexes all of its occurrences once, so repeated searches for a closer\n * that never comes stay linear over the whole text.\n */\n private next(needle: string, from: number): number {\n let list = this.occurrences.get(needle);\n if (!list) {\n list = [];\n for (let at = this.text.indexOf(needle); at !== -1; at = this.text.indexOf(needle, at + 1)) {\n list.push(at);\n }\n this.occurrences.set(needle, list);\n }\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < from) lo = mid + 1;\n else hi = mid;\n }\n return lo < list.length ? (list[lo] as number) : -1;\n }\n\n /** Charge `n` visited characters to the diagnostic meter (complexity tests). */\n private tick(n: number): void {\n if (this.meter) this.meter.work += n;\n }\n\n /** Streaming only: a paragraph ending at `pe` may still be continued by a line not yet arrived. */\n private paragraphMayGrow(pe: number): boolean {\n if (!this.streaming) return false;\n // A paragraph cut short by a block that is still undecided (a `$$` pair\n // whose closer sits on the open last line, a JSON head whose braces have\n // not balanced) grows over that block if it dissolves into prose.\n if (this.undecidedBreaks.has(pe)) return true;\n const rest = this.n - pe;\n if (rest === 0) return true;\n const tail = this.text.slice(pe);\n // One line break, then an open last line that is blank SO FAR: its next\n // byte may be text that continues the paragraph (``Set `mode {{v}}\\n `` +\n // ``and` `` closes the code span over the variable) — F3.\n // A trailing lone CR is the first half of a line break still arriving —\n // the open line is still blank so far (verify-RC-B3 round 3, B4).\n return /^(?:\\r\\n|\\r|\\n)[ \\t\\r]*$/.test(tail);\n }\n\n /**\n * Streaming: an open block that may still turn back into prose — a `$$`\n * pair whose closer is on the open last line (prose after it makes it\n * inline), a JSON head whose braces have not balanced (it may never parse),\n * or any opener that is itself still arriving on the open last line.\n */\n private mayDissolve(block: RawIsland): boolean {\n if (!this.streaming) return false;\n // A block that opens in provisional text may not be a block at all once\n // that text decides (a pending code span can swallow its `$$`).\n if (block.start >= this.provisionalFrom) return true;\n if (block.complete) return false;\n if (block.type === \"math_block\" || block.type === \"json\") return true;\n // An opener still arriving on the open last line (`<n` + `` ` ``) may yet\n // turn out to be no opener at all.\n return this.isOpenTail(this.lineOf(block.start));\n }\n\n /** Streaming: paragraph ends where an undecided, dissolvable block cut them short. */\n private readonly undecidedBreaks = new Set<number>();\n\n /** Streaming only: the final line, still waiting for its terminator. */\n private isOpenTail(k: number): boolean {\n return (\n this.streaming &&\n k === this.lineStarts.length - 1 &&\n (this.lineEnds[k] === this.contentEnds[k] || this.pendingCR)\n );\n }\n\n private get lineCount(): number {\n return this.lineStarts.length;\n }\n\n private lineOf(pos: number): number {\n let lo = 0;\n let hi = this.lineStarts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if ((this.lineStarts[mid] as number) <= pos) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n /** How many whitespace characters open the text at `from` (up to `to`). */\n private leadingSpace(from: number, to: number): number {\n let k = from;\n while (k < to && /\\s/.test(this.text[k] as string)) k++;\n return k - from;\n }\n\n private isBlank(from: number, to: number): boolean {\n return !NOT_WHITESPACE.test(this.text.slice(from, to));\n }\n\n private lineIsBlank(li: number): boolean {\n return this.isBlank(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n private lineText(li: number): string {\n return this.text.slice(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n run(): RawBlock[] {\n let pos = 0;\n while (pos < this.n) {\n const li = this.lineOf(pos);\n const ce = this.contentEnds[li] as number;\n if (this.isBlank(pos, ce)) {\n pos = this.gap(pos, li);\n continue;\n }\n if (pos >= this.provisionalFrom) {\n this.push({ kind: \"prose\", start: pos, end: this.n, island: null, inlines: [] });\n break;\n }\n const island = this.detectBlock(pos, li, true);\n // Streaming: a block whose OPENER is provisional text (indented past\n // the line start, ` $$…` with a pending code span) is as undecided as\n // that text.\n if (island && pos + this.leadingSpace(pos, this.contentEnds[li] as number) >= this.provisionalFrom) {\n this.push({ kind: \"prose\", start: pos, end: this.n, island: null, inlines: [] });\n break;\n }\n if (island) {\n this.push({ kind: \"island\", start: island.start, end: island.end, island, inlines: [] });\n pos = island.end;\n continue;\n }\n pos = this.paragraph(pos, li);\n }\n if (this.streaming) this.holdUndecidedTail();\n return this.blocks;\n }\n\n /**\n * Streaming: settle nothing the next bytes can still change (verify-RC-B3 F3).\n *\n * 1. A block island that ends on the open last line is undecided — the next\n * bytes on that line can re-read it or dissolve it (`<!--@a:k1-->` +\n * ` more` is an inline anchor, `<br>` + `x` is prose). It runs open to\n * the end of the text.\n * 2. A box-drawing tree still forming at the end of the text claims, as its\n * root label, the lines directly above its first connector (the\n * renderer's `findTreeBlockStart`), and the open last line itself may\n * become one of its connector lines — so inlines on those lines are held\n * back as prose until a blank line, a heading or a tree line decides.\n * This also holds everything a closer still able to arrive on the open\n * last line could change (`$x$` + `5` is currency, G4; `{{v}}` + `}`).\n */\n private holdUndecidedTail(): void {\n const last = this.lineStarts.length - 1;\n if (last < 0) return;\n // An island read out of a paragraph that reaches INTO provisional text\n // (`<!--\\n$$-->` while that `$$` may still pair) is as undecided as that\n // text (verify-RC-B3 round 4, D1).\n if (this.provisionalFrom < this.n) {\n for (let b = 0; b < this.blocks.length; b++) {\n const block = this.blocks[b] as RawBlock;\n if (block.end <= this.provisionalFrom) continue;\n if (block.kind === \"prose\") block.inlines = block.inlines.filter((inline) => inline.end <= this.provisionalFrom);\n else if (block.island?.fromParagraph && block.start < this.provisionalFrom) {\n this.blocks[b] = { kind: \"prose\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n }\n }\n if (this.isOpenTail(last)) {\n // The last block that is not whitespace; islands only (prose is held below).\n let b = this.blocks.length - 1;\n while (b >= 0 && (this.blocks[b] as RawBlock).kind === \"gap\") b--;\n const block = this.blocks[b];\n if (block?.island?.complete && block.island.end > (this.lineStarts[last] as number)) {\n block.island.complete = false;\n block.island.end = this.n;\n block.end = this.n;\n this.blocks.length = b + 1; // only whitespace followed it\n }\n }\n const from = this.treeRootHoldFrom();\n for (let b = this.blocks.length - 1; b >= 0; b--) {\n const block = this.blocks[b] as RawBlock;\n if (block.end <= from) break;\n if (block.kind === \"prose\") block.inlines = block.inlines.filter((inline) => inline.end <= from);\n // An island on lines the tree may claim (an orphan-closer rescue, a\n // block that opened mid-line on one) is held as prose.\n if (block.island) this.blocks[b] = { kind: \"prose\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n }\n\n /**\n * Streaming: where a tree that may still form at the end of the text would\n * start claiming lines (`n` when none can). Only paragraph lines can be\n * claimed — a line that starts inside an island (a fence body, an XML\n * region…) is never a tree line nor a root label, so it stops the walk.\n */\n private treeRootHoldFrom(): number {\n /** Where line `k` becomes claimable paragraph text, or -1 when an island owns the rest of it. */\n const claimFrom = (k: number): number => {\n const lineStart = this.lineStarts[k] as number;\n const lineEnd = this.contentEnds[k] as number;\n let pos = lineStart;\n for (;;) {\n const block = this.blockAt(pos);\n if (!block || block.kind !== \"island\" || !block.island) return pos;\n // Cut out of a paragraph, or still able to dissolve back into one.\n if (block.island.fromParagraph === true || this.mayDissolve(block.island)) return pos;\n if (block.start < lineStart) {\n // An island that opened mid-line on an earlier claimable line shares\n // that line's fate; otherwise it owns this line up to its end.\n const opened = this.lineOf(block.start);\n if ((this.lineStarts[opened] as number) !== block.start && claimFrom(opened) !== -1) return pos;\n if (block.end >= lineEnd) return -1;\n pos = block.end;\n continue;\n }\n // An island on this line: the text after it may still be paragraph text.\n if (block.end >= lineEnd) return -1;\n pos = block.end;\n }\n };\n let k = this.lineCount - 1;\n // The line a new connector can still land on: the open last line, or the\n // next line when the text ends with a terminator.\n let start = this.lineCount;\n let startPos = this.n;\n if (k >= 0 && this.isOpenTail(k)) {\n const at = claimFrom(k);\n if (at === -1) return this.n;\n start = k;\n startPos = at;\n k--;\n }\n // A tree counts connector lines across blank lines, so it can start at\n // any connector line of the trailing connector/blank run.\n for (; k >= 0; k--) {\n this.tick(1);\n const at = claimFrom(k);\n if (at === -1) break;\n if (this.lineIsBlank(k)) continue;\n if (!TREE_GLYPHS.test(this.lineText(k))) break;\n start = k;\n startPos = at;\n }\n let rootPos = startPos;\n for (let j = start - 1; j >= 0; j--) {\n const at = claimFrom(j);\n if (at === -1) break;\n const trimmed = this.lineText(j).trim();\n this.tick(trimmed.length + 1);\n if (!trimmed || isSplitterTreeLine(trimmed) || /^#{1,6}\\s/.test(trimmed)) break;\n rootPos = at;\n if (at > (this.lineStarts[j] as number)) break; // an island before it on its line ends the walk\n }\n return rootPos;\n }\n\n /** The block (so far) containing offset `pos`, or null. */\n private blockAt(pos: number): RawBlock | null {\n let lo = 0;\n let hi = this.blocks.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const block = this.blocks[mid] as RawBlock;\n if (pos < block.start) hi = mid - 1;\n else if (pos >= block.end) lo = mid + 1;\n else return block;\n }\n return null;\n }\n\n private push(block: RawBlock): void {\n if (block.end <= block.start) return;\n if (block.kind === \"prose\" && this.isBlank(block.start, block.end)) {\n block = { kind: \"gap\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n const last = this.blocks[this.blocks.length - 1];\n if (block.kind === \"gap\" && last && last.kind === \"gap\" && last.end === block.start) {\n last.end = block.end;\n return;\n }\n this.blocks.push(block);\n }\n\n private gap(pos: number, li: number): number {\n let end = this.lineEnds[li] as number;\n let k = li + 1;\n while (k < this.lineCount && this.lineIsBlank(k)) {\n end = this.lineEnds[k] as number;\n k++;\n }\n this.push({ kind: \"gap\", start: pos, end, island: null, inlines: [] });\n return end;\n }\n\n // ── block detection ────────────────────────────────────────────────────\n\n private detectBlock(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const cacheKey = atParaStart ? -1 - p : p;\n if (this.blockCache.has(cacheKey)) return this.blockCache.get(cacheKey) ?? null;\n const found = this.detectBlockUncached(p, li, atParaStart);\n this.blockCache.set(cacheKey, found);\n return found;\n }\n\n private detectBlockUncached(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const ce = this.contentEnds[li] as number;\n const seg = this.text.slice(p, ce);\n const t = seg.trimStart();\n const indent = seg.length - t.length;\n const tp = p + indent;\n\n if (p === 0) {\n const fm = this.frontMatter(li, t);\n if (fm) return fm;\n }\n // An indented `:::` / `> [!x]` under a list item belongs to that item:\n // the renderer draws it INSIDE the list, so it must stay in the list's\n // prose block — cutting it out would let an editor move it away from its\n // item (verify-RC-B8 round 2, SAFETY).\n const listNested = indent > 0 && this.inListContinuation(li);\n if (indent <= 3 && !listNested && t.startsWith(\"::\")) {\n const directive = this.directive(p, li, t);\n if (directive) return directive;\n }\n if (indent === 0 && (t.startsWith(\"!!!\") || t.startsWith(\"???\"))) {\n const admonition = this.mkdocsAdmonition(p, li, t);\n if (admonition) return admonition;\n }\n if (indent <= 3 && !listNested && t.startsWith(\">\")) {\n const callout = this.callout(p, li, t);\n if (callout) return callout;\n }\n if (atParaStart && indent <= 3 && t.startsWith(\"[^\")) {\n const footnote = this.footnoteDefinition(p, li, t);\n if (footnote) return footnote;\n }\n // THE one fence rule (source/code-ranges.ts): backtick at any indent, tilde at <= 3.\n const fence = fenceOpenerOf(seg);\n if (fence?.char === \"`\") return this.backtickFence(p, li, fence);\n if (fence?.char === \"~\") return this.tildeFence(p, li, fence);\n if (t.startsWith(\"$$\")) {\n const math = this.mathBlock(p, tp);\n if (math) return math;\n }\n if (t.startsWith(\"<\")) {\n const attr = this.attributeXml(p, tp, t);\n if (attr) return attr;\n const region = this.xmlRegion(p, tp, t);\n if (region) return region;\n const container = this.genericXml(p, li, seg, indent);\n if (container) return container;\n if (t.startsWith(\"<!--\")) {\n const comment = this.blockComment(p, tp, li);\n if (comment) return comment;\n }\n const html = this.htmlBlock(p, li, t, tp, atParaStart);\n if (html) return html;\n }\n if (t.startsWith(\"{\")) {\n const json = this.bareJson(p, li, tp);\n if (json) return json;\n }\n if (TREE_GLYPHS.test(t)) {\n const tree = this.tree(p, li);\n if (tree) return tree;\n }\n return null;\n }\n\n /** True when line `li` continues a list item (the nearest non-blank line above is a list item or indented text under one). */\n private inListContinuation(li: number): boolean {\n for (let k = li - 1; k >= 0; k--) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) continue;\n if (/^[ \\t]*(?:[-*+]|\\d{1,9}[.)])[ \\t]/.test(line)) return true;\n if (/^[ \\t]/.test(line)) continue;\n return false;\n }\n return false;\n }\n\n private island(\n type: IslandType,\n start: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean> = {},\n ): RawIsland {\n return { type, start, end, complete, meta };\n }\n\n private frontMatter(li: number, t: string): RawIsland | null {\n // A leading byte-order mark is an encoding mark, not content: `\\uFEFF---`\n // opens front matter like `---` (RC-B3r round 3, C1).\n const fence = this.lineText(li).replace(/^\\uFEFF/, \"\");\n if ((fence !== \"---\" && fence !== \"+++\") || t !== fence) return null;\n const toml = fence === \"+++\";\n let sawContent = false;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (line === fence || (!toml && line === \"...\")) {\n return sawContent\n ? this.island(\"front_matter\", 0, this.contentEnds[k] as number, true, { format: toml ? \"toml\" : \"yaml\" })\n : null;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n const shaped = toml\n ? /^\\s*(?:[A-Za-z0-9_.\"-]+\\s*=|\\[|#)/.test(line)\n : /^(?:[A-Za-z0-9_\"'-][^:]*:(?:\\s|$)|\\s+\\S|-\\s|#)/.test(line);\n if (!shaped) {\n // Streaming: the open last line may still become the closing fence.\n if (this.isOpenTail(k)) break;\n return null;\n }\n sawContent = true;\n }\n // Streaming: a front matter whose closing fence has not arrived yet is\n // undecided — the closer turns everything so far into document properties\n // (markdown-core holds it back the same way, `hasUnclosedFrontmatter`).\n if (this.streaming) return this.island(\"front_matter\", 0, this.n, false, { format: toml ? \"toml\" : \"yaml\" });\n return null;\n }\n\n /**\n * `:::name[label]{attrs}` … closing `:::` (a colon run at least as long as\n * the opener's, nesting counted), or a leaf `::name[…]{…}` line. The whole\n * container is ONE island: its grammar (fence lengths, labels, attributes,\n * nested tabs) is exactly what a visual editor would re-serialize wrongly.\n */\n private directive(p: number, li: number, t: string): RawIsland | null {\n const open = DIRECTIVE_OPEN.exec(t);\n if (!open) return null;\n const colons = (open[1] as string).length;\n const name = open[2] as string;\n if (colons === 2) {\n return this.island(\"directive\", p, this.contentEnds[li] as number, true, { name, leaf: true });\n }\n const stack: number[] = [colons];\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k).trim();\n const inner = DIRECTIVE_OPEN.exec(line);\n if (inner && (inner[1] as string).length >= 3) {\n stack.push((inner[1] as string).length);\n continue;\n }\n const close = /^(:{3,})\\s*$/.exec(line);\n if (close && (close[1] as string).length >= (stack[stack.length - 1] as number)) {\n stack.pop();\n if (stack.length === 0) return this.island(\"directive\", p, this.contentEnds[k] as number, true, { name });\n }\n }\n return this.island(\"directive\", p, this.n, false, { name });\n }\n\n /** MkDocs `!!! type \"Title\"` / `??? type` / `???+ type` and its indented (or blank-separated indented) body. */\n private mkdocsAdmonition(p: number, li: number, t: string): RawIsland | null {\n const open = MKDOCS_OPEN.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (/^(?: {4}|\\t)/.test(line) && NOT_WHITESPACE.test(line)) {\n last = k;\n continue;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n break;\n }\n return this.island(\"directive\", p, this.contentEnds[last] as number, true, {\n name: (open[2] as string).toLowerCase(),\n syntax: \"mkdocs\",\n });\n }\n\n /** A blockquote whose first line is `> [!TYPE]…` — every following `>` line belongs to it. */\n private callout(p: number, li: number, t: string): RawIsland | null {\n const open = CALLOUT_OPEN.exec(t);\n // Only a name the renderer draws as a callout is one; `> [!BOGUS]` is an\n // ordinary quote there, so it stays editable prose here (verify-RC-B8).\n if (!open || !CALLOUT_NAMES.has((open[1] as string).toLowerCase())) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (!/^ {0,3}>/.test(this.lineText(k))) break;\n last = k;\n }\n return this.island(\"callout\", p, this.contentEnds[last] as number, true, {\n name: (open[1] as string).toLowerCase(),\n ...(open[2] ? { fold: open[2] === \"-\" ? \"closed\" : \"open\" } : {}),\n });\n }\n\n /** `[^id]: text` plus its continuation lines (indented, or lazy text before a blank line). */\n private footnoteDefinition(p: number, li: number, t: string): RawIsland | null {\n const open = FOOTNOTE_DEF.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) {\n // A blank line continues the note only when an indented line follows.\n let j = k + 1;\n while (j < this.lineCount && !NOT_WHITESPACE.test(this.lineText(j))) j++;\n if (j < this.lineCount && /^(?: {4}|\\t)/.test(this.lineText(j))) {\n k = j - 1;\n continue;\n }\n break;\n }\n if (/^(?: {4}|\\t)/.test(line)) {\n last = k;\n continue;\n }\n // Streaming: an unterminated last line may still become `[^m]: …` (a new\n // note), a block, or this note's lazy continuation — undecided (G5, H1).\n // Checked BEFORE block detection: what that line is, is not known yet.\n if (this.isOpenTail(k)) return this.heldFootnote(p, open[1] as string);\n if (FOOTNOTE_DEF.test(line.trimStart())) break;\n // Streaming: a connector line that a tree may still claim (fewer than\n // three connector lines so far, all the way to the end) is undecided —\n // it is this note's lazy line only if no tree forms (round 4, D1).\n if (this.streaming && TREE_GLYPHS.test(line) && this.connectorRunReachesEnd(k)) {\n return this.heldFootnote(p, open[1] as string);\n }\n const block = this.detectBlock(this.lineStarts[k] as number, k, false);\n // Streaming: a block that may still dissolve into prose would make its\n // line this note's lazy continuation — undecided (F3).\n if (block && this.mayDissolve(block)) return this.heldFootnote(p, open[1] as string);\n if (block) break;\n last = k;\n }\n const end = this.contentEnds[last] as number;\n // Streaming: a note that ends the text (at most one line terminator after\n // it) may still gain a lazy continuation line — held open, never settled,\n // until that is decided (verify-RC-B3 H1).\n if (this.paragraphMayGrow(end)) return this.heldFootnote(p, open[1] as string);\n // Streaming: a note that took in provisional text (a `$$` that may still\n // pair across a blank line) is as undecided as that text (round 4).\n if (this.streaming && end > this.provisionalFrom) return this.heldFootnote(p, open[1] as string);\n return this.island(\"footnote_def\", p, end, true, { id: open[1] as string });\n }\n\n /** Every line from `k` to the end is a connector line or blank (a tree may still form there). */\n private connectorRunReachesEnd(k: number): boolean {\n if (this.lastNonConnectorLine === undefined) {\n // Once, from the end: the last line that is neither blank nor a connector.\n let j = this.lineCount - 1;\n for (; j >= 0; j--) {\n this.tick(1);\n if (!this.lineIsBlank(j) && !TREE_GLYPHS.test(this.lineText(j))) break;\n }\n this.lastNonConnectorLine = j;\n }\n return k > this.lastNonConnectorLine;\n }\n\n private lastNonConnectorLine: number | undefined = undefined;\n\n /** A footnote whose continuation is still arriving: open to the end of the text. */\n private heldFootnote(p: number, id: string): RawIsland {\n return this.island(\"footnote_def\", p, this.n, false, { id });\n }\n\n /** The text's lines as the one fence closer reads them (streaming: the open tail closes nothing). */\n private get fenceLines(): FenceLines {\n return {\n count: this.lineCount,\n line: (k) => this.lineText(k),\n openTail: (k) => this.isOpenTail(k),\n streaming: this.streaming,\n };\n }\n\n /**\n * Backtick fence — THE one closer (`closeFence`, source/code-ranges.ts): the\n * nested-fence rule for markdown fences with the strict-CommonMark retry, the\n * renderer's line-end closer, JSON-string awareness for ```json.\n */\n private backtickFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const isJson = lang === \"json\";\n const normalized = normalizeFenceLanguage(lang);\n const meta: Record<string, string | number | boolean> = { fence: \"`\", ticks: opener.ticks, lang };\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const end = closeFence(this.fenceLines, li, opener);\n if (end.closed) {\n return this.fenceIsland(p, this.contentEnds[end.line] as number, true, meta, li, end.line, isJson);\n }\n return this.fenceIsland(p, this.n, false, meta, li, this.lineCount, isJson);\n }\n\n private fenceIsland(\n p: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean>,\n openLine: number,\n closeLine: number,\n isJson: boolean,\n ): RawIsland {\n if (isJson && openLine + 1 < this.lineCount) {\n const bodyEnd =\n closeLine < this.lineCount ? (this.lineStarts[closeLine] as number) : this.n;\n const body = this.text.slice(this.lineStarts[openLine + 1] as number, Math.max(bodyEnd, this.lineStarts[openLine + 1] as number));\n if (body.trimStart().startsWith(\"{\")) Object.assign(meta, jsonMeta(body));\n }\n return this.island(\"fence\", p, end, complete, meta);\n }\n\n private tildeFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const meta: Record<string, string | number | boolean> = { fence: \"~\", ticks: opener.ticks, lang };\n const normalized = normalizeFenceLanguage(lang);\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const close = closeFence(this.fenceLines, li, opener);\n if (close.closed) {\n const tildeEnd = this.contentEnds[close.line] as number;\n const end = this.rendererOverflow(li + 1, close.line, tildeEnd);\n return this.island(\"fence\", p, end, end === this.n ? this.overflowComplete : true, meta);\n }\n return this.island(\"fence\", p, this.n, false, meta);\n }\n\n /** Completion of the last `rendererOverflow` that ran to the end of the text. */\n private overflowComplete = true;\n\n /**\n * The renderer's splitter does not know ~~~ fences: it reads the lines inside\n * one as ordinary lines, so a ```` ``` ```` fence (or an XML section, a JSON\n * block…) that STARTS inside the tilde fence can run past its closer. The\n * editor must lock at least what the renderer draws (verify-RC-B3 residual\n * R5), so a tilde island extends over every block the renderer would detect\n * starting inside it. Returns the island's end.\n */\n private rendererOverflow(firstLine: number, closeLine: number, tildeEnd: number): number {\n let end = tildeEnd;\n this.overflowComplete = true;\n for (let j = firstLine; j <= closeLine && j < this.lineCount; j++) {\n const start = this.lineStarts[j] as number;\n if (this.lineIsBlank(j)) continue;\n // The renderer sees no tildes: a ~~~ line (the closer included) opens\n // nothing, and skipping it BEFORE detection keeps this scan from ever\n // re-entering tildeFence (no recursion, however many ~~~ lines follow).\n if (fenceOpenerOf(this.lineText(j))?.char === \"~\") continue;\n const inner = this.detectBlockUncached(start, j, false);\n if (!inner) continue;\n // Streaming: a block that reaches the closer and ends where the text\n // ends may still grow past it (an html block runs to a blank line) — the\n // fence's end is undecided (F3).\n if (this.streaming && inner.end >= tildeEnd && this.paragraphMayGrow(inner.end)) {\n this.overflowComplete = false;\n return this.n;\n }\n if (inner.end > end) {\n end = inner.end;\n this.overflowComplete = inner.complete;\n }\n const lastLine = this.lineOf(Math.max(start, inner.end - 1));\n if (lastLine > j) j = lastLine;\n }\n return end;\n }\n\n /**\n * A line-leading `$$` that OPENS a math pair (source/math-pairs.ts — the\n * core's rule). A closer, an unpaired `$$`, or a prose pair is never a block:\n * a lone `$$` renders as literal text and locks nothing.\n */\n private mathBlock(p: number, tp: number): RawIsland | null {\n const close = this.mathPairs.get(tp);\n if (close === undefined) return null;\n const end = close + 2;\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n // `$$x$$` followed by prose on its line is inline math inside a paragraph.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n const endLine = this.lineOf(close);\n const endCe = this.contentEnds[endLine] as number;\n // A multi-line pair whose closer is followed by prose stays in its paragraph.\n if (endLine !== li && !this.isBlank(end, endCe)) return null;\n // Streaming: a closer on the still-open last line may yet be followed by\n // prose on that line (which makes it inline math in a paragraph), so the\n // block is not settled until the line ends (verify-RC-B3 residual R2′).\n // (An unsettled island runs to the end of the text, like every open island.)\n if (this.isOpenTail(endLine)) return this.island(\"math_block\", p, this.n, false, { delimiter: \"$$\" });\n return this.island(\"math_block\", p, end, true, { delimiter: \"$$\" });\n }\n\n /** `<artifact …>`, `<decision …>`, … at the start of a line. */\n private attributeXml(p: number, tp: number, t: string): RawIsland | null {\n for (const name of ATTRIBUTE_XML_NAMES) {\n const prefix = `<${name}`;\n if (!t.startsWith(prefix)) continue;\n const next = t[prefix.length];\n if (next !== \" \" && next !== \">\" && next !== \"/\" && next !== \"\\t\") continue;\n return this.attributeElement(name, p, tp, \"xml_attr\");\n }\n return null;\n }\n\n /** Opening tag at `tp` through its `</name>` (or to EOF when still streaming). */\n private attributeElement(\n name: string,\n p: number,\n tp: number,\n type: IslandType,\n ): RawIsland | null {\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n const tag = readXmlTag(this.text, tp, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n let openEnd: number;\n if (tag && !tag.isClosing) {\n if (tag.isSelfClosing) {\n return this.island(type, p, tp + tag.raw.length, true, { tag: name, selfClosing: true });\n }\n openEnd = tp + tag.raw.length;\n } else {\n const gt = this.next(\">\", tp);\n if (gt === -1) return this.island(type, p, this.n, false, { tag: name });\n if (gt >= ce) return null;\n openEnd = gt + 1;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, openEnd);\n if (close === -1) return this.island(type, p, this.n, false, { tag: name });\n return this.island(type, p, close + closer.length, true, { tag: name });\n }\n\n /** `<thinking>`, `<flashcards>`, … — exact attribute-less openers. */\n private xmlRegion(p: number, tp: number, t: string): RawIsland | null {\n for (const name of XML_TAG_BLOCK_NAMES) {\n const opener = `<${name}>`;\n if (!t.startsWith(opener)) continue;\n const closer = `</${name}>`;\n const close = this.next(closer, tp + opener.length);\n if (close === -1) return this.island(\"xml_region\", p, this.n, false, { tag: name });\n return this.island(\"xml_region\", p, close + closer.length, true, { tag: name });\n }\n return null;\n }\n\n /** Line-leading unknown XML element — balanced by the renderer's own tracker. */\n private genericXml(p: number, li: number, seg: string, indent: number): RawIsland | null {\n const first = seg.slice(indent);\n const opening = readXmlTag(first, 0);\n if (opening && !opening.isClosing) {\n const root = opening.tagName;\n if (KNOWN_XML_TAG_NAMES.has(root) || ALLOWED_RAW_HTML_TAGS.has(root.toLowerCase())) {\n return null;\n }\n const tracker = new XmlContainerTracker(root);\n const firstEnd = tracker.consumeLine(seg, indent);\n if (firstEnd !== null) {\n return this.island(\"xml_container\", p, p + firstEnd, true, { tag: root });\n }\n for (let k = li + 1; k < this.lineCount; k++) {\n const end = tracker.consumeLine(this.lineText(k));\n if (end !== null) {\n return this.island(\"xml_container\", p, (this.lineStarts[k] as number) + end, true, {\n tag: root,\n });\n }\n }\n // An HTML BLOCK tag (`<div>`, `<section>`, …) that never closes is no\n // container that owns the rest of the text: GFM ends that HTML block at\n // the first blank line, so it stays prose for the markdown renderer — the\n // chat splitters agree (verify-RC-B4 round 9).\n if (isHtmlBlockTagName(root)) return null;\n return this.island(\"xml_container\", p, this.n, false, { tag: root });\n }\n if (isUnclosedGenericXmlOpening(seg)) {\n const name = /^\\s*<([A-Za-z_][\\w.:-]*)/.exec(seg)?.[1] ?? \"\";\n if (isHtmlBlockTagName(name)) return null;\n return this.island(\"xml_container\", p, this.n, false, {});\n }\n return null;\n }\n\n private blockComment(p: number, tp: number, li: number): RawIsland | null {\n const close = this.next(\"-->\", tp + 4);\n if (close === -1) return this.island(\"html_comment\", p, this.n, false);\n const end = close + 3;\n const raw = this.text.slice(tp, end);\n const anchor = PINNED_ANCHOR_RE.exec(raw);\n const ce = this.contentEnds[li] as number;\n if (anchor) {\n // A pinned anchor followed by prose on its line is an inline marker.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n return this.island(\"anchor\", p, end, true, { id: anchor[1] as string });\n }\n return this.island(\"html_comment\", p, end, true);\n }\n\n private htmlBlock(\n p: number,\n li: number,\n t: string,\n tp: number,\n atParaStart: boolean,\n ): RawIsland | null {\n const tag = readXmlTag(t, 0);\n if (!tag) return null;\n const name = tag.tagName.toLowerCase();\n if (!ALLOWED_RAW_HTML_TAGS.has(name)) return null;\n if (name === \"pre\" && !tag.isClosing) {\n const closer = /<\\/pre\\s*>/gi;\n closer.lastIndex = tp;\n const close = closer.exec(this.text);\n if (!close) return this.island(\"html_block\", p, this.n, false, { tag: name });\n return this.island(\"html_block\", p, close.index + close[0].length, true, { tag: name });\n }\n const typeSix = HTML_BLOCK_LEVEL_TAGS.has(name);\n // A line that is only one tag opens a block; while that line is still\n // arriving, more bytes can make it prose, so it decides nothing (G5).\n // A line that is only one tag opens a block. While that line is still\n // arriving, more bytes can make it prose — holdUndecidedTail reports such\n // a block open (G5, F3).\n const typeSeven = atParaStart && t.trimEnd() === tag.raw;\n if (!typeSix && !typeSeven) return null;\n let end = this.contentEnds[li] as number;\n for (let k = li + 1; k < this.lineCount && !this.lineIsBlank(k); k++) {\n end = this.contentEnds[k] as number;\n }\n return this.island(\"html_block\", p, end, true, { tag: name });\n }\n\n private buildBraceTables(): void {\n const count = this.lineCount;\n // prefix[i] = net braces over lines [0, i)\n const prefix = new Int32Array(count + 1);\n for (let i = 0; i < count; i++) {\n const { opens, closes } = countStructuralBraces(this.lineText(i));\n prefix[i + 1] = (prefix[i] as number) + opens - closes;\n }\n // stop[i] = smallest j >= i with prefix[j + 1] <= prefix[i], or -1.\n const stop = new Int32Array(count).fill(-1);\n const stack: number[] = [];\n // Next index m > i (over prefix positions) with prefix[m] <= prefix[i].\n for (let m = 0; m <= count; m++) {\n const value = prefix[m] as number;\n while (stack.length && (prefix[stack[stack.length - 1] as number] as number) >= value) {\n const i = stack.pop() as number;\n if (i < count) stop[i] = m - 1;\n }\n stack.push(m);\n }\n this.braceNet = prefix;\n this.braceStop = stop;\n }\n\n /** A line-leading bare JSON object — the splitter's structural brace walk. */\n private bareJson(p: number, li: number, tp: number): RawIsland | null {\n let lastLine: number | null = null;\n let net = 0;\n if (p === (this.lineStarts[li] as number)) {\n if (!this.braceStop || !this.braceNet) this.buildBraceTables();\n const stop = (this.braceStop as Int32Array)[li] as number;\n if (stop !== -1) {\n lastLine = stop;\n net =\n ((this.braceNet as Int32Array)[stop + 1] as number) -\n ((this.braceNet as Int32Array)[li] as number);\n }\n } else {\n let running = 0;\n for (let k = li; k < this.lineCount; k++) {\n const line = k === li ? this.text.slice(tp, this.contentEnds[li] as number) : this.lineText(k);\n const { opens, closes } = countStructuralBraces(line);\n running += opens - closes;\n if (running <= 0) {\n lastLine = k;\n net = running;\n break;\n }\n }\n }\n if (lastLine === null) {\n // Only the head decides; the whole tail is read once, when it is ours.\n if (isRecognizedJsonHead(this.text.slice(tp, tp + 512))) {\n return this.island(\"json\", p, this.n, false, jsonMeta(this.text.slice(tp)));\n }\n return null;\n }\n // Streaming: braces that balance on the open last line are undecided — the\n // next byte can unbalance them again (`… and}` + `{`) or complete a parse.\n // A recognized head stays an open JSON block; anything else reads as prose\n // for now (the tree-root and open-tail holds keep that prose unsettled —\n // a separate provisional mark here was redundant: planted mutation, 1,120\n // differing prefixes, 0 settled-island changes over 12,000 documents).\n if (this.isOpenTail(lastLine)) {\n if (isRecognizedJsonHead(this.text.slice(tp, tp + 512))) {\n return this.island(\"json\", p, this.n, false, jsonMeta(this.text.slice(tp)));\n }\n return null;\n }\n if (net !== 0) return null;\n const end = this.contentEnds[lastLine] as number;\n const content = this.text.slice(tp, end).trim();\n try {\n const parsed: unknown = JSON.parse(content);\n if (parsed === null || typeof parsed !== \"object\") return null;\n } catch {\n return null;\n }\n return this.island(\"json\", p, end, true, jsonMeta(content));\n }\n\n private tree(p: number, li: number): RawIsland | null {\n let treeLines = 0;\n let lastTree = li;\n let k = li;\n while (k < this.lineCount) {\n if (this.lineIsBlank(k)) {\n k++;\n continue;\n }\n if (!TREE_GLYPHS.test(this.lineText(k))) break;\n treeLines++;\n lastTree = k;\n k++;\n }\n if (treeLines < 3) return null;\n return this.island(\"tree\", p, this.contentEnds[lastTree] as number, true);\n }\n\n // ── prose ──────────────────────────────────────────────────────────────\n\n private paragraph(pos: number, li: number): number {\n let end = this.contentEnds[li] as number;\n let breakLine = -1;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (this.lineIsBlank(k)) break;\n const block = this.detectBlock(this.lineStarts[k] as number, k, false);\n if (block) {\n breakLine = k;\n // Streaming: a block that may still dissolve into prose (it runs open\n // to the end of the text) does not end this paragraph for good (F3).\n // …and so does one that starts in provisional text (it may not be a\n // block at all once the text decides).\n if (this.mayDissolve(block)) {\n this.undecidedBreaks.add(end);\n }\n break;\n }\n end = this.contentEnds[k] as number;\n }\n\n // A tree's root label (the non-blank, glyph-free, non-heading lines\n // directly above its first connector) belongs to the tree — the renderer\n // splitter's findTreeBlockStart.\n if (breakLine !== -1) {\n const breakIsland = this.detectBlock(this.lineStarts[breakLine] as number, breakLine, false);\n if (breakIsland?.type === \"tree\") {\n let root = breakLine;\n for (let j = breakLine - 1; j >= li; j--) {\n const trimmed = this.lineText(j).trim();\n if (!trimmed || isSplitterTreeLine(trimmed) || /^#{1,6}\\s/.test(trimmed)) break;\n root = j;\n }\n if (root < breakLine) {\n const treeStart = root === li ? pos : (this.lineStarts[root] as number);\n const tree = { ...breakIsland, start: treeStart };\n if (treeStart > pos) {\n const proseEnd = this.contentEnds[root - 1] as number;\n const scan = this.scanInline(pos, proseEnd);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end: proseEnd, island: null, inlines: scan.inlines });\n this.push({ kind: \"gap\", start: proseEnd, end: treeStart, island: null, inlines: [] });\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n } else {\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n }\n }\n }\n\n const scan = this.scanInline(pos, end);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end, island: null, inlines: scan.inlines });\n return end;\n }\n const br = { ...scan.breakIsland, fromParagraph: true };\n if (scan.orphan) {\n // The continuation half of a thinking region split across persisted\n // parts: everything since the last island is region body (splitter 3d).\n let start = pos;\n while (this.blocks.length) {\n const last = this.blocks[this.blocks.length - 1] as RawBlock;\n if (last.kind === \"island\") break;\n this.blocks.pop();\n start = last.start;\n }\n const island = { ...br, start };\n this.push({ kind: \"island\", start, end: island.end, island, inlines: [] });\n return island.end;\n }\n this.push({\n kind: \"prose\",\n start: pos,\n end: br.start,\n island: null,\n inlines: scan.inlines.filter((inline) => inline.end <= br.start),\n });\n this.push({ kind: \"island\", start: br.start, end: br.end, island: br, inlines: [] });\n return br.end;\n }\n\n /**\n * An island that opens inside a paragraph and closes past its end becomes a\n * block. Streaming: while the paragraph may still grow over its closer, the\n * island may yet be inline — undecided, so it runs open to the end (F3).\n */\n private spill(\n type: IslandType,\n start: number,\n end: number,\n pe: number,\n meta: Record<string, string | number | boolean>,\n ): RawIsland {\n if (this.paragraphMayGrow(pe)) return this.island(type, start, this.n, false, meta);\n return this.island(type, start, end, true, meta);\n }\n\n private scanInline(\n ps: number,\n pe: number,\n ): { inlines: RawIsland[]; breakIsland: RawIsland | null; orphan: boolean } {\n const text = this.text;\n const inlines: RawIsland[] = [];\n this.tick(pe - ps); // the scan below visits each position of the paragraph at most once\n const hasKind = text.slice(ps, pe).includes(\"__kind\");\n // Embedded-kind JSON probing is capped per paragraph so a paragraph full\n // of unclosed `{\"…` stays linear; a candidate longer than the cap stays prose.\n let kindBudget = 4 * (pe - ps) + 65536;\n const stop = (island: RawIsland, orphan = false) => ({ inlines, breakIsland: island, orphan });\n const within = (needle: string, from: number): number => {\n const at = this.next(needle, from);\n return at !== -1 && at + needle.length <= pe ? at : -1;\n };\n let runs: BacktickRuns | null = null;\n /** First maximal backtick run of exactly `n` starting at or after `from`, within the paragraph (THE pairing table). */\n const codeSpanClose = (n: number, from: number): number => {\n if (!runs) {\n this.tick(pe - ps); // one pass builds the backtick-run table\n runs = new BacktickRuns(text, ps, pe);\n }\n const at = runs.next(n, from);\n return at !== -1 && at + n <= pe ? at : -1;\n };\n\n let i = ps;\n // The paragraph's END is computed exactly as one-shot computes it (so its\n // islands are read the same way); only what is REPORTED stops at the\n // provisional point.\n const scanEnd = Math.min(pe, this.provisionalFrom);\n while (i < scanEnd) {\n const ch = text[i];\n if (ch === \"\\\\\") {\n const nextCh = text[i + 1];\n if (nextCh === \"(\" || nextCh === \"[\") {\n const close = within(nextCh === \"(\" ? \"\\\\)\" : \"\\\\]\", i + 2);\n // `\\[ … \\]` is math only when it holds TeX; otherwise it is two\n // escaped brackets — literal text (isEscapedBracketMath).\n const isMath =\n close !== -1 &&\n (nextCh === \"(\" || isEscapedBracketMath(text.slice(i + 2, close), i > 0 ? text[i - 1] : undefined));\n if (close !== -1 && isMath) {\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: nextCh === \"(\" ? \"\\\\(\" : \"\\\\[\" }));\n i = close + 2;\n continue;\n }\n // Streaming: an opener whose closer may still arrive in this\n // paragraph can turn everything after it into one formula — nothing\n // after it is an island until the paragraph decides (F3).\n if (close === -1 && this.streaming && this.paragraphMayGrow(pe)) {\n return { inlines, breakIsland: null, orphan: false };\n }\n }\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n const n = backtickRunLength(text, i);\n const close = codeSpanClose(n, i + n);\n // Streaming: while the paragraph can still grow — nothing follows it\n // but at most one line terminator, so the next line may join it — an\n // unclosed backtick run may yet be closed and turn everything after it\n // into code. Nothing after it is an island until then (G5 / flicker).\n if (close === -1 && this.streaming && this.paragraphMayGrow(pe)) {\n return { inlines, breakIsland: null, orphan: false };\n }\n i = close === -1 ? i + n : close + n;\n continue;\n }\n if (ch === \"$\") {\n if (text[i + 1] === \"$\") {\n const close = this.mathPairs.get(i);\n if (close === undefined) {\n i += 2;\n continue;\n }\n if (close + 2 > pe) return stop(this.spill(\"math_block\", i, close + 2, pe, { delimiter: \"$$\" }));\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: \"$$\" }));\n i = close + 2;\n continue;\n }\n const end = singleDollarMathEnd(text, i, pe);\n this.tick(end > 0 ? end - i : Math.min(403, pe - i));\n if (end > 0) {\n inlines.push(this.island(\"math_inline\", i, end, true, { delimiter: \"$\" }));\n i = end;\n continue;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n if (text[i + 1] === \"{\") {\n const close = this.next(\"}}\", i + 2);\n if (\n close !== -1 &&\n close + 2 <= pe &&\n close - i <= 200 &&\n !text.slice(i, close).includes(\"\\n\")\n ) {\n const raw = text.slice(i, close + 2);\n const strict = STRICT_VARIABLE_RE.exec(raw);\n inlines.push(\n this.island(\"variable\", i, close + 2, true, strict ? { name: strict[1] as string } : { template: true }),\n );\n i = close + 2;\n continue;\n }\n i += 2;\n continue;\n }\n if (hasKind && kindBudget > 0 && /^\\{\\s*\"/.test(text.slice(i, i + 64))) {\n const limit = Math.min(pe, i + 65536);\n const end = matchingJsonObjectEnd(text, i, limit);\n kindBudget -= (end ?? limit) - i;\n this.tick((end ?? limit) - i);\n if (end !== null) {\n const kind = declaredKind(text.slice(i, end));\n if (kind) {\n inlines.push(this.island(\"kind_json\", i, end, true, jsonMeta(text.slice(i, end))));\n i = end;\n continue;\n }\n }\n }\n i++;\n continue;\n }\n if ((ch === \"[\" && text[i + 1] === \"[\") || (ch === \"!\" && text[i + 1] === \"[\" && text[i + 2] === \"[\")) {\n const open = ch === \"!\" ? i + 3 : i + 2;\n const close = within(\"]]\", open);\n const newline = this.next(\"\\n\", open);\n const inner = close === -1 ? \"\" : text.slice(open, close);\n if (close !== -1 && (newline === -1 || newline > close) && inner.trim() && !/[[\\]]/.test(inner)) {\n const cut = inner.search(/\\\\?\\|/);\n const target = (cut < 0 ? inner : inner.slice(0, cut)).trim();\n inlines.push(\n this.island(\"wikilink\", i, close + 2, true, ch === \"!\" ? { target, embed: true } : { target }),\n );\n i = close + 2;\n continue;\n }\n }\n if (ch === \"[\") {\n const media = MEDIA_REF_PREFIXES.find((prefix) => text.startsWith(prefix, i));\n if (media) {\n const close = within(\"]\", i + media.length);\n const newline = this.next(\"\\n\", i);\n if (close !== -1 && (newline === -1 || newline > close)) {\n inlines.push(this.island(\"media_ref\", i, close + 1, true, { media: media.slice(1, 6).toLowerCase() }));\n i = close + 1;\n continue;\n }\n }\n i++;\n continue;\n }\n if (ch === \"<\") {\n if (text.startsWith(\"<!--\", i)) {\n const close = this.next(\"-->\", i + 4);\n if (close === -1) return stop(this.island(\"html_comment\", i, this.n, false));\n const end = close + 3;\n const anchor = end - i <= 64 ? PINNED_ANCHOR_RE.exec(text.slice(i, end)) : null;\n const type: IslandType = anchor ? \"anchor\" : \"html_comment\";\n const meta = anchor ? { id: anchor[1] as string } : {};\n if (end > pe) return stop(this.spill(type, i, end, pe, meta));\n inlines.push(this.island(type, i, end, true, meta));\n i = end;\n continue;\n }\n const cite = CITE_RE.exec(text.slice(i, i + 64));\n if (cite) {\n inlines.push(this.island(\"cite\", i, i + cite[0].length, true, { n: Number(cite[1]) }));\n i += cite[0].length;\n continue;\n }\n const tag = readXmlTag(text, i, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n if (tag && i + tag.raw.length <= pe) {\n const name = tag.tagName;\n const tagEnd = i + tag.raw.length;\n const isAttr = ATTRIBUTE_XML_NAMES.includes(name);\n const isThinking = THINKING_FAMILY.includes(name) && tag.raw === `<${name}>`;\n if (!tag.isClosing && (isAttr || isThinking)) {\n if (tag.isSelfClosing) {\n inlines.push(this.island(\"xml_inline\", i, tagEnd, true, { tag: name, selfClosing: true }));\n i = tagEnd;\n continue;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, tagEnd);\n const blockType: IslandType = isAttr ? \"xml_attr\" : \"xml_region\";\n // A mid-line reasoning opener that never closes is a mention, not\n // a region (`grep -c '<thinking>' log.txt > count.txt`): the\n // renderer shows it as prose, so locking the rest of the document\n // as one island would be wrong (verify-RC-B3 RC-B3r R3). While a\n // stream is still arriving its closer may yet come, anywhere later\n // — so there it stays an open region to the end (undecided).\n if (close === -1 && isThinking && !this.streaming) {\n i = tagEnd;\n continue;\n }\n if (close === -1) return stop(this.island(blockType, i, this.n, false, { tag: name }));\n const end = close + closer.length;\n if (end > pe) return stop(this.spill(blockType, i, end, pe, { tag: name }));\n inlines.push(this.island(\"xml_inline\", i, end, true, { tag: name }));\n i = end;\n continue;\n }\n if (tag.isClosing && THINKING_FAMILY.includes(name)) {\n return stop(this.island(\"xml_region\", i, tagEnd, true, { tag: name, continuation: true }), true);\n }\n const lower = name.toLowerCase();\n inlines.push(\n this.island(ALLOWED_RAW_HTML_TAGS.has(lower) ? \"html_tag\" : \"xml_tag\", i, tagEnd, true, {\n tag: name,\n }),\n );\n i = tagEnd;\n continue;\n }\n // An attribute-bearing opener still arriving (no `>` anywhere yet).\n const pending = ATTRIBUTE_XML_NAMES.find(\n (name) => text.startsWith(`<${name}`, i) && /\\s/.test(text[i + name.length + 1] ?? \"\"),\n );\n if (pending && this.next(\">\", i) === -1) {\n return stop(this.island(\"xml_attr\", i, this.n, false, { tag: pending }));\n }\n i++;\n continue;\n }\n i++;\n }\n return { inlines, breakIsland: null, orphan: false };\n }\n}\n\n/**\n * Cut `text` into blocks whose raw concatenation is exactly `text`.\n * Never throws; unclosed constructs are islands with `complete: false`.\n */\nexport interface TokenizeOptions {\n /**\n * The text is a prefix of a message still arriving. The final line (no\n * terminator yet) can still grow — a bare ``` there may become ```bash — so\n * it closes no fence until its newline arrives (verify-RC-B3 residual R2).\n * Omit for stored text: a complete document's last line is final.\n */\n readonly streaming?: boolean;\n /**\n * DIAGNOSTIC — complexity tests only. When given, every loop that walks the\n * text itself adds the characters it visits to `meter.work`, so a test can\n * assert the tokenizer's work grows linearly with its input (deterministic,\n * unlike wall-clock timing). Loops over a slice are not charged here: the\n * slice's own cost covers them. Omit in production.\n */\n readonly meter?: { work: number };\n}\n\nexport function tokenizeSource(text: string, options: TokenizeOptions = {}): SourceBlock[] {\n const raw = new Tokenizer(text, options.streaming ?? false, options.meter).run();\n const cp = buildCodePointIndex(text);\n const inline = (island: RawIsland): SourceIsland => ({\n islandType: island.type,\n inline: true,\n complete: island.complete,\n meta: island.meta,\n start: island.start,\n end: island.end,\n startCp: cp.toCodePoint(island.start),\n endCp: cp.toCodePoint(island.end),\n raw: text.slice(island.start, island.end),\n });\n return raw.map(\n (block): SourceBlock => ({\n kind: block.kind,\n islandType: (block.island?.type as BlockIslandType | undefined) ?? null,\n complete: block.island ? block.island.complete : true,\n meta: block.island?.meta ?? {},\n inlines: block.inlines.map(inline),\n start: block.start,\n end: block.end,\n startCp: cp.toCodePoint(block.start),\n endCp: cp.toCodePoint(block.end),\n raw: text.slice(block.start, block.end),\n }),\n );\n}\n\n/** The exact source the blocks were cut from. */\nexport function joinSource(blocks: readonly SourceBlock[]): string {\n let out = \"\";\n for (const block of blocks) out += block.raw;\n return out;\n}\n\n/** Every island — block-level and inline — in document order. */\nexport function listIslands(blocks: readonly SourceBlock[]): SourceIsland[] {\n const out: SourceIsland[] = [];\n for (const block of blocks) {\n if (block.kind === \"island\" && block.islandType) {\n out.push({\n islandType: block.islandType,\n inline: false,\n complete: block.complete,\n meta: block.meta,\n start: block.start,\n end: block.end,\n startCp: block.startCp,\n endCp: block.endCp,\n raw: block.raw,\n });\n } else {\n // A loop, never a spread: a block can hold 100k+ inline islands and a\n // spread passes each as a call argument (RangeError, residual R3).\n for (const inline of block.inlines) out.push(inline);\n }\n }\n return out;\n}\n\n/** The block containing UTF-16 offset `offset` (the later block at a boundary). */\nexport function blockAt(blocks: readonly SourceBlock[], offset: number): SourceBlock | null {\n let lo = 0;\n let hi = blocks.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const block = blocks[mid] as SourceBlock;\n if (offset < block.start) hi = mid - 1;\n else if (offset >= block.end) lo = mid + 1;\n else return block;\n }\n return null;\n}\n","/**\n * SAVE = SPLICE (rich-content PLAN decision 6).\n *\n * An editor never hands back a whole re-serialized document. It hands back\n * per-block replacements for exactly the blocks the person changed; every\n * other byte of the stored text is written back as it was. This module\n * applies those replacements and returns:\n *\n * - the new text,\n * - a change set (old range → new range, in UTF-16 AND code points,\n * narrowed to the bytes that actually differ) that the annotation layer\n * uses to carry every live anchor through the save\n * (STORE-DESIGN §3.19 — the ProseMirror / Google Docs position-mapping\n * model), and\n * - an integrity guarantee: every island not explicitly replaced must still\n * be the same island, at its mapped position, in the new text. An edit\n * that opens an unclosed fence and swallows a kind below it is REFUSED.\n *\n * ISLANDS CHANGE ONLY THROUGH `islandEdit`. A prose/range edit must hand back\n * every island inside its range byte-identical and in order (a visual editor\n * holds them as atoms); if one is altered or dropped the save throws\n * `SourceSpliceError(\"island_edit\")` naming the island. A kind editor or code\n * view changes an island with `islandEdit(island, newRaw)`.\n *\n * A no-edit save (or edits whose text equals the original block) returns the\n * original string itself — byte-identical, zero changes.\n */\n\nimport { buildCodePointIndex, splitsSurrogatePair } from \"./offsets\";\nimport {\n joinSource,\n listIslands,\n tokenizeSource,\n type IslandType,\n type SourceBlock,\n type SourceIsland,\n} from \"./tokenize\";\n\n/**\n * Replace `[start, end)` (UTF-16) of the original with `text`. A plain edit\n * starts and ends on block boundaries; an island edit (`island: true`, made by\n * `islandEdit`) names exactly one island's span.\n */\nexport interface SourceEdit {\n readonly start: number;\n readonly end: number;\n readonly text: string;\n readonly island?: boolean;\n}\n\nexport interface SourceChange {\n /** The block-aligned range the edit named, in the ORIGINAL text. */\n readonly blockStart: number;\n readonly blockEnd: number;\n /** The narrowed range that actually differs: old text … */\n readonly oldStart: number;\n readonly oldEnd: number;\n /** … and where its replacement sits in the NEW text. */\n readonly newStart: number;\n readonly newEnd: number;\n readonly oldStartCp: number;\n readonly oldEndCp: number;\n readonly newStartCp: number;\n readonly newEndCp: number;\n}\n\nexport interface DisturbedIsland {\n readonly islandType: IslandType;\n readonly inline: boolean;\n /** Where the island was in the original (UTF-16). */\n readonly start: number;\n readonly end: number;\n /** Where it should have been in the new text. */\n readonly mappedStart: number;\n}\n\nexport interface SpliceIntegrity {\n /** True when every untouched island survived intact and outside bytes are identical. */\n readonly ok: boolean;\n /** Always true by construction; checked anyway because it is THE guarantee. */\n readonly bytesOutsideEditsIdentical: boolean;\n readonly disturbed: readonly DisturbedIsland[];\n}\n\nexport interface SpliceResult {\n readonly text: string;\n readonly changed: boolean;\n readonly changes: readonly SourceChange[];\n readonly integrity: SpliceIntegrity;\n /** Tokenization of the new text. */\n readonly blocks: readonly SourceBlock[];\n}\n\nexport type SourceSpliceErrorCode =\n | \"out_of_range\"\n | \"misaligned\"\n | \"overlap\"\n | \"stale_blocks\"\n | \"island_edit\"\n | \"integrity\";\n\nexport class SourceSpliceError extends Error {\n readonly code: SourceSpliceErrorCode;\n\n constructor(\n code: SourceSpliceErrorCode,\n message: string,\n ) {\n super(message);\n this.code = code;\n this.name = \"SourceSpliceError\";\n }\n}\n\nexport interface SpliceOptions {\n /** The tokenization of `original`, when the caller already holds it. */\n readonly blocks?: readonly SourceBlock[];\n /**\n * Default `true`: a save that disturbs any island it did not explicitly\n * replace throws `SourceSpliceError(\"integrity\")`. `false` is for TOOLING\n * ONLY (diagnostic scripts that want the report instead of the refusal) —\n * no editor or persistence path may pass it.\n */\n readonly requireIntegrity?: boolean;\n}\n\n/** An edit that replaces one block's raw text. */\nexport function blockEdit(block: SourceBlock, text: string): SourceEdit {\n return { start: block.start, end: block.end, text };\n}\n\n/** The one door that changes an island: replace exactly its span with `text`. */\nexport function islandEdit(\n island: { readonly start: number; readonly end: number },\n text: string,\n): SourceEdit {\n return { start: island.start, end: island.end, text, island: true };\n}\n\n/** An edit that replaces a contiguous run of blocks `[first, last]`. */\nexport function blockRangeEdit(first: SourceBlock, last: SourceBlock, text: string): SourceEdit {\n return { start: first.start, end: last.end, text };\n}\n\n/**\n * Where an island's raw text sits in a replacement, at or after `from`, or -1\n * when the island is gone. Candidates: the island's own position measured from\n * the previous island and from the end of the edit, plus the nearest\n * occurrences either side. When the island's bytes occur more than once — a\n * copy inside a code span, or an insertion that itself contains a copy\n * (verify-RC-B3 residual R1) — the candidate whose surroundings still match\n * the original text wins, so a coincidental copy at the expected offset never\n * steals the island.\n */\nconst CONTEXT_WINDOW = 64;\n\nfunction locateIsland(\n text: string,\n raw: string,\n from: number,\n expected: number,\n expectedFromEnd: number,\n oldText: string,\n oldStart: number,\n oldEnd: number,\n): number {\n const candidates = new Set<number>();\n if (expected >= from && text.startsWith(raw, expected)) candidates.add(expected);\n if (expectedFromEnd >= from && text.startsWith(raw, expectedFromEnd)) candidates.add(expectedFromEnd);\n const after = text.indexOf(raw, Math.max(from, expected));\n if (after !== -1) candidates.add(after);\n const before = expected > from ? text.lastIndexOf(raw, expected) : -1;\n if (before >= from) candidates.add(before);\n if (candidates.size === 0) return text.indexOf(raw, from);\n if (candidates.size === 1) return candidates.values().next().value as number;\n let best = -1;\n let bestScore = -1;\n for (const at of candidates) {\n let score = 0;\n // Matching bytes just after the island …\n for (let k = 0; k < CONTEXT_WINDOW; k++) {\n const n = text[at + raw.length + k];\n if (n === undefined || n !== oldText[oldEnd + k]) break;\n score++;\n }\n // … and just before it.\n for (let k = 1; k <= CONTEXT_WINDOW; k++) {\n const n = text[at - k];\n if (n === undefined || n !== oldText[oldStart - k]) break;\n score++;\n }\n if (score > bestScore || (score === bestScore && at === expected)) {\n best = at;\n bestScore = score;\n }\n }\n return best;\n}\n\nfunction commonPrefix(a: string, b: string): number {\n const max = Math.min(a.length, b.length);\n let i = 0;\n while (i < max && a.charCodeAt(i) === b.charCodeAt(i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, i) || splitsSurrogatePair(b, i))) i--;\n return i;\n}\n\nfunction commonSuffix(a: string, b: string, prefix: number): number {\n const max = Math.min(a.length, b.length) - prefix;\n let i = 0;\n while (i < max && a.charCodeAt(a.length - 1 - i) === b.charCodeAt(b.length - 1 - i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, a.length - i) || splitsSurrogatePair(b, b.length - i))) i--;\n return i;\n}\n\n/**\n * Apply block-aligned replacements to `original`. Bytes outside the edits are\n * copied, never rebuilt; an edit equal to its block changes nothing.\n */\nexport function spliceSave(\n original: string,\n edits: readonly SourceEdit[],\n options: SpliceOptions = {},\n): SpliceResult {\n const blocks = options.blocks ?? tokenizeSource(original);\n if (options.blocks && joinSource(blocks) !== original) {\n throw new SourceSpliceError(\"stale_blocks\", \"the blocks passed in were not cut from this original text\");\n }\n\n const boundaries = new Set<number>([0, original.length]);\n for (const block of blocks) {\n boundaries.add(block.start);\n boundaries.add(block.end);\n }\n const islands = listIslands(blocks);\n const islandAt = new Map<string, SourceIsland>();\n for (const island of islands) islandAt.set(`${island.start}:${island.end}`, island);\n\n const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);\n let previousEnd = -1;\n for (const edit of sorted) {\n if (edit.start < 0 || edit.end > original.length || edit.start > edit.end) {\n throw new SourceSpliceError(\"out_of_range\", `edit [${edit.start}, ${edit.end}) is outside the text`);\n }\n if (edit.island) {\n if (!islandAt.has(`${edit.start}:${edit.end}`)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `islandEdit [${edit.start}, ${edit.end}) does not name an island's exact span`,\n );\n }\n } else if (!boundaries.has(edit.start) || !boundaries.has(edit.end)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `edit [${edit.start}, ${edit.end}) does not start and end on block boundaries`,\n );\n }\n if (edit.start < previousEnd) {\n throw new SourceSpliceError(\"overlap\", `edit [${edit.start}, ${edit.end}) overlaps the previous edit`);\n }\n previousEnd = edit.end;\n }\n\n // Split every edit into the byte ranges that actually differ. A plain edit\n // must carry each island inside its range through byte-identical and in\n // order; the text between islands is diffed segment by segment.\n interface Narrowed {\n oldStart: number;\n oldEnd: number;\n replacement: string;\n }\n const effective: Narrowed[] = [];\n const replacedIslands = new Set<string>();\n const pushSegment = (oldStart: number, oldEnd: number, replacement: string) => {\n const old = original.slice(oldStart, oldEnd);\n if (old === replacement) return;\n const prefix = commonPrefix(old, replacement);\n const suffix = commonSuffix(old, replacement, prefix);\n effective.push({\n oldStart: oldStart + prefix,\n oldEnd: oldEnd - suffix,\n replacement: replacement.slice(prefix, replacement.length - suffix),\n });\n };\n for (const edit of sorted) {\n if (edit.island) {\n replacedIslands.add(`${edit.start}:${edit.end}`);\n pushSegment(edit.start, edit.end, edit.text);\n continue;\n }\n if (edit.text === original.slice(edit.start, edit.end)) continue;\n const inside = islands.filter((island) => island.start >= edit.start && island.end <= edit.end);\n let oldCursor = edit.start;\n let newCursor = 0;\n for (const island of inside) {\n // Context is compared against the edit's own old/new text, clipped to the edit.\n const at = locateIsland(\n edit.text,\n island.raw,\n newCursor,\n newCursor + (island.start - oldCursor),\n edit.text.length - (edit.end - island.start),\n original.slice(edit.start, edit.end),\n island.start - edit.start,\n island.end - edit.start,\n );\n if (at === -1) {\n const name = island.meta.tag ?? island.meta.name ?? island.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `edit [${edit.start}, ${edit.end}) changes or removes the protected ${island.islandType}` +\n `${name ? ` (${String(name)})` : \"\"} island at [${island.start}, ${island.end}); ` +\n \"islands change only through islandEdit()\",\n );\n }\n pushSegment(oldCursor, island.start, edit.text.slice(newCursor, at));\n oldCursor = island.end;\n newCursor = at + island.raw.length;\n }\n pushSegment(oldCursor, edit.end, edit.text.slice(newCursor));\n }\n\n if (effective.length === 0) {\n return {\n text: original,\n changed: false,\n changes: [],\n integrity: { ok: true, bytesOutsideEditsIdentical: true, disturbed: [] },\n blocks,\n };\n }\n\n let text = \"\";\n let cursor = 0;\n let delta = 0;\n const pending: Array<Omit<SourceChange, \"oldStartCp\" | \"oldEndCp\" | \"newStartCp\" | \"newEndCp\">> = [];\n for (const edit of effective) {\n text += original.slice(cursor, edit.oldStart);\n const newStart = edit.oldStart + delta;\n text += edit.replacement;\n const newEnd = newStart + edit.replacement.length;\n const owner = sorted.find((e) => e.start <= edit.oldStart && e.end >= edit.oldEnd);\n pending.push({\n blockStart: owner?.start ?? edit.oldStart,\n blockEnd: owner?.end ?? edit.oldEnd,\n oldStart: edit.oldStart,\n oldEnd: edit.oldEnd,\n newStart,\n newEnd,\n });\n delta += edit.replacement.length - (edit.oldEnd - edit.oldStart);\n cursor = edit.oldEnd;\n }\n text += original.slice(cursor);\n\n const oldCp = buildCodePointIndex(original);\n const newCp = buildCodePointIndex(text);\n const changes: SourceChange[] = pending.map((change) => ({\n ...change,\n oldStartCp: oldCp.toCodePoint(change.oldStart),\n oldEndCp: oldCp.toCodePoint(change.oldEnd),\n newStartCp: newCp.toCodePoint(change.newStart),\n newEndCp: newCp.toCodePoint(change.newEnd),\n }));\n\n // Guard 1: every byte outside the changed ranges is the original byte.\n let bytesOutsideEditsIdentical = true;\n let oldCursor = 0;\n let newCursor = 0;\n for (const change of changes) {\n if (original.slice(oldCursor, change.oldStart) !== text.slice(newCursor, change.newStart)) {\n bytesOutsideEditsIdentical = false;\n }\n oldCursor = change.oldEnd;\n newCursor = change.newEnd;\n }\n if (original.slice(oldCursor) !== text.slice(newCursor)) bytesOutsideEditsIdentical = false;\n\n // Guard 2: every island not explicitly replaced is still that island, at its\n // mapped position, in the re-tokenized new text.\n const newBlocks = tokenizeSource(text);\n const newIslandsByStart = new Map<number, string[]>();\n for (const island of listIslands(newBlocks)) {\n const list = newIslandsByStart.get(island.start);\n if (list) list.push(island.raw);\n else newIslandsByStart.set(island.start, [island.raw]);\n }\n const disturbed: DisturbedIsland[] = [];\n // Islands a plain edit carried through: the edit claims to keep them, so if\n // one did not survive as that island its bytes were matched to a copy that\n // is not an island — the edit changed an island (island_edit, always).\n const carried = (island: SourceIsland) =>\n sorted.some((edit) => !edit.island && island.start >= edit.start && island.end <= edit.end);\n const changedInside: SourceIsland[] = [];\n for (const island of islands) {\n if (replacedIslands.has(`${island.start}:${island.end}`)) continue;\n const mappedStart = mapPosition(changes, island.start, { assoc: 1 }).pos;\n const candidates = newIslandsByStart.get(mappedStart);\n if (!candidates || !candidates.includes(island.raw)) {\n if (carried(island)) {\n changedInside.push(island);\n continue;\n }\n disturbed.push({\n islandType: island.islandType,\n inline: island.inline,\n start: island.start,\n end: island.end,\n mappedStart,\n });\n }\n }\n\n if (changedInside.length > 0) {\n const first = changedInside[0] as SourceIsland;\n const name = first.meta.tag ?? first.meta.name ?? first.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `the edit changes the protected ${first.islandType}${name ? ` (${String(name)})` : \"\"} island at ` +\n `[${first.start}, ${first.end}) — its bytes survive only as ordinary text` +\n `${changedInside.length > 1 ? ` (and ${changedInside.length - 1} more)` : \"\"}; islands change only through islandEdit()`,\n );\n }\n\n const integrity: SpliceIntegrity = {\n ok: bytesOutsideEditsIdentical && disturbed.length === 0,\n bytesOutsideEditsIdentical,\n disturbed,\n };\n if ((options.requireIntegrity ?? true) && !integrity.ok) {\n const named = disturbed\n .slice(0, 5)\n .map((island) => `${island.islandType}@${island.start}`)\n .join(\", \");\n throw new SourceSpliceError(\n \"integrity\",\n `integrity: the save disturbed ${disturbed.length} protected island(s) it did not replace` +\n `${named ? ` (${named}${disturbed.length > 5 ? \", …\" : \"\"})` : \"\"}` +\n `${bytesOutsideEditsIdentical ? \"\" : \"; bytes outside the edits changed\"}`,\n );\n }\n return { text, changed: true, changes, integrity, blocks: newBlocks };\n}\n\nexport interface MapOptions {\n /** -1 keeps a position at an insertion point before the inserted text; 1 (default) moves it after. */\n readonly assoc?: -1 | 1;\n /** Offset unit of `pos` and of the result. Default `utf16`. */\n readonly unit?: \"utf16\" | \"codepoint\";\n}\n\nexport interface MappedPosition {\n readonly pos: number;\n /** True when the position sat strictly inside replaced text. */\n readonly deleted: boolean;\n}\n\n/**\n * Carry a position in the old text through a change set (ProseMirror StepMap\n * semantics): positions before a change stay, positions after shift by the\n * size difference, a position strictly inside replaced text is `deleted` and\n * lands on the replacement's edge chosen by `assoc`.\n */\nexport function mapPosition(\n changes: readonly SourceChange[],\n pos: number,\n options: MapOptions = {},\n): MappedPosition {\n const assoc = options.assoc ?? 1;\n const cp = options.unit === \"codepoint\";\n let delta = 0;\n for (const change of changes) {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n const newStart = cp ? change.newStartCp : change.newStart;\n const newEnd = cp ? change.newEndCp : change.newEnd;\n if (pos < oldStart) break;\n if (pos > oldEnd) {\n delta = newEnd - oldEnd;\n continue;\n }\n if (oldStart === oldEnd) {\n // Pure insertion at `pos`.\n return { pos: assoc < 0 ? newStart : newEnd, deleted: false };\n }\n if (pos === oldStart) return { pos: newStart, deleted: false };\n if (pos === oldEnd) return { pos: newEnd, deleted: false };\n return { pos: assoc < 0 ? newStart : newEnd, deleted: true };\n }\n return { pos: pos + delta, deleted: false };\n}\n\nexport interface MappedRange {\n readonly start: number;\n readonly end: number;\n /** True when a change overlapped the range's interior. */\n readonly touched: boolean;\n /** True when the whole range was replaced away. */\n readonly collapsed: boolean;\n}\n\n/** Carry an anchor range through a change set; it stays inside its text when edits happen around it. */\nexport function mapRange(\n changes: readonly SourceChange[],\n start: number,\n end: number,\n unit: \"utf16\" | \"codepoint\" = \"utf16\",\n): MappedRange {\n const cp = unit === \"codepoint\";\n const mappedStart = mapPosition(changes, start, { assoc: 1, unit });\n const mappedEnd = mapPosition(changes, end, { assoc: -1, unit });\n const touched = changes.some((change) => {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n return oldStart < end && oldEnd > start;\n });\n const newStart = mappedStart.pos;\n const newEnd = Math.max(newStart, mappedEnd.pos);\n return { start: newStart, end: newEnd, touched, collapsed: newEnd === newStart && end > start };\n}\n","/**\n * THE link-reference rule (CommonMark 4.7 / 6.3) for surfaces that read one\n * piece of a document at a time — a table cell, a split chat block, a printed\n * row — and so cannot see the document's `[label]: url \"title\"` definitions.\n * `collectLinkDefinitions` reads them from the WHOLE text (never inside fenced\n * code); `resolveReferenceLinks` rewrites a fragment's full (`[text][label]`),\n * collapsed (`[label][]`) and shortcut (`[label]`) reference links into inline\n * links (`[text](url \"title\")`) so any renderer shows what GFM shows. Code spans,\n * images, inline links, footnote references and undefined labels are left as\n * they are. verify-RC-B4 round 9 (R9-4).\n *\n * Pure TS, no dependencies.\n */\n\nimport { fenceLineKinds, mapInlineCodeSpans } from \"./code-ranges\";\n\nexport interface LinkDefinition {\n url: string;\n title: string | null;\n}\n\n/** CommonMark label matching: case-folded, inner whitespace collapsed, trimmed. */\nexport function normalizeLinkLabel(label: string): string {\n return label.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nconst DEFINITION =\n /^ {0,3}\\[((?:[^\\]\\\\]|\\\\.){1,999})\\]:[ \\t]*(?:<([^<>\\n]*)>|(\\S+))(?:[ \\t]+(?:\"((?:[^\"\\\\]|\\\\.)*)\"|'((?:[^'\\\\]|\\\\.)*)'|\\(((?:[^()\\\\]|\\\\.)*)\\)))?[ \\t]*$/;\n\n/** Every link reference definition in `text` (first one wins, as in CommonMark); fenced code is skipped. */\nexport function collectLinkDefinitions(text: string): Map<string, LinkDefinition> {\n const defs = new Map<string, LinkDefinition>();\n for (const { label, definition } of scanLinkDefinitions(text)) {\n const key = normalizeLinkLabel(label);\n if (key && !defs.has(key)) defs.set(key, definition);\n }\n return defs;\n}\n\n/** The line indices (text split on \"\\n\") that ARE link reference definitions — GFM renders nothing for them. */\nexport function findLinkDefinitionLines(text: string): number[] {\n return scanLinkDefinitions(text).map(({ line }) => line);\n}\n\nfunction scanLinkDefinitions(text: string): Array<{ line: number; label: string; definition: LinkDefinition }> {\n const found: Array<{ line: number; label: string; definition: LinkDefinition }> = [];\n if (!text.includes(\"]:\")) return found;\n const lines = text.split(\"\\n\");\n const kinds = fenceLineKinds(text);\n let previousWasDefinition = false;\n lines.forEach((line, i) => {\n const wasDefinition = previousWasDefinition;\n previousWasDefinition = false;\n if (kinds[i] !== \"prose\") return;\n const m = DEFINITION.exec(line);\n if (!m) return;\n // A definition cannot interrupt a paragraph (or a table row run): only at the\n // start, after a blank line, a closed fence, a heading, a rule or another definition.\n const above = i > 0 ? lines[i - 1] ?? \"\" : \"\";\n const opensBlock =\n i === 0 || !above.trim() || wasDefinition || kinds[i - 1] === \"close\" || /^ {0,3}(?:#{1,6}(?:\\s|$)|(?:[-*_][ \\t]*){3,}$)/.test(above);\n if (!opensBlock) return;\n const label = m[1] ?? \"\";\n if (label.startsWith(\"^\")) return; // a footnote definition, not a link\n previousWasDefinition = true;\n found.push({ line: i, label, definition: { url: m[2] ?? m[3] ?? \"\", title: m[4] ?? m[5] ?? m[6] ?? null } });\n });\n return found;\n}\n\nconst REFERENCE = /(!?)\\[((?:[^\\]\\\\]|\\\\.)*)\\](?:\\[((?:[^\\]\\\\]|\\\\.)*)\\])?(?![(:[])/g;\n\nconst escapeTitle = (title: string) => title.replace(/[\"\\\\]/g, \"\\\\$&\");\n\n/**\n * `fragment` with every reference link whose label is defined rewritten inline.\n * An image (`![alt][ref]`) resolves too. Nothing else changes.\n */\nexport function resolveReferenceLinks(fragment: string, defs: ReadonlyMap<string, LinkDefinition>): string {\n if (defs.size === 0 || !fragment.includes(\"[\")) return fragment;\n const PLACEHOLDER = \"\\uE011\";\n const spans: string[] = [];\n const masked = mapInlineCodeSpans(fragment, (_range, raw) => {\n spans.push(raw);\n return `${PLACEHOLDER}${spans.length - 1}${PLACEHOLDER}`;\n });\n const resolved = masked.replace(REFERENCE, (whole: string, bang: string, text: string, ref: string | undefined, at: number) => {\n if (at > 0 && masked[at - 1] === \"\\\\\") return whole;\n if (text.startsWith(\"^\")) return whole; // footnote reference\n const key = normalizeLinkLabel(ref === undefined || ref === \"\" ? text : ref);\n const def = defs.get(key);\n if (!def) return whole;\n const title = def.title === null ? \"\" : ` \"${escapeTitle(def.title)}\"`;\n const url = /[\\s()<>]/.test(def.url) ? `<${def.url}>` : def.url;\n return `${bang}[${text}](${url}${title})`;\n });\n return resolved.replace(new RegExp(`${PLACEHOLDER}(\\\\d+)${PLACEHOLDER}`, \"g\"), (_m: string, i: string) => spans[Number(i)] ?? \"\");\n}\n"]}
1
+ {"version":3,"sources":["../source/offsets.ts","../source/constants.ts","../source/fence-nesting.ts","../source/code-ranges.ts","../source/math-pairs.ts","../source/math.ts","../source/xml-tag.ts","../source/gfm-table.ts","../source/tokenize.ts","../source/splice.ts","../source/link-references.ts"],"names":["k","scan","oldCursor","newCursor"],"mappings":";;;AAmBA,SAAS,OAAO,IAAA,EAAuB;AACrC,EAAA,OAAO,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA;AACnC;AACA,SAAS,MAAM,IAAA,EAAuB;AACpC,EAAA,OAAO,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA;AACnC;AAGO,SAAS,mBAAA,CAAoB,MAAc,MAAA,EAAyB;AACzE,EAAA,IAAI,MAAA,IAAU,CAAA,IAAK,MAAA,IAAU,IAAA,CAAK,QAAQ,OAAO,KAAA;AACjD,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,MAAM,CAAC,CAAA;AAC7E;AAEO,SAAS,oBAAoB,IAAA,EAA8B;AAEhE,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACxC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG;AAC/D,MAAA,UAAA,CAAW,KAAK,CAAC,CAAA;AACjB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAA0B;AAC5C,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,KAAK,UAAA,CAAW,MAAA;AACpB,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,IAAK,UAAA,CAAW,GAAG,CAAA,GAAe,KAAA,OAAY,GAAA,GAAM,CAAA;AAAA,WAC/C,EAAA,GAAK,GAAA;AAAA,IACZ;AACA,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA0B;AAG7C,IAAA,OAAO,KAAA,GAAQ,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,KAA8B;AAE7C,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,KAAK,UAAA,CAAW,MAAA;AACpB,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAE1B,MAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,MAAA,IAAI,KAAA,GAAQ,GAAA,GAAM,SAAA,EAAW,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,WACnC,EAAA,GAAK,GAAA;AAAA,IACZ;AACA,IAAA,OAAO,SAAA,GAAY,EAAA;AAAA,EACrB,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,MAAA,GAAS,UAAA,CAAW;AAAA,GACrC;AACF;AAGO,SAAS,iBAAA,CAAkB,MAAc,KAAA,EAAuB;AACrE,EAAA,OAAO,mBAAA,CAAoB,IAAI,CAAA,CAAE,WAAA,CAAY,KAAK,CAAA;AACpD;AAGO,SAAS,aAAA,CAAc,MAAc,SAAA,EAA2B;AACrE,EAAA,OAAO,mBAAA,CAAoB,IAAI,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AACpD;;;AC/EO,IAAM,mBAAA,GAAyC;AAAA,EACpD,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA;AAGO,IAAM,eAAA,GAAqC,CAAC,UAAA,EAAY,OAAA,EAAS,WAAW,CAAA;AAG5E,IAAM,mBAAA,GAAyC;AAAA,EACpD,UAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,mBAAA,uBAA+C,GAAA,CAAI;AAAA,EAC9D,GAAG,mBAAA;AAAA,EACH,GAAG;AACL,CAAC,CAAA;AAGM,IAAM,qBAAA,uBAAiD,GAAA,CAAI;AAAA,EAChE,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,GAAA;AAAA,EAAK,QAAA;AAAA,EAAU,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EACpE,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,KAAA;AAAA,EACpE,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,YAAA;AAAA,EAAc,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC9D,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,SAAA;AAAA,EACtD,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,SAAA;AAAA,EAAW;AACxD,CAAC,CAAA;AAMM,IAAM,qBAAA,uBAAiD,GAAA,CAAI;AAAA,EAChE,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,YAAA;AAAA,EAAc,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EACnE,IAAA;AAAA,EAAM,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,SAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,YAAA;AAAA,EAAc,SAAA;AAAA,EAAW;AACxD,CAAC,CAAA;AAGM,IAAM,sBAAA,uBAAkD,GAAA,CAAI;AAAA,EACjE,YAAA;AAAA,EAAc,OAAA;AAAA,EAAS,iBAAA;AAAA,EAAmB,eAAA;AAAA,EAAiB,YAAA;AAAA,EAC3D,gBAAA;AAAA,EAAkB,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,MAAA;AAAA,EAC7D,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS;AACnB,CAAC,CAAA;AAGM,IAAM,qBAAA,GAA0D;AAAA,EACrE,GAAA,EAAK,SAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAGO,IAAM,oBAAA,GAAyD;AAAA,EACpE,UAAA,EAAY,MAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,UAAA,EAAY,kBAAA;AAAA,EACZ,OAAA,EAAS,SAAA;AAAA,EACT,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,IAAA,EAAM;AACR,CAAA;AAGO,IAAM,WAAA,GAAc,eAAA;AAGpB,IAAM,gBAAA,GAAmB,8BAAA;AAGzB,IAAM,kBAAA,GAAqB,qCAAA;AAG3B,IAAM,OAAA,GAAU,+BAAA;AAEhB,SAAS,uBAAuB,QAAA,EAA0B;AAC/D,EAAA,MAAM,KAAA,GAAQ,SAAS,WAAA,EAAY;AACnC,EAAA,OAAO,qBAAA,CAAsB,KAAK,CAAA,IAAK,KAAA;AACzC;;;AC7EO,IAAM,uBAAA,uBAAmD,GAAA,CAAI;AAAA,EAClE,UAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC;AAGM,SAAS,sBAAsB,QAAA,EAA8C;AAClF,EAAA,OAAO,CAAC,CAAC,QAAA,IAAY,wBAAwB,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA;AACzE;AA8BO,IAAM,gBAAA,GAAmB;AAEhC,SAAS,kBAAkB,EAAA,EAAiC;AAC1D,EAAA,OAAO,OAAO,MAAA,IAAa,EAAA,KAAO,EAAA,IAAM,gBAAA,CAAiB,SAAS,EAAE,CAAA;AACtE;AAGO,SAAS,cAAc,IAAA,EAAsB;AAClD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAM,IAAA,CAAK,MAAA;AACf,EAAA,OAAO,QAAQ,GAAA,IAAO,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,KAAA,EAAA;AACtD,EAAA,OAAO,MAAM,KAAA,IAAS,iBAAA,CAAkB,KAAK,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,GAAA,EAAA;AACxD,EAAA,OAAO,KAAA,KAAU,KAAK,GAAA,KAAQ,IAAA,CAAK,SAAS,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAC1E;AAUO,IAAM,uBAAA,GACX;AAEF,SAAS,mBAAmB,EAAA,EAAiC;AAC3D,EAAA,OAAO,OAAO,MAAA,IAAa,EAAA,KAAO,EAAA,IAAM,uBAAA,CAAwB,SAAS,EAAE,CAAA;AAC7E;AASO,SAAS,iBAAiB,IAAA,EAAsD;AACrF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAM,IAAA,CAAK,MAAA;AACf,EAAA,OAAO,QAAQ,GAAA,IAAO,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,KAAA,EAAA;AACvD,EAAA,OAAO,MAAM,KAAA,IAAS,kBAAA,CAAmB,KAAK,GAAA,GAAM,CAAC,CAAC,CAAA,EAAG,GAAA,EAAA;AACzD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,QAAQ,KAAA,GAAQ,GAAA,IAAO,KAAK,KAAA,GAAQ,KAAK,MAAM,GAAA,EAAK,KAAA,EAAA;AAC3D,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,IAAA;AACtB,EAAA,IAAI,IAAA,CAAK,MAAM,KAAA,GAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AACzD,EAAA,IAAI,YAAY,KAAA,GAAQ,KAAA;AACxB,EAAA,OAAO,YAAY,GAAA,IAAO,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,SAAA,EAAA;AAC/D,EAAA,IAAI,OAAA,GAAU,SAAA;AACd,EAAA,OAAO,UAAU,GAAA,IAAO,CAAC,mBAAmB,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG,OAAA,EAAA;AAC5D,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAK,KAAA,CAAM,SAAA,EAAW,OAAO,CAAA,EAAE;AACvD;AAEO,SAAS,sBAAA,CACd,OAAA,EACA,SAAA,EACA,KAAA,EACA,WAAA,EACgB;AAChB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,QAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,KAAK,MAAM,GAAA,EAAK,KAAA,EAAA;AACzD,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,SAAA;AACtB,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAC,CAAA;AAC/C,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,IAAI,KAAA,GAAQ,WAAW,OAAO,SAAA;AAC9B,IAAA,IAAI,KAAA,IAAS,WAAA,GAAc,CAAA,EAAG,OAAO,cAAA;AACrC,IAAA,OAAO,aAAA;AAAA,EACT;AAKA,EAAA,IAAI,KAAA,IAAS,SAAS,SAAA,IAAa,CAAC,KAAK,QAAA,CAAS,GAAG,GAAG,OAAO,aAAA;AAC/D,EAAA,OAAO,SAAA;AACT;;;ACtFO,SAAS,cAAc,OAAA,EAAqC;AACjE,EAAA,MAAM,CAAA,GAAI,QAAQ,SAAA,EAAU;AAC5B,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AAEvB,IAAA,MAAM,MAAA,GAAS,iBAAiB,CAAC,CAAA;AACjC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,OAAO,EAAE,MAAM,GAAA,EAAK,KAAA,EAAO,OAAO,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,EAC7D;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAA,IAAU,KAAK,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACzD,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA;AACnC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,OAAQ,IAAA,CAAK,CAAC,EAAa,MAAA,EAAQ,IAAA,EAAO,KAAK,CAAC,CAAA,CAAa,MAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,KAAK,EAAA,EAAG;AAAA,EAC/G;AACA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,iBAAiB,IAAA,EAAuB;AACtD,EAAA,OAAO,aAAA,CAAc,IAAI,CAAA,KAAM,IAAA;AACjC;AAmCO,IAAM,cAAN,MAAkB;AAAA,EACd,MAAA;AAAA,EACD,KAAA,GAAQ,EAAE,QAAA,EAAU,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,EAC1C,KAAA,GAAQ,CAAA;AAAA;AAAA,EAEhB,SAAA,GAAY,KAAA;AAAA,EACK,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EAEjB,WAAA,CACE,MAAA,EACA,OAAA,GAAiC,EAAC,EAClC;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,IAAA,KAAS,GAAA,IAAO,OAAO,IAAA,KAAS,MAAA;AACrD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,IAAA,KAAS,GAAA,KAAQ,QAAQ,OAAA,IAAW,qBAAA,CAAsB,OAAO,IAAI,CAAA,CAAA;AAC3F,IAAA,IAAA,CAAK,WAAA,GAAc,MAAA,CAAO,IAAA,KAAS,GAAA,GAAM,IAAI,OAAO,CAAA,SAAA,EAAY,MAAA,CAAO,KAAK,CAAA,UAAA,CAAY,CAAA,GAAI,IAAA;AAAA,EAC9F;AAAA;AAAA,EAGA,IAAI,WAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,KAAK,IAAA,EAAuB;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA,CAAY,KAAK,IAAI,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,cAAc,IAAI,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAC7B,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,GAAQ,eAAA,CAAgB,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AAC9E,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,QAAQ,eAAA,CAAgB,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,KAAK,KAAK,CAAA;AACrD,MAAA,IAAI,MAAM,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,QAAQ,eAAA,CAAgB,IAAA,EAAM,EAAA,EAAI,IAAA,CAAK,QAAQ,KAAK,CAAA;AACzD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,WAAA,CAAY,UAAA,CAAW,KAAK,CAAA,EAAG;AACjC,MAAA,MAAM,IAAA,GAAO,uBAAuB,WAAA,EAAa,IAAA,CAAK,OAAO,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAK,CAAA;AAC5F,MAAA,IAAI,IAAA,KAAS,eAAe,OAAO,IAAA;AACnC,MAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,QAAA,IAAA,CAAK,KAAA,EAAA;AACL,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,MACnB;AACA,MAAA,IAAI,IAAA,KAAS,gBAAgB,IAAA,CAAK,KAAA,EAAA;AAAA,IACpC,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,EAAM,EAAE,CAAA;AAC7C,MAAA,MAAM,QAAQ,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACvD,MAAA,IAAI,UAAA,IAAc,KAAK,MAAA,CAAO,KAAA,IAAS,UAAU,EAAA,IAAM,IAAA,CAAK,KAAA,KAAU,CAAA,EAAG,OAAO,IAAA;AAAA,IAClF;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,GAAQ,eAAA,CAAgB,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,UAAA,CAAW,GAAA,EAAiB,IAAA,EAAc,MAAA,EAA+B;AACvF,EAAA,MAAM,QAAQ,SAAA,CAAU,GAAA,EAAK,MAAM,IAAI,WAAA,CAAY,MAAM,CAAC,CAAA;AAC1D,EAAA,IAAI,MAAM,MAAA,IAAU,CAAC,KAAA,CAAM,MAAA,CAAO,aAAa,KAAA,CAAM,MAAA,CAAO,WAAA,IAAe,CAAA,SAAU,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,MAAA,EAAO;AAC9H,EAAA,IAAI,GAAA,CAAI,WAAW,OAAO,EAAE,MAAM,KAAA,CAAM,IAAA,EAAM,QAAQ,KAAA,EAAM;AAC5D,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,IAAI,WAAA,CAAY,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAC/E,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AACpD;AAEA,SAAS,SAAA,CAAU,GAAA,EAAiB,IAAA,EAAc,MAAA,EAAyD;AACzG,EAAA,KAAA,IAAS,IAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,OAAO,CAAA,EAAA,EAAK;AAEzC,IAAA,IAAI,GAAA,CAAI,QAAA,GAAW,CAAC,CAAA,EAAG;AACvB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AACvB,IAAA,IAAI,IAAA,KAAS,MAAM,OAAO,EAAE,MAAM,CAAA,GAAI,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAC/D,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,EAChE;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,QAAQ,CAAA,EAAG,MAAA,EAAQ,OAAO,MAAA,EAAO;AACtD;AAGO,SAAS,eAAA,CACd,IAAA,EACA,IAAA,EACA,IAAA,EACA,KAAA,EACyC;AACzC,EAAA,IAAI,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA;AAC5B,EAAA,KAAA,IAAS,GAAA,GAAM,IAAA,EAAM,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACtC,IAAA,MAAM,EAAA,GAAK,KAAK,GAAG,CAAA;AACnB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,GAAU,KAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAA,KAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,QAAA,GAAW,CAAC,QAAA;AAAA,EAC9B;AACA,EAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAC7B;AAEO,SAAS,iBAAA,CAAkB,KAAa,GAAA,EAAqB;AAClE,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,IAAU,IAAI,GAAA,GAAM,CAAC,MAAM,GAAA,EAAK,CAAA,EAAA;AACrD,EAAA,OAAO,CAAA;AACT;AAKA,SAAS,YAAY,IAAA,EAAiD;AACpE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,WAAS;AACP,IAAA,MAAM,IAAI,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAE,OAAO,MAAA,EAAO;AAC/B,IAAA,KAAA,EAAA;AACA,IAAA,MAAA,IAAU,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EACjB;AACF;AAGA,SAAS,WAAA,CAAY,MAAc,KAAA,EAA8B;AAC/D,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,IAAI,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,MAAA,IAAU,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAAA,EACjB;AACA,EAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAC1B;AAEA,IAAM,SAAA,GAAY,mCAAA;AAElB,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,IAAI,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,CAAC,MAAM,GAAA,EAAK,CAAA,EAAA;AACrC,EAAA,OAAO,CAAA;AACT;AAcA,SAAS,KAAK,IAAA,EAAoB;AAChC,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,IAAS,MAAM,CAAA,MAAO;AACpB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,EAAA,KAAO,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,EAAA;AAC1C,IAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AACf,IAAA,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,GAAA,IAAO,IAAA,CAAK,UAAA,CAAW,OAAA,GAAU,CAAC,CAAA,KAAM,EAAA,GAAK,OAAA,GAAU,CAAA,GAAI,OAAO,CAAA;AACtF,IAAA,IAAI,OAAO,EAAA,EAAI;AACf,IAAA,GAAA,GAAM,EAAA,GAAK,CAAA;AAAA,EACb;AACA,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AACrB,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,EAAa,IAAA,CAAK,CAAC,CAAW,CAAA;AAC5E,EAAA,MAAM,GAAA,GAAY,EAAE,MAAA,EAAQ,IAAI,MAAA,EAAQ,EAAC,EAAG,UAAA,EAAY,EAAC,EAAG,WAAA,EAAa,KAAA,EAAO,aAAa,EAAA,EAAG;AAIhG,EAAA,MAAM,QAAA,GAAuB,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAI;AAChD,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,CAAC,CAAC,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,GAAA,EAAK;AACpC,IAAA,KAAA,CAAM,MAAM,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,GAAG,GAAG,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,QAAA,EAAU,CAAA,EAAG,MAAM,CAAA;AAC1C,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,OAAO,CAAC,CAAA,EAAa,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAa,IAAA,EAAM,SAAS,CAAA;AAC5F,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,IAAI,IAAA,EAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACzC,IAAA,GAAA,CAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,CAAC,IAAI,MAAA,IAAU,GAAA,CAAI,SAAS,KAAA,GAAQ,CAAA,MAAO,WAAA,GAAc,IAAA;AAC7D,IAAA,CAAA,GAAI,GAAA,CAAI,IAAA;AACR,IAAA,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,EAChB;AACA,EAAA,KAAA,CAAM,MAAM,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,OAAA,EAAS,OAAO,GAAG,CAAA;AAClD,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,MACP,IAAA,EACA,MAAA,EACA,MACA,GAAA,EACA,IAAA,EACA,IACA,GAAA,EACM;AACN,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,QAAkB,EAAC;AACvB,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,KAAe;AAChC,IAAA,IAAI,IAAA,KAAS,IAAI,GAAA,CAAI,UAAA,CAAW,KAAK,CAAC,IAAA,EAAM,EAAE,CAAC,CAAA;AAC/C,IAAA,IAAA,GAAO,EAAA;AAAA,EACT,CAAA;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,IAAA,GAAO,IAAI,CAAC,CAAA;AAClB,IAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,YAAY,IAAI,CAAA;AAC1C,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,KAAA,GAAQ,EAAC;AAAA,IACX;AACA,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/B,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,KAAM,EAAA,EAAI;AACzB,MAAA,SAAA,CAAU,MAAA,CAAO,CAAC,CAAW,CAAA;AAG7B,MAAA,IAAI,EAAE,MAAM,MAAA,CAAO,MAAA,GAAS,KAAK,IAAA,KAAS,EAAA,CAAA,MAAS,WAAA,GAAc,EAAA;AACjE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,IAAA,OAAO,KAAA,CAAM,UAAU,MAAA,GAAU,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,EAAc,KAAA,CAAM,GAAA,EAAI;AAC/E,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACnC,IAAA,IAAI,SAAS,KAAA,CAAM,MAAA,GAAU,MAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAe,CAAA;AAClE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAa,MAAA;AAChC,MAAA,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,CAAa,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,CAAa,MAAA,IAAU,GAAA,IAAO,CAAA,IAAK,GAAA,IAAO,CAAA,GAAI,GAAA,GAAM,CAAA,CAAA;AACjG,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,MAAA,OAAA,GAAU,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,MAAA,EAAQ,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,QAAQ,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAI,IAAA,KAAS,EAAA,EAAI,IAAA,GAAO,MAAA,CAAO,CAAC,CAAA;AAChC,MAAA,IAAI,IAAI,WAAA,KAAgB,EAAA,EAAI,GAAA,CAAI,WAAA,GAAc,OAAO,CAAC,CAAA;AACtD,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,MAAA,CAAO,CAAC,CAAW,CAAA;AAC7B,IAAA,GAAA,CAAI,WAAA,GAAc,EAAA;AAClB,IAAA,MAAM,GAAA,GAAM,MAAA;AACZ,IAAA,MAAM,GAAA,GAAkB;AAAA,MACtB,KAAA,EAAO,EAAA;AAAA,MACP,IAAA,EAAM,CAAC,CAAA,KAAM;AACX,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,CAAI,CAAC,GAAG,KAAK,CAAA;AACvC,QAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,QAAA,IAAI,MAAA,CAAO,IAAA,KAAS,GAAA,IAAO,GAAA,GAAM,CAAA,EAAG;AAClC,UAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,UAAA,IAAI,MAAM,IAAA,EAAK,KAAM,EAAA,IAAM,GAAA,GAAM,KAAK,OAAO,IAAA;AAC7C,UAAA,OAAO,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,QACvC;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA;AACrC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,OAAO,CAAC,CAAA,EAAa,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAa,IAAA,EAAM,SAAS,CAAA;AAC5F,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,IAAI,IAAA,EAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACzC,IAAA,IAAI,CAAC,IAAI,MAAA,IAAU,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,WAAA,GAAc,IAAA;AACrE,IAAA,CAAA,GAAI,GAAA,CAAI,IAAA;AAAA,EACV;AACA,EAAA,SAAA,CAAU,KAAK,MAAA,CAAO,MAAA,GAAU,OAAO,EAAE,CAAA,GAAe,KAAK,MAAM,CAAA;AACrE;AAQO,IAAM,eAAN,MAAmB;AAAA;AAAA,EAEf,MAA+B,EAAC;AAAA,EACxB,QAAA,uBAAe,GAAA,EAAsB;AAAA,EACrC,OAAA,uBAAc,GAAA,EAAoB;AAAA,EAEnD,WAAA,CAAY,IAAA,EAAc,IAAA,EAAc,EAAA,EAAY;AAClD,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,IAAM;AAC3B,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,EAAI;AAC7B,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,OAAO,CAAA,GAAI,MAAM,EAAA,IAAM,IAAA,CAAK,WAAW,CAAA,GAAI,GAAG,MAAM,EAAA,EAAI,GAAA,EAAA;AACxD,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,MAAM,CAAA;AACnC,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACtB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAClC,MAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,gBACX,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAC,CAAA;AAC/B,MAAA,CAAA,IAAK,GAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGA,IAAA,CAAK,GAAW,KAAA,EAAuB;AACrC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,KAAK,IAAA,CAAK,MAAA;AACd,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,IAAK,IAAA,CAAK,GAAG,CAAA,GAAe,KAAA,OAAY,GAAA,GAAM,CAAA;AAAA,WACzC,EAAA,GAAK,GAAA;AAAA,IACZ;AACA,IAAA,OAAO,IAAA,CAAK,EAAE,CAAA,IAAK,EAAA;AAAA,EACrB;AAAA;AAAA,EAGA,MAAM,KAAA,EAAuB;AAC3B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,IAAK,EAAA;AAAA,EACpC;AACF;AAEA,SAAS,SAAA,CAAU,IAAA,EAAc,IAAA,EAAc,EAAA,EAAY,GAAA,EAAwB;AAKjF,EAAA,IAAI,IAAA,GAA4B,IAAA;AAChC,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,IAAM;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9B,IAAA,IAAA,KAAS,IAAI,YAAA,CAAa,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,IAAI,GAAG,CAAA;AACpC,IAAA,IAAI,UAAU,EAAA,EAAI;AAChB,MAAA,CAAA,IAAK,GAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAK,KAAA,GAAQ,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,CAAA;AACrD,IAAA,CAAA,GAAI,KAAA,GAAQ,GAAA;AAAA,EACd;AACF;AAOO,SAAS,eAAe,IAAA,EAA2B;AACxD,EAAA,MAAM,CAAA,GAAI,KAAK,IAAI,CAAA;AACnB,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,CAAA,CAAE,MAAM,CAAA;AAC3B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,CAAA,CAAE,YAAY,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AACvE,EAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAChD;AAOO,SAAS,aAAA,CAAc,MAAc,EAAA,EAAuD;AACjG,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,MAAW,CAAA,IAAK,cAAA,CAAe,IAAI,CAAA,EAAG;AACpC,IAAA,IAAI,CAAA,CAAE,QAAQ,EAAA,EAAI;AAClB,IAAA,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,GAAG,CAAC,CAAA;AACjE,IAAA,EAAA,GAAK,CAAA,CAAE,GAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAC5B;AAQO,SAAS,oBAAoB,IAAA,EAA2B;AAC7D,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,SAAA,CAAU,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AACtC,EAAA,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAChD;AAGO,SAAS,kBAAA,CAAmB,MAAc,EAAA,EAAuD;AACtG,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,MAAW,CAAA,IAAK,mBAAA,CAAoB,IAAI,CAAA,EAAG;AACzC,IAAA,IAAI,CAAA,CAAE,QAAQ,EAAA,EAAI;AAClB,IAAA,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,CAAA,CAAE,KAAK,CAAA,GAAI,EAAA,CAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,GAAG,CAAC,CAAA;AACjE,IAAA,EAAA,GAAK,CAAA,CAAE,GAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAC5B;AAGO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,GAAA,EAAK,CAAC,CAAA;AACtC,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,GAAA,CAAI,SAAS,KAAK,CAAA;AACjD,EAAA,OAAO,MAAM,MAAA,IAAU,CAAA,IAAK,MAAM,UAAA,CAAW,GAAG,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA,CAAM,MAAK,KAAM,EAAA,GAAK,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AACzH;AAOO,SAAS,WAAW,GAAA,EAA4E;AACrG,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,IAAI,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,GAAI,CAAA,CAAE,MAAM,CAAA,EAAG,EAAE,IAAI,CAAE,CAAA;AAChF,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAY,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,aAAA,CAAA,CAAe,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,sCAAA,EAAwC,EAAE,CAAC,CAAA;AAC/G,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC1B,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAI,YAAY,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAW,CAAA;AAClH,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAE,MAAA,EAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,EAAO;AAC5D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAI,CAAA,CAAE,WAAW,KAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7F,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAM,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,GAAI,OAAO,IAAA,EAAK,GAAI,CAAC,MAAM,CAAA,GAAI,EAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,EAAO;AACvG;AASO,SAAS,eAAe,IAAA,EAA+B;AAC5D,EAAA,MAAM,CAAA,GAAI,KAAK,IAAI,CAAA;AACnB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,CAAA,KAAM,EAAA,EAAI,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA,GAAI,CAAC,CAAA,EAAG,KAAA,EAAA;AAC1E,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAqB,KAAK,CAAA,CAAE,KAAK,OAAO,CAAA;AAC1D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,IAAK,EAAE,MAAA,EAAQ;AAC3C,IAAA,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,OAAO,CAAA,EAAG,CAAA,IAAK,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAClD,IAAA,IAAI,MAAA,IAAU,IAAA,GAAO,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA,GAAI,OAAA;AAAA,EAC3C;AACA,EAAA,OAAO,KAAA;AACT;AASO,SAAS,qBAAqB,IAAA,EAAsB;AACzD,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,IAAI,MAAM,CAAA,IAAK,mBAAA,CAAoB,IAAA,CAAK,IAAI,GAAG,OAAO,EAAA;AAItD,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,WAAA,CAAY,IAAI,IAAI,CAAC,CAAA;AACtD,EAAA,IAAI,QAAA,IAAY,+BAA+B,IAAA,CAAK,QAAQ,GAAG,OAAO,oBAAA,CAAqB,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,CAAA;AACrG,EAAA,MAAM,CAAA,GAAI,KAAK,IAAI,CAAA;AACnB,EAAA,MAAM,OAAO,CAAA,CAAE,WAAA;AACf,EAAA,IAAI,CAAA,CAAE,WAAA,IAAe,IAAA,KAAS,EAAA,EAAI,OAAO,EAAA;AACzC,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,CAAA,IAAK;AAC1B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,EAAI;AAC7B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,OAAO,CAAA,GAAI,MAAM,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,GAAI,GAAG,MAAM,EAAA,EAAI,GAAA,EAAA;AACvD,IAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AAClB,IAAA,CAAA,IAAK,GAAA;AAAA,EACP;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAc;AAC7B,IAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,KAAK,CAAC,CAAA;AAC3B,IAAA,OAAO,QAAQ,GAAA,KAAQ,CAAA;AAAA,EACzB,CAAA;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU;AACjC,IAAA,IAAI,QAAQ,CAAC,CAAA,SAAW,IAAA,CAAK,CAAC,EAAuB,CAAC,CAAA;AACtD,IAAA,MAAM,GAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAuB,CAAC,CAAA;AAC3C,IAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,KAAY,IAAA,CAAK,CAAC,CAAA,CAAuB,CAAC,CAAA,KAAM,GAAA,IAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAI,CAAA,EAAA;AACpF,IAAA,IAAI,KAAK,IAAA,CAAK,MAAA,SAAgB,IAAA,CAAK,CAAC,EAAuB,CAAC,CAAA;AAC5D,IAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,EACV;AACA,EAAA,OAAO,EAAA;AACT;;;AC3kBA,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,mBAAA,GACJ,0GAAA;AACF,IAAM,aAAA,GAAgB,YAAA;AACtB,IAAM,UAAA,GAAa,eAAA;AACnB,IAAM,gBAAA,GAAmB,CAAA;AAOlB,SAAS,kBAAkB,KAAA,EAAwB;AACxD,EAAA,OAAO,gBAAgB,IAAA,CAAK,KAAK,CAAA,IAAK,QAAA,CAAS,KAAK,KAAK,CAAA;AAC3D;AAGA,SAAS,cAAA,CAAe,MAAc,IAAA,EAAuB;AAG3D,EAAA,KAAA,IAAS,IAAI,IAAA,GAAO,CAAA,EAAG,KAAK,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM,KAAK,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAO,KAAK,CAAC,CAAA,KAAM,KAAM,OAAO,KAAA;AACxG,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,UAAU,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM,CAAA,EAAA,EAAK,IAAI,KAAK,CAAC,CAAA,KAAM,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,KAAM,OAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AACrI,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,oBAAA,CAAqB,KAAA,EAAe,IAAA,GAAO,KAAA,EAAgB;AACzE,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,EAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,IAAI,CAAA,CAAE,MAAA,GAAS,aAAA,EAAe,OAAO,KAAA;AAIrC,EAAA,IAAI,CAAC,IAAA,IAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AAC9C,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG;AACzB,IAAA,OAAA,CAAQ,EAAE,KAAA,CAAM,UAAU,KAAK,EAAC,EAAG,SAAS,gBAAA,GAAmB,CAAA;AAAA,EACjE;AACA,EAAA,OAAA,CAAQ,EAAE,KAAA,CAAM,UAAU,CAAA,IAAK,IAAI,MAAA,GAAS,gBAAA;AAC9C;AAGA,SAAS,WAAW,IAAA,EAAuC;AACzD,EAAA,OAAO,cAAA,CAAe,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,GAAG,CAAC,CAAA;AACzD;AAWO,SAAS,yBAAyB,IAAA,EAAsB;AAC7D,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,GAAG,OAAO,EAAA;AACjC,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,EAAA,IAAM,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,EAAG;AAC3F,IAAA,OAAO,CAAA,GAAI,OAAO,MAAA,IAAW,MAAA,CAAO,CAAC,CAAA,CAAuB,CAAC,KAAK,CAAA,EAAG;AACnE,MAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAS,OAAO,CAAC,CAAA,CAAuB,CAAC,CAAC,CAAA;AAC5D,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC9B,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC1B,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,IAAI,kBAAkB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG;AAClD,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,KAAK,CAAA,EAAG,cAAA,CAAe,IAAA,EAAM,IAAI,CAAC,CAAA,EAAG;AACjF,MAAA,MAAA,CAAO,IAAI,IAAI,CAAA;AACf,MAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAChB,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AAKA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,OAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,KAAK,CAAW,CAAA,EAAG,KAAA,EAAA;AAClF,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AAGvB,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,OAAO,IAAA,IAAQ,aAAA,IAAiB,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,GAAI,IAAI,CAAA,IAAK,GAAG,CAAA,EAAG,IAAA,EAAA;AAC1E,IAAA,IAAI,KAAK,MAAA,IAAU,KAAA,GAAQ,CAAA,CAAA,GAAK,IAAA,GAAO,QAAQ,aAAA,EAAe;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,IAAA,IAAI,oBAAoB,IAAA,CAAK,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,aAAA,EAAe;AAC7D,IAAA,IAAI,CAAC,eAAe,IAAA,EAAM,KAAK,KAAK,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG;AAC9D,IAAA,IAAA,CAAK,CAAA,CAAE,MAAM,UAAU,CAAA,IAAK,EAAC,EAAG,MAAA,IAAU,mBAAmB,CAAA,EAAG;AAChE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,gBAAgB,IAAA,EAAmC;AACjE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,GAAG,OAAO,KAAA;AACjC,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,EAAA,IAAM,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,EAAG;AAC3F,IAAA,OAAO,CAAA,GAAI,OAAO,MAAA,IAAW,MAAA,CAAO,CAAC,CAAA,CAAuB,CAAC,KAAK,CAAA,EAAG;AACnE,MAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAS,OAAO,CAAC,CAAA,CAAuB,CAAC,CAAC,CAAA;AAC5D,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC9B,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAC1B,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,IAAI,kBAAkB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG;AAClD,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,KAAK,CAAA,EAAG,cAAA,CAAe,IAAA,EAAM,IAAI,CAAC,CAAA,EAAG;AACjF,MAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AACrB,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AACA,EAAA,OAAO,KAAA;AACT;;;ACpKA,IAAM,UAAA,GAAa,0BAAA;AACnB,IAAM,aAAA,GAAgB,wBAAA;AACtB,IAAM,gBAAA,GAAmB,2BAAA;AAwClB,SAAS,kBAAA,CACd,SACA,KAAA,EACS;AACT,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,KAAK,OAAO,KAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,KAAK,OAAO,CAAA,IAAK,MAAM,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AACvD,EAAA,IAAI,UAAU,MAAA,IAAa,QAAA,CAAS,IAAA,CAAK,KAAK,GAAG,OAAO,KAAA;AACxD,EAAA,IAAI,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,KAAA;AACzC,EAAA,IAAI,WAAA,CAAY,KAAK,OAAO,CAAA,IAAK,eAAe,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AACtE,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,IAAK,KAAA,KAAU,UAAa,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAA;AACrF,EAAA,IAAI,iBAAA,CAAkB,OAAO,CAAA,EAAG,OAAO,KAAA;AACvC,EAAA,OAAO,WAAW,IAAA,CAAK,OAAO,CAAA,IAAK,CAAC,aAAa,OAAO,CAAA;AAC1D;AAEA,IAAM,UAAA,GAAa,0BAAA;AAEnB,IAAM,WAAA,GAAc,yBAAA;AAYpB,SAAS,eAAA,CAAgB,SAAiB,KAAA,EAAoC;AAC5E,EAAA,IAAI,uBAAA,CAAwB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAGlD,EAAA,IAAI,cAAA,CAAe,KAAK,OAAO,CAAA,IAAK,SAAS,IAAA,CAAK,OAAO,GAAG,OAAO,IAAA;AACnE,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI,MAAM,CAAC,CAAA,KAAM,KAAK,OAAO,UAAA,CAAW,KAAK,OAAO,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,IAAA,CAAK,KAAK,IAAI,CAAC,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AAGjB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAG/B,EAAA,IAAI,yCAAA,CAA0C,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACpE,EAAA,OAAO,WAAW,IAAA,CAAK,OAAO,KAAK,CAAC,WAAA,CAAY,KAAK,GAAG,CAAA;AAC1D;AAEA,IAAM,cAAA,uBAAqB,GAAA,CAAI;AAAA,EAC7B,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,KAAA;AAAA,EACvD,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AACnE,CAAC,CAAA;AAQD,SAAS,aAAa,OAAA,EAA0B;AAC9C,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAC3C,EAAA,IAAI,2CAAA,CAA4C,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACtE,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AAChC,EAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA,IAAK,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACvG,EAAA,OAAO,MAAM,MAAA,IAAU,CAAA;AACzB;AAYO,SAAS,wBAAwB,OAAA,EAA0B;AAChE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,KAAK,OAAO,KAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,KAAK,OAAO,CAAA,IAAK,MAAM,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AACvD,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACxC,EAAA,IAAI,SAAS,IAAA,CAAK,OAAO,GAAG,OAAO,sBAAA,CAAuB,KAAK,OAAO,CAAA;AACtE,EAAA,OAAO,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,IAAK,YAAY,OAAO,CAAA;AACxD;AAOA,SAAS,YAAY,OAAA,EAA0B;AAC7C,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA;AACxC,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,GAAG,OAAO,KAAA;AACzE,EAAA,IAAI,oBAAA,CAAqB,KAAK,OAAO,CAAA,IAAK,4CAA4C,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AAC5G,EAAA,OAAO,uEAAA,CAAwE,KAAK,OAAO,CAAA;AAC7F;AASO,IAAM,YAAA,GAAe;AAOrB,SAAS,iBAAA,CAAkB,MAAc,KAAA,EAAuB;AACrE,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,GAAQ,IAAI,YAAY,CAAA;AAC3D,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,YAAA,GAAe,CAAA,EAAG,IAAI;AAAA,CAAA,GAAO,IAAA;AACpD;AAEO,SAAS,mBAAA,CAAoB,IAAA,EAAc,IAAA,EAAc,KAAA,GAAQ,KAAK,MAAA,EAAgB;AAG3F,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAO,GAAG,CAAA;AACxC,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,IAAI,IAAA,GAAO,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,MAAM,IAAA,EAAM;AAChB,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,UAAU,EAAA,IAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,KAAM,KAAK,OAAO,EAAA;AACpD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,KAAK,CAAA;AAC1C,EAAA,OAAO,kBAAA,CAAmB,SAAS,iBAAA,CAAkB,IAAA,EAAM,KAAK,CAAC,CAAA,GAAI,QAAQ,CAAA,GAAI,EAAA;AACnF;AAGA,IAAM,kBAAA,GAAqB,kFAAA;AAcpB,SAAS,oBAAA,CAAqB,SAAiB,MAAA,EAAqC;AACzF,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,KAAA;AAC5B,EAAA,IAAI,WAAW,MAAA,IAAa,iBAAA,CAAkB,IAAA,CAAK,MAAM,GAAG,OAAO,KAAA;AACnE,EAAA,OAAO,kBAAA,CAAmB,KAAK,OAAO,CAAA;AACxC;;;ACpLA,IAAM,cAAA,GAAiB,WAAA;AACvB,IAAM,kBAAA,GAAqB,SAAA;AAC3B,IAAM,UAAA,GAAa,IAAA;AAOZ,SAAS,UAAA,CACd,OAAA,EACA,KAAA,EACA,IAAA,GAAiD,CAAC,MAAA,EAAQ,IAAA,KAAS,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA,EAC5E;AACnB,EAAA,IAAI,SAAS,KAAA,GAAQ,CAAA;AACrB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAM,CAAA,KAAM,GAAA;AACtC,EAAA,IAAI,SAAA,EAAW,MAAA,EAAA;AACf,EAAA,IAAI,CAAC,eAAe,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,GAAG,OAAO,IAAA;AACxD,EAAA,MAAM,SAAA,GAAY,MAAA;AAClB,EAAA,OAAO,mBAAmB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AACvD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW,MAAM,CAAA;AAC/C,EAAA,MAAM,aAAqD,EAAC;AAC5D,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AAC/C,IAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACpC,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,MACpC,SAAA;AAAA,MACA,aAAA,EAAe,KAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA,GAAS,QAAQ,MAAA,EAAQ;AAC9B,IAAA,OAAO,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AAC/C,IAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,KAAM,GAAA;AACtB,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,QACpC,SAAA;AAAA,QACA,aAAA,EAAe,KAAA;AAAA,QACf;AAAA,OACF;AACF,IAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,KAAM,GAAA,EAAK;AAC3B,MAAA,MAAA,EAAA;AACA,MAAA,OAAO,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AAC/C,MAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACpC,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,QACpC,SAAA;AAAA,QACA,aAAA,EAAe,IAAA;AAAA,QACf;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,eAAe,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,GAAG,OAAO,IAAA;AACxD,IAAA,MAAM,cAAA,GAAiB,MAAA;AACvB,IAAA,OAAO,mBAAmB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AACvD,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,MAAM,CAAA;AACjD,IAAA,OAAO,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AAC/C,IAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACpC,IAAA,MAAA,EAAA;AACA,IAAA,OAAO,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,IAAK,EAAE,CAAA,EAAG,MAAA,EAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAC5B,IAAA,IAAI,KAAA,KAAU,GAAA,IAAO,KAAA,KAAU,GAAA,EAAK,OAAO,IAAA;AAC3C,IAAA,MAAM,aAAa,EAAE,MAAA;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,EAAO,UAAU,CAAA;AACvC,IAAA,IAAI,QAAA,KAAa,IAAI,OAAO,IAAA;AAC5B,IAAA,MAAA,GAAS,QAAA;AACT,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,QAAQ,KAAA,CAAM,UAAA,EAAY,MAAM,CAAA,EAAG,CAAA;AAClE,IAAA,MAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,MAAc,MAAA,EAAyB;AAChE,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,IAAS,IAAI,MAAA,GAAS,CAAA,EAAG,KAAK,CAAC,CAAA,KAAM,MAAM,CAAA,EAAA,EAAK,OAAA,EAAA;AAChD,EAAA,OAAO,UAAU,CAAA,KAAM,CAAA;AACzB;AAOO,IAAM,sBAAN,MAA0B;AAAA,EACtB,OAAA;AAAA,EACD,KAAA,GAAQ,CAAA;AAAA,EACR,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA,GAAU,KAAA;AAAA,EACV,WAAA,GAAc,CAAA;AAAA;AAAA,EAEd,KAAA,GAA4B,IAAA;AAAA,EAEpC,YAAY,OAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA,EAEA,WAAA,CAAY,IAAA,EAAc,WAAA,GAAc,CAAA,EAAkB;AACxD,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,OAAQ,KAAA,GAAQ,IAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,KAAK,SAAA,IAAa,CAAC,KAAK,OAAA,IAAW,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC9D,MAAA,MAAM,MAAA,GAAS,cAAc,IAAI,CAAA;AACjC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,WAAA,CAAY,MAAM,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,WAAA,EAAa,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC9C,MAAA,IAAI,IAAA,CAAK,cAAc,CAAA,EAAG;AACxB,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,UAAA,IAAI,GAAA,GAAM,CAAA;AACV,UAAA,OAAO,IAAA,CAAK,GAAG,CAAA,KAAM,GAAA,EAAK,GAAA,EAAA;AAC1B,UAAA,IAAI,GAAA,GAAM,CAAA,KAAM,IAAA,CAAK,WAAA,OAAkB,WAAA,GAAc,CAAA;AACrD,UAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,QACZ;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AACjC,QAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AACjC,QAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,QAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AACf,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA,EAAG;AAC9B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,WAAA,EAAa,CAAC,CAAA,EAAG;AACnC,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAO,CAAC,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAA,EAAG;AAClD,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,OAAO,IAAA,CAAK,GAAG,CAAA,KAAM,GAAA,EAAK,GAAA,EAAA;AAC1B,QAAA,IAAA,CAAK,cAAc,GAAA,GAAM,CAAA;AACzB,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACrB,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,MAAA;AAC3B,MAAA,IAAI,GAAA,CAAI,OAAA,KAAY,IAAA,CAAK,OAAA,EAAS;AAChC,QAAA,IAAI,GAAA,CAAI,WAAW,IAAA,CAAK,KAAA,EAAA;AAAA,aAAA,IACf,CAAC,GAAA,CAAI,aAAA,EAAe,IAAA,CAAK,KAAA,EAAA;AAClC,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,CAAA,EAAG,OAAO,MAAA;AAAA,MAC/B;AACA,MAAA,CAAA,GAAI,MAAA,GAAS,CAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC/JO,SAAS,iBAAiB,IAAA,EAAwB;AACvD,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA,EAAG;AACvC,IAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAClC,MAAA,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAC/B,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,SAAS,IAAA,EAAwB;AAC/C,EAAA,MAAM,KAAA,GAAQ,iBAAiB,IAAI,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,QAAU,KAAA,EAAM;AACrD,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,KAAM,EAAA,EAAI,KAAA,CAAM,GAAA,EAAI;AAAA,OAAA,IAGzD,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IAAM,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,QAAS,GAAA,EAAI;AACjF,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA;AAClC;AAMA,IAAM,WAAA,GAAc,oHAAA;AACpB,IAAM,WAAA,GAAc,CAAC,OAAA,KACnB,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,IAAK,gBAAA,CAAiB,OAAO,CAAA,IAAK,eAAA,CAAgB,OAAO,CAAA;AAInF,IAAM,QAAA,GAAW,6CAAA;AAEjB,IAAM,gBAAA,GAAmB,sCAAA;AAEzB,IAAM,gBAAA,GACJ,0VAAA;AACF,IAAM,iBAAiB,IAAI,MAAA,CAAO,CAAA,OAAA,EAAU,gBAAgB,oBAAoB,GAAG,CAAA;AAEnF,IAAM,SAAA,GAAY,CAAA,8EAAA,CAAA;AAClB,IAAM,iBAAA,GAAoB,IAAI,MAAA,CAAO,CAAA,6BAAA,EAAgC,SAAS,CAAA,4CAAA,CAA8C,CAAA;AAc5H,IAAM,yBAAA,GACJ,6MAAA;AACF,IAAM,0BAA0B,IAAI,MAAA,CAAO,CAAA,OAAA,EAAU,yBAAyB,oBAAoB,GAAG,CAAA;AAM9F,SAAS,uBAAuB,OAAA,EAA0B;AAC/D,EAAA,OAAO,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAC7C;AAEA,IAAM,mBAAA,uBAA+C,GAAA,CAAI;AAAA;AAAA,EAEvD,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,UAAA;AAAA,EAC1B,GAAG,gBAAA,CAAiB,OAAA,CAAQ,UAAU,mBAAmB,CAAA,CAAE,MAAM,GAAG;AACtE,CAAC,CAAA;AASM,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,OAAO,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AACnD;AAGO,SAAS,gBAAgB,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAG,GAAG,OAAO,KAAA;AACrC,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,IAAK,iBAAiB,IAAA,CAAK,OAAO,CAAA,IAAK,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,IAAK,iBAAA,CAAkB,KAAK,OAAO,CAAA;AACnI;AAGO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,IAAA,IAAI,EAAA,KAAO,KAAK,MAAA,IAAU,CAAA;AAAA,SAAA,IACjB,EAAA,KAAO,GAAA,EAAM,MAAA,IAAU,CAAA,GAAK,MAAA,GAAS,CAAA;AAAA,SACzC;AAAA,EACP;AACA,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,WAAA,GAAc,wCAAA;AAGpB,SAAS,oBAAoB,MAAA,EAAiC;AAC5D,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,IAAK,EAAE,CAAA,GAAA,CAAK,MAAA,CAAO,CAAC,CAAA,IAAK,EAAA,EAAI,MAAA;AAClE,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,GAAI,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,CAAC,CAAC,IAAI,SAAA,GAAY,CAAA;AACpF,EAAA,OAAO,SAAA,IAAa,GAAA,IAAO,CAAA,IAAK,GAAA,IAAO,IAAI,GAAA,GAAM,CAAA,CAAA;AACnD;AASO,SAAS,oBAAA,CAAqB,OAA0B,KAAA,EAAuB;AACpF,EAAA,OAAO,sBAAA,CAAuB,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AACnD;AAGA,SAAS,sBAAA,CAAuB,KAAA,EAA0B,KAAA,EAAe,OAAA,EAA0B;AACjG,EAAA,MAAM,GAAA,GAAM,UAAU,WAAA,CAAY,IAAA,CAAK,MAAM,KAAK,CAAA,IAAK,EAAE,CAAA,GAAI,IAAA;AAC7D,EAAA,IAAI,GAAA,EAAK,OAAO,mBAAA,CAAoB,GAAG,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,KAAA,CAAM,KAAK,KAAK,EAAE,CAAA;AAC5C,EAAA,IAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AACzB,EAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AACtC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,IAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACpC,IAAA,IAAI,MAAA,IAAU,SAAS,MAAA,EAAQ;AAC7B,MAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,CAAA;AAC1C,MAAA,IAAI,OAAA,IAAW,QAAQ,OAAO,OAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AAAA,EAC3B;AACA,EAAA,OAAO,CAAA;AACT;AAEA,IAAM,cAAA,GAAiB,UAAA;AAGhB,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,SAAS,OAAO,CAAA;AAC9B,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,IAAA,KAAS,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5E;AAGO,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,OAAO,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC,CAAA;AAC3D;AAGA,SAAS,iBAAiB,IAAA,EAA0C;AAClE,EAAA,IAAI,SAAS,MAAA,IAAa,CAAC,iBAAA,CAAkB,IAAI,GAAG,OAAO,KAAA;AAC3D,EAAA,OAAO,CAAC,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACtC;AAOO,SAAS,mBAAA,CAAoB,QAAgB,SAAA,EAAwC;AAC1F,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,YAAA,CAAa,IAAI,CAAA,IAAM,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,WAAA,CAAY,IAAI,GAAI,OAAO,KAAA;AACxF,EAAA,IAAI,CAAC,gBAAA,CAAiB,SAAS,CAAA,EAAG,OAAO,KAAA;AACzC,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA,KAAW,SAAS,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,MAAA;AAC9D;AAUO,SAAS,cAAA,CAAe,IAAA,EAAc,eAAA,GAAkB,CAAA,EAAY;AACzE,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,IAAI,UAAA,CAAW,IAAI,CAAA,GAAI,eAAA,IAAmB,GAAG,OAAO,KAAA;AACpD,EAAA,OAAO,QAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,YAAY,OAAO,CAAA;AACxD;AAGO,SAAS,UAAA,CAAW,OAA0B,KAAA,EAAwB;AAC3E,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAC7B,EAAA,IAAI,CAAC,YAAA,CAAa,IAAI,CAAA,IAAK,CAAC,mBAAA,CAAoB,IAAA,EAAM,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AAChF,EAAA,OAAO,CAAC,mBAAmB,KAAA,EAAO,KAAK,KAAK,CAAC,eAAA,CAAgB,OAAO,KAAK,CAAA;AAC3E;AAEA,IAAM,UAAA,GAAa,UAAA;AACnB,IAAM,cAAA,GAAiB,wDAAA;AAEvB,IAAM,eAAA,GAAkB,CAAC,OAAA,KACvB,iBAAA,CAAkB,KAAK,OAAO,CAAA,IAAK,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,IAAK,gBAAA,CAAiB,OAAO,CAAA,IAAK,gBAAgB,OAAO,CAAA;AAUzH,SAAS,aAAa,OAAA,EAA4C;AAChE,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,oCAAA;AACnC,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,MAAM,CAAA,EAAG,OAAO,KAAA;AACvC,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,KAAA;AACrC,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,WAAW,CAAA,EAAG,OAAO,OAAA;AAC5C,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,GAAA;AACxC,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,OAAO,MAAA;AACT;AAWA,SAAS,eAAA,CAAgB,OAA0B,KAAA,EAAwB;AACzE,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,OAAO,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK,EAAG,KAAA,IAAS,CAAA;AAC9D,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,GAAI,KAAA,EAAO,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,GAAG,IAAA,GAAO,MAAA;AACpC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,MAAM,MAAM,UAAA,CAAW,IAAI,IAAI,CAAA,GAAI,YAAA,CAAa,OAAO,CAAA,GAAI,MAAA;AAC3D,IAAA,MAAM,QAAQ,GAAA,KAAQ,IAAA,IAAQ,CAAC,cAAA,CAAe,KAAK,OAAO,CAAA;AAC1D,IAAA,MAAM,UAAA,GAAa,GAAA,KAAQ,MAAA,IAAa,EAAE,SAAA,IAAa,KAAA,CAAA;AACvD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,SAAA,GAAY,KAAA;AAGZ,IAAA,IAAI,sBAAA,CAAuB,OAAO,CAAA,EAAG;AAErC,IAAA,IAAA,GAAO,GAAA,IAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAC,CAAC,IAAI,MAAA,GAAY,GAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA,KAAS,MAAA;AAClB;AAEA,SAAS,kBAAA,CAAmB,OAA0B,KAAA,EAAwB;AAC5E,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAC/B,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,EAAG;AACtC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACzB,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC9B,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACpC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAE,MAAM,EAAE,IAAA,EAAK;AAC/C,MAAA,IAAI,CAAC,IAAA,IAAQ,eAAA,CAAgB,IAAI,CAAA,EAAG;AACpC,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA;AAAA,IACF;AACA,IAAA,KAAA,GAAQ,CAAA;AACR,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,EAC7B;AACA,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,KAAA;AACtB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAC9B,EAAA,IAAI,UAAA,CAAW,KAAK,KAAK,CAAA,SAAU,CAAC,UAAA,CAAW,KAAK,MAAM,CAAA;AAC1D,EAAA,OAAO,WAAW,MAAM,CAAA,GAAI,sBAAA,CAAuB,KAAA,EAAO,OAAO,IAAI,CAAA;AACvE;AAGO,SAAS,aAAA,CAAc,OAA0B,KAAA,EAAwB;AAC9E,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAK,CAAA,IAAK,EAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACjC,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO,KAAK,KAAK,CAAC,gBAAA,CAAiB,SAAS,CAAA,EAAG,OAAO,KAAA;AAGtE,EAAA,IAAI,QAAA,CAAS,MAAM,CAAA,CAAE,MAAA,KAAW,SAAS,SAAS,CAAA,CAAE,QAAQ,OAAO,KAAA;AACnE,EAAA,OAAO,WAAW,MAAM,CAAA,GAAI,oBAAA,CAAqB,KAAA,EAAO,KAAK,CAAA,GAAI,CAAA;AACnE;AAGO,SAAS,cAAA,CAAe,KAAA,EAA0B,IAAA,GAAO,CAAA,EAAW;AACzE,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,GAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,IAAK,GAAG,IAAI,UAAA,CAAW,KAAA,EAAO,CAAC,GAAG,OAAO,CAAA;AAC3F,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,YAAA,CAAa,OAA0B,KAAA,EAAuB;AAC5E,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,EAAO,KAAK,CAAA;AACnD,EAAA,IAAI,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAC1C,EAAA,OAAO,GAAA,GAAM,KAAA,CAAM,MAAA,IAAU,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA,IAAK,EAAA,EAAI,SAAS,CAAA,EAAG,GAAA,IAAO,CAAA;AACjF,EAAA,OAAO,GAAA;AACT;;;ACvLA,IAAM,cAAA,GAAiB,IAAA;AAEvB,IAAM,cAAA,GAAiB,0BAAA;AACvB,IAAM,WAAA,GAAc,wCAAA;AACpB,IAAM,YAAA,GAAe,sCAAA;AAKd,IAAM,aAAA,uBAAyC,GAAA,CAAI;AAAA,EACxD,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,WAAA;AAAA,EAAa,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,WAAA;AAAA,EAC7E,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,UAAA;AAAA,EAC3E,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,UAAA;AAAA,EAAY,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS;AAC7F,CAAC;AACD,IAAM,YAAA,GAAe,oBAAA;AAErB,SAAS,sBAAsB,MAAA,EAAmD;AAChF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,SAAS,OAAA,GAAU,KAAA;AAAA,WAAA,IACd,IAAA,KAAS,MAAM,OAAA,GAAU,IAAA;AAAA,WAAA,IACzB,IAAA,KAAS,KAAK,QAAA,GAAW,KAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,KAAK,QAAA,GAAW,IAAA;AAAA,SAAA,IACpB,SAAS,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACd,SAAS,GAAA,EAAK,MAAA,EAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,SAAS,aAAa,OAAA,EAAgC;AACpD,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AACxD,EAAA,OAAO,KAAA,GAAS,KAAA,CAAM,CAAC,CAAA,GAAe,IAAA;AACxC;AAGA,SAAS,SAAS,OAAA,EAA4D;AAC5E,EAAA,MAAM,OAAkD,EAAC;AACzD,EAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,EAAA,IAAI,GAAA,OAAU,QAAA,GAAW,GAAA;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACjD,IAAA,IAAI,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3E,MAAA,MAAM,OAAQ,MAAA,CAAmC,MAAA;AACjD,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,EAAK,OAAQ,IAAA,GAAO,IAAA;AAAA,IAC3D;AAAA,EACF,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,IAAA,GAAO,gCAAA,CAAiC,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA;AACtE,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,IAAI,OAAO,KAAK,IAAA,KAAS,QAAA,IAAY,KAAK,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG;AACxE,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AACA,EAAA,IAAI,GAAA,KAAQ,eAAA,EAAiB,IAAA,CAAK,SAAA,GAAY,IAAA;AAC9C,EAAA,IAAI,OAAO,oBAAA,CAAqB,GAAG,GAAG,IAAA,CAAK,KAAA,GAAQ,qBAAqB,GAAG,CAAA;AAC3E,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,qBAAqB,OAAA,EAA0B;AACtD,EAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,eAAA,IAAmB,GAAA,IAAO,oBAAA;AAC/D;AAEA,SAAS,qBAAA,CAAsB,MAAA,EAAgB,KAAA,EAAe,KAAA,EAA8B;AAC1F,EAAA,IAAI,MAAA,CAAO,KAAK,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AAClC,EAAA,MAAM,KAAA,GAAkB,CAAC,GAAG,CAAA;AAC5B,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,OAAO,KAAA,EAAA,EAAS;AAClD,IAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,SAAS,OAAA,GAAU,KAAA;AAAA,WAAA,IACd,IAAA,KAAS,MAAM,OAAA,GAAU,IAAA;AAAA,WAAA,IACzB,IAAA,KAAS,KAAK,QAAA,GAAW,KAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAChC,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,GAAA,EAAI;AAC1B,IAAA,IAAK,IAAA,KAAS,OAAO,OAAA,KAAY,GAAA,IAAS,SAAS,GAAA,IAAO,OAAA,KAAY,KAAM,OAAO,IAAA;AACnF,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,GAAQ,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,aAAa,SAAA,EAAkC;AACtD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAC5C,IAAA,IAAI,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,IAAA;AACnF,IAAA,MAAM,OAAQ,MAAA,CAAmC,MAAA;AACjD,IAAA,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,KAAS,IAAA,GAAO,IAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,SAAS,4BAA4B,MAAA,EAAyB;AAC5D,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,EAAU;AAC9B,EAAA,MAAM,MAAA,GAAS,kCAAA,CAAmC,IAAA,CAAK,IAAI,CAAA;AAC3D,EAAA,IACE,CAAC,MAAA,IACD,mBAAA,CAAoB,GAAA,CAAI,OAAO,CAAC,CAAW,CAAA,IAC3C,qBAAA,CAAsB,GAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAa,aAAa,CAAA;AAE7D,IAAA,OAAO,KAAA;AACT,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,OAAO,CAAC,CAAA,CAAE,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACnD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,EAAO,KAAA,GAAQ,IAAA;AAAA,IACjC,CAAA,MAAA,IAAW,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,SAAA,IACpD,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,KAAA;AAAA,EACnC;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,mBAAmB,IAAA,EAAuB;AACjD,EAAA,OAAO,YAAY,IAAA,CAAK,IAAI,CAAA,IAAK,wBAAA,CAAyB,KAAK,IAAI,CAAA;AACrE;AAEA,IAAM,kBAAA,GAAqB,CAAC,aAAA,EAAe,aAAA,EAAe,aAAa,CAAA;AAMvE,IAAM,YAAN,MAAgB;AAAA,EACG,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,CAAA;AAAA,EACA,aAAuB,EAAC;AAAA,EACxB,cAAwB,EAAC;AAAA,EACzB,WAAqB,EAAC;AAAA,EACtB,SAAqB,EAAC;AAAA,EACtB,UAAA,uBAAiB,GAAA,EAA8B;AAAA;AAAA,EAExD,SAAA,GAA+B,IAAA;AAAA,EAC/B,QAAA,GAA8B,IAAA;AAAA;AAAA,EAErB,WAAA,uBAAkB,GAAA,EAAsB;AAAA;AAAA,EAExC,SAAA;AAAA,EACA,SAAS,CAAC,MAAA,EAAgB,SAAyB,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,EAE1F,WAAA,CACE,IAAA,EACA,SAAA,GAAY,KAAA,EACZ,QAAsC,MAAA,EACtC;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,MAAM,CAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,gBAAgB,IAAI,CAAA;AAGrC,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,wBAAA,CAAyB,IAAI,CAAA,GAAI,EAAA;AACpE,IAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,EAAA,EAAI,IAAA,CAAK,kBAAkB,MAAA,CAAO,iBAAA;AAK/D,IAAA,IAAI,SAAA,IAAa,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAKpC,MAAA,MAAM,IAAA,GAAO,qBAAqB,IAAI,CAAA;AACtC,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAC1C,QAAA,IAAI,UAAA,KAAe,IAAI,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,CAAI,IAAA,CAAK,iBAAiB,UAAU,CAAA;AACvF,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAK,SAAA,EAAW;AAC1C,UAAA,IAAI,KAAA,IAAS,MAAM,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,CAAI,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,QAC/E;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,OAAO,CAAC,GAAA,EAAK,MAAM,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA,EAAG;AAChD,QAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,IAAA,GAAO,GAAG,CAAA;AACtC,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,KAAK,SAAA,EAAW;AAC1C,UAAA,IAAI,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,KAAM,KAAA,EAAO,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,IAAI,CAAA;AAAA,QACzF;AACA,QAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,GAAA,EAAK;AAC/B,UAAA,IAAI,KAAA,GAAQ,KAAK,MAAA,IAAU,IAAA,CAAK,UAAU,GAAA,CAAI,IAAI,MAAM,KAAA,EAAO;AAC7D,YAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,KAAM,EAAA,EAAI;AAC7B,QAAA,IAAA,CAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAC1B,QAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,CAAA,GAAI,KAAA,IAAS,IAAA,CAAK,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,KAAM,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAC5E,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACxB,QAAA,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,WAAW,CAAA,EAAG;AAI5C,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA,IAAa,IAAA,CAAK,MAAA,GAAS,KAAA,IAAS,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,KAAM,EAAA;AAC1F,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAC1B,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA,GAAI,KAAK,MAAM,CAAA;AACpE,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAGQ,kBAAkB,MAAA,CAAO,iBAAA;AAAA;AAAA,EAGzB,SAAA,GAAY,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOZ,IAAA,CAAK,QAAgB,IAAA,EAAsB;AACjD,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,EAAC;AACR,MAAA,KAAA,IAAS,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAA,KAAO,EAAA,EAAI,EAAA,GAAK,KAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,EAAA,GAAK,CAAC,CAAA,EAAG;AAC1F,QAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MACd;AACA,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,IACnC;AACA,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,KAAK,IAAA,CAAK,MAAA;AACd,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,IAAK,IAAA,CAAK,GAAG,CAAA,GAAe,IAAA,OAAW,GAAA,GAAM,CAAA;AAAA,WACxC,EAAA,GAAK,GAAA;AAAA,IACZ;AACA,IAAA,OAAO,EAAA,GAAK,IAAA,CAAK,MAAA,GAAU,IAAA,CAAK,EAAE,CAAA,GAAe,EAAA;AAAA,EACnD;AAAA;AAAA,EAGQ,KAAK,CAAA,EAAiB;AAC5B,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,EACrC;AAAA;AAAA,EAGQ,iBAAiB,EAAA,EAAqB;AAC5C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAI5B,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,EAAE,GAAG,OAAO,IAAA;AACzC,IAAA,MAAM,IAAA,GAAO,KAAK,CAAA,GAAI,EAAA;AACtB,IAAA,IAAI,IAAA,KAAS,GAAG,OAAO,IAAA;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAM/B,IAAA,OAAO,0BAAA,CAA2B,KAAK,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,YAAY,KAAA,EAA2B;AAC7C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,KAAA;AAG5B,IAAA,IAAI,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAChD,IAAA,IAAI,KAAA,CAAM,UAAU,OAAO,KAAA;AAC3B,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,IAAA,KAAS,QAAQ,OAAO,IAAA;AAGjE,IAAA,OAAO,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACjD;AAAA;AAAA,EAGiB,eAAA,uBAAsB,GAAA,EAAY;AAAA;AAAA,EAG3C,WAAW,CAAA,EAAoB;AACrC,IAAA,OACE,IAAA,CAAK,SAAA,IACL,CAAA,KAAM,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA,KAC9B,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,CAAC,KAAK,IAAA,CAAK,SAAA,CAAA;AAAA,EAEtD;AAAA,EAEA,IAAY,SAAA,GAAoB;AAC9B,IAAA,OAAO,KAAK,UAAA,CAAW,MAAA;AAAA,EACzB;AAAA,EAEQ,OAAO,GAAA,EAAqB;AAClC,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA;AAClC,IAAA,OAAO,KAAK,EAAA,EAAI;AACd,MAAA,MAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,CAAA,KAAO,CAAA;AAC9B,MAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAgB,KAAK,EAAA,GAAK,GAAA;AAAA,gBACxC,GAAA,GAAM,CAAA;AAAA,IAClB;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA,EAGQ,YAAA,CAAa,MAAc,EAAA,EAAoB;AACrD,IAAA,IAAI,CAAA,GAAI,IAAA;AACR,IAAA,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAC,CAAW,CAAA,EAAG,CAAA,EAAA;AACpD,IAAA,OAAO,CAAA,GAAI,IAAA;AAAA,EACb;AAAA,EAEQ,OAAA,CAAQ,MAAc,EAAA,EAAqB;AACjD,IAAA,OAAO,CAAC,eAAe,IAAA,CAAK,IAAA,CAAK,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,EACvD;AAAA,EAEQ,YAAY,EAAA,EAAqB;AACvC,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA,EAAa,IAAA,CAAK,WAAA,CAAY,EAAE,CAAW,CAAA;AAAA,EACnF;AAAA,EAEQ,SAAS,EAAA,EAAoB;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA,EAAa,IAAA,CAAK,WAAA,CAAY,EAAE,CAAW,CAAA;AAAA,EACtF;AAAA,EAEA,GAAA,GAAkB;AAChB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,OAAO,GAAA,GAAM,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,EAAG;AACzB,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AACtB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,IAAO,KAAK,eAAA,EAAiB;AAC/B,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AAC/E,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,IAAI,IAAI,CAAA;AAI7C,MAAA,IAAI,MAAA,IAAU,GAAA,GAAM,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,IAAA,CAAK,WAAA,CAAY,EAAE,CAAW,CAAA,IAAK,IAAA,CAAK,eAAA,EAAiB;AAClG,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AAC/E,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,MAAA,CAAO,KAAA,EAAO,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AACvF,QAAA,GAAA,GAAM,MAAA,CAAO,GAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK,EAAE,CAAA;AAAA,IAC9B;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,iBAAA,EAAkB;AAC3C,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,iBAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA;AACtC,IAAA,IAAI,OAAO,CAAA,EAAG;AAId,IAAA,IAAI,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,CAAA,EAAG;AACjC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,QAAA,IAAI,KAAA,CAAM,GAAA,IAAO,IAAA,CAAK,eAAA,EAAiB;AACvC,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,GAAA,IAAO,KAAK,eAAe,CAAA;AAAA,aAAA,IACtG,MAAM,MAAA,EAAQ,aAAA,IAAiB,KAAA,CAAM,KAAA,GAAQ,KAAK,eAAA,EAAiB;AAC1E,UAAA,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,GAAA,EAAK,MAAM,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,EAAC,EAAE;AAAA,QAClG;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAEzB,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA;AAC7B,MAAA,OAAO,KAAK,CAAA,IAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAe,SAAS,KAAA,EAAO,CAAA,EAAA;AAC9D,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,MAAA,IAAI,KAAA,EAAO,QAAQ,QAAA,IAAY,KAAA,CAAM,OAAO,GAAA,GAAO,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAc;AACnF,QAAA,KAAA,CAAM,OAAO,QAAA,GAAW,KAAA;AACxB,QAAA,KAAA,CAAM,MAAA,CAAO,MAAM,IAAA,CAAK,CAAA;AACxB,QAAA,KAAA,CAAM,MAAM,IAAA,CAAK,CAAA;AACjB,QAAA,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,gBAAA,EAAiB;AACnC,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,MAAA,IAAI,KAAA,CAAM,OAAO,IAAA,EAAM;AACvB,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,GAAA,IAAO,IAAI,CAAA;AAG/F,MAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,KAAA,CAAM,KAAA,EAAO,KAAK,KAAA,CAAM,GAAA,EAAK,QAAQ,IAAA,EAAM,OAAA,EAAS,EAAC,EAAE;AAAA,IACpH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAA,GAA2B;AAEjC,IAAA,MAAM,SAAA,GAAY,CAACA,EAAAA,KAAsB;AACvC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAWA,EAAC,CAAA;AACnC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAYA,EAAC,CAAA;AAClC,MAAA,IAAI,GAAA,GAAM,SAAA;AACV,MAAA,WAAS;AACP,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,KAAA,CAAM,IAAA,KAAS,YAAY,CAAC,KAAA,CAAM,QAAQ,OAAO,GAAA;AAE/D,QAAA,IAAI,KAAA,CAAM,OAAO,aAAA,KAAkB,IAAA,IAAQ,KAAK,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA,EAAG,OAAO,GAAA;AAClF,QAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAG3B,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACtC,UAAA,IAAK,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,KAAiB,KAAA,CAAM,SAAS,SAAA,CAAU,MAAM,CAAA,KAAM,EAAA,EAAI,OAAO,GAAA;AAC5F,UAAA,IAAI,KAAA,CAAM,GAAA,IAAO,OAAA,EAAS,OAAO,EAAA;AACjC,UAAA,GAAA,GAAM,KAAA,CAAM,GAAA;AACZ,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,GAAA,IAAO,OAAA,EAAS,OAAO,EAAA;AACjC,QAAA,GAAA,GAAM,KAAA,CAAM,GAAA;AAAA,MACd;AAAA,IACF,CAAA;AACA,IAAA,IAAI,CAAA,GAAI,KAAK,SAAA,GAAY,CAAA;AAGzB,IAAA,IAAI,QAAQ,IAAA,CAAK,SAAA;AACjB,IAAA,IAAI,WAAW,IAAA,CAAK,CAAA;AACpB,IAAA,IAAI,CAAA,IAAK,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AAChC,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA,CAAK,CAAA;AAC3B,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,QAAA,GAAW,EAAA;AACX,MAAA,CAAA,EAAA;AAAA,IACF;AAGA,IAAA,OAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAClB,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,IAAI,OAAO,EAAA,EAAI;AACf,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AACzB,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACzC,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,QAAA,GAAW,EAAA;AAAA,IACb;AACA,IAAA,IAAI,OAAA,GAAU,QAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,EAAA,GAAK,UAAU,CAAC,CAAA;AACtB,MAAA,IAAI,OAAO,EAAA,EAAI;AACf,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,EAAE,IAAA,EAAK;AACtC,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,WAAW,kBAAA,CAAmB,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1E,MAAA,OAAA,GAAU,EAAA;AACV,MAAA,IAAI,EAAA,GAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAc;AAAA,IAC3C;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGQ,QAAQ,GAAA,EAA8B;AAC5C,IAAA,IAAI,EAAA,GAAK,CAAA;AACT,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA;AAC9B,IAAA,OAAO,MAAM,EAAA,EAAI;AACf,MAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC7B,MAAA,IAAI,GAAA,GAAM,KAAA,CAAM,KAAA,EAAO,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,WAAA,IACzB,GAAA,IAAO,KAAA,CAAM,GAAA,EAAK,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,WACjC,OAAO,KAAA;AAAA,IACd;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,KAAK,KAAA,EAAuB;AAClC,IAAA,IAAI,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,IAAW,IAAA,CAAK,QAAQ,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AAClE,MAAA,KAAA,GAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,EAAC,EAAE;AAAA,IACvF;AACA,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,SAAS,KAAA,IAAS,IAAA,CAAK,GAAA,KAAQ,KAAA,CAAM,KAAA,EAAO;AACnF,MAAA,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACxB;AAAA,EAEQ,GAAA,CAAI,KAAa,EAAA,EAAoB;AAC3C,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAC1B,IAAA,IAAI,IAAI,EAAA,GAAK,CAAA;AACb,IAAA,OAAO,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AAChD,MAAA,GAAA,GAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AACrB,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,CAAA;AACrE,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAIQ,WAAA,CAAY,CAAA,EAAW,EAAA,EAAY,WAAA,EAAwC;AACjF,IAAA,MAAM,QAAA,GAAW,WAAA,GAAc,EAAA,GAAK,CAAA,GAAI,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,SAAU,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AAC3E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,CAAA,EAAG,IAAI,WAAW,CAAA;AACzD,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CAAoB,CAAA,EAAW,EAAA,EAAY,WAAA,EAAwC;AACzF,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA;AACjC,IAAA,MAAM,CAAA,GAAI,IAAI,SAAA,EAAU;AACxB,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,GAAS,CAAA,CAAE,MAAA;AAC9B,IAAA,MAAM,KAAK,CAAA,GAAI,MAAA;AAEf,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,EAAA,EAAI,CAAC,CAAA;AACjC,MAAA,IAAI,IAAI,OAAO,EAAA;AAAA,IACjB;AAKA,IAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,mBAAmB,EAAE,CAAA;AAC3D,IAAA,IAAI,UAAU,CAAA,IAAK,CAAC,cAAc,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AACpD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAC,CAAA;AACzC,MAAA,IAAI,WAAW,OAAO,SAAA;AAAA,IACxB;AACA,IAAA,IAAI,MAAA,KAAW,MAAM,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI;AAChE,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,IAAI,CAAC,CAAA;AACjD,MAAA,IAAI,YAAY,OAAO,UAAA;AAAA,IACzB;AACA,IAAA,IAAI,UAAU,CAAA,IAAK,CAAC,cAAc,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACnD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AACrC,MAAA,IAAI,SAAS,OAAO,OAAA;AAAA,IACtB;AACA,IAAA,IAAI,eAAe,MAAA,IAAU,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AACpD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,kBAAA,CAAmB,CAAA,EAAG,IAAI,CAAC,CAAA;AACjD,MAAA,IAAI,UAAU,OAAO,QAAA;AAAA,IACvB;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAc,GAAG,CAAA;AAC/B,IAAA,IAAI,KAAA,EAAO,SAAS,GAAA,EAAK,OAAO,KAAK,aAAA,CAAc,CAAA,EAAG,IAAI,KAAK,CAAA;AAC/D,IAAA,IAAI,KAAA,EAAO,SAAS,GAAA,EAAK,OAAO,KAAK,UAAA,CAAW,CAAA,EAAG,IAAI,KAAK,CAAA;AAC5D,IAAA,IAAI,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AACtB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACjC,MAAA,IAAI,MAAM,OAAO,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,IAAI,CAAC,CAAA;AACvC,MAAA,IAAI,MAAM,OAAO,IAAA;AACjB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,IAAI,CAAC,CAAA;AACtC,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,EAAA,EAAI,KAAK,MAAM,CAAA;AACpD,MAAA,IAAI,WAAW,OAAO,SAAA;AACtB,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AACxB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,IAAI,EAAE,CAAA;AAC3C,QAAA,IAAI,SAAS,OAAO,OAAA;AAAA,MACtB;AACA,MAAA,MAAM,OAAO,IAAA,CAAK,SAAA,CAAU,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,WAAW,CAAA;AACrD,MAAA,IAAI,MAAM,OAAO,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,IAAI,EAAE,CAAA;AACpC,MAAA,IAAI,MAAM,OAAO,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,MAAM,OAAO,IAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,mBAAmB,EAAA,EAAqB;AAC9C,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,MAAA,IAAI,mCAAA,CAAoC,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AAC3D,MAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,OACN,IAAA,EACA,KAAA,EACA,KACA,QAAA,EACA,IAAA,GAAkD,EAAC,EACxC;AACX,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,UAAU,IAAA,EAAK;AAAA,EAC5C;AAAA,EAEQ,WAAA,CAAY,IAAY,CAAA,EAA6B;AAG3D,IAAA,MAAM,QAAQ,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACrD,IAAA,IAAK,UAAU,KAAA,IAAS,KAAA,KAAU,KAAA,IAAU,CAAA,KAAM,OAAO,OAAO,IAAA;AAChE,IAAA,MAAM,OAAO,KAAA,KAAU,KAAA;AACvB,IAAA,IAAI,UAAA,GAAa,KAAA;AACjB,IAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC5B,MAAA,IAAI,IAAA,KAAS,KAAA,IAAU,CAAC,IAAA,IAAQ,SAAS,KAAA,EAAQ;AAC/C,QAAA,OAAO,aACH,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,KAAK,WAAA,CAAY,CAAC,CAAA,EAAa,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,GAAO,MAAA,GAAS,MAAA,EAAQ,CAAA,GACtG,IAAA;AAAA,MACN;AACA,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,MAAA,GAAS,OACX,mCAAA,CAAoC,IAAA,CAAK,IAAI,CAAA,GAC7C,gDAAA,CAAiD,KAAK,IAAI,CAAA;AAC9D,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AACxB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AAIA,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,OAAO,cAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,OAAO,EAAE,MAAA,EAAQ,IAAA,GAAO,MAAA,GAAS,QAAQ,CAAA;AAC3G,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,SAAA,CAAU,CAAA,EAAW,EAAA,EAAY,CAAA,EAA6B;AACpE,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA;AAClC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,MAAA,GAAU,IAAA,CAAK,CAAC,CAAA,CAAa,MAAA;AACnC,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA,EAAa,IAAA,EAAM,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAAA,IAC/F;AACA,IAAA,MAAM,KAAA,GAAkB,CAAC,MAAM,CAAA;AAC/B,IAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,EAAE,IAAA,EAAK;AACnC,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,IAAI,KAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAa,UAAU,CAAA,EAAG;AAC7C,QAAA,KAAA,CAAM,IAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAa,MAAM,CAAA;AACtC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,IAAI,KAAA,IAAU,MAAM,CAAC,CAAA,CAAa,UAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,EAAc;AAC/E,QAAA,KAAA,CAAM,GAAA,EAAI;AACV,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAK,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,YAAY,CAAC,CAAA,EAAa,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,MAC1G;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,WAAA,EAAa,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA;AAAA,EAC5D;AAAA;AAAA,EAGQ,gBAAA,CAAiB,CAAA,EAAW,EAAA,EAAY,CAAA,EAA6B;AAC3E,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC5B,MAAA,IAAI,eAAe,IAAA,CAAK,IAAI,KAAK,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,QAAA,IAAA,GAAO,CAAA;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,MAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,WAAA,EAAa,CAAA,EAAG,KAAK,WAAA,CAAY,IAAI,GAAa,IAAA,EAAM;AAAA,MACzE,IAAA,EAAO,IAAA,CAAK,CAAC,CAAA,CAAa,WAAA,EAAY;AAAA,MACtC,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,OAAA,CAAQ,CAAA,EAAW,EAAA,EAAY,CAAA,EAA6B;AAClE,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAGhC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,aAAA,CAAc,GAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAAa,WAAA,EAAa,CAAA,EAAG,OAAO,IAAA;AAC3E,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACxC,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW,CAAA,EAAG,KAAK,WAAA,CAAY,IAAI,GAAa,IAAA,EAAM;AAAA,MACvE,IAAA,EAAO,IAAA,CAAK,CAAC,CAAA,CAAa,WAAA,EAAY;AAAA,MACtC,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,GAAM,QAAA,GAAW,MAAA,KAAW;AAAC,KAChE,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,kBAAA,CAAmB,CAAA,EAAW,EAAA,EAAY,CAAA,EAA6B;AAC7E,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC5B,MAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAE9B,QAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,QAAA,OAAO,CAAA,GAAI,IAAA,CAAK,SAAA,IAAa,CAAC,cAAA,CAAe,KAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AACrE,QAAA,IAAI,CAAA,GAAI,KAAK,SAAA,IAAa,cAAA,CAAe,KAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC/D,UAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AACR,UAAA;AAAA,QACF;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,cAAA,CAAe,IAAA,CAAK,IAAI,CAAA,EAAG;AAC7B,QAAA,IAAA,GAAO,CAAA;AACP,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,KAAK,YAAA,CAAa,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AACrE,MAAA,IAAI,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG;AAIzC,MAAA,IAAI,IAAA,CAAK,aAAa,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,sBAAA,CAAuB,CAAC,CAAA,EAAG;AAC9E,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AAAA,MAC/C;AACA,MAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,IAAA,CAAK,WAAW,CAAC,CAAA,EAAa,GAAG,KAAK,CAAA;AAGrE,MAAA,IAAI,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG,OAAO,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AACnF,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,IAAA,GAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAIjC,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA,EAAG,OAAO,KAAK,YAAA,CAAa,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AAG7E,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,GAAA,GAAM,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,IAAA,CAAK,CAAC,CAAW,CAAA;AAC/F,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,EAAE,EAAA,EAAI,IAAA,CAAK,CAAC,CAAA,EAAa,CAAA;AAAA,EAC5E;AAAA;AAAA,EAGQ,uBAAuB,CAAA,EAAoB;AACjD,IAAA,IAAI,IAAA,CAAK,yBAAyB,MAAA,EAAW;AAE3C,MAAA,IAAI,CAAA,GAAI,KAAK,SAAA,GAAY,CAAA;AACzB,MAAA,OAAO,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAClB,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,QAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAC,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAAA,MACnE;AACA,MAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,IAAI,IAAA,CAAK,oBAAA;AAAA,EAClB;AAAA,EAEQ,oBAAA,GAA2C,MAAA;AAAA;AAAA,EAG3C,YAAA,CAAa,GAAW,EAAA,EAAuB;AACrD,IAAA,OAAO,IAAA,CAAK,OAAO,cAAA,EAAgB,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,EAAE,EAAA,EAAI,CAAA;AAAA,EAC7D;AAAA;AAAA,EAGA,IAAY,UAAA,GAAyB;AACnC,IAAA,OAAO;AAAA,MACL,OAAO,IAAA,CAAK,SAAA;AAAA,MACZ,IAAA,EAAM,CAAC,CAAA,KAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAC5B,QAAA,EAAU,CAAC,CAAA,KAAM,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,MAClC,WAAW,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAA,CAAc,CAAA,EAAW,EAAA,EAAY,MAAA,EAAgC;AAC3E,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,SAAS,IAAA,KAAS,MAAA;AACxB,IAAA,MAAM,UAAA,GAAa,uBAAuB,IAAI,CAAA;AAC9C,IAAA,MAAM,OAAkD,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,CAAO,OAAO,IAAA,EAAK;AAChG,IAAA,IAAI,cAAc,sBAAA,CAAuB,GAAA,CAAI,UAAU,CAAA,OAAQ,OAAA,GAAU,UAAA;AACzE,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,IAAI,MAAM,CAAA;AAClD,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAa,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,IACnG;AACA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,OAAO,IAAA,EAAM,EAAA,EAAI,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AAAA,EAC5E;AAAA,EAEQ,YACN,CAAA,EACA,GAAA,EACA,UACA,IAAA,EACA,QAAA,EACA,WACA,MAAA,EACW;AACX,IAAA,IAAI,MAAA,IAAU,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,SAAA,EAAW;AAC3C,MAAA,MAAM,OAAA,GACJ,YAAY,IAAA,CAAK,SAAA,GAAa,KAAK,UAAA,CAAW,SAAS,IAAe,IAAA,CAAK,CAAA;AAC7E,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,WAAW,QAAA,GAAW,CAAC,CAAA,EAAa,IAAA,CAAK,IAAI,OAAA,EAAS,IAAA,CAAK,WAAW,QAAA,GAAW,CAAC,CAAW,CAAC,CAAA;AAChI,MAAA,IAAI,IAAA,CAAK,SAAA,EAAU,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,UAAU,IAAI,CAAA;AAAA,EACpD;AAAA,EAEQ,UAAA,CAAW,CAAA,EAAW,EAAA,EAAY,MAAA,EAAgC;AACxE,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,MAAM,OAAkD,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,CAAO,OAAO,IAAA,EAAK;AAChG,IAAA,MAAM,UAAA,GAAa,uBAAuB,IAAI,CAAA;AAC9C,IAAA,IAAI,cAAc,sBAAA,CAAuB,GAAA,CAAI,UAAU,CAAA,OAAQ,OAAA,GAAU,UAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,IAAI,MAAM,CAAA;AACpD,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA;AAC5C,MAAA,MAAM,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA,EAAG,KAAA,CAAM,MAAM,QAAQ,CAAA;AAC9D,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,GAAA,EAAK,GAAA,KAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,gBAAA,GAAmB,IAAA,EAAM,IAAI,CAAA;AAAA,IACzF;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA,EAAS,GAAG,IAAA,CAAK,CAAA,EAAG,OAAO,IAAI,CAAA;AAAA,EACpD;AAAA;AAAA,EAGQ,gBAAA,GAAmB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUnB,gBAAA,CAAiB,SAAA,EAAmB,SAAA,EAAmB,QAAA,EAA0B;AACvF,IAAA,IAAI,GAAA,GAAM,QAAA;AACV,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,KAAA,IAAS,IAAI,SAAA,EAAW,CAAA,IAAK,aAAa,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AACjE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC/B,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AAIzB,MAAA,IAAI,cAAc,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,SAAS,GAAA,EAAK;AACnD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,GAAG,KAAK,CAAA;AACtD,MAAA,IAAI,CAAC,KAAA,EAAO;AAIZ,MAAA,IAAI,IAAA,CAAK,aAAa,KAAA,CAAM,GAAA,IAAO,YAAY,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,GAAG,CAAA,EAAG;AAC/E,QAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,QAAA,OAAO,IAAA,CAAK,CAAA;AAAA,MACd;AACA,MAAA,IAAI,KAAA,CAAM,MAAM,GAAA,EAAK;AACnB,QAAA,GAAA,GAAM,KAAA,CAAM,GAAA;AACZ,QAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,QAAA;AAAA,MAChC;AACA,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,IAAA,CAAK,IAAI,KAAA,EAAO,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAC3D,MAAA,IAAI,QAAA,GAAW,GAAG,CAAA,GAAI,QAAA;AAAA,IACxB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,SAAA,CAAU,GAAW,EAAA,EAA8B;AACzD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,IAAA;AAChC,IAAA,MAAM,MAAM,KAAA,GAAQ,CAAA;AACpB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAE9B,IAAA,IAAI,GAAA,IAAO,MAAM,CAAC,IAAA,CAAK,QAAQ,GAAA,EAAK,EAAE,GAAG,OAAO,IAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAEtC,IAAA,IAAI,OAAA,KAAY,MAAM,CAAC,IAAA,CAAK,QAAQ,GAAA,EAAK,KAAK,GAAG,OAAO,IAAA;AAKxD,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,SAAU,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AACpG,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,EAAc,CAAA,EAAG,KAAK,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpE;AAAA;AAAA,EAGQ,YAAA,CAAa,CAAA,EAAW,EAAA,EAAY,CAAA,EAA6B;AACvE,IAAA,KAAA,MAAW,QAAQ,mBAAA,EAAqB;AACtC,MAAA,MAAM,MAAA,GAAS,IAAI,IAAI,CAAA,CAAA;AACvB,MAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAC5B,MAAA,IAAI,SAAS,GAAA,IAAO,IAAA,KAAS,OAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAM;AACnE,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,CAAA,EAAG,IAAI,UAAU,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,gBAAA,CACN,IAAA,EACA,CAAA,EACA,EAAA,EACA,IAAA,EACkB;AAClB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC9B,IAAA,MAAM,MAAM,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,EAAA,EAAI,KAAK,MAAM,CAAA;AACjD,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,SAAS,CAAC,CAAA;AAClC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,GAAA,IAAO,CAAC,GAAA,CAAI,SAAA,EAAW;AACzB,MAAA,IAAI,IAAI,aAAA,EAAe;AACrB,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,WAAA,EAAa,MAAM,CAAA;AAAA,MACzF;AACA,MAAA,OAAA,GAAU,EAAA,GAAK,IAAI,GAAA,CAAI,MAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,EAAE,CAAA;AAC5B,MAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,EAAE,GAAA,EAAK,MAAM,CAAA;AACvE,MAAA,IAAI,EAAA,IAAM,IAAI,OAAO,IAAA;AACrB,MAAA,OAAA,GAAU,EAAA,GAAK,CAAA;AAAA,IACjB;AACA,IAAA,MAAM,MAAA,GAAS,KAAK,IAAI,CAAA,CAAA,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,OAAO,CAAA;AACvC,IAAA,IAAI,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,EAAE,GAAA,EAAK,MAAM,CAAA;AAC1E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EACxE;AAAA;AAAA,EAGQ,SAAA,CAAU,CAAA,EAAW,EAAA,EAAY,CAAA,EAA6B;AACpE,IAAA,KAAA,MAAW,QAAQ,mBAAA,EAAqB;AACtC,MAAA,MAAM,MAAA,GAAS,IAAI,IAAI,CAAA,CAAA,CAAA;AACvB,MAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,MAAA,MAAM,MAAA,GAAS,KAAK,IAAI,CAAA,CAAA,CAAA;AACxB,MAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,EAAA,GAAK,OAAO,MAAM,CAAA;AAClD,MAAA,IAAI,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,EAAE,GAAA,EAAK,MAAM,CAAA;AAClF,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,UAAA,CAAW,CAAA,EAAW,EAAA,EAAY,GAAA,EAAa,MAAA,EAAkC;AACvF,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,EAAO,CAAC,CAAA;AACnC,IAAA,IAAI,OAAA,IAAW,CAAC,OAAA,CAAQ,SAAA,EAAW;AACjC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,mBAAA,CAAoB,IAAI,IAAI,CAAA,IAAK,sBAAsB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG;AAClF,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,OAAA,GAAU,IAAI,mBAAA,CAAoB,IAAI,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,WAAA,CAAY,GAAA,EAAK,MAAM,CAAA;AAChD,MAAA,IAAI,aAAa,IAAA,EAAM;AACrB,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB,CAAA,EAAG,CAAA,GAAI,UAAU,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,MAC1E;AACA,MAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,QAAA,MAAM,MAAM,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAChD,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAA,OAAO,IAAA,CAAK,OAAO,eAAA,EAAiB,CAAA,EAAI,KAAK,UAAA,CAAW,CAAC,CAAA,GAAe,GAAA,EAAK,IAAA,EAAM;AAAA,YACjF,GAAA,EAAK;AAAA,WACN,CAAA;AAAA,QACH;AAAA,MACF;AAKA,MAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG,OAAO,IAAA;AACrC,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB,CAAA,EAAG,IAAA,CAAK,GAAG,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,2BAAA,CAA4B,GAAG,CAAA,EAAG;AACpC,MAAA,MAAM,OAAO,0BAAA,CAA2B,IAAA,CAAK,GAAG,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC1D,MAAA,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG,OAAO,IAAA;AACrC,MAAA,OAAO,IAAA,CAAK,OAAO,eAAA,EAAiB,CAAA,EAAG,KAAK,CAAA,EAAG,KAAA,EAAO,EAAE,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,CAAA,EAAW,EAAA,EAAY,EAAA,EAA8B;AACxE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,CAAA;AACrC,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,IAAA,CAAK,OAAO,cAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA;AACrE,IAAA,MAAM,MAAM,KAAA,GAAQ,CAAA;AACpB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAA;AACxC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC9B,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,IAAI,GAAA,IAAO,MAAM,CAAC,IAAA,CAAK,QAAQ,GAAA,EAAK,EAAE,GAAG,OAAO,IAAA;AAChD,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,CAAO,CAAC,CAAA,EAAa,CAAA;AAAA,IACxE;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,EACjD;AAAA,EAEQ,SAAA,CACN,CAAA,EACA,EAAA,EACA,CAAA,EACA,IACA,WAAA,EACkB;AAClB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,CAAA,EAAG,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY;AACrC,IAAA,IAAI,CAAC,qBAAA,CAAsB,GAAA,CAAI,IAAI,GAAG,OAAO,IAAA;AAC7C,IAAA,IAAI,IAAA,KAAS,KAAA,IAAS,CAAC,GAAA,CAAI,SAAA,EAAW;AACpC,MAAA,MAAM,MAAA,GAAS,cAAA;AACf,MAAA,MAAA,CAAO,SAAA,GAAY,EAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AACnC,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,EAAE,GAAA,EAAK,MAAM,CAAA;AAC5E,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,MAAM,CAAA;AAAA,IACxF;AACA,IAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AAM9C,IAAA,MAAM,SAAA,GAAY,WAAA,IAAe,CAAA,CAAE,OAAA,OAAc,GAAA,CAAI,GAAA;AACrD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,SAAA,EAAW,OAAO,IAAA;AACnC,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG,CAAA,EAAA,EAAK;AACpE,MAAA,GAAA,GAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,YAAA,EAAc,CAAA,EAAG,KAAK,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,EAC9D;AAAA,EAEQ,gBAAA,GAAyB;AAC/B,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,EAAE,OAAO,MAAA,EAAO,GAAI,sBAAsB,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAChE,MAAA,MAAA,CAAO,IAAI,CAAC,CAAA,GAAK,MAAA,CAAO,CAAC,IAAe,KAAA,GAAQ,MAAA;AAAA,IAClD;AAEA,IAAA,MAAM,OAAO,IAAI,UAAA,CAAW,KAAK,CAAA,CAAE,KAAK,EAAE,CAAA;AAC1C,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,OAAO,KAAA,CAAM,UAAW,MAAA,CAAO,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAW,CAAA,IAAgB,KAAA,EAAO;AACrF,QAAA,MAAM,CAAA,GAAI,MAAM,GAAA,EAAI;AACpB,QAAA,IAAI,CAAA,GAAI,KAAA,EAAO,IAAA,CAAK,CAAC,IAAI,CAAA,GAAI,CAAA;AAAA,MAC/B;AACA,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA,EAGQ,QAAA,CAAS,CAAA,EAAW,EAAA,EAAY,EAAA,EAA8B;AACpE,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,CAAA,KAAO,IAAA,CAAK,UAAA,CAAW,EAAE,CAAA,EAAc;AACzC,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,QAAA,OAAe,gBAAA,EAAiB;AAC7D,MAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,CAAyB,EAAE,CAAA;AAC9C,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,GAAA,GACI,KAAK,QAAA,CAAwB,IAAA,GAAO,CAAC,CAAA,GACrC,IAAA,CAAK,SAAwB,EAAE,CAAA;AAAA,MACrC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,IAAA,GAAO,CAAA,KAAM,EAAA,GAAK,IAAA,CAAK,KAAK,KAAA,CAAM,EAAA,EAAI,IAAA,CAAK,WAAA,CAAY,EAAE,CAAW,CAAA,GAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AAC7F,QAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,sBAAsB,IAAI,CAAA;AACpD,QAAA,OAAA,IAAW,KAAA,GAAQ,MAAA;AACnB,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,QAAA,GAAW,CAAA;AACX,UAAA,GAAA,GAAM,OAAA;AACN,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,aAAa,IAAA,EAAM;AAErB,MAAA,IAAI,oBAAA,CAAqB,KAAK,IAAA,CAAK,KAAA,CAAM,IAAI,EAAA,GAAK,GAAG,CAAC,CAAA,EAAG;AACvD,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAC,CAAA;AAAA,MAC5E;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAOA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,MAAA,IAAI,oBAAA,CAAqB,KAAK,IAAA,CAAK,KAAA,CAAM,IAAI,EAAA,GAAK,GAAG,CAAC,CAAA,EAAG;AACvD,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAC,CAAA;AAAA,MAC5E;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,IAAA;AACtB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AACrC,IAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,MAAM,EAAA,EAAI,GAAG,EAAE,IAAA,EAAK;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC1C,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,IAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAQ,CAAA,EAAG,KAAK,IAAA,EAAM,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEQ,IAAA,CAAK,GAAW,EAAA,EAA8B;AACpD,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,CAAA,GAAI,EAAA;AACR,IAAA,OAAO,CAAA,GAAI,KAAK,SAAA,EAAW;AACzB,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AACvB,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,KAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACzC,MAAA,SAAA,EAAA;AACA,MAAA,QAAA,GAAW,CAAA;AACX,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,GAAG,OAAO,IAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAQ,CAAA,EAAG,KAAK,WAAA,CAAY,QAAQ,GAAa,IAAI,CAAA;AAAA,EAC1E;AAAA;AAAA,EAIQ,SAAA,CAAU,KAAa,EAAA,EAAoB;AACjD,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC7B,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,KAAA,IAAS,IAAI,EAAA,GAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,CAAY,IAAA,CAAK,WAAW,CAAC,CAAA,EAAa,GAAG,KAAK,CAAA;AACrE,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,GAAY,CAAA;AAKZ,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,EAAG;AAC3B,UAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,GAAG,CAAA;AAAA,QAC9B;AACA,QAAA;AAAA,MACF;AACA,MAAA,GAAA,GAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,IAC1B;AAKA,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,MAAM,WAAA,GAAc,KAAK,WAAA,CAAY,IAAA,CAAK,WAAW,SAAS,CAAA,EAAa,WAAW,KAAK,CAAA;AAC3F,MAAA,IAAI,WAAA,EAAa,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,IAAA,GAAO,SAAA;AACX,QAAA,KAAA,IAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,CAAA,IAAK,IAAI,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,EAAE,IAAA,EAAK;AACtC,UAAA,IAAI,CAAC,WAAW,kBAAA,CAAmB,OAAO,KAAK,WAAA,CAAY,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1E,UAAA,IAAA,GAAO,CAAA;AAAA,QACT;AACA,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,MAAM,YAAY,IAAA,KAAS,EAAA,GAAK,GAAA,GAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAC3D,UAAA,MAAM,IAAA,GAAO,EAAE,GAAG,WAAA,EAAa,OAAO,SAAA,EAAU;AAChD,UAAA,IAAI,YAAY,GAAA,EAAK;AACnB,YAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA;AAC1C,YAAA,MAAMC,KAAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,QAAQ,CAAA;AAC1C,YAAA,IAAI,CAACA,MAAK,WAAA,EAAa;AACrB,cAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,OAAA,EAASA,KAAAA,CAAK,SAAS,CAAA;AAC3F,cAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AACrF,cAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,EAAW,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AACxF,cAAA,OAAO,IAAA,CAAK,GAAA;AAAA,YACd;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,SAAA,EAAW,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AACxF,YAAA,OAAO,IAAA,CAAK,GAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAMA,KAAAA,GAAO,IAAA,CAAK,UAAA,CAAW,GAAA,EAAK,GAAG,CAAA;AACrC,IAAA,IAAI,CAACA,MAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAASA,KAAAA,CAAK,OAAA,EAAS,CAAA;AACjF,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAK,EAAE,GAAGA,KAAAA,CAAK,WAAA,EAAa,eAAe,IAAA,EAAK;AACtD,IAAA,IAAIA,MAAK,MAAA,EAAQ;AAGf,MAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,MAAA,OAAO,IAAA,CAAK,OAAO,MAAA,EAAQ;AACzB,QAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC/C,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC5B,QAAA,IAAA,CAAK,OAAO,GAAA,EAAI;AAChB,QAAA,KAAA,GAAQ,IAAA,CAAK,KAAA;AAAA,MACf;AACA,MAAA,MAAM,MAAA,GAAS,EAAE,GAAG,EAAA,EAAI,KAAA,EAAM;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,EAAC,EAAG,CAAA;AACzE,MAAA,OAAO,MAAA,CAAO,GAAA;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,GAAA;AAAA,MACP,KAAK,EAAA,CAAG,KAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAASA,MAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,GAAA,IAAO,EAAA,CAAG,KAAK;AAAA,KAChE,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,EAAA,CAAG,KAAA,EAAO,GAAA,EAAK,EAAA,CAAG,KAAK,MAAA,EAAQ,EAAA,EAAI,OAAA,EAAS,IAAI,CAAA;AACnF,IAAA,OAAO,EAAA,CAAG,GAAA;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,KAAA,CACN,IAAA,EACA,KAAA,EACA,GAAA,EACA,IACA,IAAA,EACW;AACX,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA,EAAG,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA;AAClF,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,EACjD;AAAA,EAEQ,UAAA,CACN,IACA,EAAA,EAC0E;AAC1E,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,UAAuB,EAAC;AAC9B,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,CAAA;AACjB,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA,CAAE,SAAS,QAAQ,CAAA;AAGpD,IAAA,IAAI,UAAA,GAAa,CAAA,IAAK,EAAA,GAAK,EAAA,CAAA,GAAM,KAAA;AACjC,IAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAmB,MAAA,GAAS,WAAW,EAAE,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAO,CAAA;AAC5F,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,EAAgB,IAAA,KAAyB;AACvD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACjC,MAAA,OAAO,OAAO,EAAA,IAAM,EAAA,GAAK,MAAA,CAAO,MAAA,IAAU,KAAK,EAAA,GAAK,EAAA;AAAA,IACtD,CAAA;AACA,IAAA,IAAI,IAAA,GAA4B,IAAA;AAEhC,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,EAAW,IAAA,KAAyB;AACzD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,CAAA;AACjB,QAAA,IAAA,GAAO,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,EAAE,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA;AAC5B,MAAA,OAAO,EAAA,KAAO,EAAA,IAAM,EAAA,GAAK,CAAA,IAAK,KAAK,EAAA,GAAK,EAAA;AAAA,IAC1C,CAAA;AAEA,IAAA,IAAI,CAAA,GAAI,EAAA;AAIR,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,eAAe,CAAA;AACjD,IAAA,OAAO,IAAI,OAAA,EAAS;AAClB,MAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACzB,QAAA,IAAI,MAAA,KAAW,GAAA,IAAO,MAAA,KAAW,GAAA,EAAK;AACpC,UAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,KAAW,MAAM,KAAA,GAAQ,KAAA,EAAO,IAAI,CAAC,CAAA;AAG1D,UAAA,MAAM,SACJ,KAAA,KAAU,EAAA,KACT,WAAW,GAAA,IAAO,oBAAA,CAAqB,KAAK,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,KAAK,GAAG,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAC,IAAI,MAAS,CAAA,CAAA;AACnG,UAAA,IAAI,KAAA,KAAU,MAAM,MAAA,EAAQ;AAC1B,YAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,GAAG,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,EAAE,WAAW,MAAA,KAAW,GAAA,GAAM,KAAA,GAAQ,KAAA,EAAO,CAAC,CAAA;AAC1G,YAAA,CAAA,GAAI,KAAA,GAAQ,CAAA;AACZ,YAAA;AAAA,UACF;AAIA,UAAA,IAAI,UAAU,EAAA,IAAM,IAAA,CAAK,aAAa,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA,EAAG;AAC/D,YAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,UACrD;AAAA,QACF;AACA,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,MAAM,CAAA,GAAI,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAA;AACnC,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAKpC,QAAA,IAAI,UAAU,EAAA,IAAM,IAAA,CAAK,aAAa,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA,EAAG;AAC/D,UAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,QACrD;AACA,QAAA,CAAA,GAAI,KAAA,KAAU,EAAA,GAAK,CAAA,GAAI,CAAA,GAAI,KAAA,GAAQ,CAAA;AACnC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACvB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA;AAClC,UAAA,IAAI,UAAU,MAAA,EAAW;AACvB,YAAA,CAAA,IAAK,CAAA;AACL,YAAA;AAAA,UACF;AACA,UAAA,IAAI,QAAQ,CAAA,GAAI,EAAA,EAAI,OAAO,IAAA,CAAK,KAAK,KAAA,CAAM,YAAA,EAAc,CAAA,EAAG,KAAA,GAAQ,GAAG,EAAA,EAAI,EAAE,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAC/F,UAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAChF,UAAA,CAAA,GAAI,KAAA,GAAQ,CAAA;AACZ,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA;AAC3C,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,KAAK,GAAA,CAAI,GAAA,EAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACnD,QAAA,IAAI,MAAM,CAAA,EAAG;AACX,UAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,aAAA,EAAe,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,EAAE,SAAA,EAAW,GAAA,EAAK,CAAC,CAAA;AACzE,UAAA,CAAA,GAAI,GAAA;AACJ,UAAA;AAAA,QACF;AACA,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,EAAK;AACvB,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AACnC,UAAA,IACE,UAAU,EAAA,IACV,KAAA,GAAQ,CAAA,IAAK,EAAA,IACb,QAAQ,CAAA,IAAK,GAAA,IACb,CAAC,IAAA,CAAK,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EACnC;AACA,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA;AACnC,YAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAA;AAC1C,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,KAAK,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,KAAA,GAAQ,GAAG,IAAA,EAAM,MAAA,GAAS,EAAE,IAAA,EAAM,OAAO,CAAC,CAAA,KAAgB,EAAE,QAAA,EAAU,MAAM;AAAA,aACzG;AACA,YAAA,CAAA,GAAI,KAAA,GAAQ,CAAA;AACZ,YAAA;AAAA,UACF;AACA,UAAA,CAAA,IAAK,CAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAA,IAAW,UAAA,GAAa,CAAA,IAAK,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA,EAAG;AACtE,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,KAAK,CAAA;AACpC,UAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAChD,UAAA,UAAA,IAAA,CAAe,OAAO,KAAA,IAAS,CAAA;AAC/B,UAAA,IAAA,CAAK,IAAA,CAAA,CAAM,GAAA,IAAO,KAAA,IAAS,CAAC,CAAA;AAC5B,UAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,YAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5C,YAAA,IAAI,IAAA,EAAM;AACR,cAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,GAAG,GAAA,EAAK,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAC,CAAC,CAAA;AACjF,cAAA,CAAA,GAAI,GAAA;AACJ,cAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAK,OAAO,GAAA,IAAO,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,OAAS,EAAA,KAAO,GAAA,IAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,KAAM,GAAA,IAAO,KAAK,CAAA,GAAI,CAAC,MAAM,GAAA,EAAM;AACrG,QAAA,MAAM,IAAA,GAAO,EAAA,KAAO,GAAA,GAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACtC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AAC/B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AACpC,QAAA,MAAM,QAAQ,KAAA,KAAU,EAAA,GAAK,KAAK,IAAA,CAAK,KAAA,CAAM,MAAM,KAAK,CAAA;AACxD,QAAA,IAAI,KAAA,KAAU,EAAA,KAAO,OAAA,KAAY,EAAA,IAAM,OAAA,GAAU,KAAA,CAAA,IAAU,KAAA,CAAM,IAAA,EAAK,IAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/F,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAChC,UAAA,MAAM,MAAA,GAAA,CAAU,MAAM,CAAA,GAAI,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,EAAK;AAC5D,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,KAAK,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,KAAA,GAAQ,GAAG,IAAA,EAAM,EAAA,KAAO,GAAA,GAAM,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAK,GAAI,EAAE,QAAQ;AAAA,WAC/F;AACA,UAAA,CAAA,GAAI,KAAA,GAAQ,CAAA;AACZ,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,MAAM,KAAA,GAAQ,mBAAmB,IAAA,CAAK,CAAC,WAAW,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAC,CAAA;AAC5E,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,EAAK,CAAA,GAAI,MAAM,MAAM,CAAA;AAC1C,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AACjC,UAAA,IAAI,KAAA,KAAU,EAAA,KAAO,OAAA,KAAY,EAAA,IAAM,UAAU,KAAA,CAAA,EAAQ;AACvD,YAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA,EAAG,KAAA,GAAQ,GAAG,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY,EAAG,CAAC,CAAA;AACrG,YAAA,CAAA,GAAI,KAAA,GAAQ,CAAA;AACZ,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA,EAAG;AAC9B,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AACpC,UAAA,IAAI,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAK,CAAC,CAAA;AAC3E,UAAA,MAAM,MAAM,KAAA,GAAQ,CAAA;AACpB,UAAA,MAAM,MAAA,GAAS,GAAA,GAAM,CAAA,IAAK,EAAA,GAAK,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAI,IAAA;AAC3E,UAAA,MAAM,IAAA,GAAmB,SAAS,QAAA,GAAW,cAAA;AAC7C,UAAA,MAAM,IAAA,GAAO,SAAS,EAAE,EAAA,EAAI,OAAO,CAAC,CAAA,KAAgB,EAAC;AACrD,UAAA,IAAI,GAAA,GAAM,EAAA,EAAI,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,IAAI,CAAC,CAAA;AAC5D,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,MAAA,CAAO,IAAA,EAAM,GAAG,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAClD,UAAA,CAAA,GAAI,GAAA;AACJ,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA;AAC/C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAG,CAAA,GAAI,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,EAAM,EAAE,GAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA;AACrF,UAAA,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA;AACb,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,CAAA,EAAG,KAAK,MAAM,CAAA;AAC3C,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,SAAS,CAAC,CAAA;AAClC,QAAA,IAAI,GAAA,IAAO,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,UAAU,EAAA,EAAI;AACnC,UAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,UAAA,MAAM,MAAA,GAAS,CAAA,GAAI,GAAA,CAAI,GAAA,CAAI,MAAA;AAC3B,UAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA;AAChD,UAAA,MAAM,UAAA,GAAa,gBAAgB,QAAA,CAAS,IAAI,KAAK,GAAA,CAAI,GAAA,KAAQ,IAAI,IAAI,CAAA,CAAA,CAAA;AACzE,UAAA,IAAI,CAAC,GAAA,CAAI,SAAA,KAAc,MAAA,IAAU,UAAA,CAAA,EAAa;AAC5C,YAAA,IAAI,IAAI,aAAA,EAAe;AACrB,cAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA;AACzF,cAAA,CAAA,GAAI,MAAA;AACJ,cAAA;AAAA,YACF;AACA,YAAA,MAAM,MAAA,GAAS,KAAK,IAAI,CAAA,CAAA,CAAA;AACxB,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA;AACtC,YAAA,MAAM,SAAA,GAAwB,SAAS,UAAA,GAAa,YAAA;AAOpD,YAAA,IAAI,KAAA,KAAU,EAAA,IAAM,UAAA,IAAc,CAAC,KAAK,SAAA,EAAW;AACjD,cAAA,CAAA,GAAI,MAAA;AACJ,cAAA;AAAA,YACF;AACA,YAAA,IAAI,KAAA,KAAU,EAAA,EAAI,OAAO,IAAA,CAAK,KAAK,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,GAAG,KAAA,EAAO,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AACrF,YAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,MAAA;AAC3B,YAAA,IAAI,GAAA,GAAM,EAAA,EAAI,OAAO,IAAA,CAAK,KAAK,KAAA,CAAM,SAAA,EAAW,CAAA,EAAG,GAAA,EAAK,EAAA,EAAI,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAC1E,YAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AACnE,YAAA,CAAA,GAAI,GAAA;AACJ,YAAA;AAAA,UACF;AACA,UAAA,IAAI,GAAA,CAAI,SAAA,IAAa,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG;AACnD,YAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,YAAA,EAAc,GAAG,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,GAAG,IAAI,CAAA;AAAA,UACjG;AACA,UAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,IAAA,CAAK,MAAA,CAAO,qBAAA,CAAsB,GAAA,CAAI,KAAK,IAAI,UAAA,GAAa,SAAA,EAAW,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM;AAAA,cACtF,GAAA,EAAK;AAAA,aACN;AAAA,WACH;AACA,UAAA,CAAA,GAAI,MAAA;AACJ,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,UAAU,mBAAA,CAAoB,IAAA;AAAA,UAClC,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA,IAAK,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,GAAI,KAAK,MAAA,GAAS,CAAC,KAAK,EAAE;AAAA,SACvF;AACA,QAAA,IAAI,WAAW,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAC,MAAM,EAAA,EAAI;AACvC,UAAA,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,EAAE,GAAA,EAAK,OAAA,EAAS,CAAC,CAAA;AAAA,QACzE;AACA,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AACA,MAAA,CAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,EACrD;AACF,CAAA;AAwBO,SAAS,cAAA,CAAe,IAAA,EAAc,OAAA,GAA2B,EAAC,EAAkB;AACzF,EAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,IAAA,EAAM,OAAA,CAAQ,aAAa,KAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,GAAA,EAAI;AAC/E,EAAA,MAAM,EAAA,GAAK,oBAAoB,IAAI,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,MAAqC;AAAA,IACnD,YAAY,MAAA,CAAO,IAAA;AAAA,IACnB,MAAA,EAAQ,IAAA;AAAA,IACR,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,KAAK,MAAA,CAAO,GAAA;AAAA,IACZ,OAAA,EAAS,EAAA,CAAG,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAAA,IACpC,KAAA,EAAO,EAAA,CAAG,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA;AAAA,IAChC,KAAK,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,OAAO,GAAG;AAAA,GAC1C,CAAA;AACA,EAAA,OAAO,GAAA,CAAI,GAAA;AAAA,IACT,CAAC,KAAA,MAAwB;AAAA,MACvB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAA,EAAa,KAAA,CAAM,MAAA,EAAQ,IAAA,IAAwC,IAAA;AAAA,MACnE,QAAA,EAAU,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,OAAO,QAAA,GAAW,IAAA;AAAA,MACjD,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,IAAA,IAAQ,EAAC;AAAA,MAC7B,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAAA,MACjC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,OAAA,EAAS,EAAA,CAAG,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AAAA,MACnC,KAAA,EAAO,EAAA,CAAG,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AAAA,MAC/B,KAAK,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,MAAM,GAAG;AAAA,KACxC;AAAA,GACF;AACF;AAGO,SAAS,WAAW,MAAA,EAAwC;AACjE,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,GAAA,IAAO,KAAA,CAAM,GAAA;AACzC,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,YAAY,MAAA,EAAgD;AAC1E,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,UAAA,EAAY;AAC/C,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,MAAA,EAAQ,KAAA;AAAA,QACR,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM;AAAA,OACZ,CAAA;AAAA,IACH,CAAA,MAAO;AAGL,MAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,OAAA,EAAS,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,OAAA,CAAQ,QAAgC,MAAA,EAAoC;AAC1F,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,OAAO,MAAA,GAAS,CAAA;AACzB,EAAA,OAAO,MAAM,EAAA,EAAI;AACf,IAAA,MAAM,GAAA,GAAO,KAAK,EAAA,KAAQ,CAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,KAAA,EAAO,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,SAAA,IAC5B,MAAA,IAAU,KAAA,CAAM,GAAA,EAAK,EAAA,GAAK,GAAA,GAAM,CAAA;AAAA,SACpC,OAAO,KAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;;;ACnoDO,IAAM,iBAAA,GAAN,cAAgC,KAAA,CAAM;AAAA,EAClC,IAAA;AAAA,EAET,WAAA,CACE,MACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AAAA,EACd;AACF;AAeO,SAAS,SAAA,CAAU,OAAoB,IAAA,EAA0B;AACtE,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,GAAA,EAAK,KAAA,CAAM,KAAK,IAAA,EAAK;AACpD;AAGO,SAAS,UAAA,CACd,QACA,IAAA,EACY;AACZ,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,KAAA,EAAO,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK;AACpE;AAGO,SAAS,cAAA,CAAe,KAAA,EAAoB,IAAA,EAAmB,IAAA,EAA0B;AAC9F,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,GAAA,EAAK,IAAA,CAAK,KAAK,IAAA,EAAK;AACnD;AAYA,IAAM,cAAA,GAAiB,EAAA;AAEvB,SAAS,YAAA,CACP,MACA,GAAA,EACA,IAAA,EACA,UACA,eAAA,EACA,OAAA,EACA,UACA,MAAA,EACQ;AACR,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,IAAI,QAAA,IAAY,QAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA;AAC/E,EAAA,IAAI,eAAA,IAAmB,QAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,eAAe,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,eAAe,CAAA;AACpG,EAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,GAAA,EAAK,KAAK,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAC,CAAA;AACxD,EAAA,IAAI,KAAA,KAAU,EAAA,EAAI,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACtC,EAAA,MAAM,SAAS,QAAA,GAAW,IAAA,GAAO,KAAK,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA,GAAI,EAAA;AACnE,EAAA,IAAI,MAAA,IAAU,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACzC,EAAA,IAAI,WAAW,IAAA,KAAS,CAAA,SAAU,IAAA,CAAK,OAAA,CAAQ,KAAK,IAAI,CAAA;AACxD,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,WAAW,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AAC7D,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AAClC,MAAA,IAAI,MAAM,MAAA,IAAa,CAAA,KAAM,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG;AAClD,MAAA,KAAA,EAAA;AAAA,IACF;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,cAAA,EAAgB,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACrB,MAAA,IAAI,MAAM,MAAA,IAAa,CAAA,KAAM,OAAA,CAAQ,QAAA,GAAW,CAAC,CAAA,EAAG;AACpD,MAAA,KAAA,EAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,SAAA,IAAc,KAAA,KAAU,SAAA,IAAa,OAAO,QAAA,EAAW;AACjE,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,SAAA,GAAY,KAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,GAAW,CAAA,EAAmB;AAClD,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACvC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,OAAO,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,EAAG,CAAA,EAAA;AACvD,EAAA,IAAI,CAAA,GAAI,MAAM,mBAAA,CAAoB,CAAA,EAAG,CAAC,CAAA,IAAK,mBAAA,CAAoB,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAA,EAAA;AACvE,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,YAAA,CAAa,CAAA,EAAW,CAAA,EAAW,MAAA,EAAwB;AAClE,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAA,GAAI,MAAA;AAC3C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,GAAA,IAAO,CAAA,CAAE,UAAA,CAAW,EAAE,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA,KAAM,EAAE,UAAA,CAAW,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,EAAA;AACrF,EAAA,IAAI,CAAA,GAAI,CAAA,KAAM,mBAAA,CAAoB,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,IAAK,mBAAA,CAAoB,CAAA,EAAG,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAA,EAAI,CAAA,EAAA;AAC7F,EAAA,OAAO,CAAA;AACT;AAMO,SAAS,UAAA,CACd,QAAA,EACA,KAAA,EACA,OAAA,GAAyB,EAAC,EACZ;AACd,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,cAAA,CAAe,QAAQ,CAAA;AACxD,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,UAAA,CAAW,MAAM,MAAM,QAAA,EAAU;AACrD,IAAA,MAAM,IAAI,iBAAA,CAAkB,cAAA,EAAgB,2DAA2D,CAAA;AAAA,EACzG;AAEA,EAAA,MAAM,6BAAa,IAAI,GAAA,CAAY,CAAC,CAAA,EAAG,QAAA,CAAS,MAAM,CAAC,CAAA;AACvD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,UAAA,CAAW,GAAA,CAAI,MAAM,KAAK,CAAA;AAC1B,IAAA,UAAA,CAAW,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,EAC1B;AACA,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA0B;AAC/C,EAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA;AAElF,EAAA,MAAM,SAAS,CAAC,GAAG,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,GAAA,GAAM,EAAE,GAAG,CAAA;AAC3E,EAAA,IAAI,WAAA,GAAc,EAAA;AAClB,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,GAAA,GAAM,SAAS,MAAA,IAAU,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK;AACzE,MAAA,MAAM,IAAI,kBAAkB,cAAA,EAAgB,CAAA,MAAA,EAAS,KAAK,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA,qBAAA,CAAuB,CAAA;AAAA,IACrG;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA,EAAG;AAC9C,QAAA,MAAM,IAAI,iBAAA;AAAA,UACR,YAAA;AAAA,UACA,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,KAAK,GAAG,CAAA,sCAAA;AAAA,SACxC;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,IAAK,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,iBAAA;AAAA,QACR,YAAA;AAAA,QACA,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,KAAK,GAAG,CAAA,4CAAA;AAAA,OAClC;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAQ,WAAA,EAAa;AAC5B,MAAA,MAAM,IAAI,kBAAkB,SAAA,EAAW,CAAA,MAAA,EAAS,KAAK,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,GAAG,CAAA,4BAAA,CAA8B,CAAA;AAAA,IACvG;AACA,IAAA,WAAA,GAAc,IAAA,CAAK,GAAA;AAAA,EACrB;AAUA,EAAA,MAAM,YAAwB,EAAC;AAC/B,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,EAAkB,MAAA,EAAgB,WAAA,KAAwB;AAC7E,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AAC3C,IAAA,IAAI,QAAQ,WAAA,EAAa;AACzB,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,EAAK,WAAW,CAAA;AAC5C,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,EAAK,WAAA,EAAa,MAAM,CAAA;AACpD,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,UAAU,QAAA,GAAW,MAAA;AAAA,MACrB,QAAQ,MAAA,GAAS,MAAA;AAAA,MACjB,aAAa,WAAA,CAAY,KAAA,CAAM,MAAA,EAAQ,WAAA,CAAY,SAAS,MAAM;AAAA,KACnE,CAAA;AAAA,EACH,CAAA;AACA,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,eAAA,CAAgB,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC/C,MAAA,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,KAAK,IAAI,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,CAAS,KAAA,CAAM,KAAK,KAAA,EAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AACxD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,KAAA,IAAS,MAAA,CAAO,GAAA,IAAO,IAAA,CAAK,GAAG,CAAA;AAC9F,IAAA,IAAIC,aAAY,IAAA,CAAK,KAAA;AACrB,IAAA,IAAIC,UAAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAE3B,MAAA,MAAM,EAAA,GAAK,YAAA;AAAA,QACT,IAAA,CAAK,IAAA;AAAA,QACL,MAAA,CAAO,GAAA;AAAA,QACPA,UAAAA;AAAA,QACAA,UAAAA,IAAa,OAAO,KAAA,GAAQD,UAAAA,CAAAA;AAAA,QAC5B,IAAA,CAAK,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAM,MAAA,CAAO,KAAA,CAAA;AAAA,QACtC,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAAA,QACnC,MAAA,CAAO,QAAQ,IAAA,CAAK,KAAA;AAAA,QACpB,MAAA,CAAO,MAAM,IAAA,CAAK;AAAA,OACpB;AACA,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,GAAA,IAAO,OAAO,IAAA,CAAK,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,IAAQ,EAAA;AACxE,QAAA,MAAM,IAAI,iBAAA;AAAA,UACR,aAAA;AAAA,UACA,CAAA,MAAA,EAAS,KAAK,KAAK,CAAA,EAAA,EAAK,KAAK,GAAG,CAAA,mCAAA,EAAsC,MAAA,CAAO,UAAU,CAAA,EAClF,IAAA,GAAO,KAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,eAAe,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,MAAA,CAAO,GAAG,CAAA,2CAAA;AAAA,SAEjF;AAAA,MACF;AACA,MAAA,WAAA,CAAYA,UAAAA,EAAW,OAAO,KAAA,EAAO,IAAA,CAAK,KAAK,KAAA,CAAMC,UAAAA,EAAW,EAAE,CAAC,CAAA;AACnE,MAAAD,aAAY,MAAA,CAAO,GAAA;AACnB,MAAAC,UAAAA,GAAY,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,MAAA;AAAA,IAC9B;AACA,IAAA,WAAA,CAAYD,YAAW,IAAA,CAAK,GAAA,EAAK,KAAK,IAAA,CAAK,KAAA,CAAMC,UAAS,CAAC,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,SAAS,EAAC;AAAA,MACV,SAAA,EAAW,EAAE,EAAA,EAAI,IAAA,EAAM,4BAA4B,IAAA,EAAM,SAAA,EAAW,EAAC,EAAE;AAAA,MACvE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,UAA4F,EAAC;AACnG,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,IAAA,IAAQ,QAAA,CAAS,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,GAAW,KAAA;AACjC,IAAA,IAAA,IAAQ,IAAA,CAAK,WAAA;AACb,IAAA,MAAM,MAAA,GAAS,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,QAAA,IAAY,CAAA,CAAE,GAAA,IAAO,IAAA,CAAK,MAAM,CAAA;AACjF,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,UAAA,EAAY,KAAA,EAAO,KAAA,IAAS,IAAA,CAAK,QAAA;AAAA,MACjC,QAAA,EAAU,KAAA,EAAO,GAAA,IAAO,IAAA,CAAK,MAAA;AAAA,MAC7B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,KAAA,IAAS,IAAA,CAAK,WAAA,CAAY,MAAA,IAAU,IAAA,CAAK,SAAS,IAAA,CAAK,QAAA,CAAA;AACvD,IAAA,MAAA,GAAS,IAAA,CAAK,MAAA;AAAA,EAChB;AACA,EAAA,IAAA,IAAQ,QAAA,CAAS,MAAM,MAAM,CAAA;AAE7B,EAAA,MAAM,KAAA,GAAQ,oBAAoB,QAAQ,CAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,oBAAoB,IAAI,CAAA;AACtC,EAAA,MAAM,OAAA,GAA0B,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IACvD,GAAG,MAAA;AAAA,IACH,UAAA,EAAY,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC7C,QAAA,EAAU,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA;AAAA,IACzC,UAAA,EAAY,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC7C,QAAA,EAAU,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,MAAM;AAAA,GAC3C,CAAE,CAAA;AAGF,EAAA,IAAI,0BAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,SAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,MAAA,CAAO,QAAQ,CAAA,EAAG;AACzF,MAAA,0BAAA,GAA6B,KAAA;AAAA,IAC/B;AACA,IAAA,SAAA,GAAY,MAAA,CAAO,MAAA;AACnB,IAAA,SAAA,GAAY,MAAA,CAAO,MAAA;AAAA,EACrB;AACA,EAAA,IAAI,QAAA,CAAS,MAAM,SAAS,CAAA,KAAM,KAAK,KAAA,CAAM,SAAS,GAAG,0BAAA,GAA6B,KAAA;AAItF,EAAA,MAAM,SAAA,GAAY,eAAe,IAAI,CAAA;AACrC,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAsB;AACpD,EAAA,KAAA,MAAW,MAAA,IAAU,WAAA,CAAY,SAAS,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAC/C,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,2BACP,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,MAAM,YAA+B,EAAC;AAItC,EAAA,MAAM,UAAU,CAAC,MAAA,KACf,MAAA,CAAO,IAAA,CAAK,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,KAAA,IAAS,IAAA,CAAK,SAAS,MAAA,CAAO,GAAA,IAAO,KAAK,GAAG,CAAA;AAC5F,EAAA,MAAM,gBAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAA,CAAE,CAAA,EAAG;AAC1D,IAAA,MAAM,WAAA,GAAc,YAAY,OAAA,EAAS,MAAA,CAAO,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,GAAA;AACrE,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,GAAA,CAAI,WAAW,CAAA;AACpD,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAW,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA,EAAG;AACnD,MAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnB,QAAA,aAAA,CAAc,KAAK,MAAM,CAAA;AACzB,QAAA;AAAA,MACF;AACA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,IAAO,MAAM,IAAA,CAAK,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,IAAQ,EAAA;AACrE,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,aAAA;AAAA,MACA,CAAA,+BAAA,EAAkC,KAAA,CAAM,UAAU,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,YAAA,EAC/E,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,GAAG,CAAA,gDAAA,EAC1B,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,CAAA,MAAA,EAAS,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA,MAAA,CAAA,GAAW,EAAE,CAAA,0CAAA;AAAA,KAChF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,EAAA,EAAI,0BAAA,IAA8B,SAAA,CAAU,MAAA,KAAW,CAAA;AAAA,IACvD,0BAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAA,CAAK,OAAA,CAAQ,gBAAA,IAAoB,IAAA,KAAS,CAAC,UAAU,EAAA,EAAI;AACvD,IAAA,MAAM,QAAQ,SAAA,CACX,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,IAAI,CAAC,MAAA,KAAW,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA,CACtD,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,iBAAA;AAAA,MACR,WAAA;AAAA,MACA,iCAAiC,SAAA,CAAU,MAAM,0CAC5C,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,EAAG,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,aAAQ,EAAE,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAC9D,0BAAA,GAA6B,KAAK,mCAAmC,CAAA;AAAA,KAC5E;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,OAAA,EAAS,SAAA,EAAW,QAAQ,SAAA,EAAU;AACtE;AAqBO,SAAS,WAAA,CACd,OAAA,EACA,GAAA,EACA,OAAA,GAAsB,EAAC,EACP;AAChB,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,QAAQ,IAAA,KAAS,WAAA;AAC5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,QAAA,GAAW,EAAA,GAAK,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,QAAA;AACjD,IAAA,MAAM,MAAA,GAAS,EAAA,GAAK,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,MAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,EAAA,GAAK,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,QAAA;AACjD,IAAA,MAAM,MAAA,GAAS,EAAA,GAAK,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,MAAA;AAC7C,IAAA,IAAI,MAAM,QAAA,EAAU;AACpB,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,KAAA,GAAQ,MAAA,GAAS,MAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAa,MAAA,EAAQ;AAEvB,MAAA,OAAO,EAAE,GAAA,EAAK,KAAA,GAAQ,IAAI,QAAA,GAAW,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,IAC9D;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,KAAA,EAAM;AAC7D,IAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,SAAS,KAAA,EAAM;AACzD,IAAA,OAAO,EAAE,GAAA,EAAK,KAAA,GAAQ,IAAI,QAAA,GAAW,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,EAC7D;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,GAAM,KAAA,EAAO,SAAS,KAAA,EAAM;AAC5C;AAYO,SAAS,QAAA,CACd,OAAA,EACA,KAAA,EACA,GAAA,EACA,OAA8B,OAAA,EACjB;AACb,EAAA,MAAM,KAAK,IAAA,KAAS,WAAA;AACpB,EAAA,MAAM,WAAA,GAAc,YAAY,OAAA,EAAS,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAM,CAAA;AAClE,EAAA,MAAM,SAAA,GAAY,YAAY,OAAA,EAAS,GAAA,EAAK,EAAE,KAAA,EAAO,EAAA,EAAI,MAAM,CAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW;AACvC,IAAA,MAAM,QAAA,GAAW,EAAA,GAAK,MAAA,CAAO,UAAA,GAAa,MAAA,CAAO,QAAA;AACjD,IAAA,MAAM,MAAA,GAAS,EAAA,GAAK,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,MAAA;AAC7C,IAAA,OAAO,QAAA,GAAW,OAAO,MAAA,GAAS,KAAA;AAAA,EACpC,CAAC,CAAA;AACD,EAAA,MAAM,WAAW,WAAA,CAAY,GAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,UAAU,GAAG,CAAA;AAC/C,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,SAAS,SAAA,EAAW,MAAA,KAAW,QAAA,IAAY,GAAA,GAAM,KAAA,EAAM;AAChG;;;ACjfO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAO,MAAM,IAAA,EAAK,CAAE,QAAQ,MAAA,EAAQ,GAAG,EAAE,WAAA,EAAY;AACvD;AAEA,IAAM,UAAA,GACJ,sJAAA;AAGK,SAAS,uBAAuB,IAAA,EAA2C;AAChF,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA4B;AAC7C,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,UAAA,EAAW,IAAK,mBAAA,CAAoB,IAAI,CAAA,EAAG;AAC7D,IAAA,MAAM,GAAA,GAAM,mBAAmB,KAAK,CAAA;AACpC,IAAA,IAAI,GAAA,IAAO,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,wBAAwB,IAAA,EAAwB;AAC9D,EAAA,OAAO,mBAAA,CAAoB,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,EAAE,IAAA,OAAW,IAAI,CAAA;AACzD;AAEA,SAAS,oBAAoB,IAAA,EAAkF;AAC7G,EAAA,MAAM,QAA4E,EAAC;AACnF,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,GAAG,OAAO,KAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,EAAA,IAAI,qBAAA,GAAwB,KAAA;AAC5B,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,IAAA,MAAM,aAAA,GAAgB,qBAAA;AACtB,IAAA,qBAAA,GAAwB,KAAA;AACxB,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,OAAA,EAAS;AAC1B,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,IAAI,CAAC,CAAA,EAAG;AAGR,IAAA,MAAM,QAAQ,CAAA,GAAI,CAAA,GAAI,MAAM,CAAA,GAAI,CAAC,KAAK,EAAA,GAAK,EAAA;AAC3C,IAAA,MAAM,UAAA,GACJ,CAAA,KAAM,CAAA,IAAK,CAAC,MAAM,IAAA,EAAK,IAAK,aAAA,IAAiB,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,OAAA,IAAW,gDAAA,CAAiD,KAAK,KAAK,CAAA;AACtI,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACtB,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,qBAAA,GAAwB,IAAA;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,UAAA,EAAY,EAAE,GAAA,EAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA,EAAK,EAAG,CAAA;AAAA,EAC7G,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT;AAEA,IAAM,SAAA,GAAY,iEAAA;AAElB,IAAM,cAAc,CAAC,KAAA,KAAkB,KAAA,CAAM,OAAA,CAAQ,UAAU,MAAM,CAAA;AAM9D,SAAS,qBAAA,CAAsB,UAAkB,IAAA,EAAmD;AACzG,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,IAAK,CAAC,SAAS,QAAA,CAAS,GAAG,GAAG,OAAO,QAAA;AACvD,EAAA,MAAM,WAAA,GAAc,QAAA;AACpB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,QAAA,EAAU,CAAC,QAAQ,GAAA,KAAQ;AAC3D,IAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,IAAA,OAAO,GAAG,WAAW,CAAA,EAAG,MAAM,MAAA,GAAS,CAAC,GAAG,WAAW,CAAA,CAAA;AAAA,EACxD,CAAC,CAAA;AACD,EAAA,MAAM,QAAA,GAAW,OAAO,OAAA,CAAQ,SAAA,EAAW,CAAC,KAAA,EAAe,IAAA,EAAc,IAAA,EAAc,GAAA,EAAyB,EAAA,KAAe;AAC7H,IAAA,IAAI,KAAK,CAAA,IAAK,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,MAAM,OAAO,KAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,KAAA;AACjC,IAAA,MAAM,MAAM,kBAAA,CAAmB,GAAA,KAAQ,UAAa,GAAA,KAAQ,EAAA,GAAK,OAAO,GAAG,CAAA;AAC3E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,KAAU,IAAA,GAAO,KAAK,CAAA,EAAA,EAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,CAAA,CAAA,CAAA,GAAM,GAAA,CAAI,GAAA;AAC5D,IAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,GAAG,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA,EACxC,CAAC,CAAA;AACD,EAAA,OAAO,SAAS,OAAA,CAAQ,IAAI,OAAO,CAAA,EAAG,WAAW,SAAS,WAAW,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,CAAC,IAAY,CAAA,KAAc,KAAA,CAAM,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;AAClI","file":"source.cjs","sourcesContent":["/**\n * UTF-16 ⇄ code-point offset conversion.\n *\n * JavaScript strings are indexed in UTF-16 code units; Postgres `position()`,\n * `substring()` and `length()` count code points. Every offset this module\n * emits is given in BOTH units so an anchor captured on either side of the\n * wire can be mapped without re-deriving the text.\n */\n\n/** Indexes the surrogate pairs of one text so conversion is O(log pairs). */\nexport interface CodePointIndex {\n /** Code-point offset of a UTF-16 offset. */\n toCodePoint(utf16: number): number;\n /** UTF-16 offset of a code-point offset. */\n toUtf16(codePoint: number): number;\n /** Code-point length of the text. */\n readonly lengthCp: number;\n}\n\nfunction isHigh(code: number): boolean {\n return code >= 0xd800 && code <= 0xdbff;\n}\nfunction isLow(code: number): boolean {\n return code >= 0xdc00 && code <= 0xdfff;\n}\n\n/** True when `offset` sits between the two halves of a surrogate pair. */\nexport function splitsSurrogatePair(text: string, offset: number): boolean {\n if (offset <= 0 || offset >= text.length) return false;\n return isHigh(text.charCodeAt(offset - 1)) && isLow(text.charCodeAt(offset));\n}\n\nexport function buildCodePointIndex(text: string): CodePointIndex {\n // UTF-16 offsets of every high surrogate that starts a valid pair.\n const pairStarts: number[] = [];\n for (let i = 0; i < text.length - 1; i++) {\n if (isHigh(text.charCodeAt(i)) && isLow(text.charCodeAt(i + 1))) {\n pairStarts.push(i);\n i++;\n }\n }\n\n /** Number of pair starts strictly less than `limit`. */\n const countBelow = (limit: number): number => {\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((pairStarts[mid] as number) < limit) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n };\n\n const toCodePoint = (utf16: number): number => {\n // Every pair fully before `utf16` counts one code unit too many; a pair\n // whose low half sits exactly at `utf16 - 1` is also fully before it.\n return utf16 - countBelow(utf16 - 1);\n };\n\n const toUtf16 = (codePoint: number): number => {\n // Smallest u with toCodePoint(u) >= codePoint, walked by pair count.\n let lo = 0;\n let hi = pairStarts.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n // Code point of the pair start `pairStarts[mid]`.\n const start = pairStarts[mid] as number;\n if (start - mid < codePoint) lo = mid + 1;\n else hi = mid;\n }\n return codePoint + lo;\n };\n\n return {\n toCodePoint,\n toUtf16,\n lengthCp: text.length - pairStarts.length,\n };\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toCodePointOffset(text: string, utf16: number): number {\n return buildCodePointIndex(text).toCodePoint(utf16);\n}\n\n/** One-shot conversion; build an index when converting many offsets. */\nexport function toUtf16Offset(text: string, codePoint: number): number {\n return buildCodePointIndex(text).toUtf16(codePoint);\n}\n","/**\n * The protected-construct vocabulary the source tokenizer recognises.\n *\n * Each list mirrors a live list in matrx-frontend's renderer splitter\n * (`content-splitter-v2.ts`) or its raw-HTML sanitizer (`rehypeSafeRawHtml.ts`);\n * the source is named on every constant. Inventory:\n * common-docs `projects/rich-content-unification/evidence/r2-protected-syntax.md`.\n */\n\n/** `XML_TAG_BLOCKS` — line-leading, attribute-less XML regions. */\nexport const XML_TAG_BLOCK_NAMES: readonly string[] = [\n \"thinking\",\n \"think\",\n \"reasoning\",\n \"info\",\n \"task\",\n \"database\",\n \"private\",\n \"plan\",\n \"event\",\n \"tool\",\n \"questionnaire\",\n \"flashcards\",\n \"cooking_recipe\",\n \"timeline\",\n \"progress_tracker\",\n \"troubleshooting\",\n \"resources\",\n \"research\",\n];\n\n/** The thinking family — the only XML regions recognised mid-line and as orphan closers. */\nexport const THINKING_FAMILY: readonly string[] = [\"thinking\", \"think\", \"reasoning\"];\n\n/** `ATTRIBUTE_XML_BLOCKS` — attribute-bearing XML, also detected mid-line. */\nexport const ATTRIBUTE_XML_NAMES: readonly string[] = [\n \"decision\",\n \"artifact\",\n \"editor_error\",\n \"editor_code_snippet\",\n \"audiocite\",\n];\n\nexport const KNOWN_XML_TAG_NAMES: ReadonlySet<string> = new Set([\n ...XML_TAG_BLOCK_NAMES,\n ...ATTRIBUTE_XML_NAMES,\n]);\n\n/** `ALLOWED_RAW_HTML_TAGS` (rehypeSafeRawHtml.ts) — raw HTML the renderer honours. */\nexport const ALLOWED_RAW_HTML_TAGS: ReadonlySet<string> = new Set([\n \"img\", \"a\", \"br\", \"hr\", \"span\", \"p\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"s\",\n \"del\", \"ins\", \"sup\", \"sub\", \"mark\", \"kbd\", \"abbr\", \"small\", \"code\", \"pre\",\n \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\", \"details\", \"summary\",\n]);\n\n/**\n * CommonMark HTML-block type 6 names within the allow-list: a line opening\n * with one of these starts an HTML block that runs to the next blank line.\n */\nexport const HTML_BLOCK_LEVEL_TAGS: ReadonlySet<string> = new Set([\n \"p\", \"hr\", \"ul\", \"ol\", \"li\", \"blockquote\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\",\n \"h6\", \"table\", \"thead\", \"tbody\", \"tfoot\", \"tr\", \"th\", \"td\", \"caption\",\n \"colgroup\", \"col\", \"figure\", \"figcaption\", \"details\", \"summary\",\n]);\n\n/** `SPECIAL_CODE_LANGUAGES` — fence languages the renderer promotes to kinds. */\nexport const SPECIAL_CODE_LANGUAGES: ReadonlySet<string> = new Set([\n \"transcript\", \"tasks\", \"structured_info\", \"questionnaire\", \"flashcards\",\n \"cooking_recipe\", \"mermaid\", \"svg\", \"chart\", \"map\", \"stats\", \"diff\",\n \"html\", \"react\", \"matrx\",\n]);\n\n/** `CODE_LANGUAGE_ALIASES`. */\nexport const CODE_LANGUAGE_ALIASES: Readonly<Record<string, string>> = {\n mmd: \"mermaid\",\n jsx: \"react\",\n tsx: \"react\",\n};\n\n/** `JSON_BLOCK_PATTERNS` root keys → typed JSON block type. */\nexport const TYPED_JSON_ROOT_KEYS: Readonly<Record<string, string>> = {\n quiz_title: \"quiz\",\n presentation: \"presentation\",\n decision_tree: \"decision_tree\",\n comparison: \"comparison_table\",\n diagram: \"diagram\",\n math_problem: \"math_problem\",\n item_presentation: \"item_presentation\",\n name: \"schema_proposal\",\n};\n\n/** Box-drawing glyphs that mark a tree diagram (`TREE_CHARS`). */\nexport const TREE_GLYPHS = /[├└│┌┐┘┬┴┤┼─]/;\n\n/** A pinned annotation anchor (STORE-DESIGN §3.19): `<!--@a:k3f9-->`. */\nexport const PINNED_ANCHOR_RE = /^<!--@a:([A-Za-z0-9_-]+)-->$/;\n\n/** remarkMatrxVariable's strict variable token. */\nexport const STRICT_VARIABLE_RE = /^\\{\\{([a-zA-Z_][a-zA-Z0-9_.]*)\\}\\}$/;\n\n/** remarkMatrxCite's citation marker, anchored at the cursor. */\nexport const CITE_RE = /^<matrxcite\\s+n=\"(\\d+)\"\\s*\\/>/;\n\nexport function normalizeFenceLanguage(language: string): string {\n const lower = language.toLowerCase();\n return CODE_LANGUAGE_ALIASES[lower] ?? lower;\n}\n","// ─────────────────────────────────────────────────────────────────────────\n// THE ONE NESTED-FENCE RULE for a ```markdown / ```md / ```mdx fence.\n//\n// Source of truth (moved here from matrx-frontend\n// components/markdown-core/fence-nesting.ts, 2026-09-25). Consumers: the\n// source tokenizer (source/tokenize.ts), matrx-frontend's static splitter and\n// live StreamBlockAccumulator, and — by conformance, since Python cannot\n// import this — aidream matrx-ai `processing/blocks/fence_nesting.py`, which\n// runs the SAME generated vectors (`__tests__/fence-nesting-vectors.json`,\n// byte-identical copy at packages/matrx-ai/tests/fixtures/).\n//\n// Models write a markdown document inside a ```markdown fence and put their\n// own ```python … ``` blocks inside it with the SAME three backticks. Under\n// strict CommonMark the first inner bare ``` closes the outer fence: the\n// document ends mid-way, the rest leaks out as prose, and the outer closing\n// ``` opens a phantom code block that swallows everything after it.\n//\n// The rule, for MARKDOWN-language fences only (every other language keeps\n// strict CommonMark — a ```bash heredoc is code, not a document):\n// - a fence line WITH an info string (```python) opens a nested fence;\n// - a bare fence line (``` with at least the opener's tick count) closes\n// the innermost nested fence while one is open, and closes the outer\n// fence only when none is;\n// - a longer outer fence (````markdown) keeps working exactly as before —\n// an inner ``` is shorter than the opener, so it is plain content;\n// - if the text ENDS with a nested fence still open, the extraction is\n// redone under strict CommonMark (an unclosed inner fence must not eat\n// the outer closer and the rest of the message).\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Fence languages whose body is itself a markdown document. */\nexport const NESTING_FENCE_LANGUAGES: ReadonlySet<string> = new Set([\n \"markdown\",\n \"md\",\n \"mdx\",\n]);\n\n/** True when a fence opened with this info-string language nests inner fences. */\nexport function fenceNestsInnerFences(language: string | undefined | null): boolean {\n return !!language && NESTING_FENCE_LANGUAGES.has(language.toLowerCase());\n}\n\nexport type InnerFenceLine =\n /** Not a fence line — ordinary content of the outer fence. */\n | \"content\"\n /** ```lang inside a markdown fence — content, and one level deeper. */\n | \"open-nested\"\n /** Bare ``` that closes the innermost nested fence — content, one level up. */\n | \"close-nested\"\n /** Bare ``` that closes the OUTER fence. */\n | \"close-outer\";\n\n/**\n * Classify one line inside an open backtick fence, already trimmed with\n * {@link trimFenceLine} (never a language's own `trim()`).\n *\n * @param trimmed the line with surrounding whitespace removed\n * @param openTicks backtick count of the outer fence's opener\n * @param nests whether the outer fence follows the nesting rule\n * @param nestedDepth how many nested fences are open right now\n */\n/**\n * The whitespace a fence line may carry around its backticks and info string:\n * CommonMark's ASCII whitespace — space, tab, LF, CR, form feed, vertical tab.\n * Defined HERE, not by a language's `trim()`: JavaScript's `trim()` also strips\n * U+FEFF, U+00A0 and the Unicode spaces, while Python's `strip()` also strips\n * U+0085 and U+001C–U+001F — which made the two twins disagree on lines such\n * as ```` ```\\uFEFF ```` (verify-RC-B3 residual R4). Every caller trims a line\n * with `trimFenceLine` before classifying it; the Python twin mirrors both.\n */\nexport const FENCE_WHITESPACE = \" \\t\\n\\r\\f\\v\";\n\nfunction isFenceWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_WHITESPACE.includes(ch);\n}\n\n/** Strip {@link FENCE_WHITESPACE} (and nothing else) from both ends of a line. */\nexport function trimFenceLine(line: string): string {\n let start = 0;\n let end = line.length;\n while (start < end && isFenceWhitespace(line[start])) start++;\n while (end > start && isFenceWhitespace(line[end - 1])) end--;\n return start === 0 && end === line.length ? line : line.slice(start, end);\n}\n\n/**\n * The whitespace around a fence OPENER and inside its info string. The\n * renderer finds openers with JavaScript's `String#trim()` and splits the info\n * string on `/\\s/`; this set IS that definition, written out so the Python\n * twin can match it exactly — ECMAScript WhiteSpace + LineTerminator. It\n * differs from Python's `str.split()` on U+0085 and U+001C–U+001F (not JS\n * whitespace) and U+FEFF (JS whitespace) — verify-RC-B3 residual R4′.\n */\nexport const FENCE_OPENER_WHITESPACE =\n \"\\t\\n\\v\\f\\r \\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff\";\n\nfunction isOpenerWhitespace(ch: string | undefined): boolean {\n return ch !== undefined && ch !== \"\" && FENCE_OPENER_WHITESPACE.includes(ch);\n}\n\n/**\n * Parse a backtick fence OPENER line the way the renderer does: trim the line,\n * count the backtick run (3+), trim the rest, and take the first\n * whitespace-separated word as the language. null when the line opens nothing —\n * including when the info string holds a backtick (GFM / CommonMark 4.5:\n * \"```` code ````\" and \"``` `x` | b\" are code spans, never fences).\n */\nexport function parseFenceOpener(line: string): { ticks: number; lang: string } | null {\n let start = 0;\n let end = line.length;\n while (start < end && isOpenerWhitespace(line[start])) start++;\n while (end > start && isOpenerWhitespace(line[end - 1])) end--;\n let ticks = 0;\n while (start + ticks < end && line[start + ticks] === \"`\") ticks++;\n if (ticks < 3) return null;\n if (line.slice(start + ticks, end).includes(\"`\")) return null;\n let infoStart = start + ticks;\n while (infoStart < end && isOpenerWhitespace(line[infoStart])) infoStart++;\n let langEnd = infoStart;\n while (langEnd < end && !isOpenerWhitespace(line[langEnd])) langEnd++;\n return { ticks, lang: line.slice(infoStart, langEnd) };\n}\n\nexport function classifyInnerFenceLine(\n trimmed: string,\n openTicks: number,\n nests: boolean,\n nestedDepth: number,\n): InnerFenceLine {\n let ticks = 0;\n while (ticks < trimmed.length && trimmed[ticks] === \"`\") ticks++;\n if (ticks < 3) return \"content\";\n const info = trimFenceLine(trimmed.slice(ticks));\n if (info === \"\") {\n if (ticks < openTicks) return \"content\";\n if (nests && nestedDepth > 0) return \"close-nested\";\n return \"close-outer\";\n }\n // A fence line with an info string never closes anything (CommonMark).\n // Inside a markdown fence it opens a nested one — unless the outer opener is\n // LONGER, in which case CommonMark already treats the inner fence as content\n // and its bare closer can never reach the outer fence.\n if (nests && ticks >= openTicks && !info.includes(\"`\")) return \"open-nested\";\n return \"content\";\n}\n","/**\n * THE ONE CODE-RANGE RULE — where code is in markdown source, for every surface.\n *\n * Ruling (RC-B10, 2026-09-25, REGISTER rulings ledger): the rule is the\n * RENDERER's rule — what the chat renderer's splitter, the source tokenizer\n * and the Python block detector already agree on — made container-aware only\n * where the renderer hands a block to remark:\n * - a BACKTICK fence opens on a line whose whitespace-trimmed text starts\n * with ``` at ANY indent (so a fence inside a list item opens at any\n * depth), after stripping blockquote `>` prefixes;\n * - a TILDE fence opens at ≤ 3 spaces relative to its container (a list\n * item's content column, inside any `>` prefixes);\n * - a backtick fence closes by THE nested-fence rule (`fence-nesting.ts`,\n * with the strict-CommonMark retry when a nested fence is left open) or by\n * the renderer's line-end closer (`code```` with nothing after it); inside\n * a ```json fence a backtick run inside a JSON string is text;\n * - a fence inside a blockquote ends where the blockquote ends;\n * - strict CommonMark's \"4+ spaces is not a fence\" is rejected on purpose:\n * users see what the renderer's splitter draws.\n * Inline code spans pair equal-length backtick runs inside one paragraph.\n *\n * Order is the renderer's: phase 1 is the splitter — every raw line whose\n * trimmed text starts with ``` opens a block, before remark sees anything\n * (so `- ```` can never close on a later raw ``` line; that line opens a\n * splitter block instead). Phase 2 is remark inside each prose segment the\n * splitter left: blockquote fences, fences on a list-marker line, tilde\n * fences, and code spans — none can run past its segment. A ``` line inside a\n * tilde fence is therefore drawn as code up to ITS closer (the splitter does\n * not know ~~~), exactly the tokenizer's `rendererOverflow`.\n *\n * Consumers: `findCodeRanges` (math pairing, kit's delimiter guard, chat's\n * speakable text, print, every matrx-frontend walker), and the line-level\n * primitives `fenceOpenerOf` / `closeFence`, which the tokenizer and the\n * renderer's splitters drive line by line. A private copy of fence or\n * code-span detection anywhere fails `__tests__/one-code-range-rule.test.ts`.\n */\nimport { classifyInnerFenceLine, fenceNestsInnerFences, parseFenceOpener, trimFenceLine } from \"./fence-nesting\";\n\nexport interface CodeRange {\n /** UTF-16 offset of the first character (the fence line start, or the opening backtick run). */\n start: number;\n /** Offset just past the closing fence line's content / closing backtick run (the fence's last line when unclosed). */\n end: number;\n kind: \"fence\" | \"span\";\n}\n\nexport interface FenceOpener {\n char: \"`\" | \"~\";\n /** Length of the opening run. */\n ticks: number;\n /** The info string's first word (\"\" when none). */\n lang: string;\n}\n\n/**\n * THE opener rule for one line's content (container prefixes already\n * removed; for a tilde fence, `content` starts at the container's column).\n */\nexport function fenceOpenerOf(content: string): FenceOpener | null {\n const t = content.trimStart();\n if (t.startsWith(\"```\")) {\n // THE opener parse: a backtick in the info string opens nothing (CommonMark 4.5).\n const parsed = parseFenceOpener(t);\n if (!parsed) return null;\n return { char: \"`\", ticks: parsed.ticks, lang: parsed.lang };\n }\n if (content.length - t.length <= 3 && t.startsWith(\"~~~\")) {\n const open = /^(~{3,})(.*)$/.exec(t);\n if (!open) return null;\n return { char: \"~\", ticks: (open[1] as string).length, lang: (open[2] as string).trim().split(/\\s/)[0] ?? \"\" };\n }\n return null;\n}\n\n/**\n * Does this line START a fenced code block? THE opener rule (`fenceOpenerOf`),\n * which follows CommonMark 4.5: a `~~~` run, or a backtick run whose info string\n * holds no backtick. Kept as a named predicate for block-boundary readers (a\n * table's end, source/gfm-table.ts).\n */\nexport function opensStrictFence(line: string): boolean {\n return fenceOpenerOf(line) !== null;\n}\n\n/** The lines a fence is read from. */\nexport interface FenceLines {\n count: number;\n /** Line `k`'s content (no terminator), or null when the fence's container has ended before it. */\n line(k: number): string | null;\n /** Streaming: line `k` has not ended yet, so it closes nothing. */\n openTail?(k: number): boolean;\n /**\n * Streaming: more lines may still arrive. The strict-CommonMark retry\n * applies only while the nested reading ends inside a nested fence — a\n * later line can close that nested fence, so a retry's closer is\n * undecided and the fence stays open (verify-RC-B3 F3).\n */\n streaming?: boolean;\n}\n\nexport interface FenceEnd {\n /** The closing line when `closed`; otherwise the fence's last line (text end, or the line before its container ended). */\n line: number;\n closed: boolean;\n}\n\n/**\n * THE closer rule, read line by line — the one implementation behind\n * `closeFence` and every streaming walker. Feed each following line\n * (container prefixes removed); `feed` returns true on the line that closes\n * the fence. A backtick fence closes by the nested-fence rule or the\n * renderer's line-end closer (`code````), and inside ```json a backtick run in\n * a JSON string is text; a tilde fence closes on `~~~` (≥ its length, ≤ 3\n * spaces). `nesting: false` forces strict CommonMark (the retry `closeFence`\n * makes when a nested fence is left open at the end; a streaming reader\n * cannot look ahead, so it reads with nesting and never retries).\n */\nexport class FenceReader {\n readonly opener: FenceOpener;\n private state = { inString: false, escaped: false };\n private depth = 0;\n /** A nested fence was opened at some point. */\n sawNested = false;\n private readonly isJson: boolean;\n private readonly nesting: boolean;\n private readonly tildeCloser: RegExp | null;\n\n constructor(\n opener: FenceOpener,\n options: { nesting?: boolean } = {},\n ) {\n this.opener = opener;\n this.isJson = opener.char === \"`\" && opener.lang === \"json\";\n this.nesting = opener.char === \"`\" && (options.nesting ?? fenceNestsInnerFences(opener.lang));\n this.tildeCloser = opener.char === \"~\" ? new RegExp(`^ {0,3}~{${opener.ticks},}[ \\\\t]*$`) : null;\n }\n\n /** How many nested fences are open right now. */\n get nestedDepth(): number {\n return this.depth;\n }\n\n feed(line: string): boolean {\n if (this.tildeCloser) return this.tildeCloser.test(line);\n const trimmedLine = trimFenceLine(line);\n const at = line.indexOf(\"```\");\n if (at === -1) {\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n if (this.isJson) {\n const probe = jsonStringState(line, 0, at, this.state);\n if (probe.inString) {\n this.state = jsonStringState(line, at, line.length, probe);\n return false;\n }\n }\n if (trimmedLine.startsWith(\"```\")) {\n const kind = classifyInnerFenceLine(trimmedLine, this.opener.ticks, this.nesting, this.depth);\n if (kind === \"close-outer\") return true;\n if (kind === \"open-nested\") {\n this.depth++;\n this.sawNested = true;\n }\n if (kind === \"close-nested\") this.depth--;\n } else {\n // The renderer's line-end closer: `code```` with nothing after the run.\n const closeTicks = backtickRunLength(line, at);\n const after = trimFenceLine(line.slice(at + closeTicks));\n if (closeTicks >= this.opener.ticks && after === \"\" && this.depth === 0) return true;\n }\n if (this.isJson) this.state = jsonStringState(line, 0, line.length, this.state);\n return false;\n }\n}\n\n/** Where the fence opened on line `open` ends. */\nexport function closeFence(src: FenceLines, open: number, opener: FenceOpener): FenceEnd {\n const first = readFence(src, open, new FenceReader(opener));\n if (first.closed || !first.reader.sawNested || first.reader.nestedDepth <= 0) return { line: first.line, closed: first.closed };\n if (src.streaming) return { line: first.line, closed: false };\n const strict = readFence(src, open, new FenceReader(opener, { nesting: false }));\n return { line: strict.line, closed: strict.closed };\n}\n\nfunction readFence(src: FenceLines, open: number, reader: FenceReader): FenceEnd & { reader: FenceReader } {\n for (let k = open + 1; k < src.count; k++) {\n // Streaming: a bare ``` on the unfinished last line may still grow into ```bash.\n if (src.openTail?.(k)) continue;\n const line = src.line(k);\n if (line === null) return { line: k - 1, closed: false, reader };\n if (reader.feed(line)) return { line: k, closed: true, reader };\n }\n return { line: src.count - 1, closed: false, reader };\n}\n\n/** JSON-string state after scanning `line[from, upTo)` from the given state. */\nexport function jsonStringState(\n line: string,\n from: number,\n upTo: number,\n state: { inString: boolean; escaped: boolean },\n): { inString: boolean; escaped: boolean } {\n let { inString, escaped } = state;\n for (let idx = from; idx < upTo; idx++) {\n const ch = line[idx];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\" && inString) {\n escaped = true;\n continue;\n }\n if (ch === '\"') inString = !inString;\n }\n return { inString, escaped };\n}\n\nexport function backtickRunLength(str: string, pos: number): number {\n let n = 0;\n while (pos + n < str.length && str[pos + n] === \"`\") n++;\n return n;\n}\n\n// ── the whole-text scan ────────────────────────────────────────────────────\n\n/** Blockquote prefix: how many `>` markers open the line, and where its content starts. */\nfunction quotePrefix(line: string): { depth: number; offset: number } {\n let depth = 0;\n let offset = 0;\n for (;;) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return { depth, offset };\n depth++;\n offset += m[0].length;\n }\n}\n\n/** Strip exactly `depth` blockquote markers; null when the line has fewer (the blockquote ended). */\nfunction stripQuotes(line: string, depth: number): string | null {\n let offset = 0;\n for (let d = 0; d < depth; d++) {\n const m = /^ {0,3}> ?/.exec(line.slice(offset));\n if (!m) return null;\n offset += m[0].length;\n }\n return line.slice(offset);\n}\n\nconst LIST_ITEM = /^( *)([-*+]|\\d{1,9}[.)])( +|\\t|$)/;\n\nfunction leadingSpaces(s: string): number {\n let i = 0;\n while (i < s.length && s[i] === \" \") i++;\n return i;\n}\n\ninterface Scan {\n ranges: CodeRange[];\n /** Every fence as lines: [opener line, last line, closed]. */\n fences: Array<[number, number, boolean]>;\n /** Paragraph runs outside fences, [start, end), for code-span pairing. */\n paragraphs: Array<[number, number]>;\n /** Text ends inside an open fence. */\n endsInFence: boolean;\n /** Start of the final, still-growing paragraph (streaming rule), -1 if none. */\n pendingPara: number;\n}\n\nfunction scan(text: string): Scan {\n const starts: number[] = [];\n const ends: number[] = [];\n for (let pos = 0; ; ) {\n const nl = text.indexOf(\"\\n\", pos);\n const lineEnd = nl === -1 ? text.length : nl;\n starts.push(pos);\n ends.push(lineEnd > pos && text.charCodeAt(lineEnd - 1) === 13 ? lineEnd - 1 : lineEnd);\n if (nl === -1) break;\n pos = nl + 1;\n }\n const count = starts.length;\n const raw = (k: number) => text.slice(starts[k] as number, ends[k] as number);\n const out: Scan = { ranges: [], fences: [], paragraphs: [], endsInFence: false, pendingPara: -1 };\n\n // Phase 1 — the renderer's splitter: every line whose trimmed text starts\n // with ``` opens a code block at ANY indent, before remark sees anything.\n const rawLines: FenceLines = { count, line: raw };\n let segment = 0;\n for (let k = 0; k < count; k++) {\n const opener = fenceOpenerOf(raw(k));\n if (!opener || opener.char !== \"`\") continue;\n prose(text, starts, ends, raw, segment, k, out);\n const end = closeFence(rawLines, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n out.pendingPara = -1;\n if (!end.closed && end.line === count - 1) out.endsInFence = true;\n k = end.line;\n segment = k + 1;\n }\n prose(text, starts, ends, raw, segment, count, out);\n return out;\n}\n\n/**\n * Phase 2 — remark, inside one prose segment [from, to) the splitter left:\n * fences in blockquotes, on a list-marker line, and tilde fences (relative to\n * their container), plus the paragraphs whose backtick runs pair as spans. A\n * fence here can never run past its segment: the splitter's block begins there.\n */\nfunction prose(\n text: string,\n starts: number[],\n ends: number[],\n raw: (k: number) => string,\n from: number,\n to: number,\n out: Scan,\n): void {\n let para = -1;\n let quoteDepth = 0;\n let lists: number[] = []; // content columns of the open list items (inside the quote prefix)\n const closePara = (at: number) => {\n if (para !== -1) out.paragraphs.push([para, at]);\n para = -1;\n };\n for (let k = from; k < to; k++) {\n const line = raw(k);\n const { depth, offset } = quotePrefix(line);\n if (depth !== quoteDepth) {\n quoteDepth = depth;\n lists = [];\n }\n let content = line.slice(offset);\n if (content.trim() === \"\") {\n closePara(starts[k] as number);\n // The empty \"line\" after a final newline is not a blank line: the next\n // line may still join this paragraph.\n if (!(k === starts.length - 1 && line === \"\")) out.pendingPara = -1;\n continue;\n }\n const indent = leadingSpaces(content);\n while (lists.length && indent < (lists[lists.length - 1] as number)) lists.pop();\n const item = LIST_ITEM.exec(content);\n let column = lists.length ? (lists[lists.length - 1] as number) : 0;\n if (item) {\n const gap = (item[3] as string).length;\n column = (item[1] as string).length + (item[2] as string).length + (gap >= 1 && gap <= 4 ? gap : 1);\n lists.push(column);\n content = content.slice(Math.min(column, content.length));\n } else {\n content = content.slice(Math.min(indent, column));\n }\n const opener = fenceOpenerOf(content);\n if (!opener) {\n if (para === -1) para = starts[k] as number;\n if (out.pendingPara === -1) out.pendingPara = starts[k] as number;\n continue;\n }\n closePara(starts[k] as number);\n out.pendingPara = -1;\n const col = column;\n const src: FenceLines = {\n count: to,\n line: (j) => {\n const inner = stripQuotes(raw(j), depth);\n if (inner === null) return null;\n if (opener.char === \"~\" && col > 0) {\n const ind = leadingSpaces(inner);\n if (inner.trim() !== \"\" && ind < col) return null; // the list item ended\n return inner.slice(Math.min(ind, col));\n }\n return inner;\n },\n };\n const end = closeFence(src, k, opener);\n out.ranges.push({ start: starts[k] as number, end: ends[end.line] as number, kind: \"fence\" });\n out.fences.push([k, end.line, end.closed]);\n if (!end.closed && end.line === starts.length - 1) out.endsInFence = true;\n k = end.line;\n }\n closePara(to < starts.length ? (starts[to] as number) : text.length);\n}\n\n/**\n * THE code-span pairing table for one paragraph, text[from, to): a backtick\n * run closes at the first LATER run of exactly its length; a run with none is\n * literal text. `findCodeRanges` pairs runs in order; the tokenizer's inline\n * scanner asks `next` in the renderer's leftmost-first inline order.\n */\nexport class BacktickRuns {\n /** Every run, in order: [start, length]. */\n readonly all: Array<[number, number]> = [];\n private readonly byLength = new Map<number, number[]>();\n private readonly indexOf = new Map<number, number>();\n\n constructor(text: string, from: number, to: number) {\n for (let k = from; k < to; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < to && text.charCodeAt(k + len) === 96) len++;\n this.indexOf.set(k, this.all.length);\n this.all.push([k, len]);\n const list = this.byLength.get(len);\n if (list) list.push(k);\n else this.byLength.set(len, [k]);\n k += len;\n }\n }\n\n /** Start of the first run of exactly `n` backticks at or after `after`, or -1. */\n next(n: number, after: number): number {\n const list = this.byLength.get(n);\n if (!list) return -1;\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < after) lo = mid + 1;\n else hi = mid;\n }\n return list[lo] ?? -1;\n }\n\n /** Index of the run starting at `start` in `all`. */\n index(start: number): number {\n return this.indexOf.get(start) ?? -1;\n }\n}\n\nfunction codeSpans(text: string, from: number, to: number, out: CodeRange[]): void {\n // Left to right, exactly as the renderer (remark) and the tokenizer's inline\n // scanner read: a backslash escapes the next character, so an escaped\n // backtick opens nothing; a run closes at the first LATER run of exactly its\n // length (inside code a backslash is literal, so a closer may follow one).\n let runs: BacktickRuns | null = null;\n for (let i = from; i < to; ) {\n const ch = text.charCodeAt(i);\n if (ch === 92) {\n i += 2;\n continue;\n }\n if (ch !== 96) {\n i++;\n continue;\n }\n const n = backtickRunLength(text, i);\n const len = Math.min(n, to - i);\n runs ??= new BacktickRuns(text, from, to);\n const close = runs.next(len, i + len);\n if (close === -1) {\n i += len;\n continue;\n }\n out.push({ start: i, end: close + len, kind: \"span\" });\n i = close + len;\n }\n}\n\n/**\n * Every code range in the text — fences (by the renderer's rule above) and\n * inline code spans — sorted by start. Linear: one pass over lines, one over\n * each paragraph's backtick runs.\n */\nexport function findCodeRanges(text: string): CodeRange[] {\n const s = scan(text);\n const ranges = [...s.ranges];\n for (const [from, to] of s.paragraphs) codeSpans(text, from, to, ranges);\n return ranges.sort((a, b) => a.start - b.start);\n}\n\n/**\n * Rewrite every code range (fences and spans, by THE rule) through `fn`; text\n * outside code is kept byte for byte. The one way to strip, replace or\n * placeholder code in markdown — never a private /```…```/ regex.\n */\nexport function mapCodeRanges(text: string, fn: (range: CodeRange, raw: string) => string): string {\n let out = \"\";\n let at = 0;\n for (const r of findCodeRanges(text)) {\n if (r.start < at) continue;\n out += text.slice(at, r.start) + fn(r, text.slice(r.start, r.end));\n at = r.end;\n }\n return out + text.slice(at);\n}\n\n/**\n * The code SPANS in one piece of INLINE content — a table cell, a heading's\n * text, a link label — where no block structure exists, so a line opening with\n * three or more backticks is a code span, never a fence (```` `` code `` ```` in a\n * GFM cell). Same scanner and escape rules as `findCodeRanges`' span pass.\n */\nexport function findInlineCodeSpans(text: string): CodeRange[] {\n const ranges: CodeRange[] = [];\n codeSpans(text, 0, text.length, ranges);\n return ranges.sort((a, b) => a.start - b.start);\n}\n\n/** Rewrite every code SPAN of inline content through `fn` (see `findInlineCodeSpans`); other text is kept byte for byte. */\nexport function mapInlineCodeSpans(text: string, fn: (range: CodeRange, raw: string) => string): string {\n let out = \"\";\n let at = 0;\n for (const r of findInlineCodeSpans(text)) {\n if (r.start < at) continue;\n out += text.slice(at, r.start) + fn(r, text.slice(r.start, r.end));\n at = r.end;\n }\n return out + text.slice(at);\n}\n\n/** A code span's text (CommonMark): the backtick runs off, then one padding space each side when both are there and the content is not all spaces. */\nexport function codeSpanText(raw: string): string {\n const ticks = backtickRunLength(raw, 0);\n const inner = raw.slice(ticks, raw.length - ticks);\n return inner.length >= 2 && inner.startsWith(\" \") && inner.endsWith(\" \") && inner.trim() !== \"\" ? inner.slice(1, -1) : inner;\n}\n\n/**\n * A fence range's parts: its opener, its body (the lines between the opener\n * and the closer, blockquote prefixes kept), and whether it closed. Reads\n * `raw` exactly as `findCodeRanges` returned it.\n */\nexport function fenceParts(raw: string): { opener: FenceOpener; body: string; closed: boolean } | null {\n const lines = raw.split(\"\\n\").map((l) => (l.endsWith(\"\\r\") ? l.slice(0, -1) : l));\n const { offset } = quotePrefix(lines[0] ?? \"\");\n const opener = fenceOpenerOf((lines[0] ?? \"\").slice(offset).replace(/^ *(?:[-*+]|\\d{1,9}[.)])(?= |\\t|$) ?/, \"\"));\n if (!opener) return null;\n const rest = lines.slice(1);\n const closed = rest.length > 0 && new FenceReader(opener, { nesting: false }).feed(rest[rest.length - 1] as string);\n if (!closed) return { opener, body: rest.join(\"\\n\"), closed };\n const last = rest[rest.length - 1] as string;\n // The renderer's line-end closer (`code````): the text before the run is code.\n const before = trimFenceLine(last).startsWith(\"```\") ? \"\" : last.slice(0, last.indexOf(\"```\"));\n return { opener, body: [...rest.slice(0, -1), ...(before.trim() ? [before] : [])].join(\"\\n\"), closed };\n}\n\nexport type FenceLineKind = \"prose\" | \"open\" | \"body\" | \"close\";\n\n/**\n * Where each line (the text split on \"\\n\") sits relative to the fences\n * `findCodeRanges` finds: its opener, its body, its closer, or prose. For a\n * line walker that must skip code — one rule, never a private `inFence` toggle.\n */\nexport function fenceLineKinds(text: string): FenceLineKind[] {\n const s = scan(text);\n let count = 1;\n for (let i = text.indexOf(\"\\n\"); i !== -1; i = text.indexOf(\"\\n\", i + 1)) count++;\n const kinds = new Array<FenceLineKind>(count).fill(\"prose\");\n for (const [open, last, closed] of s.fences) {\n kinds[open] = \"open\";\n for (let k = open + 1; k <= last; k++) kinds[k] = \"body\";\n if (closed && last > open) kinds[last] = \"close\";\n }\n return kinds;\n}\n\n/**\n * STREAMING: where the last, still-growing paragraph (no blank line or fence\n * after it) holds a backtick run that a later run could still close — a run\n * with no later run of its length, or the run touching the end of the text\n * (it may still lengthen). Such a code span can yet swallow any `$$` after it,\n * so a streaming tokenizer treats text from there as provisional. -1 if none.\n */\nexport function pendingCodeSpanStart(text: string): number {\n const n = text.length;\n if (n === 0 || /\\n[ \\t]*\\n[ \\t]*$/.test(text)) return -1;\n // An open last line that is only whitespace or blockquote markers SO FAR is\n // not a blank line yet: its next byte may continue the paragraph\n // (verify-RC-B3 F3: `\\n ` + `and\\``, `\\n>` + `<\\`\\`\\``).\n const lastLine = text.slice(text.lastIndexOf(\"\\n\") + 1);\n if (lastLine && /^(?: {0,3}>[ \\t]?)*[ \\t\\r]*$/.test(lastLine)) return pendingCodeSpanStart(`${text}x`);\n const s = scan(text);\n const para = s.pendingPara;\n if (s.endsInFence || para === -1) return -1;\n const runs: Array<[number, number]> = [];\n for (let k = para; k < n; ) {\n if (text.charCodeAt(k) !== 96) {\n k++;\n continue;\n }\n let len = 1;\n while (k + len < n && text.charCodeAt(k + len) === 96) len++;\n runs.push([k, len]);\n k += len;\n }\n // Pair runs the way findCodeRanges does, treating a run that touches the end\n // as still growing (it matches nothing yet); the first run left open is pending.\n const growing = (r: number) => {\n const [start, len] = runs[r] as [number, number];\n return start + len === n;\n };\n for (let r = 0; r < runs.length; ) {\n if (growing(r)) return (runs[r] as [number, number])[0];\n const len = (runs[r] as [number, number])[1];\n let j = r + 1;\n while (j < runs.length && ((runs[j] as [number, number])[1] !== len || growing(j))) j++;\n if (j >= runs.length) return (runs[r] as [number, number])[0];\n r = j + 1;\n }\n return -1;\n}\n","import { findCodeRanges } from \"./code-ranges\";\n\n/**\n * `$$` pairing — the core's rule for which `$$` delimiters are real math.\n *\n * Ported from `@ai-matrx/kit/delimiter-guard` (`guardMathDelimiters`), which\n * every math-capable renderer runs before remark-math. Its decisions:\n * - `$$` tokens outside code (``` / ~~~ fences, `inline code`) pair in\n * document order, open → close;\n * - a pair whose inside reads as prose or carries markdown structure is NOT\n * math: the renderer neutralizes its opener and the closer is retried as\n * the next opener;\n * - an unpaired `$$` is inert — it renders as literal text.\n * So the tokenizer protects exactly the pairs the renderer shows as math, and\n * a lone `$$` (a stray closer, or an opener that never closed) never locks\n * anything. Linear time: one regex pass per code shape, one sweep.\n */\n\nconst MAX_MATH_SPAN = 600;\nconst STRUCTURAL_MARKDOWN =\n /\\]\\(|https?:\\/\\/|\\*\\*|(?:^|\\n)[ \\t]{0,3}#{1,6}[ \\t]|(?:^|\\n)[ \\t]*[-*+][ \\t]+|(?:^|\\n)[ \\t]*\\d+[.)][ \\t]/;\nconst LATEX_COMMAND = /\\\\[a-zA-Z]/;\nconst PROSE_WORD = /[A-Za-z]{3,}/g;\nconst PROSE_WORD_LIMIT = 6;\n\n/**\n * `$$...$$`, `$$…$$`, `$$ · $$`: a PLACEHOLDER — prose describing the syntax,\n * never a formula. The pair is consumed whole as literal text (neither `$$`\n * may open the next span).\n */\nexport function isMathPlaceholder(inner: string): boolean {\n return /^[\\s.…·⋯_-]*$/.test(inner) && /[.…·⋯]/.test(inner);\n}\n\n/** A `$$` alone on its line opens a flow block (like a fence). */\nfunction opensFlowBlock(text: string, open: number): boolean {\n // Only whitespace between the line start and the opener, and after it to\n // the line end. Scans just that whitespace, so a line full of `$$` stays linear.\n for (let k = open - 1; k >= 0 && text[k] !== \"\\n\"; k--) if (text[k] !== \" \" && text[k] !== \"\\t\") return false;\n for (let k = open + 2; k < text.length && text[k] !== \"\\n\"; k++) if (text[k] !== \" \" && text[k] !== \"\\t\" && text[k] !== \"\\r\") return false;\n return true;\n}\n\n/**\n * The guard's `looksLikeMath`. `flow` = the opener is alone on its line: a\n * flow block may span blank lines (like a fence); a `$$` with text beside it\n * never crosses one — TeX's rule, and what keeps a stray prose `$$` from\n * pairing with the next paragraph's formula.\n */\nexport function looksLikeDisplayMath(inner: string, flow = false): boolean {\n const s = inner.trim();\n if (!s) return false;\n if (STRUCTURAL_MARKDOWN.test(s)) return false;\n if (s.length > MAX_MATH_SPAN) return false;\n // TeX's rule: display math never contains a blank line — a stray prose `$$`\n // never pairs with the next paragraph's formula, LaTeX in between or not.\n // On the UNtrimmed span: the blank line is often right before the closer.\n if (!flow && /\\n[ \\t]*\\n/.test(inner)) return false;\n if (LATEX_COMMAND.test(s)) {\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT * 3;\n }\n return (s.match(PROSE_WORD) ?? []).length < PROSE_WORD_LIMIT;\n}\n\n/** Code ranges as `[start, end)` tuples — the ONE CommonMark rule (`./code-ranges`). */\nfunction codeRanges(text: string): Array<[number, number]> {\n return findCodeRanges(text).map((r) => [r.start, r.end]);\n}\n\nexport { pendingCodeSpanStart } from \"./code-ranges\";\n\n/**\n * STREAMING: the last `$$` token that is still unpaired AND could still pair\n * with a `$$` not yet arrived — its span so far is short enough, carries no\n * markdown structure, not too many prose words, and (unless it opens a flow\n * block) no blank line. Everything after it may yet become math, so a\n * streaming tokenizer treats it as provisional. -1 when there is none.\n */\nexport function pendingDisplayMathOpener(text: string): number {\n if (!text.includes(\"$$\")) return -1;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2;\n }\n const paired = new Set<number>();\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n paired.add(open);\n paired.add(close);\n j += 2;\n continue;\n }\n j += 1;\n }\n // The EARLIEST unpaired token that could still pair: a later token can yet\n // vanish into an inline code span whose closer has not arrived, which would\n // hand an earlier token a new partner.\n // Trailing whitespace is trimmed from every candidate's span; measure it once.\n let trail = 0;\n while (trail < text.length && /\\s/.test(text[text.length - 1 - trail] as string)) trail++;\n for (const token of tokens) {\n if (paired.has(token)) continue;\n // Cheap bound first (keeps this linear): a span to the end longer than the\n // math limit plus its surrounding whitespace can never pair.\n let lead = 0;\n while (lead <= MAX_MATH_SPAN && /\\s/.test(text[token + 2 + lead] ?? \"x\")) lead++;\n if (text.length - (token + 2) - lead - trail > MAX_MATH_SPAN) continue;\n const inner = text.slice(token + 2);\n const s = inner.trim();\n if (STRUCTURAL_MARKDOWN.test(s) || s.length > MAX_MATH_SPAN) continue;\n if (!opensFlowBlock(text, token) && /\\n[ \\t]*\\n/.test(inner)) continue;\n if ((s.match(PROSE_WORD) ?? []).length >= PROSE_WORD_LIMIT * 3) continue;\n return token;\n }\n return -1;\n}\n\n/** Map of `$$` opener offset → closer offset for every pair the renderer shows as math. */\nexport function pairDisplayMath(text: string): Map<number, number> {\n const pairs = new Map<number, number>();\n if (!text.includes(\"$$\")) return pairs;\n const ranges = codeRanges(text);\n const tokens: number[] = [];\n let r = 0;\n let maxEnd = -1;\n for (let i = text.indexOf(\"$$\"); i !== -1 && i < text.length - 1; i = text.indexOf(\"$$\", i)) {\n while (r < ranges.length && (ranges[r] as [number, number])[0] <= i) {\n maxEnd = Math.max(maxEnd, (ranges[r] as [number, number])[1]);\n r++;\n }\n if (maxEnd <= i) tokens.push(i);\n i += 2; // never treat the second `$` of a pair as a new opener\n }\n let j = 0;\n while (j < tokens.length) {\n const open = tokens[j] as number;\n const close = tokens[j + 1];\n if (close === undefined) break;\n if (isMathPlaceholder(text.slice(open + 2, close))) {\n j += 2;\n continue;\n }\n if (looksLikeDisplayMath(text.slice(open + 2, close), opensFlowBlock(text, open))) {\n pairs.set(open, close);\n j += 2;\n continue;\n }\n j += 1;\n }\n return pairs;\n}\n","import { isMathPlaceholder } from \"./math-pairs\";\n\nconst TEX_SIGNAL = /\\\\[A-Za-z]+|[\\\\^_{}=<>+]/;\nconst LONE_VARIABLE = /^[A-Za-z](?:'|[0-9])?$/;\nconst MATH_SHAPE_CHARS = /^[A-Za-z0-9'\\s(),.*\\/-]+$/;\n\n/**\n * THE single-dollar math rule — the one predicate that decides whether a\n * CLOSED `$…$` is inline math or currency, on screen, in every export and in\n * the editor's islands (the renderer's normalizer, the source tokenizer and\n * print all ask it).\n *\n * Pandoc's `tex_math_dollars` delimiters (what remark-math approximates, and\n * how ChatGPT and Claude render): the opening `$` is followed by a\n * non-space, the closing `$` is preceded by a non-space and not followed by a\n * digit — so `$5 and $10`, `$5-$10`, `$5/$10` stay currency while `$FC$`,\n * `$AB$`, `$5$` and `$(0, 0)$` are math. On top of that, content that reads as\n * something other than a formula is refused — each guard is a false positive\n * measured in stored answers (matrx-frontend\n * `scripts/measure-single-dollar-rule.ts`, 2026-09-25: over 85k assistant\n * messages and 4k notes the widening adds 128 spans, every one a formula\n * (`$FC$`, `$(0, 0)$`, `$3x + 6 = 15$`), and drops 22 the old rule drew as\n * math that were code, template literals, a printf or broken TeX):\n * - an unescaped `%` — TeX's comment character, and a percentage\n * (`$\\ge$20% owners**…**$`, a printf `%1$s`);\n * - a closing bracket or `/` first, or an opening bracket last\n * (`[$X] plus [$Y]`, `($/SF/Yr) | High-Cost Market ($`, a regex\n * `/…/, '').replace(/…$`), or a straight quote at either end (`[\"$\", \"$\"]`\n * in data);\n * - `:` `;` `,` `/` last — a separator between two `$` words\n * (`$HOME/.local/bin:$PATH`, `$AAPL/$TSLA`);\n * - a number glued to a following letter (`$10$N9qo…`, a bcrypt cost);\n * - a placeholder (`$...$`);\n * - prose, unless a TeX command or operator says otherwise: two plain\n * words (`$Tipping (fee)$`), a contraction (`$I'm$`, never `$X'Y$`), an\n * abbreviation (`$e.g. (x)$`);\n * - a shell or template variable chain (`$USER$HOSTNAME`, `$name.$ext`,\n * `${a}${b}`) — {@link isVariableChain}.\n *\n * `after` is the text right after the closing `$` — {@link singleDollarAfter}\n * (up to {@link AFTER_WINDOW} characters; `\\n` marks the end of the text). A single character still\n * applies the Pandoc digit rule, but the variable-chain guard needs the\n * whole following name.\n */\nexport function isSingleDollarMath(\n content: string,\n after: string | undefined,\n): boolean {\n if (!content || content.length > 400) return false;\n if (/^\\s/.test(content) || /\\s$/.test(content)) return false;\n if (after !== undefined && /^[0-9]/.test(after)) return false;\n if (isVariableChain(content, after)) return false;\n if (/(?:^|[^\\\\])%/.test(content)) return false;\n if (/^[)\\]}\"/]/.test(content) || /[(\\[{\":;,/]$/.test(content)) return false;\n if (/^[0-9]/.test(content) && after !== undefined && /^[A-Za-z]/.test(after)) return false;\n if (isMathPlaceholder(content)) return false;\n return TEX_SIGNAL.test(content) || !readsAsProse(content);\n}\n\nconst IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n/** What may follow a closing `$` glued on in math prose: `$n$th`, `$x_i$s`, `$AB$'s`. */\nconst MATH_SUFFIX = /^(?:s|es|th|st|nd|rd)$/i;\n\n/**\n * Shell and template variables written outside backticks, not a formula:\n * the closing `$` is glued to the NEXT variable (`$USER$HOSTNAME`, `A=$A$B`,\n * R's `df$col$sub`), to a variable after one separator (`$name.$ext`,\n * `PS1='$USER@$HOST'`, PHP/Perl `$this->$prop`, `$class::$instance`), or the\n * span is a template placeholder (`${a}${b}`,\n * `${name}`). Measured before it shipped (matrx-frontend\n * `scripts/measure-single-dollar-rule.ts`, classes `shell-variable-chain` and\n * `template-literal`). Math keeps its glued suffixes: `$n$th`, `$x_i$s`.\n */\nfunction isVariableChain(content: string, after: string | undefined): boolean {\n if (/^\\{[A-Za-z_][\\w.]*\\}$/.test(content)) return true;\n // Shell arithmetic expansion `$((1+2))` and PowerShell's pipeline variable\n // `$_.Name` / `$_[0]` (verify-RC-B3 round 4, D5).\n if (/^\\(\\(.*\\)\\)$/.test(content) || /^_[.[]/.test(content)) return true;\n if (!after) return false;\n if (after[0] === \"{\") return IDENTIFIER.test(content);\n const run = /^[A-Za-z0-9_]+/.exec(after)?.[0];\n if (!run) return false;\n // A caller that passes one character cannot tell `$n$t…` (`th`) from the\n // next variable — no verdict from so little (older callers).\n if (after.length === 1) return false;\n // One separator between two names: `$name.$ext`, `$USER@$HOST`, PHP/Perl\n // member access `$this->$prop`, `$obj->$method`, `$class::$instance`.\n if (/^[A-Za-z_][A-Za-z0-9_]*(?:[.@-]|->|::)$/.test(content)) return true;\n return IDENTIFIER.test(content) && !MATH_SUFFIX.test(run);\n}\n\nconst FUNCTION_NAMES = new Set([\n \"sin\", \"cos\", \"tan\", \"sec\", \"csc\", \"cot\", \"log\", \"ln\", \"exp\",\n \"lim\", \"max\", \"min\", \"det\", \"gcd\", \"mod\", \"arg\", \"sinh\", \"cosh\", \"tanh\",\n]);\n\n/**\n * Words, not symbols: two plain words of three or more letters (standard\n * function names aside) with a space between them, a contraction (`I'm` — a\n * prime is never followed by a lowercase letter; `X'Y` is Boolean algebra), or an abbreviation (`e.g.` — a letter\n * is never followed by a period; `x.y` inside parentheses is fine).\n */\nfunction readsAsProse(content: string): boolean {\n if (/[A-Za-z]'[a-z]/.test(content)) return true;\n if (/(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return true;\n if (!/\\s/.test(content)) return false;\n const words = (content.match(/[A-Za-z]{3,}/g) ?? []).filter((w) => !FUNCTION_NAMES.has(w.toLowerCase()));\n return words.length >= 2;\n}\n\n/**\n * Whether an UNCLOSED `$…` already reads as a formula — for a stream that\n * must decide before the closing `$` arrives (matrx-frontend `stream-heal`\n * holds such a tail back instead of printing raw TeX). Stricter than\n * {@link isSingleDollarMath} on purpose: with no closer there are no Pandoc\n * delimiter facts yet, so it needs a math SIGNAL — a TeX command or operator\n * (`\\alpha`, `^`, `_`, `{`, `=`, …), a lone variable (`x`, `x'`), or a\n * single-letter math shape (`f(g(x))`, `u v`). Content that opens with a digit\n * needs a real TeX command, so `$35 per stop` keeps showing while it streams.\n */\nexport function looksLikeOpenInlineMath(partial: string): boolean {\n if (!partial || partial.length > 400) return false;\n if (/^\\s/.test(partial) || /\\s$/.test(partial)) return false;\n if (LONE_VARIABLE.test(partial)) return true;\n if (/^[0-9]/.test(partial)) return /\\\\[A-Za-z]+|[\\\\^_{}]/.test(partial);\n return TEX_SIGNAL.test(partial) || isMathShape(partial);\n}\n\n/**\n * A math SHAPE with no TeX command or operator: single-letter identifiers\n * (optionally primed, optionally a standard function name) applied,\n * juxtaposed or listed — `f(g(x))`, `u v`, `f'(x)`, `(x, y)`, `ln(x)`.\n */\nfunction isMathShape(content: string): boolean {\n if (!MATH_SHAPE_CHARS.test(content)) return false;\n const words = content.match(/[A-Za-z]+/g);\n if (!words) return false;\n if (!words.every((w) => w.length === 1 || FUNCTION_NAMES.has(w))) return false;\n if (/[A-Za-z]'+[A-Za-z]/.test(content) || /(?:^|[\\s(,])[A-Za-z]\\.(?:[A-Za-z]\\.|\\s|$)/.test(content)) return false;\n return /[A-Za-z]'*\\(|[A-Za-z]'|\\b[A-Za-z]\\s+[A-Za-z]\\b|\\([^)]*[A-Za-z][^)]*\\)/.test(content);\n}\n\n/**\n * Where a single-dollar math span opened at `open` (a lone `$`) closes, or -1.\n * Same scan the normalizer uses: same line, backslash-escapes skipped, the\n * closer is a `$` not followed by another `$`, and the content passes\n * {@link isSingleDollarMath}. Returns the offset just past the closing `$`.\n */\n/** How much text after a closing `$` the rule reads (a glued suffix or the next variable name). */\nexport const AFTER_WINDOW = 32;\n\n/**\n * The `after` argument of {@link isSingleDollarMath} for the closing `$` at\n * `close`: the next {@link AFTER_WINDOW} characters, with a `\\n` standing for\n * the end of the text (so `$A$B` at the very end reads the whole name `B`).\n */\nexport function singleDollarAfter(text: string, close: number): string {\n const rest = text.slice(close + 1, close + 1 + AFTER_WINDOW);\n return rest.length < AFTER_WINDOW ? `${rest}\\n` : rest;\n}\n\nexport function singleDollarMathEnd(text: string, open: number, limit = text.length): number {\n // Content over 400 characters is never math, so the scan never needs to go\n // further — this keeps a line full of `$` linear.\n const bound = Math.min(limit, open + 403);\n let close = -1;\n for (let k = open + 1; k < bound; k += 1) {\n const c = text[k];\n if (c === \"\\n\") break;\n if (c === \"\\\\\") {\n k += 1;\n continue;\n }\n if (c === \"$\") {\n close = k;\n break;\n }\n }\n if (close === -1 || text[close + 1] === \"$\") return -1;\n const content = text.slice(open + 1, close);\n return isSingleDollarMath(content, singleDollarAfter(text, close)) ? close + 1 : -1;\n}\n\n/** TeX that no prose carries: a command, a superscript, a brace, a relation or `+`, a subscript on a letter. */\nconst BRACKET_TEX_SIGNAL = /\\\\[A-Za-z]+|[\\^{}=<>+]|_\\{|(?:^|[^A-Za-z0-9])[A-Za-z]_[A-Za-z0-9](?![A-Za-z0-9])/;\n\n/**\n * THE escaped-bracket rule — whether a closed `\\[ … \\]` is display math or\n * CommonMark's escaped brackets (literal `[ … ]`). The tokenizer, the\n * renderer's normalizer and the editor all ask it.\n *\n * Math only when the content is real TeX (BRACKET_TEX_SIGNAL) and the `\\[`\n * is not an index on an identifier (`arr\\[i+1\\]`, `f(x)\\[k\\]`).\n * Everything a person writes with escaped brackets stays text: citations\n * `\\[1\\]`, dates `\\[2026-09-25\\]`, task boxes `- \\[x\\]`, editorial\n * insertions `\\[was\\]`, placeholders `\\[site name\\]` (verify-RC-B4 R3-2).\n * `before` is the character just before the `\\[` (undefined at the start).\n */\nexport function isEscapedBracketMath(content: string, before: string | undefined): boolean {\n if (!content.trim()) return false;\n if (before !== undefined && /[A-Za-z0-9_)\\]]/.test(before)) return false;\n return BRACKET_TEX_SIGNAL.test(content);\n}\n","/**\n * XML tag reading + the generic-container balance scanner.\n *\n * Ported VERBATIM (behaviour) from matrx-frontend\n * `components/mardown-display/blocks/xml/readXmlTag.ts` and the\n * `XmlContainerTracker` in\n * `components/mardown-display/markdown-classification/processors/utils/content-splitter-v2.ts`\n * so the source tokenizer ends a generic XML section exactly where the\n * renderer does. Fences inside the section are found by THE one code-range\n * rule (source/code-ranges.ts `fenceOpenerOf` + `FenceReader`), which the\n * renderer's splitter imports too (RC-B10).\n */\nimport { FenceReader, fenceOpenerOf } from \"./code-ranges\";\n\nexport interface ReadXmlTag {\n tagName: string;\n raw: string;\n isClosing: boolean;\n isSelfClosing: boolean;\n attributes: Array<{ name: string; value: string }>;\n}\n\nconst XML_NAME_START = /[A-Za-z_]/;\nconst XML_NAME_CHARACTER = /[\\w.:-]/;\nconst WHITESPACE = /\\s/;\n\n/**\n * `find(needle, from)` must behave like `content.indexOf(needle, from)`; the\n * tokenizer passes a cached occurrence index so a text full of unclosed\n * attribute quotes stays linear. Behaviour is identical either way.\n */\nexport function readXmlTag(\n content: string,\n start: number,\n find: (needle: string, from: number) => number = (needle, from) => content.indexOf(needle, from),\n): ReadXmlTag | null {\n let cursor = start + 1;\n const isClosing = content[cursor] === \"/\";\n if (isClosing) cursor++;\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const nameStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const tagName = content.slice(nameStart, cursor);\n const attributes: Array<{ name: string; value: string }> = [];\n if (isClosing) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n }\n while (cursor < content.length) {\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] === \">\")\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: false,\n attributes,\n };\n if (content[cursor] === \"/\") {\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \">\") return null;\n return {\n tagName,\n raw: content.slice(start, cursor + 1),\n isClosing,\n isSelfClosing: true,\n attributes,\n };\n }\n if (!XML_NAME_START.test(content[cursor] ?? \"\")) return null;\n const attributeStart = cursor;\n while (XML_NAME_CHARACTER.test(content[cursor] ?? \"\")) cursor++;\n const name = content.slice(attributeStart, cursor);\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n if (content[cursor] !== \"=\") return null;\n cursor++;\n while (WHITESPACE.test(content[cursor] ?? \"\")) cursor++;\n const quote = content[cursor];\n if (quote !== '\"' && quote !== \"'\") return null;\n const valueStart = ++cursor;\n const valueEnd = find(quote, valueStart);\n if (valueEnd === -1) return null;\n cursor = valueEnd;\n attributes.push({ name, value: content.slice(valueStart, cursor) });\n cursor++;\n }\n return null;\n}\n\nfunction isEscapedBacktick(line: string, offset: number): boolean {\n let slashes = 0;\n for (let i = offset - 1; line[i] === \"\\\\\"; i--) slashes++;\n return slashes % 2 === 1;\n}\n\n/**\n * Balances ONE unknown root tag line by line, ignoring lookalike tags inside\n * fenced code, inline code spans, comments and CDATA. `consumeLine` returns\n * the offset (within that line) just past the root's closing tag, or null.\n */\nexport class XmlContainerTracker {\n readonly rootTag: string;\n private depth = 0;\n private inComment = false;\n private inCdata = false;\n private inlineTicks = 0;\n /** The open fence, read by THE one closer (source/code-ranges.ts). */\n private fence: FenceReader | null = null;\n\n constructor(rootTag: string) {\n this.rootTag = rootTag;\n }\n\n consumeLine(line: string, startOffset = 0): number | null {\n if (this.fence) {\n if (this.fence.feed(line)) this.fence = null;\n return null;\n }\n if (!this.inComment && !this.inCdata && this.inlineTicks === 0) {\n const opener = fenceOpenerOf(line);\n if (opener) {\n this.fence = new FenceReader(opener);\n return null;\n }\n }\n\n for (let i = startOffset; i < line.length; i++) {\n if (this.inlineTicks > 0) {\n if (line[i] === \"`\") {\n let end = i;\n while (line[end] === \"`\") end++;\n if (end - i === this.inlineTicks) this.inlineTicks = 0;\n i = end - 1;\n }\n continue;\n }\n if (this.inComment) {\n const end = line.indexOf(\"-->\", i);\n if (end === -1) return null;\n this.inComment = false;\n i = end + 2;\n continue;\n }\n if (this.inCdata) {\n const end = line.indexOf(\"]]>\", i);\n if (end === -1) return null;\n this.inCdata = false;\n i = end + 2;\n continue;\n }\n if (line.startsWith(\"<!--\", i)) {\n this.inComment = true;\n i += 3;\n continue;\n }\n if (line.startsWith(\"<![CDATA[\", i)) {\n this.inCdata = true;\n i += 8;\n continue;\n }\n if (line[i] === \"`\" && !isEscapedBacktick(line, i)) {\n let end = i;\n while (line[end] === \"`\") end++;\n this.inlineTicks = end - i;\n i = end - 1;\n continue;\n }\n if (line[i] !== \"<\") continue;\n const tag = readXmlTag(line, i);\n if (!tag) continue;\n const tagEnd = i + tag.raw.length;\n if (tag.tagName === this.rootTag) {\n if (tag.isClosing) this.depth--;\n else if (!tag.isSelfClosing) this.depth++;\n if (this.depth === 0) return tagEnd;\n }\n i = tagEnd - 1;\n }\n return null;\n }\n}\n","/**\n * THE GFM table rule — one splitter, one cell-pipe rule, one \"where does a\n * table start and run\" — for every surface that reads a markdown table: the\n * chat splitter and live stream, the table renderers and editors, the rich\n * editor's writer, the print package, and (by shared vectors) the Python block\n * detector. verify-RC-B4 R4/R5/R6.\n *\n * - A `|` is a cell boundary unless an ODD run of backslashes precedes it\n * (`\\|` is a pipe inside the cell; `\\\\|` is an escaped backslash and then a\n * boundary). Code spans get no special treatment: GFM splits rows before\n * inline parsing, so an unescaped `|` inside backticks is a boundary too.\n * - A cell's `\\|` shows as `|` — inside code spans too (spec example 200).\n * - A table starts at a header line whose NEXT line is a delimiter row (`--- |\n * :-:`, edge pipes optional, never a list item such as `- | -`) of the SAME\n * width; the header needs no pipe of its own (`Notes` over `|---|` is a\n * one-column table), is not indented code, and is not a lazy continuation of a\n * list item's or quote's paragraph. It runs to a blank line, a\n * line that starts another block (`- x`, `> y`, `# z`, `1.`, a fence, a rule,\n * an HTML block — CommonMark 4.6's seven start conditions), or a line indented\n * four or more columns past the table's container (indented code); every other\n * line is a row, with or without a pipe (spec example 202), a lone `|` included\n * (an empty row).\n *\n * Pure TS, no dependencies.\n */\n\nimport { opensStrictFence } from \"./code-ranges\";\n\n/** The row's bytes between boundaries (edge segments included). */\nexport function splitRowSegments(line: string): string[] {\n const segments: string[] = [];\n let start = 0;\n for (let i = 0; i < line.length; i += 1) {\n const ch = line[i];\n if (ch === \"\\\\\") {\n i += 1; // the escaped character — never a boundary\n continue;\n }\n if (ch === \"|\") {\n segments.push(line.slice(start, i));\n start = i + 1;\n }\n }\n segments.push(line.slice(start));\n return segments;\n}\n\n/** A row's cell texts as GFM reads them (source bytes, trimmed; edge pipes dropped). */\nexport function rowCells(line: string): string[] {\n const cells = splitRowSegments(line).map((cell) => cell.trim());\n if (cells.length > 1 && cells[0] === \"\") cells.shift();\n if (cells.length > 1 && cells[cells.length - 1] === \"\") cells.pop();\n // A line with no cell at all is no row; a lone `|` IS a row — one empty cell,\n // as GFM reads it (a hidden row is a screen that lies).\n else if (cells.length === 1 && cells[0] === \"\" && !line.includes(\"|\")) cells.pop();\n return cells;\n}\n\n/** GFM's table-level unescape: a cell's `\\|` is a pipe, in code spans too. */\nexport function unescapeCellPipes(cell: string): string {\n return cell.replace(/\\\\\\|/g, \"|\");\n}\n\n/** A line GFM reads as the start of another block (list item, quote, heading, fence, rule, HTML block). */\n// Fences are judged by THE code-range rule (opensStrictFence): a `~~~` run, or a\n// backtick run whose info string holds no backtick (CommonMark 4.5).\n// A footnote definition (`[^1]: …`, GFM) is a block start too: it ends a table.\nconst BLOCK_START = /^(?:[-+*](?:\\s|$)|\\d{1,9}[.)](?:\\s|$)|>|#{1,6}(?:\\s|$)|(?:-\\s*){3,}$|(?:\\*\\s*){3,}$|(?:_\\s*){3,}$|\\[\\^[^\\]\\s]+\\]:)/;\nconst startsBlock = (trimmed: string): boolean =>\n BLOCK_START.test(trimmed) || opensStrictFence(trimmed) || startsHtmlBlock(trimmed);\n\n// CommonMark 4.6 HTML block start conditions (0.31, as micromark reads them).\n// 1: <script|pre|style|textarea then whitespace, `>` or end of line.\nconst HTML_RAW = /^<(?:script|pre|style|textarea)(?:[\\s>]|$)/i;\n// 2: <!-- 3: <? 4: <! then an ASCII letter 5: <![CDATA[\nconst HTML_COMMENT_ETC = /^(?:<!--|<\\?|<![A-Za-z]|<!\\[CDATA\\[)/;\n// 6: < or </ then a block tag name, then whitespace, end of line, `>` or `/>`.\nconst HTML_BLOCK_NAMES =\n \"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\";\nconst HTML_BLOCK_TAG = new RegExp(`^</?(?:${HTML_BLOCK_NAMES})(?:[\\\\s>]|/>|$)`, \"i\");\n// 7: one complete open tag or closing tag (any other name), then only whitespace.\nconst ATTRIBUTE = `\\\\s+[A-Za-z_:][A-Za-z0-9_.:-]*(?:\\\\s*=\\\\s*(?:[^\\\\s\"'=<>\\`]+|'[^']*'|\"[^\"]*\"))?`;\nconst HTML_COMPLETE_TAG = new RegExp(`^(?:<[A-Za-z][A-Za-z0-9-]*(?:${ATTRIBUTE})*\\\\s*/?>|</[A-Za-z][A-Za-z0-9-]*\\\\s*>)\\\\s*$`);\n\n/**\n * THE ONE DELIBERATE GFM DEVIATION (verify-RC-B4 round 16 ruling: content never\n * silently disappears; that law outranks GFM parity here). CommonMark 4.6 reads a\n * line opening with one of these type-6 names as an HTML block that runs to the\n * next blank line, so every line under it is raw HTML — and every surface's\n * sanitizer then drops the element (the screen's raw-HTML allow-list and print's\n * GitHub schema both lack all of these), leaving the text under it unformatted or\n * gone. A stored answer quoting `<link rel=\"canonical\" …/>` above a page of prose\n * lost its lists and tables that way. So such a block ENDS AT ITS OWN LINE: the\n * lines after it are read as ordinary markdown. The Python twin\n * (gfm_table_lines.py) holds the same list; the shared vectors pin it.\n */\nconst STRIPPED_HTML_BLOCK_NAMES =\n \"address|article|aside|base|basefont|body|center|dialog|dir|fieldset|footer|form|frame|frameset|head|header|html|iframe|legend|link|main|menu|menuitem|nav|noframes|optgroup|option|param|search|title|track\";\nconst STRIPPED_HTML_BLOCK_TAG = new RegExp(`^</?(?:${STRIPPED_HTML_BLOCK_NAMES})(?:[\\\\s>]|/>|$)`, \"i\");\n\n/**\n * The trimmed line opens an HTML block whose element every sanitizer strips: the\n * block ends at this line (the one deliberate GFM deviation, above).\n */\nexport function opensStrippedHtmlBlock(trimmed: string): boolean {\n return STRIPPED_HTML_BLOCK_TAG.test(trimmed);\n}\n\nconst HTML_BLOCK_NAME_SET: ReadonlySet<string> = new Set([\n // Condition 1 (raw text) and condition 6 (block) tag names — CommonMark 0.31.\n \"script\", \"pre\", \"style\", \"textarea\",\n ...HTML_BLOCK_NAMES.replace(\"h[1-6]\", \"h1|h2|h3|h4|h5|h6\").split(\"|\"),\n]);\n\n/**\n * A tag name CommonMark reads as an HTML BLOCK when it opens a line (conditions\n * 1 and 6: `div`, `details`, `section`, `script`, …; case-insensitive). A\n * line-leading tag with such a name is HTML — the markdown renderer's, ending\n * where GFM ends it — never a custom XML container that owns what follows.\n * verify-RC-B4 round 9.\n */\nexport function isHtmlBlockTagName(name: string): boolean {\n return HTML_BLOCK_NAME_SET.has(name.toLowerCase());\n}\n\n/** The trimmed line starts an HTML block (any of CommonMark 4.6's seven conditions). */\nexport function startsHtmlBlock(trimmed: string): boolean {\n if (!trimmed.startsWith(\"<\")) return false;\n return HTML_RAW.test(trimmed) || HTML_COMMENT_ETC.test(trimmed) || HTML_BLOCK_TAG.test(trimmed) || HTML_COMPLETE_TAG.test(trimmed);\n}\n\n/** The column a line's content starts at: spaces count 1, a tab runs to the next multiple of 4. */\nexport function lineIndent(line: string): number {\n let column = 0;\n for (const ch of line) {\n if (ch === \" \") column += 1;\n else if (ch === \"\\t\") column += 4 - (column % 4);\n else break;\n }\n return column;\n}\n\nconst LIST_MARKER = /^([ \\t]*)([-+*]|\\d{1,9}[.)])([ \\t]+|$)/;\n\n/** A list item's content column: after the marker and 1–4 spaces (1 when 5+, or when the item is empty). */\nfunction markerContentColumn(marker: RegExpExecArray): number {\n const markerEnd = lineIndent(marker[1] ?? \"\") + (marker[2] ?? \"\").length;\n const gap = marker[3] ? lineIndent(\" \".repeat(markerEnd) + marker[3]) - markerEnd : 1;\n return markerEnd + (gap >= 1 && gap <= 4 ? gap : 1);\n}\n\n/**\n * The content column of the container a table at `start` sits in: the list item\n * whose content the header line belongs to (the nearest list-marker line above,\n * past blank and continuation lines, whose content column is at or left of the\n * header's), or 0 at top level. Indentation past it by 4+ columns is indented\n * code, which ends the table.\n */\nexport function tableContainerIndent(lines: readonly string[], start: number): number {\n return tableContainerIndentOf(lines, start, false);\n}\n\n/** The content column of the list item line `start` belongs to — its own item when `ownItem` and it is a marker line. */\nfunction tableContainerIndentOf(lines: readonly string[], start: number, ownItem: boolean): number {\n const own = ownItem ? LIST_MARKER.exec(lines[start] ?? \"\") : null;\n if (own) return markerContentColumn(own);\n const header = lineIndent(lines[start] ?? \"\");\n if (header === 0) return 0;\n for (let k = start - 1; k >= 0; k -= 1) {\n const line = lines[k] ?? \"\";\n if (!line.trim()) continue;\n const indent = lineIndent(line);\n const marker = LIST_MARKER.exec(line);\n if (marker && indent < header) {\n const content = markerContentColumn(marker);\n if (content <= header) return content;\n continue;\n }\n if (indent === 0) return 0;\n }\n return 0;\n}\n\nconst DELIMITER_CELL = /^:?-+:?$/;\n\n/** A GFM delimiter row: every cell `---`, `:--`, `--:` or `:-:`, with at least one pipe. */\nexport function isGfmDelimiterRow(line: string): boolean {\n const trimmed = line.trim();\n if (!trimmed.includes(\"|\")) return false;\n const cells = rowCells(trimmed);\n return cells.length > 0 && cells.every((cell) => DELIMITER_CELL.test(cell));\n}\n\n/** A pipe-led row: `|` first, and another `|` after it. */\nexport function isPipeLedRow(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.startsWith(\"|\") && trimmed.includes(\"|\", 1);\n}\n\n/** A delimiter row GFM reads as one: `|`-bearing dashes and colons, never a list item (`- | -`). */\nfunction isTableDelimiter(line: string | undefined): line is string {\n if (line === undefined || !isGfmDelimiterRow(line)) return false;\n return !BLOCK_START.test(line.trim());\n}\n\n/**\n * True when `header` + `delimiter` open a table whose header is NOT a pipe-led\n * row: `a | b` (no edge pipes), `| a` (one pipe), or even `Notes` (no pipe — a\n * one-column table over `|---|`). The delimiter must match the header's width.\n */\nexport function startsPipelessTable(header: string, delimiter: string | undefined): boolean {\n const head = header.trim();\n if (!head || isPipeLedRow(head) || (!head.startsWith(\"|\") && startsBlock(head))) return false;\n if (!isTableDelimiter(delimiter)) return false;\n return rowCells(head).length === rowCells(delimiter.trim()).length;\n}\n\n/**\n * A line that continues an open table — GFM's rule (spec example 202): the table\n * runs to the first blank line, the first line that starts another block (an\n * HTML block included), or the first line indented 4+ columns past the table's\n * container (`containerIndent`, from `tableContainerIndent`; indented code). Any\n * other line is a row, even one without a pipe (`bar` → a one-cell row) and a\n * lone `|` (an empty row). verify-RC-B4 R7-2 / round 9.\n */\nexport function continuesTable(line: string, containerIndent = 0): boolean {\n const trimmed = line.trim();\n if (!trimmed) return false;\n if (lineIndent(line) - containerIndent >= 4) return false;\n return trimmed.startsWith(\"|\") || !startsBlock(trimmed);\n}\n\n/** Line `index` opens a table: a pipe-led row, or a pipe-less GFM header over its delimiter row. */\nexport function opensTable(lines: readonly string[], index: number): boolean {\n const line = lines[index] ?? \"\";\n if (!isPipeLedRow(line) && !startsPipelessTable(line, lines[index + 1])) return false;\n return !isLazyContinuation(lines, index) && !insideHtmlBlock(lines, index);\n}\n\nconst QUOTE_LINE = /^ {0,3}>/;\nconst THEMATIC_BREAK = /^(?:(?:-[ \\t]*){3,}|(?:\\*[ \\t]*){3,}|(?:_[ \\t]*){3,})$/;\n/** A line that ends a paragraph above it without being part of it: heading, rule, fence, HTML block. */\nconst breaksParagraph = (trimmed: string): boolean =>\n /^#{1,6}(?:\\s|$)/.test(trimmed) || THEMATIC_BREAK.test(trimmed) || opensStrictFence(trimmed) || startsHtmlBlock(trimmed);\n\n/**\n * Line `index` is a LAZY continuation of a paragraph inside a list item or block\n * quote (CommonMark 5.1/5.2): the paragraph runs right above it (no blank line)\n * and the line is not indented to that container's content column (or lacks the\n * quote's `>`). GFM reads such a line as more paragraph text — never a table\n * header (`- item` then `| a | b |` on the next line is no table). verify-RC-B4 round 9.\n */\n/** The end marker of HTML block types 1–5 (CommonMark 4.6); types 6 and 7 end at a blank line. */\nfunction htmlBlockEnd(trimmed: string): RegExp | null | undefined {\n if (HTML_RAW.test(trimmed)) return /<\\/(?:script|pre|style|textarea)>/i;\n if (trimmed.startsWith(\"<!--\")) return /-->/;\n if (trimmed.startsWith(\"<?\")) return /\\?>/;\n if (trimmed.startsWith(\"<![CDATA[\")) return /\\]\\]>/;\n if (/^<![A-Za-z]/.test(trimmed)) return />/;\n if (HTML_BLOCK_TAG.test(trimmed)) return null;\n if (HTML_COMPLETE_TAG.test(trimmed)) return null;\n return undefined;\n}\n\n/**\n * Line `index` sits INSIDE an HTML block that opened above it in the same run of\n * lines (no blank line between): `<details>` then `| a | b |` is raw HTML to GFM,\n * never a table. Types 1–5 end at their marker (`-->`, `</script>`, …) — a\n * closed `<!-- note -->` line leaves the next line free; types 6 and 7 run to the\n * blank line; type 7 (any other complete tag) cannot interrupt a paragraph.\n * A block whose element every sanitizer strips ends at its own line (the one\n * deliberate GFM deviation, STRIPPED_HTML_BLOCK_NAMES). verify-RC-B4 round 9 (R9-5).\n */\nfunction insideHtmlBlock(lines: readonly string[], index: number): boolean {\n let start = index;\n while (start > 0 && (lines[start - 1] ?? \"\").trim()) start -= 1;\n let open: RegExp | null | undefined; // undefined = not in an HTML block\n let paragraph = false;\n for (let k = start; k < index; k += 1) {\n const line = lines[k] ?? \"\";\n if (open !== undefined) {\n if (open && open.test(line)) open = undefined;\n continue;\n }\n const trimmed = line.trim();\n const end = lineIndent(line) < 4 ? htmlBlockEnd(trimmed) : undefined;\n const type7 = end === null && !HTML_BLOCK_TAG.test(trimmed);\n const interrupts = end !== undefined && !(paragraph && type7);\n if (!interrupts) {\n paragraph = true;\n continue;\n }\n paragraph = false;\n // A block whose element every sanitizer strips ends at its own line (the one\n // deliberate GFM deviation, STRIPPED_HTML_BLOCK_NAMES).\n if (opensStrippedHtmlBlock(trimmed)) continue;\n // A type 1–5 block whose end marker is on its own first line is already closed.\n open = end && end.test(trimmed.slice(2)) ? undefined : end;\n }\n return open !== undefined;\n}\n\nfunction isLazyContinuation(lines: readonly string[], index: number): boolean {\n const header = lines[index] ?? \"\";\n let first = -1;\n for (let k = index - 1; k >= 0; k -= 1) {\n const line = lines[k] ?? \"\";\n const trimmed = line.trim();\n if (!trimmed) break;\n if (breaksParagraph(trimmed)) break;\n const marker = LIST_MARKER.exec(line);\n if (marker) {\n const rest = line.slice(marker[0].length).trim();\n if (!rest || breaksParagraph(rest)) break; // an empty item, or one holding no paragraph\n first = k;\n break;\n }\n first = k;\n if (QUOTE_LINE.test(line)) break;\n }\n if (first < 0) return false;\n const start = lines[first] ?? \"\";\n if (QUOTE_LINE.test(start)) return !QUOTE_LINE.test(header);\n return lineIndent(header) < tableContainerIndentOf(lines, first, true);\n}\n\n/** A WHOLE table header at `index`: a table opens here AND its next line is a GFM delimiter row. */\nexport function tableStartsAt(lines: readonly string[], index: number): boolean {\n const header = lines[index] ?? \"\";\n const delimiter = lines[index + 1];\n if (!opensTable(lines, index) || !isTableDelimiter(delimiter)) return false;\n // GFM: the delimiter row matches the header's width, and a header indented 4+\n // columns past its container is indented code.\n if (rowCells(header).length !== rowCells(delimiter).length) return false;\n return lineIndent(header) - tableContainerIndent(lines, index) < 4;\n}\n\n/** Index of the first line at or after `from` that opens a table; -1 when none. */\nexport function findTableStart(lines: readonly string[], from = 0): number {\n for (let i = Math.max(0, from); i < lines.length; i += 1) if (opensTable(lines, i)) return i;\n return -1;\n}\n\n/** Index just past the table whose header is at `start` (header, delimiter, then continuation rows). */\nexport function findTableEnd(lines: readonly string[], start: number): number {\n const container = tableContainerIndent(lines, start);\n let end = Math.min(lines.length, start + 2);\n while (end < lines.length && continuesTable(lines[end] ?? \"\", container)) end += 1;\n return end;\n}\n","/**\n * THE OFFSET-PRESERVING SOURCE TOKENIZER (rich-content PLAN decision 6).\n *\n * Cuts stored markdown into blocks that cover the text EXACTLY: the\n * concatenation of every block's `raw` is the input, always, byte for byte.\n * Nothing is trimmed, normalized, or re-serialized here — the tokenizer only\n * draws boundaries. Every custom construct the platform stores (kinds and\n * `__kind` JSON, typed JSON blocks, special fences, XML sections including\n * attribute-bearing, mid-line and unknown containers, `{{variables}}`,\n * `<matrxcite/>`, math, raw HTML, code fences, HTML comments and pinned\n * anchors `<!--@a:…-->`) is an ISLAND: an atomic span no editor may parse\n * into its own model. Islands that sit inside running prose (a variable, a\n * citation, inline math) stay inside their paragraph as `inlines`, so a\n * visual editor keeps the paragraph whole and holds the island as an atom.\n *\n * Block kinds:\n * - `prose` — a markdown paragraph run (headings, lists, tables…): the only\n * thing a visual editor may re-serialize, and only when edited.\n * - `island` — a protected construct; `islandType` says which.\n * - `gap` — the line terminator(s) and blank lines between blocks. Never\n * edited; they keep the document's exact spacing.\n *\n * Streaming-tolerant: never throws on partial input. A construct whose\n * closer has not arrived yet becomes an island running to the end of the text\n * with `complete: false` — the same ownership rule the renderer's splitter\n * applies, so a half-streamed fence or XML section is never reflowed.\n *\n * Boundaries follow matrx-frontend's renderer splitter (`content-splitter-v2.ts`)\n * wherever it decides where a construct ends, so the editor and the renderer\n * agree on what is locked. Offsets are UTF-16 (`start`/`end`) and code points\n * (`startCp`/`endCp`).\n */\n\nimport { buildCodePointIndex } from \"./offsets\";\nimport {\n ALLOWED_RAW_HTML_TAGS,\n ATTRIBUTE_XML_NAMES,\n CITE_RE,\n HTML_BLOCK_LEVEL_TAGS,\n KNOWN_XML_TAG_NAMES,\n PINNED_ANCHOR_RE,\n SPECIAL_CODE_LANGUAGES,\n STRICT_VARIABLE_RE,\n THINKING_FAMILY,\n TREE_GLYPHS,\n TYPED_JSON_ROOT_KEYS,\n XML_TAG_BLOCK_NAMES,\n normalizeFenceLanguage,\n} from \"./constants\";\nimport { BacktickRuns, backtickRunLength, closeFence, fenceOpenerOf, type FenceLines, type FenceOpener } from \"./code-ranges\";\nimport { isEscapedBracketMath, singleDollarMathEnd } from \"./math\";\nimport { pairDisplayMath, pendingCodeSpanStart, pendingDisplayMathOpener } from \"./math-pairs\";\nimport { XmlContainerTracker, readXmlTag } from \"./xml-tag\";\nimport { isHtmlBlockTagName } from \"./gfm-table\";\n\nexport type SourceBlockKind = \"prose\" | \"island\" | \"gap\";\n\n/** Island types that own whole blocks. */\nexport type BlockIslandType =\n /** ``` / ~~~ fenced code of any language (meta.lang, meta.special). */\n | \"fence\"\n /** A bare JSON object block — typed JSON, `__kind` instances, directives. */\n | \"json\"\n /** A known attribute-less XML region (`<thinking>`, `<flashcards>`, …). */\n | \"xml_region\"\n /** An attribute-bearing XML element (`<artifact …>`, `<decision …>`, …). */\n | \"xml_attr\"\n /** Any other line-leading, balanced XML element. */\n | \"xml_container\"\n /** Allow-listed raw HTML block. */\n | \"html_block\"\n /** `<!-- … -->` comment. */\n | \"html_comment\"\n /** A pinned annotation anchor `<!--@a:id-->`. */\n | \"anchor\"\n /** `$$ … $$` display math on its own lines. */\n | \"math_block\"\n /** YAML (`---`) or TOML (`+++`) front matter at the start of the text (meta.format). */\n | \"front_matter\"\n /** A box-drawing tree diagram. */\n | \"tree\"\n /**\n * A generic-directive container `:::name[label]{attrs}` … `:::` (tabs,\n * columns, details, figures, callouts, TOC — meta.name), a leaf directive\n * `::name` on its own line (meta.leaf), or a MkDocs admonition\n * `!!! type \"Title\"` / `??? type` with its indented body (meta.syntax \"mkdocs\").\n */\n | \"directive\"\n /** A GitHub alert / Obsidian callout: a blockquote opening `> [!TYPE]` (meta.name). */\n | \"callout\"\n /** A footnote definition `[^id]: …` with its indented continuation lines (meta.id). */\n | \"footnote_def\";\n\n/** Island types that live inside a prose block. */\nexport type InlineIslandType =\n | \"variable\"\n | \"cite\"\n | \"math_inline\"\n | \"html_tag\"\n | \"xml_tag\"\n | \"xml_inline\"\n | \"html_comment\"\n | \"anchor\"\n | \"kind_json\"\n | \"media_ref\"\n /** `[[Page]]`, `[[Page|alias]]` (meta.target) — or `![[Page]]` (meta.embed). */\n | \"wikilink\";\n\nexport type IslandType = BlockIslandType | InlineIslandType;\n\nexport type IslandMeta = Readonly<Record<string, string | number | boolean>>;\n\nexport interface SourceSpan {\n /** UTF-16 offset of the first code unit. */\n readonly start: number;\n /** UTF-16 offset just past the last code unit. */\n readonly end: number;\n /** Code-point offset of `start`. */\n readonly startCp: number;\n /** Code-point offset of `end`. */\n readonly endCp: number;\n /** Exactly `text.slice(start, end)`. */\n readonly raw: string;\n}\n\nexport interface SourceIsland extends SourceSpan {\n readonly islandType: IslandType;\n /** True when the island sits inside a prose block. */\n readonly inline: boolean;\n /** False when the construct's closer never arrived (streaming / malformed). */\n readonly complete: boolean;\n readonly meta: IslandMeta;\n}\n\nexport interface SourceBlock extends SourceSpan {\n readonly kind: SourceBlockKind;\n /** Set only on `island` blocks. */\n readonly islandType: BlockIslandType | null;\n readonly complete: boolean;\n readonly meta: IslandMeta;\n /** Inline islands of a `prose` block, in document order. Empty otherwise. */\n readonly inlines: readonly SourceIsland[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// helpers\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface RawIsland {\n type: IslandType;\n start: number;\n end: number;\n complete: boolean;\n meta: Record<string, string | number | boolean>;\n /** Cut out of a paragraph's lines (an orphan-closer rescue, a spilled inline). */\n fromParagraph?: boolean;\n}\n\ninterface RawBlock {\n kind: SourceBlockKind;\n start: number;\n end: number;\n island: RawIsland | null;\n inlines: RawIsland[];\n}\n\nconst NOT_WHITESPACE = /\\S/;\n/** `:::name`, `::name` (leaf) — a name right after the colons. */\nconst DIRECTIVE_OPEN = /^(:{2,})([A-Za-z][\\w-]*)/;\nconst MKDOCS_OPEN = /^(!!!|\\?\\?\\?\\+?)[ \\t]+([A-Za-z][\\w-]*)/;\nconst CALLOUT_OPEN = /^>[ \\t]*\\[!([A-Za-z][\\w-]*)\\]([+-])?/;\n/**\n * Every callout spelling the renderer resolves (matrx-frontend\n * components/markdown-core/syntax/callout-types.ts ALIASES — keep in step).\n */\nexport const CALLOUT_NAMES: ReadonlySet<string> = new Set([\n \"note\", \"seealso\", \"example\", \"tip\", \"hint\", \"important\", \"warning\", \"warn\", \"attention\",\n \"caution\", \"danger\", \"error\", \"failure\", \"fail\", \"missing\", \"bug\", \"info\", \"abstract\",\n \"summary\", \"tldr\", \"todo\", \"success\", \"check\", \"done\", \"question\", \"help\", \"faq\", \"quote\", \"cite\",\n]);\nconst FOOTNOTE_DEF = /^\\[\\^([^\\]\\s]+)\\]:/;\n\nfunction countStructuralBraces(source: string): { opens: number; closes: number } {\n let opens = 0;\n let closes = 0;\n let inString = false;\n let escaped = false;\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') inString = true;\n else if (char === \"{\") opens++;\n else if (char === \"}\") closes++;\n }\n return { opens, closes };\n}\n\nfunction firstJsonKey(content: string): string | null {\n const match = /^\\{\\s*\"([^\"]+)\"/.exec(content.trimStart());\n return match ? (match[1] as string) : null;\n}\n\n/** Describe a JSON object's platform identity for island meta. */\nfunction jsonMeta(content: string): Record<string, string | number | boolean> {\n const meta: Record<string, string | number | boolean> = {};\n const key = firstJsonKey(content);\n if (key) meta.firstKey = key;\n try {\n const parsed: unknown = JSON.parse(content.trim());\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n const kind = (parsed as Record<string, unknown>).__kind;\n if (typeof kind === \"string\" && kind.trim()) meta.kind = kind;\n }\n } catch {\n // partial or malformed — identity from the head only\n const head = /^\\{\\s*\"__kind\"\\s*:\\s*\"([^\"]*)\"/.exec(content.trimStart());\n if (head) meta.kind = head[1] as string;\n }\n if (typeof meta.kind === \"string\" && meta.kind.startsWith(\"directive_v\")) {\n meta.directive = true;\n }\n if (key === \"matrx_version\") meta.directive = true;\n if (key && TYPED_JSON_ROOT_KEYS[key]) meta.typed = TYPED_JSON_ROOT_KEYS[key] as string;\n return meta;\n}\n\n/** A JSON object head the renderer already treats as a typed/kind block mid-stream. */\nfunction isRecognizedJsonHead(content: string): boolean {\n const key = firstJsonKey(content);\n if (!key) return false;\n return key === \"__kind\" || key === \"matrx_version\" || key in TYPED_JSON_ROOT_KEYS;\n}\n\nfunction matchingJsonObjectEnd(source: string, start: number, limit: number): number | null {\n if (source[start] !== \"{\") return null;\n const stack: string[] = [\"{\"];\n let inString = false;\n let escaped = false;\n for (let index = start + 1; index < limit; index++) {\n const char = source[index];\n if (inString) {\n if (escaped) escaped = false;\n else if (char === \"\\\\\") escaped = true;\n else if (char === '\"') inString = false;\n continue;\n }\n if (char === '\"') {\n inString = true;\n continue;\n }\n if (char === \"{\" || char === \"[\") {\n stack.push(char);\n continue;\n }\n if (char !== \"}\" && char !== \"]\") continue;\n const opening = stack.pop();\n if ((char === \"}\" && opening !== \"{\") || (char === \"]\" && opening !== \"[\")) return null;\n if (stack.length === 0) return index + 1;\n }\n return null;\n}\n\nfunction declaredKind(candidate: string): string | null {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return null;\n const kind = (parsed as Record<string, unknown>).__kind;\n return typeof kind === \"string\" && kind.trim() ? kind : null;\n } catch {\n return null;\n }\n}\n\n/** Splitter's `isUnclosedGenericXmlOpening`: an unknown opening tag still arriving. */\nfunction isUnclosedGenericXmlOpening(source: string): boolean {\n const text = source.trimStart();\n const prefix = /^<([A-Za-z_][\\w.:-]*)(?=\\s|\\/|$)/.exec(text);\n if (\n !prefix ||\n KNOWN_XML_TAG_NAMES.has(prefix[1] as string) ||\n ALLOWED_RAW_HTML_TAGS.has((prefix[1] as string).toLowerCase())\n )\n return false;\n let quote: string | null = null;\n for (let i = prefix[0].length; i < text.length; i++) {\n if (quote) {\n if (text[i] === quote) quote = null;\n } else if (text[i] === \"'\" || text[i] === '\"') quote = text[i] as string;\n else if (text[i] === \">\") return false;\n }\n return true;\n}\n\n/** The renderer splitter's `isTreeLine` (box glyphs OR ASCII connectors) — used only to stop a root walk-back. */\nfunction isSplitterTreeLine(line: string): boolean {\n return TREE_GLYPHS.test(line) || /^[\\s│|]*[├└+|][\\s─\\-]+/.test(line);\n}\n\nconst MEDIA_REF_PREFIXES = [\"[Image URL:\", \"[Video URL:\", \"[Audio URL:\"] as const;\n\n// ─────────────────────────────────────────────────────────────────────────\n// the tokenizer\n// ─────────────────────────────────────────────────────────────────────────\n\nclass Tokenizer {\n private readonly text: string;\n private readonly streaming: boolean;\n private readonly meter: { work: number } | undefined;\n private readonly n: number;\n private readonly lineStarts: number[] = [];\n private readonly contentEnds: number[] = [];\n private readonly lineEnds: number[] = [];\n private readonly blocks: RawBlock[] = [];\n private readonly blockCache = new Map<number, RawIsland | null>();\n /** Lazily built: for line i, first line j >= i where brace net from i drops to <= 0. */\n private braceStop: Int32Array | null = null;\n private braceNet: Int32Array | null = null;\n /** Every occurrence offset of each needle searched so far (overlapping, like indexOf). */\n private readonly occurrences = new Map<string, number[]>();\n /** `$$` opener → closer for the pairs the core renders as math. */\n private readonly mathPairs: Map<number, number>;\n private readonly finder = (needle: string, from: number): number => this.next(needle, from);\n\n constructor(\n text: string,\n streaming = false,\n meter: { work: number } | undefined = undefined,\n ) {\n this.text = text;\n this.streaming = streaming;\n this.meter = meter;\n this.n = text.length;\n this.tick(text.length); // the line split below walks the whole text\n this.mathPairs = pairDisplayMath(text);\n // Streaming: a `$$` still waiting for its partner may yet turn what follows\n // into math, so nothing at or after it is an island yet (G5).\n this.provisionalFrom = streaming ? pendingDisplayMathOpener(text) : -1;\n if (this.provisionalFrom === -1) this.provisionalFrom = Number.POSITIVE_INFINITY;\n // Streaming: the pairing rule's code ranges depend on backtick / tilde runs\n // the next bytes can still complete (`` → ```, an inline span's closing `),\n // which can re-pair `$$` tokens already read. Pair the text as if each\n // completion had arrived; any `$$` paired differently is not settled.\n if (streaming && text.includes(\"$$\")) {\n // A code span the final paragraph may still close can swallow any `$$`\n // after its opener (the pairing rule's code spans run across lines).\n // Only `$$` readings can change: the first token after the span's opener,\n // and the opener of any pair whose closer lies after it.\n const span = pendingCodeSpanStart(text);\n if (span !== -1) {\n const firstToken = text.indexOf(\"$$\", span);\n if (firstToken !== -1) this.provisionalFrom = Math.min(this.provisionalFrom, firstToken);\n for (const [open, close] of this.mathPairs) {\n if (close >= span) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n // `$`: a trailing single `$` may be the first half of a `$$` (round 3, B3).\n for (const pad of [\"`\", \"``\", \"```\", \"~~~\", \"$\"]) {\n const alt = pairDisplayMath(text + pad);\n for (const [open, close] of this.mathPairs) {\n if (alt.get(open) !== close) this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n for (const [open, close] of alt) {\n if (close < text.length && this.mathPairs.get(open) !== close) {\n this.provisionalFrom = Math.min(this.provisionalFrom, open);\n }\n }\n }\n }\n let start = 0;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) {\n this.lineStarts.push(start);\n this.contentEnds.push(i > start && text.charCodeAt(i - 1) === 13 ? i - 1 : i);\n this.lineEnds.push(i + 1);\n start = i + 1;\n }\n }\n if (start < text.length || text.length === 0) {\n // Streaming: a final lone CR is the first half of a CRLF still arriving —\n // it is not content (once the LF lands it never is), so a construct\n // ending on this line does not shrink by one when it does (G5).\n this.pendingCR = streaming && text.length > start && text.charCodeAt(text.length - 1) === 13;\n this.lineStarts.push(start);\n this.contentEnds.push(this.pendingCR ? text.length - 1 : text.length);\n this.lineEnds.push(text.length);\n }\n }\n\n /** Streaming: where provisional text starts (a pending `$$`), or +∞. */\n private provisionalFrom = Number.POSITIVE_INFINITY;\n\n /** Streaming: the text ends in a lone CR whose LF has not arrived yet. */\n private pendingCR = false;\n\n /**\n * `text.indexOf(needle, from)` in O(log k): the first query for a needle\n * indexes all of its occurrences once, so repeated searches for a closer\n * that never comes stay linear over the whole text.\n */\n private next(needle: string, from: number): number {\n let list = this.occurrences.get(needle);\n if (!list) {\n list = [];\n for (let at = this.text.indexOf(needle); at !== -1; at = this.text.indexOf(needle, at + 1)) {\n list.push(at);\n }\n this.occurrences.set(needle, list);\n }\n let lo = 0;\n let hi = list.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if ((list[mid] as number) < from) lo = mid + 1;\n else hi = mid;\n }\n return lo < list.length ? (list[lo] as number) : -1;\n }\n\n /** Charge `n` visited characters to the diagnostic meter (complexity tests). */\n private tick(n: number): void {\n if (this.meter) this.meter.work += n;\n }\n\n /** Streaming only: a paragraph ending at `pe` may still be continued by a line not yet arrived. */\n private paragraphMayGrow(pe: number): boolean {\n if (!this.streaming) return false;\n // A paragraph cut short by a block that is still undecided (a `$$` pair\n // whose closer sits on the open last line, a JSON head whose braces have\n // not balanced) grows over that block if it dissolves into prose.\n if (this.undecidedBreaks.has(pe)) return true;\n const rest = this.n - pe;\n if (rest === 0) return true;\n const tail = this.text.slice(pe);\n // One line break, then an open last line that is blank SO FAR: its next\n // byte may be text that continues the paragraph (``Set `mode {{v}}\\n `` +\n // ``and` `` closes the code span over the variable) — F3.\n // A trailing lone CR is the first half of a line break still arriving —\n // the open line is still blank so far (verify-RC-B3 round 3, B4).\n return /^(?:\\r\\n|\\r|\\n)[ \\t\\r]*$/.test(tail);\n }\n\n /**\n * Streaming: an open block that may still turn back into prose — a `$$`\n * pair whose closer is on the open last line (prose after it makes it\n * inline), a JSON head whose braces have not balanced (it may never parse),\n * or any opener that is itself still arriving on the open last line.\n */\n private mayDissolve(block: RawIsland): boolean {\n if (!this.streaming) return false;\n // A block that opens in provisional text may not be a block at all once\n // that text decides (a pending code span can swallow its `$$`).\n if (block.start >= this.provisionalFrom) return true;\n if (block.complete) return false;\n if (block.type === \"math_block\" || block.type === \"json\") return true;\n // An opener still arriving on the open last line (`<n` + `` ` ``) may yet\n // turn out to be no opener at all.\n return this.isOpenTail(this.lineOf(block.start));\n }\n\n /** Streaming: paragraph ends where an undecided, dissolvable block cut them short. */\n private readonly undecidedBreaks = new Set<number>();\n\n /** Streaming only: the final line, still waiting for its terminator. */\n private isOpenTail(k: number): boolean {\n return (\n this.streaming &&\n k === this.lineStarts.length - 1 &&\n (this.lineEnds[k] === this.contentEnds[k] || this.pendingCR)\n );\n }\n\n private get lineCount(): number {\n return this.lineStarts.length;\n }\n\n private lineOf(pos: number): number {\n let lo = 0;\n let hi = this.lineStarts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >>> 1;\n if ((this.lineStarts[mid] as number) <= pos) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n /** How many whitespace characters open the text at `from` (up to `to`). */\n private leadingSpace(from: number, to: number): number {\n let k = from;\n while (k < to && /\\s/.test(this.text[k] as string)) k++;\n return k - from;\n }\n\n private isBlank(from: number, to: number): boolean {\n return !NOT_WHITESPACE.test(this.text.slice(from, to));\n }\n\n private lineIsBlank(li: number): boolean {\n return this.isBlank(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n private lineText(li: number): string {\n return this.text.slice(this.lineStarts[li] as number, this.contentEnds[li] as number);\n }\n\n run(): RawBlock[] {\n let pos = 0;\n while (pos < this.n) {\n const li = this.lineOf(pos);\n const ce = this.contentEnds[li] as number;\n if (this.isBlank(pos, ce)) {\n pos = this.gap(pos, li);\n continue;\n }\n if (pos >= this.provisionalFrom) {\n this.push({ kind: \"prose\", start: pos, end: this.n, island: null, inlines: [] });\n break;\n }\n const island = this.detectBlock(pos, li, true);\n // Streaming: a block whose OPENER is provisional text (indented past\n // the line start, ` $$…` with a pending code span) is as undecided as\n // that text.\n if (island && pos + this.leadingSpace(pos, this.contentEnds[li] as number) >= this.provisionalFrom) {\n this.push({ kind: \"prose\", start: pos, end: this.n, island: null, inlines: [] });\n break;\n }\n if (island) {\n this.push({ kind: \"island\", start: island.start, end: island.end, island, inlines: [] });\n pos = island.end;\n continue;\n }\n pos = this.paragraph(pos, li);\n }\n if (this.streaming) this.holdUndecidedTail();\n return this.blocks;\n }\n\n /**\n * Streaming: settle nothing the next bytes can still change (verify-RC-B3 F3).\n *\n * 1. A block island that ends on the open last line is undecided — the next\n * bytes on that line can re-read it or dissolve it (`<!--@a:k1-->` +\n * ` more` is an inline anchor, `<br>` + `x` is prose). It runs open to\n * the end of the text.\n * 2. A box-drawing tree still forming at the end of the text claims, as its\n * root label, the lines directly above its first connector (the\n * renderer's `findTreeBlockStart`), and the open last line itself may\n * become one of its connector lines — so inlines on those lines are held\n * back as prose until a blank line, a heading or a tree line decides.\n * This also holds everything a closer still able to arrive on the open\n * last line could change (`$x$` + `5` is currency, G4; `{{v}}` + `}`).\n */\n private holdUndecidedTail(): void {\n const last = this.lineStarts.length - 1;\n if (last < 0) return;\n // An island read out of a paragraph that reaches INTO provisional text\n // (`<!--\\n$$-->` while that `$$` may still pair) is as undecided as that\n // text (verify-RC-B3 round 4, D1).\n if (this.provisionalFrom < this.n) {\n for (let b = 0; b < this.blocks.length; b++) {\n const block = this.blocks[b] as RawBlock;\n if (block.end <= this.provisionalFrom) continue;\n if (block.kind === \"prose\") block.inlines = block.inlines.filter((inline) => inline.end <= this.provisionalFrom);\n else if (block.island?.fromParagraph && block.start < this.provisionalFrom) {\n this.blocks[b] = { kind: \"prose\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n }\n }\n if (this.isOpenTail(last)) {\n // The last block that is not whitespace; islands only (prose is held below).\n let b = this.blocks.length - 1;\n while (b >= 0 && (this.blocks[b] as RawBlock).kind === \"gap\") b--;\n const block = this.blocks[b];\n if (block?.island?.complete && block.island.end > (this.lineStarts[last] as number)) {\n block.island.complete = false;\n block.island.end = this.n;\n block.end = this.n;\n this.blocks.length = b + 1; // only whitespace followed it\n }\n }\n const from = this.treeRootHoldFrom();\n for (let b = this.blocks.length - 1; b >= 0; b--) {\n const block = this.blocks[b] as RawBlock;\n if (block.end <= from) break;\n if (block.kind === \"prose\") block.inlines = block.inlines.filter((inline) => inline.end <= from);\n // An island on lines the tree may claim (an orphan-closer rescue, a\n // block that opened mid-line on one) is held as prose.\n if (block.island) this.blocks[b] = { kind: \"prose\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n }\n\n /**\n * Streaming: where a tree that may still form at the end of the text would\n * start claiming lines (`n` when none can). Only paragraph lines can be\n * claimed — a line that starts inside an island (a fence body, an XML\n * region…) is never a tree line nor a root label, so it stops the walk.\n */\n private treeRootHoldFrom(): number {\n /** Where line `k` becomes claimable paragraph text, or -1 when an island owns the rest of it. */\n const claimFrom = (k: number): number => {\n const lineStart = this.lineStarts[k] as number;\n const lineEnd = this.contentEnds[k] as number;\n let pos = lineStart;\n for (;;) {\n const block = this.blockAt(pos);\n if (!block || block.kind !== \"island\" || !block.island) return pos;\n // Cut out of a paragraph, or still able to dissolve back into one.\n if (block.island.fromParagraph === true || this.mayDissolve(block.island)) return pos;\n if (block.start < lineStart) {\n // An island that opened mid-line on an earlier claimable line shares\n // that line's fate; otherwise it owns this line up to its end.\n const opened = this.lineOf(block.start);\n if ((this.lineStarts[opened] as number) !== block.start && claimFrom(opened) !== -1) return pos;\n if (block.end >= lineEnd) return -1;\n pos = block.end;\n continue;\n }\n // An island on this line: the text after it may still be paragraph text.\n if (block.end >= lineEnd) return -1;\n pos = block.end;\n }\n };\n let k = this.lineCount - 1;\n // The line a new connector can still land on: the open last line, or the\n // next line when the text ends with a terminator.\n let start = this.lineCount;\n let startPos = this.n;\n if (k >= 0 && this.isOpenTail(k)) {\n const at = claimFrom(k);\n if (at === -1) return this.n;\n start = k;\n startPos = at;\n k--;\n }\n // A tree counts connector lines across blank lines, so it can start at\n // any connector line of the trailing connector/blank run.\n for (; k >= 0; k--) {\n this.tick(1);\n const at = claimFrom(k);\n if (at === -1) break;\n if (this.lineIsBlank(k)) continue;\n if (!TREE_GLYPHS.test(this.lineText(k))) break;\n start = k;\n startPos = at;\n }\n let rootPos = startPos;\n for (let j = start - 1; j >= 0; j--) {\n const at = claimFrom(j);\n if (at === -1) break;\n const trimmed = this.lineText(j).trim();\n this.tick(trimmed.length + 1);\n if (!trimmed || isSplitterTreeLine(trimmed) || /^#{1,6}\\s/.test(trimmed)) break;\n rootPos = at;\n if (at > (this.lineStarts[j] as number)) break; // an island before it on its line ends the walk\n }\n return rootPos;\n }\n\n /** The block (so far) containing offset `pos`, or null. */\n private blockAt(pos: number): RawBlock | null {\n let lo = 0;\n let hi = this.blocks.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const block = this.blocks[mid] as RawBlock;\n if (pos < block.start) hi = mid - 1;\n else if (pos >= block.end) lo = mid + 1;\n else return block;\n }\n return null;\n }\n\n private push(block: RawBlock): void {\n if (block.end <= block.start) return;\n if (block.kind === \"prose\" && this.isBlank(block.start, block.end)) {\n block = { kind: \"gap\", start: block.start, end: block.end, island: null, inlines: [] };\n }\n const last = this.blocks[this.blocks.length - 1];\n if (block.kind === \"gap\" && last && last.kind === \"gap\" && last.end === block.start) {\n last.end = block.end;\n return;\n }\n this.blocks.push(block);\n }\n\n private gap(pos: number, li: number): number {\n let end = this.lineEnds[li] as number;\n let k = li + 1;\n while (k < this.lineCount && this.lineIsBlank(k)) {\n end = this.lineEnds[k] as number;\n k++;\n }\n this.push({ kind: \"gap\", start: pos, end, island: null, inlines: [] });\n return end;\n }\n\n // ── block detection ────────────────────────────────────────────────────\n\n private detectBlock(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const cacheKey = atParaStart ? -1 - p : p;\n if (this.blockCache.has(cacheKey)) return this.blockCache.get(cacheKey) ?? null;\n const found = this.detectBlockUncached(p, li, atParaStart);\n this.blockCache.set(cacheKey, found);\n return found;\n }\n\n private detectBlockUncached(p: number, li: number, atParaStart: boolean): RawIsland | null {\n const ce = this.contentEnds[li] as number;\n const seg = this.text.slice(p, ce);\n const t = seg.trimStart();\n const indent = seg.length - t.length;\n const tp = p + indent;\n\n if (p === 0) {\n const fm = this.frontMatter(li, t);\n if (fm) return fm;\n }\n // An indented `:::` / `> [!x]` under a list item belongs to that item:\n // the renderer draws it INSIDE the list, so it must stay in the list's\n // prose block — cutting it out would let an editor move it away from its\n // item (verify-RC-B8 round 2, SAFETY).\n const listNested = indent > 0 && this.inListContinuation(li);\n if (indent <= 3 && !listNested && t.startsWith(\"::\")) {\n const directive = this.directive(p, li, t);\n if (directive) return directive;\n }\n if (indent === 0 && (t.startsWith(\"!!!\") || t.startsWith(\"???\"))) {\n const admonition = this.mkdocsAdmonition(p, li, t);\n if (admonition) return admonition;\n }\n if (indent <= 3 && !listNested && t.startsWith(\">\")) {\n const callout = this.callout(p, li, t);\n if (callout) return callout;\n }\n if (atParaStart && indent <= 3 && t.startsWith(\"[^\")) {\n const footnote = this.footnoteDefinition(p, li, t);\n if (footnote) return footnote;\n }\n // THE one fence rule (source/code-ranges.ts): backtick at any indent, tilde at <= 3.\n const fence = fenceOpenerOf(seg);\n if (fence?.char === \"`\") return this.backtickFence(p, li, fence);\n if (fence?.char === \"~\") return this.tildeFence(p, li, fence);\n if (t.startsWith(\"$$\")) {\n const math = this.mathBlock(p, tp);\n if (math) return math;\n }\n if (t.startsWith(\"<\")) {\n const attr = this.attributeXml(p, tp, t);\n if (attr) return attr;\n const region = this.xmlRegion(p, tp, t);\n if (region) return region;\n const container = this.genericXml(p, li, seg, indent);\n if (container) return container;\n if (t.startsWith(\"<!--\")) {\n const comment = this.blockComment(p, tp, li);\n if (comment) return comment;\n }\n const html = this.htmlBlock(p, li, t, tp, atParaStart);\n if (html) return html;\n }\n if (t.startsWith(\"{\")) {\n const json = this.bareJson(p, li, tp);\n if (json) return json;\n }\n if (TREE_GLYPHS.test(t)) {\n const tree = this.tree(p, li);\n if (tree) return tree;\n }\n return null;\n }\n\n /** True when line `li` continues a list item (the nearest non-blank line above is a list item or indented text under one). */\n private inListContinuation(li: number): boolean {\n for (let k = li - 1; k >= 0; k--) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) continue;\n if (/^[ \\t]*(?:[-*+]|\\d{1,9}[.)])[ \\t]/.test(line)) return true;\n if (/^[ \\t]/.test(line)) continue;\n return false;\n }\n return false;\n }\n\n private island(\n type: IslandType,\n start: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean> = {},\n ): RawIsland {\n return { type, start, end, complete, meta };\n }\n\n private frontMatter(li: number, t: string): RawIsland | null {\n // A leading byte-order mark is an encoding mark, not content: `\\uFEFF---`\n // opens front matter like `---` (RC-B3r round 3, C1).\n const fence = this.lineText(li).replace(/^\\uFEFF/, \"\");\n if ((fence !== \"---\" && fence !== \"+++\") || t !== fence) return null;\n const toml = fence === \"+++\";\n let sawContent = false;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (line === fence || (!toml && line === \"...\")) {\n return sawContent\n ? this.island(\"front_matter\", 0, this.contentEnds[k] as number, true, { format: toml ? \"toml\" : \"yaml\" })\n : null;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n const shaped = toml\n ? /^\\s*(?:[A-Za-z0-9_.\"-]+\\s*=|\\[|#)/.test(line)\n : /^(?:[A-Za-z0-9_\"'-][^:]*:(?:\\s|$)|\\s+\\S|-\\s|#)/.test(line);\n if (!shaped) {\n // Streaming: the open last line may still become the closing fence.\n if (this.isOpenTail(k)) break;\n return null;\n }\n sawContent = true;\n }\n // Streaming: a front matter whose closing fence has not arrived yet is\n // undecided — the closer turns everything so far into document properties\n // (markdown-core holds it back the same way, `hasUnclosedFrontmatter`).\n if (this.streaming) return this.island(\"front_matter\", 0, this.n, false, { format: toml ? \"toml\" : \"yaml\" });\n return null;\n }\n\n /**\n * `:::name[label]{attrs}` … closing `:::` (a colon run at least as long as\n * the opener's, nesting counted), or a leaf `::name[…]{…}` line. The whole\n * container is ONE island: its grammar (fence lengths, labels, attributes,\n * nested tabs) is exactly what a visual editor would re-serialize wrongly.\n */\n private directive(p: number, li: number, t: string): RawIsland | null {\n const open = DIRECTIVE_OPEN.exec(t);\n if (!open) return null;\n const colons = (open[1] as string).length;\n const name = open[2] as string;\n if (colons === 2) {\n return this.island(\"directive\", p, this.contentEnds[li] as number, true, { name, leaf: true });\n }\n const stack: number[] = [colons];\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k).trim();\n const inner = DIRECTIVE_OPEN.exec(line);\n if (inner && (inner[1] as string).length >= 3) {\n stack.push((inner[1] as string).length);\n continue;\n }\n const close = /^(:{3,})\\s*$/.exec(line);\n if (close && (close[1] as string).length >= (stack[stack.length - 1] as number)) {\n stack.pop();\n if (stack.length === 0) return this.island(\"directive\", p, this.contentEnds[k] as number, true, { name });\n }\n }\n return this.island(\"directive\", p, this.n, false, { name });\n }\n\n /** MkDocs `!!! type \"Title\"` / `??? type` / `???+ type` and its indented (or blank-separated indented) body. */\n private mkdocsAdmonition(p: number, li: number, t: string): RawIsland | null {\n const open = MKDOCS_OPEN.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (/^(?: {4}|\\t)/.test(line) && NOT_WHITESPACE.test(line)) {\n last = k;\n continue;\n }\n if (!NOT_WHITESPACE.test(line)) continue;\n break;\n }\n return this.island(\"directive\", p, this.contentEnds[last] as number, true, {\n name: (open[2] as string).toLowerCase(),\n syntax: \"mkdocs\",\n });\n }\n\n /** A blockquote whose first line is `> [!TYPE]…` — every following `>` line belongs to it. */\n private callout(p: number, li: number, t: string): RawIsland | null {\n const open = CALLOUT_OPEN.exec(t);\n // Only a name the renderer draws as a callout is one; `> [!BOGUS]` is an\n // ordinary quote there, so it stays editable prose here (verify-RC-B8).\n if (!open || !CALLOUT_NAMES.has((open[1] as string).toLowerCase())) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (!/^ {0,3}>/.test(this.lineText(k))) break;\n last = k;\n }\n return this.island(\"callout\", p, this.contentEnds[last] as number, true, {\n name: (open[1] as string).toLowerCase(),\n ...(open[2] ? { fold: open[2] === \"-\" ? \"closed\" : \"open\" } : {}),\n });\n }\n\n /** `[^id]: text` plus its continuation lines (indented, or lazy text before a blank line). */\n private footnoteDefinition(p: number, li: number, t: string): RawIsland | null {\n const open = FOOTNOTE_DEF.exec(t);\n if (!open) return null;\n let last = li;\n for (let k = li + 1; k < this.lineCount; k++) {\n const line = this.lineText(k);\n if (!NOT_WHITESPACE.test(line)) {\n // A blank line continues the note only when an indented line follows.\n let j = k + 1;\n while (j < this.lineCount && !NOT_WHITESPACE.test(this.lineText(j))) j++;\n if (j < this.lineCount && /^(?: {4}|\\t)/.test(this.lineText(j))) {\n k = j - 1;\n continue;\n }\n break;\n }\n if (/^(?: {4}|\\t)/.test(line)) {\n last = k;\n continue;\n }\n // Streaming: an unterminated last line may still become `[^m]: …` (a new\n // note), a block, or this note's lazy continuation — undecided (G5, H1).\n // Checked BEFORE block detection: what that line is, is not known yet.\n if (this.isOpenTail(k)) return this.heldFootnote(p, open[1] as string);\n if (FOOTNOTE_DEF.test(line.trimStart())) break;\n // Streaming: a connector line that a tree may still claim (fewer than\n // three connector lines so far, all the way to the end) is undecided —\n // it is this note's lazy line only if no tree forms (round 4, D1).\n if (this.streaming && TREE_GLYPHS.test(line) && this.connectorRunReachesEnd(k)) {\n return this.heldFootnote(p, open[1] as string);\n }\n const block = this.detectBlock(this.lineStarts[k] as number, k, false);\n // Streaming: a block that may still dissolve into prose would make its\n // line this note's lazy continuation — undecided (F3).\n if (block && this.mayDissolve(block)) return this.heldFootnote(p, open[1] as string);\n if (block) break;\n last = k;\n }\n const end = this.contentEnds[last] as number;\n // Streaming: a note that ends the text (at most one line terminator after\n // it) may still gain a lazy continuation line — held open, never settled,\n // until that is decided (verify-RC-B3 H1).\n if (this.paragraphMayGrow(end)) return this.heldFootnote(p, open[1] as string);\n // Streaming: a note that took in provisional text (a `$$` that may still\n // pair across a blank line) is as undecided as that text (round 4).\n if (this.streaming && end > this.provisionalFrom) return this.heldFootnote(p, open[1] as string);\n return this.island(\"footnote_def\", p, end, true, { id: open[1] as string });\n }\n\n /** Every line from `k` to the end is a connector line or blank (a tree may still form there). */\n private connectorRunReachesEnd(k: number): boolean {\n if (this.lastNonConnectorLine === undefined) {\n // Once, from the end: the last line that is neither blank nor a connector.\n let j = this.lineCount - 1;\n for (; j >= 0; j--) {\n this.tick(1);\n if (!this.lineIsBlank(j) && !TREE_GLYPHS.test(this.lineText(j))) break;\n }\n this.lastNonConnectorLine = j;\n }\n return k > this.lastNonConnectorLine;\n }\n\n private lastNonConnectorLine: number | undefined = undefined;\n\n /** A footnote whose continuation is still arriving: open to the end of the text. */\n private heldFootnote(p: number, id: string): RawIsland {\n return this.island(\"footnote_def\", p, this.n, false, { id });\n }\n\n /** The text's lines as the one fence closer reads them (streaming: the open tail closes nothing). */\n private get fenceLines(): FenceLines {\n return {\n count: this.lineCount,\n line: (k) => this.lineText(k),\n openTail: (k) => this.isOpenTail(k),\n streaming: this.streaming,\n };\n }\n\n /**\n * Backtick fence — THE one closer (`closeFence`, source/code-ranges.ts): the\n * nested-fence rule for markdown fences with the strict-CommonMark retry, the\n * renderer's line-end closer, JSON-string awareness for ```json.\n */\n private backtickFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const isJson = lang === \"json\";\n const normalized = normalizeFenceLanguage(lang);\n const meta: Record<string, string | number | boolean> = { fence: \"`\", ticks: opener.ticks, lang };\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const end = closeFence(this.fenceLines, li, opener);\n if (end.closed) {\n return this.fenceIsland(p, this.contentEnds[end.line] as number, true, meta, li, end.line, isJson);\n }\n return this.fenceIsland(p, this.n, false, meta, li, this.lineCount, isJson);\n }\n\n private fenceIsland(\n p: number,\n end: number,\n complete: boolean,\n meta: Record<string, string | number | boolean>,\n openLine: number,\n closeLine: number,\n isJson: boolean,\n ): RawIsland {\n if (isJson && openLine + 1 < this.lineCount) {\n const bodyEnd =\n closeLine < this.lineCount ? (this.lineStarts[closeLine] as number) : this.n;\n const body = this.text.slice(this.lineStarts[openLine + 1] as number, Math.max(bodyEnd, this.lineStarts[openLine + 1] as number));\n if (body.trimStart().startsWith(\"{\")) Object.assign(meta, jsonMeta(body));\n }\n return this.island(\"fence\", p, end, complete, meta);\n }\n\n private tildeFence(p: number, li: number, opener: FenceOpener): RawIsland {\n const lang = opener.lang;\n const meta: Record<string, string | number | boolean> = { fence: \"~\", ticks: opener.ticks, lang };\n const normalized = normalizeFenceLanguage(lang);\n if (normalized && SPECIAL_CODE_LANGUAGES.has(normalized)) meta.special = normalized;\n const close = closeFence(this.fenceLines, li, opener);\n if (close.closed) {\n const tildeEnd = this.contentEnds[close.line] as number;\n const end = this.rendererOverflow(li + 1, close.line, tildeEnd);\n return this.island(\"fence\", p, end, end === this.n ? this.overflowComplete : true, meta);\n }\n return this.island(\"fence\", p, this.n, false, meta);\n }\n\n /** Completion of the last `rendererOverflow` that ran to the end of the text. */\n private overflowComplete = true;\n\n /**\n * The renderer's splitter does not know ~~~ fences: it reads the lines inside\n * one as ordinary lines, so a ```` ``` ```` fence (or an XML section, a JSON\n * block…) that STARTS inside the tilde fence can run past its closer. The\n * editor must lock at least what the renderer draws (verify-RC-B3 residual\n * R5), so a tilde island extends over every block the renderer would detect\n * starting inside it. Returns the island's end.\n */\n private rendererOverflow(firstLine: number, closeLine: number, tildeEnd: number): number {\n let end = tildeEnd;\n this.overflowComplete = true;\n for (let j = firstLine; j <= closeLine && j < this.lineCount; j++) {\n const start = this.lineStarts[j] as number;\n if (this.lineIsBlank(j)) continue;\n // The renderer sees no tildes: a ~~~ line (the closer included) opens\n // nothing, and skipping it BEFORE detection keeps this scan from ever\n // re-entering tildeFence (no recursion, however many ~~~ lines follow).\n if (fenceOpenerOf(this.lineText(j))?.char === \"~\") continue;\n const inner = this.detectBlockUncached(start, j, false);\n if (!inner) continue;\n // Streaming: a block that reaches the closer and ends where the text\n // ends may still grow past it (an html block runs to a blank line) — the\n // fence's end is undecided (F3).\n if (this.streaming && inner.end >= tildeEnd && this.paragraphMayGrow(inner.end)) {\n this.overflowComplete = false;\n return this.n;\n }\n if (inner.end > end) {\n end = inner.end;\n this.overflowComplete = inner.complete;\n }\n const lastLine = this.lineOf(Math.max(start, inner.end - 1));\n if (lastLine > j) j = lastLine;\n }\n return end;\n }\n\n /**\n * A line-leading `$$` that OPENS a math pair (source/math-pairs.ts — the\n * core's rule). A closer, an unpaired `$$`, or a prose pair is never a block:\n * a lone `$$` renders as literal text and locks nothing.\n */\n private mathBlock(p: number, tp: number): RawIsland | null {\n const close = this.mathPairs.get(tp);\n if (close === undefined) return null;\n const end = close + 2;\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n // `$$x$$` followed by prose on its line is inline math inside a paragraph.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n const endLine = this.lineOf(close);\n const endCe = this.contentEnds[endLine] as number;\n // A multi-line pair whose closer is followed by prose stays in its paragraph.\n if (endLine !== li && !this.isBlank(end, endCe)) return null;\n // Streaming: a closer on the still-open last line may yet be followed by\n // prose on that line (which makes it inline math in a paragraph), so the\n // block is not settled until the line ends (verify-RC-B3 residual R2′).\n // (An unsettled island runs to the end of the text, like every open island.)\n if (this.isOpenTail(endLine)) return this.island(\"math_block\", p, this.n, false, { delimiter: \"$$\" });\n return this.island(\"math_block\", p, end, true, { delimiter: \"$$\" });\n }\n\n /** `<artifact …>`, `<decision …>`, … at the start of a line. */\n private attributeXml(p: number, tp: number, t: string): RawIsland | null {\n for (const name of ATTRIBUTE_XML_NAMES) {\n const prefix = `<${name}`;\n if (!t.startsWith(prefix)) continue;\n const next = t[prefix.length];\n if (next !== \" \" && next !== \">\" && next !== \"/\" && next !== \"\\t\") continue;\n return this.attributeElement(name, p, tp, \"xml_attr\");\n }\n return null;\n }\n\n /** Opening tag at `tp` through its `</name>` (or to EOF when still streaming). */\n private attributeElement(\n name: string,\n p: number,\n tp: number,\n type: IslandType,\n ): RawIsland | null {\n const li = this.lineOf(tp);\n const ce = this.contentEnds[li] as number;\n const tag = readXmlTag(this.text, tp, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n let openEnd: number;\n if (tag && !tag.isClosing) {\n if (tag.isSelfClosing) {\n return this.island(type, p, tp + tag.raw.length, true, { tag: name, selfClosing: true });\n }\n openEnd = tp + tag.raw.length;\n } else {\n const gt = this.next(\">\", tp);\n if (gt === -1) return this.island(type, p, this.n, false, { tag: name });\n if (gt >= ce) return null;\n openEnd = gt + 1;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, openEnd);\n if (close === -1) return this.island(type, p, this.n, false, { tag: name });\n return this.island(type, p, close + closer.length, true, { tag: name });\n }\n\n /** `<thinking>`, `<flashcards>`, … — exact attribute-less openers. */\n private xmlRegion(p: number, tp: number, t: string): RawIsland | null {\n for (const name of XML_TAG_BLOCK_NAMES) {\n const opener = `<${name}>`;\n if (!t.startsWith(opener)) continue;\n const closer = `</${name}>`;\n const close = this.next(closer, tp + opener.length);\n if (close === -1) return this.island(\"xml_region\", p, this.n, false, { tag: name });\n return this.island(\"xml_region\", p, close + closer.length, true, { tag: name });\n }\n return null;\n }\n\n /** Line-leading unknown XML element — balanced by the renderer's own tracker. */\n private genericXml(p: number, li: number, seg: string, indent: number): RawIsland | null {\n const first = seg.slice(indent);\n const opening = readXmlTag(first, 0);\n if (opening && !opening.isClosing) {\n const root = opening.tagName;\n if (KNOWN_XML_TAG_NAMES.has(root) || ALLOWED_RAW_HTML_TAGS.has(root.toLowerCase())) {\n return null;\n }\n const tracker = new XmlContainerTracker(root);\n const firstEnd = tracker.consumeLine(seg, indent);\n if (firstEnd !== null) {\n return this.island(\"xml_container\", p, p + firstEnd, true, { tag: root });\n }\n for (let k = li + 1; k < this.lineCount; k++) {\n const end = tracker.consumeLine(this.lineText(k));\n if (end !== null) {\n return this.island(\"xml_container\", p, (this.lineStarts[k] as number) + end, true, {\n tag: root,\n });\n }\n }\n // An HTML BLOCK tag (`<div>`, `<section>`, …) that never closes is no\n // container that owns the rest of the text: GFM ends that HTML block at\n // the first blank line, so it stays prose for the markdown renderer — the\n // chat splitters agree (verify-RC-B4 round 9).\n if (isHtmlBlockTagName(root)) return null;\n return this.island(\"xml_container\", p, this.n, false, { tag: root });\n }\n if (isUnclosedGenericXmlOpening(seg)) {\n const name = /^\\s*<([A-Za-z_][\\w.:-]*)/.exec(seg)?.[1] ?? \"\";\n if (isHtmlBlockTagName(name)) return null;\n return this.island(\"xml_container\", p, this.n, false, {});\n }\n return null;\n }\n\n private blockComment(p: number, tp: number, li: number): RawIsland | null {\n const close = this.next(\"-->\", tp + 4);\n if (close === -1) return this.island(\"html_comment\", p, this.n, false);\n const end = close + 3;\n const raw = this.text.slice(tp, end);\n const anchor = PINNED_ANCHOR_RE.exec(raw);\n const ce = this.contentEnds[li] as number;\n if (anchor) {\n // A pinned anchor followed by prose on its line is an inline marker.\n if (end <= ce && !this.isBlank(end, ce)) return null;\n return this.island(\"anchor\", p, end, true, { id: anchor[1] as string });\n }\n return this.island(\"html_comment\", p, end, true);\n }\n\n private htmlBlock(\n p: number,\n li: number,\n t: string,\n tp: number,\n atParaStart: boolean,\n ): RawIsland | null {\n const tag = readXmlTag(t, 0);\n if (!tag) return null;\n const name = tag.tagName.toLowerCase();\n if (!ALLOWED_RAW_HTML_TAGS.has(name)) return null;\n if (name === \"pre\" && !tag.isClosing) {\n const closer = /<\\/pre\\s*>/gi;\n closer.lastIndex = tp;\n const close = closer.exec(this.text);\n if (!close) return this.island(\"html_block\", p, this.n, false, { tag: name });\n return this.island(\"html_block\", p, close.index + close[0].length, true, { tag: name });\n }\n const typeSix = HTML_BLOCK_LEVEL_TAGS.has(name);\n // A line that is only one tag opens a block; while that line is still\n // arriving, more bytes can make it prose, so it decides nothing (G5).\n // A line that is only one tag opens a block. While that line is still\n // arriving, more bytes can make it prose — holdUndecidedTail reports such\n // a block open (G5, F3).\n const typeSeven = atParaStart && t.trimEnd() === tag.raw;\n if (!typeSix && !typeSeven) return null;\n let end = this.contentEnds[li] as number;\n for (let k = li + 1; k < this.lineCount && !this.lineIsBlank(k); k++) {\n end = this.contentEnds[k] as number;\n }\n return this.island(\"html_block\", p, end, true, { tag: name });\n }\n\n private buildBraceTables(): void {\n const count = this.lineCount;\n // prefix[i] = net braces over lines [0, i)\n const prefix = new Int32Array(count + 1);\n for (let i = 0; i < count; i++) {\n const { opens, closes } = countStructuralBraces(this.lineText(i));\n prefix[i + 1] = (prefix[i] as number) + opens - closes;\n }\n // stop[i] = smallest j >= i with prefix[j + 1] <= prefix[i], or -1.\n const stop = new Int32Array(count).fill(-1);\n const stack: number[] = [];\n // Next index m > i (over prefix positions) with prefix[m] <= prefix[i].\n for (let m = 0; m <= count; m++) {\n const value = prefix[m] as number;\n while (stack.length && (prefix[stack[stack.length - 1] as number] as number) >= value) {\n const i = stack.pop() as number;\n if (i < count) stop[i] = m - 1;\n }\n stack.push(m);\n }\n this.braceNet = prefix;\n this.braceStop = stop;\n }\n\n /** A line-leading bare JSON object — the splitter's structural brace walk. */\n private bareJson(p: number, li: number, tp: number): RawIsland | null {\n let lastLine: number | null = null;\n let net = 0;\n if (p === (this.lineStarts[li] as number)) {\n if (!this.braceStop || !this.braceNet) this.buildBraceTables();\n const stop = (this.braceStop as Int32Array)[li] as number;\n if (stop !== -1) {\n lastLine = stop;\n net =\n ((this.braceNet as Int32Array)[stop + 1] as number) -\n ((this.braceNet as Int32Array)[li] as number);\n }\n } else {\n let running = 0;\n for (let k = li; k < this.lineCount; k++) {\n const line = k === li ? this.text.slice(tp, this.contentEnds[li] as number) : this.lineText(k);\n const { opens, closes } = countStructuralBraces(line);\n running += opens - closes;\n if (running <= 0) {\n lastLine = k;\n net = running;\n break;\n }\n }\n }\n if (lastLine === null) {\n // Only the head decides; the whole tail is read once, when it is ours.\n if (isRecognizedJsonHead(this.text.slice(tp, tp + 512))) {\n return this.island(\"json\", p, this.n, false, jsonMeta(this.text.slice(tp)));\n }\n return null;\n }\n // Streaming: braces that balance on the open last line are undecided — the\n // next byte can unbalance them again (`… and}` + `{`) or complete a parse.\n // A recognized head stays an open JSON block; anything else reads as prose\n // for now (the tree-root and open-tail holds keep that prose unsettled —\n // a separate provisional mark here was redundant: planted mutation, 1,120\n // differing prefixes, 0 settled-island changes over 12,000 documents).\n if (this.isOpenTail(lastLine)) {\n if (isRecognizedJsonHead(this.text.slice(tp, tp + 512))) {\n return this.island(\"json\", p, this.n, false, jsonMeta(this.text.slice(tp)));\n }\n return null;\n }\n if (net !== 0) return null;\n const end = this.contentEnds[lastLine] as number;\n const content = this.text.slice(tp, end).trim();\n try {\n const parsed: unknown = JSON.parse(content);\n if (parsed === null || typeof parsed !== \"object\") return null;\n } catch {\n return null;\n }\n return this.island(\"json\", p, end, true, jsonMeta(content));\n }\n\n private tree(p: number, li: number): RawIsland | null {\n let treeLines = 0;\n let lastTree = li;\n let k = li;\n while (k < this.lineCount) {\n if (this.lineIsBlank(k)) {\n k++;\n continue;\n }\n if (!TREE_GLYPHS.test(this.lineText(k))) break;\n treeLines++;\n lastTree = k;\n k++;\n }\n if (treeLines < 3) return null;\n return this.island(\"tree\", p, this.contentEnds[lastTree] as number, true);\n }\n\n // ── prose ──────────────────────────────────────────────────────────────\n\n private paragraph(pos: number, li: number): number {\n let end = this.contentEnds[li] as number;\n let breakLine = -1;\n for (let k = li + 1; k < this.lineCount; k++) {\n if (this.lineIsBlank(k)) break;\n const block = this.detectBlock(this.lineStarts[k] as number, k, false);\n if (block) {\n breakLine = k;\n // Streaming: a block that may still dissolve into prose (it runs open\n // to the end of the text) does not end this paragraph for good (F3).\n // …and so does one that starts in provisional text (it may not be a\n // block at all once the text decides).\n if (this.mayDissolve(block)) {\n this.undecidedBreaks.add(end);\n }\n break;\n }\n end = this.contentEnds[k] as number;\n }\n\n // A tree's root label (the non-blank, glyph-free, non-heading lines\n // directly above its first connector) belongs to the tree — the renderer\n // splitter's findTreeBlockStart.\n if (breakLine !== -1) {\n const breakIsland = this.detectBlock(this.lineStarts[breakLine] as number, breakLine, false);\n if (breakIsland?.type === \"tree\") {\n let root = breakLine;\n for (let j = breakLine - 1; j >= li; j--) {\n const trimmed = this.lineText(j).trim();\n if (!trimmed || isSplitterTreeLine(trimmed) || /^#{1,6}\\s/.test(trimmed)) break;\n root = j;\n }\n if (root < breakLine) {\n const treeStart = root === li ? pos : (this.lineStarts[root] as number);\n const tree = { ...breakIsland, start: treeStart };\n if (treeStart > pos) {\n const proseEnd = this.contentEnds[root - 1] as number;\n const scan = this.scanInline(pos, proseEnd);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end: proseEnd, island: null, inlines: scan.inlines });\n this.push({ kind: \"gap\", start: proseEnd, end: treeStart, island: null, inlines: [] });\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n } else {\n this.push({ kind: \"island\", start: treeStart, end: tree.end, island: tree, inlines: [] });\n return tree.end;\n }\n }\n }\n }\n\n const scan = this.scanInline(pos, end);\n if (!scan.breakIsland) {\n this.push({ kind: \"prose\", start: pos, end, island: null, inlines: scan.inlines });\n return end;\n }\n const br = { ...scan.breakIsland, fromParagraph: true };\n if (scan.orphan) {\n // The continuation half of a thinking region split across persisted\n // parts: everything since the last island is region body (splitter 3d).\n let start = pos;\n while (this.blocks.length) {\n const last = this.blocks[this.blocks.length - 1] as RawBlock;\n if (last.kind === \"island\") break;\n this.blocks.pop();\n start = last.start;\n }\n const island = { ...br, start };\n this.push({ kind: \"island\", start, end: island.end, island, inlines: [] });\n return island.end;\n }\n this.push({\n kind: \"prose\",\n start: pos,\n end: br.start,\n island: null,\n inlines: scan.inlines.filter((inline) => inline.end <= br.start),\n });\n this.push({ kind: \"island\", start: br.start, end: br.end, island: br, inlines: [] });\n return br.end;\n }\n\n /**\n * An island that opens inside a paragraph and closes past its end becomes a\n * block. Streaming: while the paragraph may still grow over its closer, the\n * island may yet be inline — undecided, so it runs open to the end (F3).\n */\n private spill(\n type: IslandType,\n start: number,\n end: number,\n pe: number,\n meta: Record<string, string | number | boolean>,\n ): RawIsland {\n if (this.paragraphMayGrow(pe)) return this.island(type, start, this.n, false, meta);\n return this.island(type, start, end, true, meta);\n }\n\n private scanInline(\n ps: number,\n pe: number,\n ): { inlines: RawIsland[]; breakIsland: RawIsland | null; orphan: boolean } {\n const text = this.text;\n const inlines: RawIsland[] = [];\n this.tick(pe - ps); // the scan below visits each position of the paragraph at most once\n const hasKind = text.slice(ps, pe).includes(\"__kind\");\n // Embedded-kind JSON probing is capped per paragraph so a paragraph full\n // of unclosed `{\"…` stays linear; a candidate longer than the cap stays prose.\n let kindBudget = 4 * (pe - ps) + 65536;\n const stop = (island: RawIsland, orphan = false) => ({ inlines, breakIsland: island, orphan });\n const within = (needle: string, from: number): number => {\n const at = this.next(needle, from);\n return at !== -1 && at + needle.length <= pe ? at : -1;\n };\n let runs: BacktickRuns | null = null;\n /** First maximal backtick run of exactly `n` starting at or after `from`, within the paragraph (THE pairing table). */\n const codeSpanClose = (n: number, from: number): number => {\n if (!runs) {\n this.tick(pe - ps); // one pass builds the backtick-run table\n runs = new BacktickRuns(text, ps, pe);\n }\n const at = runs.next(n, from);\n return at !== -1 && at + n <= pe ? at : -1;\n };\n\n let i = ps;\n // The paragraph's END is computed exactly as one-shot computes it (so its\n // islands are read the same way); only what is REPORTED stops at the\n // provisional point.\n const scanEnd = Math.min(pe, this.provisionalFrom);\n while (i < scanEnd) {\n const ch = text[i];\n if (ch === \"\\\\\") {\n const nextCh = text[i + 1];\n if (nextCh === \"(\" || nextCh === \"[\") {\n const close = within(nextCh === \"(\" ? \"\\\\)\" : \"\\\\]\", i + 2);\n // `\\[ … \\]` is math only when it holds TeX; otherwise it is two\n // escaped brackets — literal text (isEscapedBracketMath).\n const isMath =\n close !== -1 &&\n (nextCh === \"(\" || isEscapedBracketMath(text.slice(i + 2, close), i > 0 ? text[i - 1] : undefined));\n if (close !== -1 && isMath) {\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: nextCh === \"(\" ? \"\\\\(\" : \"\\\\[\" }));\n i = close + 2;\n continue;\n }\n // Streaming: an opener whose closer may still arrive in this\n // paragraph can turn everything after it into one formula — nothing\n // after it is an island until the paragraph decides (F3).\n if (close === -1 && this.streaming && this.paragraphMayGrow(pe)) {\n return { inlines, breakIsland: null, orphan: false };\n }\n }\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n const n = backtickRunLength(text, i);\n const close = codeSpanClose(n, i + n);\n // Streaming: while the paragraph can still grow — nothing follows it\n // but at most one line terminator, so the next line may join it — an\n // unclosed backtick run may yet be closed and turn everything after it\n // into code. Nothing after it is an island until then (G5 / flicker).\n if (close === -1 && this.streaming && this.paragraphMayGrow(pe)) {\n return { inlines, breakIsland: null, orphan: false };\n }\n i = close === -1 ? i + n : close + n;\n continue;\n }\n if (ch === \"$\") {\n if (text[i + 1] === \"$\") {\n const close = this.mathPairs.get(i);\n if (close === undefined) {\n i += 2;\n continue;\n }\n if (close + 2 > pe) return stop(this.spill(\"math_block\", i, close + 2, pe, { delimiter: \"$$\" }));\n inlines.push(this.island(\"math_inline\", i, close + 2, true, { delimiter: \"$$\" }));\n i = close + 2;\n continue;\n }\n const end = singleDollarMathEnd(text, i, pe);\n this.tick(end > 0 ? end - i : Math.min(403, pe - i));\n if (end > 0) {\n inlines.push(this.island(\"math_inline\", i, end, true, { delimiter: \"$\" }));\n i = end;\n continue;\n }\n i++;\n continue;\n }\n if (ch === \"{\") {\n if (text[i + 1] === \"{\") {\n const close = this.next(\"}}\", i + 2);\n if (\n close !== -1 &&\n close + 2 <= pe &&\n close - i <= 200 &&\n !text.slice(i, close).includes(\"\\n\")\n ) {\n const raw = text.slice(i, close + 2);\n const strict = STRICT_VARIABLE_RE.exec(raw);\n inlines.push(\n this.island(\"variable\", i, close + 2, true, strict ? { name: strict[1] as string } : { template: true }),\n );\n i = close + 2;\n continue;\n }\n i += 2;\n continue;\n }\n if (hasKind && kindBudget > 0 && /^\\{\\s*\"/.test(text.slice(i, i + 64))) {\n const limit = Math.min(pe, i + 65536);\n const end = matchingJsonObjectEnd(text, i, limit);\n kindBudget -= (end ?? limit) - i;\n this.tick((end ?? limit) - i);\n if (end !== null) {\n const kind = declaredKind(text.slice(i, end));\n if (kind) {\n inlines.push(this.island(\"kind_json\", i, end, true, jsonMeta(text.slice(i, end))));\n i = end;\n continue;\n }\n }\n }\n i++;\n continue;\n }\n if ((ch === \"[\" && text[i + 1] === \"[\") || (ch === \"!\" && text[i + 1] === \"[\" && text[i + 2] === \"[\")) {\n const open = ch === \"!\" ? i + 3 : i + 2;\n const close = within(\"]]\", open);\n const newline = this.next(\"\\n\", open);\n const inner = close === -1 ? \"\" : text.slice(open, close);\n if (close !== -1 && (newline === -1 || newline > close) && inner.trim() && !/[[\\]]/.test(inner)) {\n const cut = inner.search(/\\\\?\\|/);\n const target = (cut < 0 ? inner : inner.slice(0, cut)).trim();\n inlines.push(\n this.island(\"wikilink\", i, close + 2, true, ch === \"!\" ? { target, embed: true } : { target }),\n );\n i = close + 2;\n continue;\n }\n }\n if (ch === \"[\") {\n const media = MEDIA_REF_PREFIXES.find((prefix) => text.startsWith(prefix, i));\n if (media) {\n const close = within(\"]\", i + media.length);\n const newline = this.next(\"\\n\", i);\n if (close !== -1 && (newline === -1 || newline > close)) {\n inlines.push(this.island(\"media_ref\", i, close + 1, true, { media: media.slice(1, 6).toLowerCase() }));\n i = close + 1;\n continue;\n }\n }\n i++;\n continue;\n }\n if (ch === \"<\") {\n if (text.startsWith(\"<!--\", i)) {\n const close = this.next(\"-->\", i + 4);\n if (close === -1) return stop(this.island(\"html_comment\", i, this.n, false));\n const end = close + 3;\n const anchor = end - i <= 64 ? PINNED_ANCHOR_RE.exec(text.slice(i, end)) : null;\n const type: IslandType = anchor ? \"anchor\" : \"html_comment\";\n const meta = anchor ? { id: anchor[1] as string } : {};\n if (end > pe) return stop(this.spill(type, i, end, pe, meta));\n inlines.push(this.island(type, i, end, true, meta));\n i = end;\n continue;\n }\n const cite = CITE_RE.exec(text.slice(i, i + 64));\n if (cite) {\n inlines.push(this.island(\"cite\", i, i + cite[0].length, true, { n: Number(cite[1]) }));\n i += cite[0].length;\n continue;\n }\n const tag = readXmlTag(text, i, this.finder);\n this.tick(tag ? tag.raw.length : 1);\n if (tag && i + tag.raw.length <= pe) {\n const name = tag.tagName;\n const tagEnd = i + tag.raw.length;\n const isAttr = ATTRIBUTE_XML_NAMES.includes(name);\n const isThinking = THINKING_FAMILY.includes(name) && tag.raw === `<${name}>`;\n if (!tag.isClosing && (isAttr || isThinking)) {\n if (tag.isSelfClosing) {\n inlines.push(this.island(\"xml_inline\", i, tagEnd, true, { tag: name, selfClosing: true }));\n i = tagEnd;\n continue;\n }\n const closer = `</${name}>`;\n const close = this.next(closer, tagEnd);\n const blockType: IslandType = isAttr ? \"xml_attr\" : \"xml_region\";\n // A mid-line reasoning opener that never closes is a mention, not\n // a region (`grep -c '<thinking>' log.txt > count.txt`): the\n // renderer shows it as prose, so locking the rest of the document\n // as one island would be wrong (verify-RC-B3 RC-B3r R3). While a\n // stream is still arriving its closer may yet come, anywhere later\n // — so there it stays an open region to the end (undecided).\n if (close === -1 && isThinking && !this.streaming) {\n i = tagEnd;\n continue;\n }\n if (close === -1) return stop(this.island(blockType, i, this.n, false, { tag: name }));\n const end = close + closer.length;\n if (end > pe) return stop(this.spill(blockType, i, end, pe, { tag: name }));\n inlines.push(this.island(\"xml_inline\", i, end, true, { tag: name }));\n i = end;\n continue;\n }\n if (tag.isClosing && THINKING_FAMILY.includes(name)) {\n return stop(this.island(\"xml_region\", i, tagEnd, true, { tag: name, continuation: true }), true);\n }\n const lower = name.toLowerCase();\n inlines.push(\n this.island(ALLOWED_RAW_HTML_TAGS.has(lower) ? \"html_tag\" : \"xml_tag\", i, tagEnd, true, {\n tag: name,\n }),\n );\n i = tagEnd;\n continue;\n }\n // An attribute-bearing opener still arriving (no `>` anywhere yet).\n const pending = ATTRIBUTE_XML_NAMES.find(\n (name) => text.startsWith(`<${name}`, i) && /\\s/.test(text[i + name.length + 1] ?? \"\"),\n );\n if (pending && this.next(\">\", i) === -1) {\n return stop(this.island(\"xml_attr\", i, this.n, false, { tag: pending }));\n }\n i++;\n continue;\n }\n i++;\n }\n return { inlines, breakIsland: null, orphan: false };\n }\n}\n\n/**\n * Cut `text` into blocks whose raw concatenation is exactly `text`.\n * Never throws; unclosed constructs are islands with `complete: false`.\n */\nexport interface TokenizeOptions {\n /**\n * The text is a prefix of a message still arriving. The final line (no\n * terminator yet) can still grow — a bare ``` there may become ```bash — so\n * it closes no fence until its newline arrives (verify-RC-B3 residual R2).\n * Omit for stored text: a complete document's last line is final.\n */\n readonly streaming?: boolean;\n /**\n * DIAGNOSTIC — complexity tests only. When given, every loop that walks the\n * text itself adds the characters it visits to `meter.work`, so a test can\n * assert the tokenizer's work grows linearly with its input (deterministic,\n * unlike wall-clock timing). Loops over a slice are not charged here: the\n * slice's own cost covers them. Omit in production.\n */\n readonly meter?: { work: number };\n}\n\nexport function tokenizeSource(text: string, options: TokenizeOptions = {}): SourceBlock[] {\n const raw = new Tokenizer(text, options.streaming ?? false, options.meter).run();\n const cp = buildCodePointIndex(text);\n const inline = (island: RawIsland): SourceIsland => ({\n islandType: island.type,\n inline: true,\n complete: island.complete,\n meta: island.meta,\n start: island.start,\n end: island.end,\n startCp: cp.toCodePoint(island.start),\n endCp: cp.toCodePoint(island.end),\n raw: text.slice(island.start, island.end),\n });\n return raw.map(\n (block): SourceBlock => ({\n kind: block.kind,\n islandType: (block.island?.type as BlockIslandType | undefined) ?? null,\n complete: block.island ? block.island.complete : true,\n meta: block.island?.meta ?? {},\n inlines: block.inlines.map(inline),\n start: block.start,\n end: block.end,\n startCp: cp.toCodePoint(block.start),\n endCp: cp.toCodePoint(block.end),\n raw: text.slice(block.start, block.end),\n }),\n );\n}\n\n/** The exact source the blocks were cut from. */\nexport function joinSource(blocks: readonly SourceBlock[]): string {\n let out = \"\";\n for (const block of blocks) out += block.raw;\n return out;\n}\n\n/** Every island — block-level and inline — in document order. */\nexport function listIslands(blocks: readonly SourceBlock[]): SourceIsland[] {\n const out: SourceIsland[] = [];\n for (const block of blocks) {\n if (block.kind === \"island\" && block.islandType) {\n out.push({\n islandType: block.islandType,\n inline: false,\n complete: block.complete,\n meta: block.meta,\n start: block.start,\n end: block.end,\n startCp: block.startCp,\n endCp: block.endCp,\n raw: block.raw,\n });\n } else {\n // A loop, never a spread: a block can hold 100k+ inline islands and a\n // spread passes each as a call argument (RangeError, residual R3).\n for (const inline of block.inlines) out.push(inline);\n }\n }\n return out;\n}\n\n/** The block containing UTF-16 offset `offset` (the later block at a boundary). */\nexport function blockAt(blocks: readonly SourceBlock[], offset: number): SourceBlock | null {\n let lo = 0;\n let hi = blocks.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const block = blocks[mid] as SourceBlock;\n if (offset < block.start) hi = mid - 1;\n else if (offset >= block.end) lo = mid + 1;\n else return block;\n }\n return null;\n}\n","/**\n * SAVE = SPLICE (rich-content PLAN decision 6).\n *\n * An editor never hands back a whole re-serialized document. It hands back\n * per-block replacements for exactly the blocks the person changed; every\n * other byte of the stored text is written back as it was. This module\n * applies those replacements and returns:\n *\n * - the new text,\n * - a change set (old range → new range, in UTF-16 AND code points,\n * narrowed to the bytes that actually differ) that the annotation layer\n * uses to carry every live anchor through the save\n * (STORE-DESIGN §3.19 — the ProseMirror / Google Docs position-mapping\n * model), and\n * - an integrity guarantee: every island not explicitly replaced must still\n * be the same island, at its mapped position, in the new text. An edit\n * that opens an unclosed fence and swallows a kind below it is REFUSED.\n *\n * ISLANDS CHANGE ONLY THROUGH `islandEdit`. A prose/range edit must hand back\n * every island inside its range byte-identical and in order (a visual editor\n * holds them as atoms); if one is altered or dropped the save throws\n * `SourceSpliceError(\"island_edit\")` naming the island. A kind editor or code\n * view changes an island with `islandEdit(island, newRaw)`.\n *\n * A no-edit save (or edits whose text equals the original block) returns the\n * original string itself — byte-identical, zero changes.\n */\n\nimport { buildCodePointIndex, splitsSurrogatePair } from \"./offsets\";\nimport {\n joinSource,\n listIslands,\n tokenizeSource,\n type IslandType,\n type SourceBlock,\n type SourceIsland,\n} from \"./tokenize\";\n\n/**\n * Replace `[start, end)` (UTF-16) of the original with `text`. A plain edit\n * starts and ends on block boundaries; an island edit (`island: true`, made by\n * `islandEdit`) names exactly one island's span.\n */\nexport interface SourceEdit {\n readonly start: number;\n readonly end: number;\n readonly text: string;\n readonly island?: boolean;\n}\n\nexport interface SourceChange {\n /** The block-aligned range the edit named, in the ORIGINAL text. */\n readonly blockStart: number;\n readonly blockEnd: number;\n /** The narrowed range that actually differs: old text … */\n readonly oldStart: number;\n readonly oldEnd: number;\n /** … and where its replacement sits in the NEW text. */\n readonly newStart: number;\n readonly newEnd: number;\n readonly oldStartCp: number;\n readonly oldEndCp: number;\n readonly newStartCp: number;\n readonly newEndCp: number;\n}\n\nexport interface DisturbedIsland {\n readonly islandType: IslandType;\n readonly inline: boolean;\n /** Where the island was in the original (UTF-16). */\n readonly start: number;\n readonly end: number;\n /** Where it should have been in the new text. */\n readonly mappedStart: number;\n}\n\nexport interface SpliceIntegrity {\n /** True when every untouched island survived intact and outside bytes are identical. */\n readonly ok: boolean;\n /** Always true by construction; checked anyway because it is THE guarantee. */\n readonly bytesOutsideEditsIdentical: boolean;\n readonly disturbed: readonly DisturbedIsland[];\n}\n\nexport interface SpliceResult {\n readonly text: string;\n readonly changed: boolean;\n readonly changes: readonly SourceChange[];\n readonly integrity: SpliceIntegrity;\n /** Tokenization of the new text. */\n readonly blocks: readonly SourceBlock[];\n}\n\nexport type SourceSpliceErrorCode =\n | \"out_of_range\"\n | \"misaligned\"\n | \"overlap\"\n | \"stale_blocks\"\n | \"island_edit\"\n | \"integrity\";\n\nexport class SourceSpliceError extends Error {\n readonly code: SourceSpliceErrorCode;\n\n constructor(\n code: SourceSpliceErrorCode,\n message: string,\n ) {\n super(message);\n this.code = code;\n this.name = \"SourceSpliceError\";\n }\n}\n\nexport interface SpliceOptions {\n /** The tokenization of `original`, when the caller already holds it. */\n readonly blocks?: readonly SourceBlock[];\n /**\n * Default `true`: a save that disturbs any island it did not explicitly\n * replace throws `SourceSpliceError(\"integrity\")`. `false` is for TOOLING\n * ONLY (diagnostic scripts that want the report instead of the refusal) —\n * no editor or persistence path may pass it.\n */\n readonly requireIntegrity?: boolean;\n}\n\n/** An edit that replaces one block's raw text. */\nexport function blockEdit(block: SourceBlock, text: string): SourceEdit {\n return { start: block.start, end: block.end, text };\n}\n\n/** The one door that changes an island: replace exactly its span with `text`. */\nexport function islandEdit(\n island: { readonly start: number; readonly end: number },\n text: string,\n): SourceEdit {\n return { start: island.start, end: island.end, text, island: true };\n}\n\n/** An edit that replaces a contiguous run of blocks `[first, last]`. */\nexport function blockRangeEdit(first: SourceBlock, last: SourceBlock, text: string): SourceEdit {\n return { start: first.start, end: last.end, text };\n}\n\n/**\n * Where an island's raw text sits in a replacement, at or after `from`, or -1\n * when the island is gone. Candidates: the island's own position measured from\n * the previous island and from the end of the edit, plus the nearest\n * occurrences either side. When the island's bytes occur more than once — a\n * copy inside a code span, or an insertion that itself contains a copy\n * (verify-RC-B3 residual R1) — the candidate whose surroundings still match\n * the original text wins, so a coincidental copy at the expected offset never\n * steals the island.\n */\nconst CONTEXT_WINDOW = 64;\n\nfunction locateIsland(\n text: string,\n raw: string,\n from: number,\n expected: number,\n expectedFromEnd: number,\n oldText: string,\n oldStart: number,\n oldEnd: number,\n): number {\n const candidates = new Set<number>();\n if (expected >= from && text.startsWith(raw, expected)) candidates.add(expected);\n if (expectedFromEnd >= from && text.startsWith(raw, expectedFromEnd)) candidates.add(expectedFromEnd);\n const after = text.indexOf(raw, Math.max(from, expected));\n if (after !== -1) candidates.add(after);\n const before = expected > from ? text.lastIndexOf(raw, expected) : -1;\n if (before >= from) candidates.add(before);\n if (candidates.size === 0) return text.indexOf(raw, from);\n if (candidates.size === 1) return candidates.values().next().value as number;\n let best = -1;\n let bestScore = -1;\n for (const at of candidates) {\n let score = 0;\n // Matching bytes just after the island …\n for (let k = 0; k < CONTEXT_WINDOW; k++) {\n const n = text[at + raw.length + k];\n if (n === undefined || n !== oldText[oldEnd + k]) break;\n score++;\n }\n // … and just before it.\n for (let k = 1; k <= CONTEXT_WINDOW; k++) {\n const n = text[at - k];\n if (n === undefined || n !== oldText[oldStart - k]) break;\n score++;\n }\n if (score > bestScore || (score === bestScore && at === expected)) {\n best = at;\n bestScore = score;\n }\n }\n return best;\n}\n\nfunction commonPrefix(a: string, b: string): number {\n const max = Math.min(a.length, b.length);\n let i = 0;\n while (i < max && a.charCodeAt(i) === b.charCodeAt(i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, i) || splitsSurrogatePair(b, i))) i--;\n return i;\n}\n\nfunction commonSuffix(a: string, b: string, prefix: number): number {\n const max = Math.min(a.length, b.length) - prefix;\n let i = 0;\n while (i < max && a.charCodeAt(a.length - 1 - i) === b.charCodeAt(b.length - 1 - i)) i++;\n if (i > 0 && (splitsSurrogatePair(a, a.length - i) || splitsSurrogatePair(b, b.length - i))) i--;\n return i;\n}\n\n/**\n * Apply block-aligned replacements to `original`. Bytes outside the edits are\n * copied, never rebuilt; an edit equal to its block changes nothing.\n */\nexport function spliceSave(\n original: string,\n edits: readonly SourceEdit[],\n options: SpliceOptions = {},\n): SpliceResult {\n const blocks = options.blocks ?? tokenizeSource(original);\n if (options.blocks && joinSource(blocks) !== original) {\n throw new SourceSpliceError(\"stale_blocks\", \"the blocks passed in were not cut from this original text\");\n }\n\n const boundaries = new Set<number>([0, original.length]);\n for (const block of blocks) {\n boundaries.add(block.start);\n boundaries.add(block.end);\n }\n const islands = listIslands(blocks);\n const islandAt = new Map<string, SourceIsland>();\n for (const island of islands) islandAt.set(`${island.start}:${island.end}`, island);\n\n const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end);\n let previousEnd = -1;\n for (const edit of sorted) {\n if (edit.start < 0 || edit.end > original.length || edit.start > edit.end) {\n throw new SourceSpliceError(\"out_of_range\", `edit [${edit.start}, ${edit.end}) is outside the text`);\n }\n if (edit.island) {\n if (!islandAt.has(`${edit.start}:${edit.end}`)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `islandEdit [${edit.start}, ${edit.end}) does not name an island's exact span`,\n );\n }\n } else if (!boundaries.has(edit.start) || !boundaries.has(edit.end)) {\n throw new SourceSpliceError(\n \"misaligned\",\n `edit [${edit.start}, ${edit.end}) does not start and end on block boundaries`,\n );\n }\n if (edit.start < previousEnd) {\n throw new SourceSpliceError(\"overlap\", `edit [${edit.start}, ${edit.end}) overlaps the previous edit`);\n }\n previousEnd = edit.end;\n }\n\n // Split every edit into the byte ranges that actually differ. A plain edit\n // must carry each island inside its range through byte-identical and in\n // order; the text between islands is diffed segment by segment.\n interface Narrowed {\n oldStart: number;\n oldEnd: number;\n replacement: string;\n }\n const effective: Narrowed[] = [];\n const replacedIslands = new Set<string>();\n const pushSegment = (oldStart: number, oldEnd: number, replacement: string) => {\n const old = original.slice(oldStart, oldEnd);\n if (old === replacement) return;\n const prefix = commonPrefix(old, replacement);\n const suffix = commonSuffix(old, replacement, prefix);\n effective.push({\n oldStart: oldStart + prefix,\n oldEnd: oldEnd - suffix,\n replacement: replacement.slice(prefix, replacement.length - suffix),\n });\n };\n for (const edit of sorted) {\n if (edit.island) {\n replacedIslands.add(`${edit.start}:${edit.end}`);\n pushSegment(edit.start, edit.end, edit.text);\n continue;\n }\n if (edit.text === original.slice(edit.start, edit.end)) continue;\n const inside = islands.filter((island) => island.start >= edit.start && island.end <= edit.end);\n let oldCursor = edit.start;\n let newCursor = 0;\n for (const island of inside) {\n // Context is compared against the edit's own old/new text, clipped to the edit.\n const at = locateIsland(\n edit.text,\n island.raw,\n newCursor,\n newCursor + (island.start - oldCursor),\n edit.text.length - (edit.end - island.start),\n original.slice(edit.start, edit.end),\n island.start - edit.start,\n island.end - edit.start,\n );\n if (at === -1) {\n const name = island.meta.tag ?? island.meta.name ?? island.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `edit [${edit.start}, ${edit.end}) changes or removes the protected ${island.islandType}` +\n `${name ? ` (${String(name)})` : \"\"} island at [${island.start}, ${island.end}); ` +\n \"islands change only through islandEdit()\",\n );\n }\n pushSegment(oldCursor, island.start, edit.text.slice(newCursor, at));\n oldCursor = island.end;\n newCursor = at + island.raw.length;\n }\n pushSegment(oldCursor, edit.end, edit.text.slice(newCursor));\n }\n\n if (effective.length === 0) {\n return {\n text: original,\n changed: false,\n changes: [],\n integrity: { ok: true, bytesOutsideEditsIdentical: true, disturbed: [] },\n blocks,\n };\n }\n\n let text = \"\";\n let cursor = 0;\n let delta = 0;\n const pending: Array<Omit<SourceChange, \"oldStartCp\" | \"oldEndCp\" | \"newStartCp\" | \"newEndCp\">> = [];\n for (const edit of effective) {\n text += original.slice(cursor, edit.oldStart);\n const newStart = edit.oldStart + delta;\n text += edit.replacement;\n const newEnd = newStart + edit.replacement.length;\n const owner = sorted.find((e) => e.start <= edit.oldStart && e.end >= edit.oldEnd);\n pending.push({\n blockStart: owner?.start ?? edit.oldStart,\n blockEnd: owner?.end ?? edit.oldEnd,\n oldStart: edit.oldStart,\n oldEnd: edit.oldEnd,\n newStart,\n newEnd,\n });\n delta += edit.replacement.length - (edit.oldEnd - edit.oldStart);\n cursor = edit.oldEnd;\n }\n text += original.slice(cursor);\n\n const oldCp = buildCodePointIndex(original);\n const newCp = buildCodePointIndex(text);\n const changes: SourceChange[] = pending.map((change) => ({\n ...change,\n oldStartCp: oldCp.toCodePoint(change.oldStart),\n oldEndCp: oldCp.toCodePoint(change.oldEnd),\n newStartCp: newCp.toCodePoint(change.newStart),\n newEndCp: newCp.toCodePoint(change.newEnd),\n }));\n\n // Guard 1: every byte outside the changed ranges is the original byte.\n let bytesOutsideEditsIdentical = true;\n let oldCursor = 0;\n let newCursor = 0;\n for (const change of changes) {\n if (original.slice(oldCursor, change.oldStart) !== text.slice(newCursor, change.newStart)) {\n bytesOutsideEditsIdentical = false;\n }\n oldCursor = change.oldEnd;\n newCursor = change.newEnd;\n }\n if (original.slice(oldCursor) !== text.slice(newCursor)) bytesOutsideEditsIdentical = false;\n\n // Guard 2: every island not explicitly replaced is still that island, at its\n // mapped position, in the re-tokenized new text.\n const newBlocks = tokenizeSource(text);\n const newIslandsByStart = new Map<number, string[]>();\n for (const island of listIslands(newBlocks)) {\n const list = newIslandsByStart.get(island.start);\n if (list) list.push(island.raw);\n else newIslandsByStart.set(island.start, [island.raw]);\n }\n const disturbed: DisturbedIsland[] = [];\n // Islands a plain edit carried through: the edit claims to keep them, so if\n // one did not survive as that island its bytes were matched to a copy that\n // is not an island — the edit changed an island (island_edit, always).\n const carried = (island: SourceIsland) =>\n sorted.some((edit) => !edit.island && island.start >= edit.start && island.end <= edit.end);\n const changedInside: SourceIsland[] = [];\n for (const island of islands) {\n if (replacedIslands.has(`${island.start}:${island.end}`)) continue;\n const mappedStart = mapPosition(changes, island.start, { assoc: 1 }).pos;\n const candidates = newIslandsByStart.get(mappedStart);\n if (!candidates || !candidates.includes(island.raw)) {\n if (carried(island)) {\n changedInside.push(island);\n continue;\n }\n disturbed.push({\n islandType: island.islandType,\n inline: island.inline,\n start: island.start,\n end: island.end,\n mappedStart,\n });\n }\n }\n\n if (changedInside.length > 0) {\n const first = changedInside[0] as SourceIsland;\n const name = first.meta.tag ?? first.meta.name ?? first.meta.lang ?? \"\";\n throw new SourceSpliceError(\n \"island_edit\",\n `the edit changes the protected ${first.islandType}${name ? ` (${String(name)})` : \"\"} island at ` +\n `[${first.start}, ${first.end}) — its bytes survive only as ordinary text` +\n `${changedInside.length > 1 ? ` (and ${changedInside.length - 1} more)` : \"\"}; islands change only through islandEdit()`,\n );\n }\n\n const integrity: SpliceIntegrity = {\n ok: bytesOutsideEditsIdentical && disturbed.length === 0,\n bytesOutsideEditsIdentical,\n disturbed,\n };\n if ((options.requireIntegrity ?? true) && !integrity.ok) {\n const named = disturbed\n .slice(0, 5)\n .map((island) => `${island.islandType}@${island.start}`)\n .join(\", \");\n throw new SourceSpliceError(\n \"integrity\",\n `integrity: the save disturbed ${disturbed.length} protected island(s) it did not replace` +\n `${named ? ` (${named}${disturbed.length > 5 ? \", …\" : \"\"})` : \"\"}` +\n `${bytesOutsideEditsIdentical ? \"\" : \"; bytes outside the edits changed\"}`,\n );\n }\n return { text, changed: true, changes, integrity, blocks: newBlocks };\n}\n\nexport interface MapOptions {\n /** -1 keeps a position at an insertion point before the inserted text; 1 (default) moves it after. */\n readonly assoc?: -1 | 1;\n /** Offset unit of `pos` and of the result. Default `utf16`. */\n readonly unit?: \"utf16\" | \"codepoint\";\n}\n\nexport interface MappedPosition {\n readonly pos: number;\n /** True when the position sat strictly inside replaced text. */\n readonly deleted: boolean;\n}\n\n/**\n * Carry a position in the old text through a change set (ProseMirror StepMap\n * semantics): positions before a change stay, positions after shift by the\n * size difference, a position strictly inside replaced text is `deleted` and\n * lands on the replacement's edge chosen by `assoc`.\n */\nexport function mapPosition(\n changes: readonly SourceChange[],\n pos: number,\n options: MapOptions = {},\n): MappedPosition {\n const assoc = options.assoc ?? 1;\n const cp = options.unit === \"codepoint\";\n let delta = 0;\n for (const change of changes) {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n const newStart = cp ? change.newStartCp : change.newStart;\n const newEnd = cp ? change.newEndCp : change.newEnd;\n if (pos < oldStart) break;\n if (pos > oldEnd) {\n delta = newEnd - oldEnd;\n continue;\n }\n if (oldStart === oldEnd) {\n // Pure insertion at `pos`.\n return { pos: assoc < 0 ? newStart : newEnd, deleted: false };\n }\n if (pos === oldStart) return { pos: newStart, deleted: false };\n if (pos === oldEnd) return { pos: newEnd, deleted: false };\n return { pos: assoc < 0 ? newStart : newEnd, deleted: true };\n }\n return { pos: pos + delta, deleted: false };\n}\n\nexport interface MappedRange {\n readonly start: number;\n readonly end: number;\n /** True when a change overlapped the range's interior. */\n readonly touched: boolean;\n /** True when the whole range was replaced away. */\n readonly collapsed: boolean;\n}\n\n/** Carry an anchor range through a change set; it stays inside its text when edits happen around it. */\nexport function mapRange(\n changes: readonly SourceChange[],\n start: number,\n end: number,\n unit: \"utf16\" | \"codepoint\" = \"utf16\",\n): MappedRange {\n const cp = unit === \"codepoint\";\n const mappedStart = mapPosition(changes, start, { assoc: 1, unit });\n const mappedEnd = mapPosition(changes, end, { assoc: -1, unit });\n const touched = changes.some((change) => {\n const oldStart = cp ? change.oldStartCp : change.oldStart;\n const oldEnd = cp ? change.oldEndCp : change.oldEnd;\n return oldStart < end && oldEnd > start;\n });\n const newStart = mappedStart.pos;\n const newEnd = Math.max(newStart, mappedEnd.pos);\n return { start: newStart, end: newEnd, touched, collapsed: newEnd === newStart && end > start };\n}\n","/**\n * THE link-reference rule (CommonMark 4.7 / 6.3) for surfaces that read one\n * piece of a document at a time — a table cell, a split chat block, a printed\n * row — and so cannot see the document's `[label]: url \"title\"` definitions.\n * `collectLinkDefinitions` reads them from the WHOLE text (never inside fenced\n * code); `resolveReferenceLinks` rewrites a fragment's full (`[text][label]`),\n * collapsed (`[label][]`) and shortcut (`[label]`) reference links into inline\n * links (`[text](url \"title\")`) so any renderer shows what GFM shows. Code spans,\n * images, inline links, footnote references and undefined labels are left as\n * they are. verify-RC-B4 round 9 (R9-4).\n *\n * Pure TS, no dependencies.\n */\n\nimport { fenceLineKinds, mapInlineCodeSpans } from \"./code-ranges\";\n\nexport interface LinkDefinition {\n url: string;\n title: string | null;\n}\n\n/** CommonMark label matching: case-folded, inner whitespace collapsed, trimmed. */\nexport function normalizeLinkLabel(label: string): string {\n return label.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nconst DEFINITION =\n /^ {0,3}\\[((?:[^\\]\\\\]|\\\\.){1,999})\\]:[ \\t]*(?:<([^<>\\n]*)>|(\\S+))(?:[ \\t]+(?:\"((?:[^\"\\\\]|\\\\.)*)\"|'((?:[^'\\\\]|\\\\.)*)'|\\(((?:[^()\\\\]|\\\\.)*)\\)))?[ \\t]*$/;\n\n/** Every link reference definition in `text` (first one wins, as in CommonMark); fenced code is skipped. */\nexport function collectLinkDefinitions(text: string): Map<string, LinkDefinition> {\n const defs = new Map<string, LinkDefinition>();\n for (const { label, definition } of scanLinkDefinitions(text)) {\n const key = normalizeLinkLabel(label);\n if (key && !defs.has(key)) defs.set(key, definition);\n }\n return defs;\n}\n\n/** The line indices (text split on \"\\n\") that ARE link reference definitions — GFM renders nothing for them. */\nexport function findLinkDefinitionLines(text: string): number[] {\n return scanLinkDefinitions(text).map(({ line }) => line);\n}\n\nfunction scanLinkDefinitions(text: string): Array<{ line: number; label: string; definition: LinkDefinition }> {\n const found: Array<{ line: number; label: string; definition: LinkDefinition }> = [];\n if (!text.includes(\"]:\")) return found;\n const lines = text.split(\"\\n\");\n const kinds = fenceLineKinds(text);\n let previousWasDefinition = false;\n lines.forEach((line, i) => {\n const wasDefinition = previousWasDefinition;\n previousWasDefinition = false;\n if (kinds[i] !== \"prose\") return;\n const m = DEFINITION.exec(line);\n if (!m) return;\n // A definition cannot interrupt a paragraph (or a table row run): only at the\n // start, after a blank line, a closed fence, a heading, a rule or another definition.\n const above = i > 0 ? lines[i - 1] ?? \"\" : \"\";\n const opensBlock =\n i === 0 || !above.trim() || wasDefinition || kinds[i - 1] === \"close\" || /^ {0,3}(?:#{1,6}(?:\\s|$)|(?:[-*_][ \\t]*){3,}$)/.test(above);\n if (!opensBlock) return;\n const label = m[1] ?? \"\";\n if (label.startsWith(\"^\")) return; // a footnote definition, not a link\n previousWasDefinition = true;\n found.push({ line: i, label, definition: { url: m[2] ?? m[3] ?? \"\", title: m[4] ?? m[5] ?? m[6] ?? null } });\n });\n return found;\n}\n\nconst REFERENCE = /(!?)\\[((?:[^\\]\\\\]|\\\\.)*)\\](?:\\[((?:[^\\]\\\\]|\\\\.)*)\\])?(?![(:[])/g;\n\nconst escapeTitle = (title: string) => title.replace(/[\"\\\\]/g, \"\\\\$&\");\n\n/**\n * `fragment` with every reference link whose label is defined rewritten inline.\n * An image (`![alt][ref]`) resolves too. Nothing else changes.\n */\nexport function resolveReferenceLinks(fragment: string, defs: ReadonlyMap<string, LinkDefinition>): string {\n if (defs.size === 0 || !fragment.includes(\"[\")) return fragment;\n const PLACEHOLDER = \"\\uE011\";\n const spans: string[] = [];\n const masked = mapInlineCodeSpans(fragment, (_range, raw) => {\n spans.push(raw);\n return `${PLACEHOLDER}${spans.length - 1}${PLACEHOLDER}`;\n });\n const resolved = masked.replace(REFERENCE, (whole: string, bang: string, text: string, ref: string | undefined, at: number) => {\n if (at > 0 && masked[at - 1] === \"\\\\\") return whole;\n if (text.startsWith(\"^\")) return whole; // footnote reference\n const key = normalizeLinkLabel(ref === undefined || ref === \"\" ? text : ref);\n const def = defs.get(key);\n if (!def) return whole;\n const title = def.title === null ? \"\" : ` \"${escapeTitle(def.title)}\"`;\n const url = /[\\s()<>]/.test(def.url) ? `<${def.url}>` : def.url;\n return `${bang}[${text}](${url}${title})`;\n });\n return resolved.replace(new RegExp(`${PLACEHOLDER}(\\\\d+)${PLACEHOLDER}`, \"g\"), (_m: string, i: string) => spans[Number(i)] ?? \"\");\n}\n"]}