@office-open/xlsx 0.10.15 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/util/index.ts"],"sourcesContent":["/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n return result;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0.\n const epoch = new Date(1899, 11, 30);\n const msPerDay = 86400000;\n const diff = date.getTime() - epoch.getTime();\n return diff / msPerDay;\n}\n"],"mappings":";;;;;;;;;;;AAIA,SAAgB,eAAe,KAAqB;CAClD,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,GAAG;EACZ,MAAM,aAAa,IAAI,KAAK;EAC5B,SAAS,OAAO,aAAa,KAAK,SAAS,IAAI;EAC/C,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE;CAC7B;CACA,OAAO;AACT;;;;;AAMA,SAAgB,mBAAmB,MAAoB;CAGrD,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,EAAE;CAGnC,QADa,KAAK,QAAQ,IAAI,MAAM,QAAQ,KAC9B;AAChB"}
1
+ {"version":3,"file":"index.mjs","names":["buildRstXml","buildRstXml","R_NS","R_NS","encoder","buildWorksheetXml","XLSX_CONTENT_TYPE_RESOLVER","buildWorksheetXml","R_NS","createThemeXml","createThemeXml"],"sources":["../src/parts/styles/parse.ts","../src/parts/shared-strings.ts","../src/parts/styles/styles.ts","../src/parts/styles/descriptor.ts","../src/parts/auto-filter.ts","../src/parts/pivot-table/parse.ts","../src/parts/worksheet/parse.ts","../src/parts/worksheet/sheet-data.ts","../src/parts/worksheet/descriptor.ts","../src/util/index.ts","../src/parts/pivot/pivot-utils.ts","../src/parts/pivot-table/stringify.ts","../src/parts/worksheet/types.ts","../src/parts/worksheet/stringify.ts","../src/parts/calc-chain.ts","../src/parts/chartsheet.ts","../src/parts/comments.ts","../src/parts/drawing/types.ts","../src/parts/drawing/parse.ts","../src/parts/drawing/stringify.ts","../src/parts/drawing/descriptor.ts","../src/parts/external-link.ts","../src/parts/connection.ts","../src/parts/query-table.ts","../src/parts/metadata.ts","../src/parts/pivot-table/descriptor.ts","../src/parts/pivot-cache.ts","../src/parts/table.ts","../src/parts/workbook/stringify.ts","../src/parts/workbook/descriptor.ts","../src/parts/dialogsheet.ts","../src/parts/xml-mapping.ts","../src/parts/revision-log/parse.ts","../src/parts/revision-log/stringify.ts","../src/parts/revision-log/revision-headers.ts","../src/parts/revision-log/users.ts","../src/parts/revision-log/descriptor.ts","../src/context.ts","../src/parse.ts","../src/patch.ts","../src/compiler.ts","../src/stream.ts","../src/generate.ts"],"sourcesContent":["/**\n * Styles — parse helpers for xl/styles.xml sub-elements.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum, findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n AlignmentOptions,\n BorderOptions,\n BorderSideOptions,\n CellProtectionOptions,\n CellFillOptions,\n FontOptions,\n CellGradientStopOptions,\n} from \"./types\";\n\nexport function parseFont(el: XmlElement): FontOptions {\n const result: Partial<FontOptions> = {};\n for (const child of el.elements ?? []) {\n switch (child.name) {\n case \"b\":\n result.bold = true;\n break;\n case \"i\":\n result.italic = true;\n break;\n case \"u\":\n result.underline = true;\n break;\n case \"strike\":\n result.strike = true;\n break;\n case \"outline\":\n result.outline = true;\n break;\n case \"shadow\":\n result.shadow = true;\n break;\n case \"condense\":\n result.condense = true;\n break;\n case \"extend\":\n result.extend = true;\n break;\n case \"sz\":\n result.size = attrNum(child, \"val\");\n break;\n case \"color\":\n result.color = parseColorHex(child);\n if (parseOnOff(attr(child, \"auto\"))) result.autoColor = true;\n break;\n case \"name\":\n result.font = attr(child, \"val\") ?? undefined;\n break;\n case \"charset\":\n result.charset = attrNum(child, \"val\");\n break;\n case \"family\":\n result.family = attrNum(child, \"val\");\n break;\n case \"vertAlign\":\n result.vertAlign = (attr(child, \"val\") as FontOptions[\"vertAlign\"]) ?? undefined;\n break;\n case \"scheme\":\n result.scheme = (attr(child, \"val\") as FontOptions[\"scheme\"]) ?? undefined;\n break;\n }\n }\n return result as FontOptions;\n}\n\nexport function parseFill(el: XmlElement): CellFillOptions {\n const patternFill = findChild(el, \"patternFill\");\n if (patternFill) {\n const result: CellFillOptions = {};\n const patternType = attr(patternFill, \"patternType\");\n if (patternType) result.patternType = patternType;\n const fg = findChild(patternFill, \"fgColor\");\n if (fg) result.color = parseColorHex(fg);\n const bg = findChild(patternFill, \"bgColor\");\n if (bg) result.bgColor = parseColorHex(bg);\n const indexed = fg ? attrNum(fg, \"indexed\") : undefined;\n if (indexed !== undefined) result.colorIndexed = indexed;\n return result;\n }\n\n const gradientFill = findChild(el, \"gradientFill\");\n if (gradientFill) {\n const result: CellFillOptions = { type: \"gradient\" };\n const gType = attr(gradientFill, \"type\");\n if (gType) result.gradientType = gType as CellFillOptions[\"gradientType\"];\n const degree = attrNum(gradientFill, \"degree\");\n if (degree !== undefined) result.gradientDegree = degree;\n const left = attrNum(gradientFill, \"left\");\n if (left !== undefined) result.gradientLeft = left;\n const right = attrNum(gradientFill, \"right\");\n if (right !== undefined) result.gradientRight = right;\n const top = attrNum(gradientFill, \"top\");\n if (top !== undefined) result.gradientTop = top;\n const bottom = attrNum(gradientFill, \"bottom\");\n if (bottom !== undefined) result.gradientBottom = bottom;\n const stops: CellGradientStopOptions[] = [];\n for (const s of gradientFill.elements ?? []) {\n if (s.name !== \"stop\") continue;\n const pos = attrNum(s, \"position\");\n const color = findChild(s, \"color\");\n if (pos !== undefined && color) {\n stops.push({ position: pos, color: parseColorHex(color) ?? \"\" });\n }\n }\n if (stops.length > 0) result.stops = stops;\n return result;\n }\n\n return {};\n}\n\nexport function parseBorder(el: XmlElement): BorderSideOptions {\n const result: BorderSideOptions = {};\n if (parseOnOff(attr(el, \"diagonalUp\"))) result.diagonalUp = true;\n if (parseOnOff(attr(el, \"diagonalDown\"))) result.diagonalDown = true;\n\n for (const side of [\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"diagonal\",\n \"start\",\n \"end\",\n \"vertical\",\n \"horizontal\",\n ] as const) {\n const sideEl = findChild(el, side);\n if (sideEl) {\n const opts: BorderOptions = {};\n const style = attr(sideEl, \"style\");\n if (style) opts.style = style as BorderOptions[\"style\"];\n const color = findChild(sideEl, \"color\");\n if (color) opts.color = parseColorHex(color);\n if (Object.keys(opts).length > 0) result[side] = opts;\n }\n }\n\n return result;\n}\n\nexport function parseAlignment(el: XmlElement): AlignmentOptions {\n const result: AlignmentOptions = {};\n const h = attr(el, \"horizontal\");\n if (h) result.horizontal = h as AlignmentOptions[\"horizontal\"];\n const v = attr(el, \"vertical\");\n if (v) result.vertical = v as AlignmentOptions[\"vertical\"];\n if (parseOnOff(attr(el, \"wrapText\"))) result.wrapText = true;\n const rotation = attrNum(el, \"textRotation\");\n if (rotation !== undefined) result.textRotation = rotation;\n const indent = attrNum(el, \"indent\");\n if (indent !== undefined) result.indent = indent;\n const relativeIndent = attrNum(el, \"relativeIndent\");\n if (relativeIndent !== undefined) result.relativeIndent = relativeIndent;\n if (parseOnOff(attr(el, \"justifyLastLine\"))) result.justifyLastLine = true;\n if (parseOnOff(attr(el, \"shrinkToFit\"))) result.shrinkToFit = true;\n const readingOrder = attrNum(el, \"readingOrder\");\n if (readingOrder !== undefined) result.readingOrder = readingOrder;\n return result;\n}\n\nexport function parseProtection(el: XmlElement): CellProtectionOptions {\n const result: Partial<CellProtectionOptions> = {};\n const locked = attr(el, \"locked\");\n if (locked !== undefined) result.locked = parseOnOff(locked) ?? true;\n const hidden = attr(el, \"hidden\");\n if (hidden !== undefined) result.hidden = parseOnOff(hidden) ?? true;\n return result as CellProtectionOptions;\n}\n\n/**\n * Read an sml color element's @rgb, stripping the alpha prefix when present\n * (FF000000 → 000000). Shared by all xlsx color-attr parse sites.\n */\nexport function parseColorHex(el: XmlElement): string | undefined {\n const rgb = attr(el, \"rgb\");\n if (rgb) {\n // Strip alpha prefix if present (FF000000 → 000000)\n return rgb.length === 8 ? rgb.slice(2) : rgb;\n }\n return undefined;\n}\n","/**\n * Shared Strings Table — generates xl/sharedStrings.xml.\n *\n * XLSX stores repeated string values in a central table to reduce file size.\n * Cells reference strings by index into this table.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { escapeXml, findChild, attr, attrNum, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { parseColorHex } from \"./styles/parse\";\nimport type {\n RichTextOptions,\n RichTextRunOptions,\n RichTextRunPropertiesOptions,\n} from \"./worksheet\";\n\n/** String or rich text entry in the SST. */\ntype SstEntry = string | RichTextOptions;\n\n/**\n * Build rich text run properties XML (CT_RPrElt).\n * Exported for reuse by Comments and other components.\n */\nexport function buildRPrXml(\n pr: NonNullable<RichTextOptions[\"runs\"]>[number][\"properties\"],\n): string {\n if (!pr) return \"\";\n const parts: string[] = [];\n if (pr.font) parts.push(`<rFont val=\"${escapeXml(pr.font)}\"/>`);\n if (pr.charset !== undefined) parts.push(`<charset val=\"${pr.charset}\"/>`);\n if (pr.family !== undefined) parts.push(`<family val=\"${pr.family}\"/>`);\n if (pr.bold) parts.push(\"<b/>\");\n if (pr.italic) parts.push(\"<i/>\");\n if (pr.strike) parts.push(\"<strike/>\");\n if (pr.outline) parts.push(\"<outline/>\");\n if (pr.shadow) parts.push(\"<shadow/>\");\n if (pr.condense) parts.push(\"<condense/>\");\n if (pr.extend) parts.push(\"<extend/>\");\n if (pr.color) {\n // ST_UnsignedIntHex requires 8 hex chars (AARRGGBB).\n // Auto-prefix FF (fully opaque) when user provides 6-char RGB.\n const rgb = pr.color.length === 6 ? `FF${pr.color}` : pr.color;\n parts.push(`<color rgb=\"${escapeXml(rgb)}\"/>`);\n }\n if (pr.size !== undefined) parts.push(`<sz val=\"${pr.size}\"/>`);\n if (pr.underline) {\n if (pr.underline === \"none\") {\n parts.push(\"<u/>\");\n } else {\n parts.push(`<u val=\"${pr.underline}\"/>`);\n }\n }\n if (pr.vertAlign) parts.push(`<vertAlign val=\"${pr.vertAlign}\"/>`);\n if (pr.scheme) parts.push(`<scheme val=\"${pr.scheme}\"/>`);\n return parts.length > 0 ? `<rPr>${parts.join(\"\")}</rPr>` : \"\";\n}\n\n/** Build a CT_Rst XML string from RichTextOptions. */\nexport function buildRstXml(rst: RichTextOptions): string {\n const parts: string[] = [];\n if (rst.runs && rst.runs.length > 0) {\n for (const run of rst.runs) {\n const rPr = buildRPrXml(run.properties);\n parts.push(`<r>${rPr}<t>${escapeXml(run.text)}</t></r>`);\n }\n } else if (rst.text !== undefined) {\n parts.push(`<t>${escapeXml(rst.text)}</t>`);\n }\n // rPh (phonetics)\n if (rst.phonetics) {\n for (const ph of rst.phonetics) {\n parts.push(`<rPh sb=\"${ph.startByte}\" eb=\"${ph.endByte}\"><t>${escapeXml(ph.text)}</t></rPh>`);\n }\n }\n return parts.join(\"\");\n}\n\nexport class SharedStrings {\n private entries: SstEntry[] = [];\n /** Dedup map for plain strings only. Rich text is not deduped. */\n private indexMap = new Map<string, number>();\n\n /**\n * Register a plain string and return its index.\n * Returns existing index if the string is already registered.\n */\n public register(s: string): number {\n const existing = this.indexMap.get(s);\n if (existing !== undefined) return existing;\n\n const idx = this.entries.length;\n this.entries.push(s);\n this.indexMap.set(s, idx);\n return idx;\n }\n\n /**\n * Register a rich text entry and return its index.\n * Rich text is not deduped (each call creates a new entry).\n */\n public registerRich(rst: RichTextOptions): number {\n const idx = this.entries.length;\n this.entries.push(rst);\n return idx;\n }\n\n /**\n * Bulk-load parsed template entries, preserving their original indices so\n * existing cell references stay valid. Plain strings populate the dedup map\n * (first occurrence wins); rich-text entries are appended unchanged.\n *\n * Used by patch to extend an existing workbook's shared strings, so appended\n * worksheets continue registering strings at the correct offset.\n */\n public loadEntries(entries: SharedStringsDocOptions[\"entries\"]): void {\n for (const entry of entries) {\n const idx = this.entries.length;\n this.entries.push(entry);\n if (typeof entry === \"string\" && !this.indexMap.has(entry)) {\n this.indexMap.set(entry, idx);\n }\n }\n }\n\n public get count(): number {\n return this.entries.length;\n }\n\n /** Return a serializable snapshot for the descriptor. */\n public toDescriptorOptions(): { entries: SstEntry[] } {\n return { entries: this.entries };\n }\n\n /** Serialize to xl/sharedStrings.xml content (without XML declaration). */\n public serialize(): string {\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${this.entries.length}\" uniqueCount=\"${this.entries.length}\">`,\n ];\n for (const entry of this.entries) {\n if (typeof entry === \"string\") {\n p.push(`<si><t>${escapeXml(entry)}</t></si>`);\n } else {\n // Rich text (CT_Rst)\n p.push(`<si>${buildRstXml(entry)}</si>`);\n }\n }\n p.push(\"</sst>\");\n return p.join(\"\");\n }\n}\n\n// ── Descriptor Types ──\n\n/** Serializable snapshot of the shared string table. uniqueCount is not\n * stored — it always equals entries.length and is derived at emit time. */\nexport interface SharedStringsDocOptions {\n /** All entries (plain strings and rich text), in registration order. */\n entries: (string | RichTextOptions)[];\n}\n\n// ── Descriptor ──\n\nexport const sharedStringsDesc: CustomDescriptor<SharedStringsDocOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.entries.length === 0) return undefined;\n\n const p: string[] = [\n '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n ` count=\"${opts.entries.length}\" uniqueCount=\"${opts.entries.length}\">`,\n ];\n\n for (const entry of opts.entries) {\n if (typeof entry === \"string\") {\n p.push(`<si><t>${escapeXml(entry)}</t></si>`);\n } else {\n p.push(`<si>${buildRstXml(entry)}</si>`);\n }\n }\n\n p.push(\"</sst>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const entries: (string | RichTextOptions)[] = [];\n\n for (const si of el.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findChild(si, \"t\");\n if (t) {\n entries.push(textOf(t) ?? \"\");\n continue;\n }\n\n // Rich text: <si><r>...</r>...</si>\n const runs: RichTextRunOptions[] = [];\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findChild(r, \"t\");\n if (rt) {\n const rPrEl = findChild(r, \"rPr\");\n const run: RichTextRunOptions = { text: textOf(rt) ?? \"\" };\n if (rPrEl) run.properties = parseRPr(rPrEl);\n runs.push(run);\n }\n }\n\n // Phonetics: <rPh sb=\"...\" eb=\"...\"><t>...</t></rPh>\n const phonetics: { startByte: number; endByte: number; text: string }[] = [];\n for (const rPh of si.elements ?? []) {\n if (rPh.name !== \"rPh\") continue;\n const sb = attrNum(rPh, \"sb\") ?? 0;\n const eb = attrNum(rPh, \"eb\") ?? 0;\n const rPhT = findChild(rPh, \"t\");\n phonetics.push({ startByte: sb, endByte: eb, text: rPhT ? (textOf(rPhT) ?? \"\") : \"\" });\n }\n\n if (runs.length > 0) {\n const entry: RichTextOptions = { runs };\n if (phonetics.length > 0) entry.phonetics = phonetics;\n entries.push(entry);\n }\n }\n\n return { entries };\n },\n};\n\n/** Parse CT_RPrElt (run properties inside shared strings r element). */\nfunction parseRPr(el: XmlElement): RichTextRunPropertiesOptions {\n const result: RichTextRunPropertiesOptions = {};\n for (const child of el.elements ?? []) {\n switch (child.name) {\n case \"rFont\":\n result.font = attr(child, \"val\") ?? undefined;\n break;\n case \"charset\":\n result.charset = attrNum(child, \"val\");\n break;\n case \"family\":\n result.family = attrNum(child, \"val\");\n break;\n case \"b\":\n result.bold = parseOnOff(attr(child, \"val\")) ?? true;\n break;\n case \"i\":\n result.italic = parseOnOff(attr(child, \"val\")) ?? true;\n break;\n case \"strike\":\n result.strike = true;\n break;\n case \"outline\":\n result.outline = true;\n break;\n case \"shadow\":\n result.shadow = true;\n break;\n case \"condense\":\n result.condense = true;\n break;\n case \"extend\":\n result.extend = true;\n break;\n case \"color\": {\n const rgb = parseColorHex(child);\n if (rgb) {\n result.color = rgb;\n } else {\n const indexed = attrNum(child, \"indexed\");\n if (indexed !== undefined) result.color = String(indexed);\n else {\n const theme = attr(child, \"theme\");\n if (theme !== undefined) result.color = `theme:${theme}`;\n }\n }\n break;\n }\n case \"sz\":\n result.size = attrNum(child, \"val\");\n break;\n case \"u\": {\n const uVal = attr(child, \"val\");\n result.underline =\n (uVal as RichTextRunPropertiesOptions[\"underline\"] | undefined) ?? \"single\";\n break;\n }\n case \"vertAlign\":\n result.vertAlign = attr(child, \"val\") as\n | RichTextRunPropertiesOptions[\"vertAlign\"]\n | undefined;\n break;\n case \"scheme\":\n result.scheme = attr(child, \"val\") as RichTextRunPropertiesOptions[\"scheme\"] | undefined;\n break;\n }\n }\n return result;\n}\n","/**\n * Styles — the xl/styles.xml accumulator.\n *\n * XLSX uses an index-based style system: cells reference style entries\n * via the `s` attribute, which is an index into `cellXfs`. This class\n * registers and deduplicates fonts, fills, borders, numFmts, and cellXfs,\n * then serializes the lot via {@link Styles.serialize}.\n *\n * @module\n */\nimport { attrs, escapeXml } from \"@office-open/xml\";\n\nimport type {\n AlignmentOptions,\n BorderOptions,\n BorderSideOptions,\n CellProtectionOptions,\n CellStyleXfOptions,\n ColorsOptions,\n CustomCellStyleOptions,\n CustomTableStyleOptions,\n DxfOptions,\n CellFillOptions,\n FontOptions,\n StyleExtensionOptions,\n StyleOptions,\n StylesState,\n} from \"./types\";\n\n// ── Style key helpers for deduplication ──\n\nfunction fontKey(f: FontOptions): string {\n return `b${f.bold ? 1 : 0}i${f.italic ? 1 : 0}u${f.underline ? 1 : 0}s${f.strike ? 1 : 0}z${f.size ?? 0}c${f.color ?? \"\"}n${f.font ?? \"\"}cs${f.charset ?? \"\"}fm${f.family ?? \"\"}co${f.condense ? 1 : 0}ex${f.extend ? 1 : 0}va${f.vertAlign ?? \"\"}sc${f.scheme ?? \"\"}sh${f.shadow ? 1 : 0}ol${f.outline ? 1 : 0}`;\n}\n\nfunction fillKey(f: CellFillOptions): string {\n return `t${f.type ?? \"\"}c${f.color ?? \"\"}p${f.patternType ?? \"\"}bg${f.bgColor ?? \"\"}g${f.stops?.map((s) => `${s.position}_${s.color}`).join(\"|\") ?? \"\"}`;\n}\n\nfunction borderKey(b: BorderSideOptions): string {\n const sk = (o?: BorderOptions) => `${o?.style ?? \"\"}_${o?.color ?? \"\"}`;\n return `t${sk(b.top)}b${sk(b.bottom)}l${sk(b.left)}r${sk(b.right)}d${sk(b.diagonal)}du${b.diagonalUp ? 1 : 0}dd${b.diagonalDown ? 1 : 0}st${sk(b.start)}en${sk(b.end)}v${sk(b.vertical)}h${sk(b.horizontal)}`;\n}\n\n// ── Built-in number format IDs ──\n\nconst BUILTIN_NUMFMTS: Record<string, number> = {\n General: 0,\n \"0\": 1,\n \"0.00\": 2,\n \"#,##0\": 3,\n \"#,##0.00\": 4,\n \"0%\": 9,\n \"0.00%\": 10,\n \"0.00E+00\": 11,\n \"mm-dd-yy\": 14,\n \"d-mmm-yy\": 15,\n \"d-mmm\": 16,\n \"mmm-yy\": 17,\n \"h:mm AM/PM\": 18,\n \"h:mm:ss AM/PM\": 19,\n \"h:mm\": 20,\n \"h:mm:ss\": 21,\n \"m/d/yy h:mm\": 22,\n \"#,##0 ;(#,##0)\": 37,\n \"#,##0 ;[Red](#,##0)\": 38,\n \"#,##0.00;(#,##0.00)\": 39,\n \"#,##0.00;[Red](#,##0.00)\": 40,\n \"mm:ss\": 45,\n \"[h]:mm:ss\": 46,\n \"mmss.0\": 47,\n \"##0.0E+0\": 48,\n \"@\": 49,\n};\n\n/**\n * Internal cellStyleXfs storage — font/fill/border/numFmt indices after\n * re-registration against the accumulator, plus the verbatim CT_Xf flags.\n */\ninterface CellStyleXfEntry {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n protection?: CellProtectionOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyNumberFormat?: boolean;\n applyFont?: boolean;\n applyFill?: boolean;\n applyBorder?: boolean;\n applyAlignment?: boolean;\n applyProtection?: boolean;\n}\n\nexport class Styles {\n private fonts: FontOptions[] = [\n { size: 11, font: \"Calibri\" }, // default font (index 0)\n ];\n private fontKeys = new Map<string, number>();\n\n private fills: CellFillOptions[] = [\n { patternType: \"none\" }, // default fill (index 0)\n { patternType: \"gray125\" }, // required fill (index 1)\n ];\n private fillKeys = new Map<string, number>();\n\n private borders: BorderSideOptions[] = [\n {}, // default empty border (index 0)\n ];\n private borderKeys = new Map<string, number>();\n\n private customNumFmts = new Map<string, number>();\n private nextCustomNumFmtId = 164; // custom numFmts start at 164\n\n private cellXfs: Array<{\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\n }> = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // default xf (index 0)\n ];\n private cellXfKeys = new Map<string, number>();\n\n /** Named cell-style templates (cellStyleXfs); index 0 is the Normal style. */\n private cellStyleXfs: CellStyleXfEntry[] = [\n { fontId: 0, fillId: 0, borderId: 0, numFmtId: 0 }, // Normal (index 0)\n ];\n\n private dxfs: DxfOptions[] = [];\n\n private colors?: ColorsOptions;\n private tableStyles?: CustomTableStyleOptions[];\n /** Custom cell styles (CT_CellStyles) */\n private customCellStyles?: CustomCellStyleOptions[];\n /** Style sheet extensions (CT_ExtensionList) */\n private styleExtensions?: StyleExtensionOptions[];\n\n public constructor() {\n // Pre-register default font/fill/border keys. These arrays are seeded\n // inline above, so index 0/1 always exist.\n this.fontKeys.set(fontKey(this.fonts[0]!), 0);\n this.fillKeys.set(fillKey(this.fills[0]!), 0);\n this.fillKeys.set(fillKey(this.fills[1]!), 1);\n this.borderKeys.set(borderKey(this.borders[0]!), 0);\n this.cellXfKeys.set(this.cellXfKey(this.cellXfs[0]!), 0);\n }\n\n /**\n * Register a style and return its index (for the cell `s` attribute).\n * Deduplicates across fonts, fills, borders, numFmts, and cellXfs.\n */\n public register(opts: StyleOptions): number {\n const fontId = this.registerFont(opts.font);\n const fillId = this.registerFill(opts.fill);\n const borderId = this.registerBorder(opts.border);\n const numFmtId = this.registerNumFmt(opts.numFmt);\n\n const xf = {\n fontId,\n fillId,\n borderId,\n numFmtId,\n alignment: opts.alignment,\n quotePrefix: opts.quotePrefix,\n pivotButton: opts.pivotButton,\n applyProtection: opts.applyProtection,\n protection: opts.protection,\n };\n\n const key = this.cellXfKey(xf);\n const existing = this.cellXfKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.cellXfs.length;\n this.cellXfs.push(xf);\n this.cellXfKeys.set(key, idx);\n return idx;\n }\n\n /**\n * Register a differential format and return its index (dxfId).\n * Used by conditional formatting rules.\n */\n public registerDxf(opts: DxfOptions): number {\n const idx = this.dxfs.length;\n this.dxfs.push(opts);\n return idx;\n }\n\n /**\n * Set color palette (indexed colors and MRU colors).\n */\n public setColors(opts: ColorsOptions): void {\n this.colors = opts;\n }\n\n public setTableStyles(styles: CustomTableStyleOptions[]): void {\n this.tableStyles = styles;\n }\n\n public setExtensions(extensions: StyleExtensionOptions[]): void {\n this.styleExtensions = extensions;\n }\n\n public setCustomCellStyles(styles: CustomCellStyleOptions[]): void {\n this.customCellStyles = styles;\n }\n\n /**\n * Set named cell-style templates (cellStyleXfs). Each entry's font/fill/\n * border/numFmt definitions are re-registered (deduplicated) so indices track\n * the rebuilt tables. Entries keep source order, keeping cellStyle.xfId\n * references stable (oldIndex === newIndex). Alignment/protection and the\n * applyXxx flags are preserved verbatim for named-style fidelity.\n */\n public setCellStyleXfs(entries: CellStyleXfOptions[]): void {\n this.cellStyleXfs = entries.map((entry) => ({\n fontId: this.registerFont(entry.font),\n fillId: this.registerFill(entry.fill),\n borderId: this.registerBorder(entry.border),\n numFmtId: this.registerNumFmt(entry.numFmt),\n alignment: entry.alignment,\n protection: entry.protection,\n quotePrefix: entry.quotePrefix,\n pivotButton: entry.pivotButton,\n applyNumberFormat: entry.applyNumberFormat,\n applyFont: entry.applyFont,\n applyFill: entry.applyFill,\n applyBorder: entry.applyBorder,\n applyAlignment: entry.applyAlignment,\n applyProtection: entry.applyProtection,\n }));\n }\n\n /**\n * Expose internal state for descriptor-based XML generation.\n * The descriptor reads this snapshot to produce xl/styles.xml.\n */\n public toDescriptorOptions(): StylesState {\n return {\n customNumFmts: new Map(this.customNumFmts),\n fonts: [...this.fonts],\n fills: [...this.fills],\n borders: [...this.borders],\n cellXfs: [...this.cellXfs],\n dxfs: [...this.dxfs],\n colors: this.colors,\n tableStyles: this.tableStyles,\n customCellStyles: this.customCellStyles,\n styleExtensions: this.styleExtensions,\n };\n }\n\n private registerFont(opts?: FontOptions): number {\n if (!opts) return 0;\n const key = fontKey(opts);\n const existing = this.fontKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fonts.length;\n this.fonts.push(opts);\n this.fontKeys.set(key, idx);\n return idx;\n }\n\n private registerFill(opts?: CellFillOptions): number {\n if (!opts) return 0;\n const key = fillKey(opts);\n const existing = this.fillKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.fills.length;\n this.fills.push(opts);\n this.fillKeys.set(key, idx);\n return idx;\n }\n\n private registerBorder(opts?: BorderSideOptions): number {\n if (!opts) return 0;\n const key = borderKey(opts);\n const existing = this.borderKeys.get(key);\n if (existing !== undefined) return existing;\n\n const idx = this.borders.length;\n this.borders.push(opts);\n this.borderKeys.set(key, idx);\n return idx;\n }\n\n private registerNumFmt(fmt?: string): number {\n if (!fmt) return 0;\n const builtin = BUILTIN_NUMFMTS[fmt];\n if (builtin !== undefined) return builtin;\n\n const existing = this.customNumFmts.get(fmt);\n if (existing !== undefined) return existing;\n\n const id = this.nextCustomNumFmtId++;\n this.customNumFmts.set(fmt, id);\n return id;\n }\n\n private cellXfKey(xf: {\n fontId: number;\n fillId: number;\n borderId: number;\n numFmtId: number;\n alignment?: AlignmentOptions;\n quotePrefix?: boolean;\n pivotButton?: boolean;\n applyProtection?: boolean;\n protection?: CellProtectionOptions;\n }): string {\n const a = xf.alignment;\n const ak = a\n ? `h${a.horizontal ?? \"\"}v${a.vertical ?? \"\"}w${a.wrapText ? 1 : 0}r${a.textRotation ?? \"\"}i${a.indent ?? \"\"}ri${a.relativeIndent ?? \"\"}jl${a.justifyLastLine ? 1 : 0}st${a.shrinkToFit ? 1 : 0}ro${a.readingOrder ?? \"\"}`\n : \"\";\n const pr = xf.protection;\n const pk = pr ? `l${pr.locked ?? \"\"}h${pr.hidden ?? \"\"}` : \"\";\n return `${xf.fontId}|${xf.fillId}|${xf.borderId}|${xf.numFmtId}|${ak}|qp${xf.quotePrefix ? 1 : 0}|pb${xf.pivotButton ? 1 : 0}|${pk}`;\n }\n\n // ── XML generation ──\n\n /**\n * Zero-allocation fast path: directly concatenate XML string.\n * Bypasses the intermediate object tree entirely.\n */\n /** Serialize to xl/styles.xml content (without XML declaration). */\n public serialize(): string {\n const p: string[] = [\n '<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n\n // numFmts\n if (this.customNumFmts.size > 0) {\n p.push(`<numFmts count=\"${this.customNumFmts.size}\">`);\n for (const [fmt, id] of this.customNumFmts) {\n p.push(`<numFmt numFmtId=\"${id}\" formatCode=\"${escapeXml(fmt)}\"/>`);\n }\n p.push(\"</numFmts>\");\n }\n\n // fonts\n p.push(`<fonts count=\"${this.fonts.length}\">`);\n for (const f of this.fonts) {\n p.push(`<font>${this.fontXmlStr(f)}</font>`);\n }\n p.push(\"</fonts>\");\n\n // fills\n p.push(`<fills count=\"${this.fills.length}\">`);\n for (const f of this.fills) {\n if (f.type === \"gradient\" && f.stops && f.stops.length > 0) {\n const gfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (f.gradientType && f.gradientType !== \"linear\") gfAttrs.type = f.gradientType;\n if (f.gradientDegree !== undefined) gfAttrs.degree = f.gradientDegree;\n if (f.gradientLeft !== undefined) gfAttrs.left = f.gradientLeft;\n if (f.gradientRight !== undefined) gfAttrs.right = f.gradientRight;\n if (f.gradientTop !== undefined) gfAttrs.top = f.gradientTop;\n if (f.gradientBottom !== undefined) gfAttrs.bottom = f.gradientBottom;\n const stopParts = f.stops\n .map((s) => `<stop position=\"${s.position}\"><color rgb=\"FF${s.color}\"/></stop>`)\n .join(\"\");\n p.push(`<fill><gradientFill${attrs(gfAttrs)}>${stopParts}</gradientFill></fill>`);\n } else {\n const patternAttrs = attrs({ patternType: f.patternType ?? \"solid\" });\n const fgColor = f.color\n ? `<fgColor rgb=\"FF${f.color}\"/>`\n : f.colorIndexed !== undefined\n ? `<fgColor indexed=\"${f.colorIndexed}\"/>`\n : \"\";\n const bgColor = f.bgColor ? `<bgColor rgb=\"FF${f.bgColor}\"/>` : \"\";\n const colorContent = fgColor + bgColor;\n p.push(\n colorContent\n ? `<fill><patternFill${patternAttrs}>${colorContent}</patternFill></fill>`\n : `<fill><patternFill${patternAttrs}/></fill>`,\n );\n }\n }\n p.push(\"</fills>\");\n\n // borders\n p.push(`<borders count=\"${this.borders.length}\">`);\n for (const b of this.borders) {\n const bAttrs: string[] = [];\n if (b.diagonalUp) bAttrs.push('diagonalUp=\"1\"');\n if (b.diagonalDown) bAttrs.push('diagonalDown=\"1\"');\n const bAttr = bAttrs.length ? ` ${bAttrs.join(\" \")}` : \"\";\n p.push(`<border${bAttr}>${this.borderXmlStr(b)}</border>`);\n }\n p.push(\"</borders>\");\n\n // cellStyleXfs — named-style templates; applyXxx preserved verbatim (not derived)\n p.push(`<cellStyleXfs count=\"${this.cellStyleXfs.length}\">`);\n for (const xf of this.cellStyleXfs) {\n const xAttrs: Record<string, string | number | boolean | undefined> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n };\n if (xf.applyNumberFormat) xAttrs.applyNumberFormat = 1;\n if (xf.applyFont) xAttrs.applyFont = 1;\n if (xf.applyFill) xAttrs.applyFill = 1;\n if (xf.applyBorder) xAttrs.applyBorder = 1;\n if (xf.applyAlignment) xAttrs.applyAlignment = 1;\n if (xf.applyProtection) xAttrs.applyProtection = 1;\n if (xf.quotePrefix) xAttrs.quotePrefix = 1;\n if (xf.pivotButton) xAttrs.pivotButton = 1;\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n const protStr = xf.protection ? this.protectionXmlStr(xf.protection) : \"\";\n const inner = alignStr + protStr;\n p.push(inner ? `<xf${attrs(xAttrs)}>${inner}</xf>` : `<xf${attrs(xAttrs)}/>`);\n }\n p.push(\"</cellStyleXfs>\");\n\n // cellXfs\n p.push(`<cellXfs count=\"${this.cellXfs.length}\">`);\n for (const xf of this.cellXfs) {\n const xAttrs: Record<string, string | number | boolean | undefined> = {\n numFmtId: xf.numFmtId,\n fontId: xf.fontId,\n fillId: xf.fillId,\n borderId: xf.borderId,\n xfId: 0,\n };\n if (xf.alignment) xAttrs.applyAlignment = 1;\n if (xf.fontId > 0) xAttrs.applyFont = 1;\n if (xf.fillId > 0) xAttrs.applyFill = 1;\n if (xf.borderId > 0) xAttrs.applyBorder = 1;\n if (xf.numFmtId > 0) xAttrs.applyNumberFormat = 1;\n if (xf.quotePrefix) xAttrs.quotePrefix = 1;\n if (xf.pivotButton) xAttrs.pivotButton = 1;\n if (xf.applyProtection) xAttrs.applyProtection = 1;\n if (xf.protection) xAttrs.applyProtection = xAttrs.applyProtection ?? 1;\n\n const alignStr = xf.alignment ? this.alignmentXmlStr(xf.alignment) : \"\";\n const protStr = xf.protection ? this.protectionXmlStr(xf.protection) : \"\";\n const inner = alignStr + protStr;\n p.push(inner ? `<xf${attrs(xAttrs)}>${inner}</xf>` : `<xf${attrs(xAttrs)}/>`);\n }\n p.push(\"</cellXfs>\");\n\n // cellStyles\n if (this.customCellStyles && this.customCellStyles.length > 0) {\n // Normal (builtinId=0) is the implicit default; only auto-add it when the\n // caller's list doesn't already include it, so a parsed list containing\n // Normal round-trips instead of producing a duplicate.\n const hasNormal = this.customCellStyles.some(\n (cs) => cs.builtinId === 0 && cs.name === \"Normal\",\n );\n const csAttrs: string[] = [`count=\"${this.customCellStyles.length + (hasNormal ? 0 : 1)}\"`];\n const csParts: string[] = [`<cellStyles ${csAttrs.join(\" \")}>`];\n if (!hasNormal) csParts.push('<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>');\n for (const cs of this.customCellStyles) {\n const attrs: string[] = [`name=\"${escapeXml(cs.name)}\"`, `xfId=\"${cs.xfId}\"`];\n if (cs.builtinId !== undefined) attrs.push(`builtinId=\"${cs.builtinId}\"`);\n if (cs.customBuiltin) attrs.push('customBuiltin=\"1\"');\n if (cs.iLevel !== undefined) attrs.push(`iLevel=\"${cs.iLevel}\"`);\n if (cs.hidden) attrs.push('hidden=\"1\"');\n csParts.push(`<cellStyle ${attrs.join(\" \")}/>`);\n }\n csParts.push(\"</cellStyles>\");\n p.push(csParts.join(\"\"));\n } else {\n p.push(\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>',\n );\n }\n\n // dxfs\n if (this.dxfs.length > 0) {\n p.push(`<dxfs count=\"${this.dxfs.length}\">`);\n for (const dxf of this.dxfs) {\n const dParts: string[] = [];\n if (dxf.font) dParts.push(`<font>${this.fontXmlStr(dxf.font)}</font>`);\n if (dxf.fill) {\n const bgColor = dxf.fill.color ? `<bgColor rgb=\"FF${dxf.fill.color}\"/>` : \"\";\n const patAttrs = attrs({ patternType: dxf.fill.patternType ?? \"solid\" });\n dParts.push(`<fill><patternFill${patAttrs}>${bgColor}</patternFill></fill>`);\n }\n if (dxf.numFmt) dParts.push(`<numFmt formatCode=\"${escapeXml(dxf.numFmt)}\"/>`);\n if (dxf.border) dParts.push(`<border>${this.borderXmlStr(dxf.border)}</border>`);\n if (dParts.length > 0) {\n p.push(`<dxf>${dParts.join(\"\")}</dxf>`);\n } else {\n p.push(\"<dxf/>\");\n }\n }\n p.push(\"</dxfs>\");\n } else {\n p.push('<dxfs count=\"0\"/>');\n }\n // tableStyles (CT_TableStyles)\n if (this.tableStyles && this.tableStyles.length > 0) {\n const tsParts: string[] = [\n `<tableStyles count=\"${this.tableStyles.length}\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\">`,\n ];\n for (const ts of this.tableStyles) {\n const tsAttrs: string[] = [`name=\"${escapeXml(ts.name)}\"`];\n if (ts.pivot) tsAttrs.push('pivot=\"1\"');\n if (ts.table === false) tsAttrs.push('table=\"0\"');\n if (ts.elements && ts.elements.length > 0) {\n tsParts.push(`<tableStyle ${tsAttrs.join(\" \")}>`);\n for (const el of ts.elements) {\n const elAttrs: string[] = [`type=\"${el.type}\"`];\n if (el.dxfId !== undefined) elAttrs.push(`dxfId=\"${el.dxfId}\"`);\n if (el.button) elAttrs.push('button=\"1\"');\n tsParts.push(`<tableStyleElement ${elAttrs.join(\" \")}/>`);\n }\n tsParts.push(\"</tableStyle>\");\n } else {\n tsParts.push(`<tableStyle ${tsAttrs.join(\" \")}/>`);\n }\n }\n tsParts.push(\"</tableStyles>\");\n p.push(tsParts.join(\"\"));\n } else {\n p.push(\n '<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleLight16\"/>',\n );\n }\n\n // colors (optional color palette)\n if (this.colors) {\n const c = this.colors;\n const colorParts: string[] = [\"<colors>\"];\n if (c.indexedColors && c.indexedColors.length > 0) {\n colorParts.push(\"<indexedColors>\");\n for (const ic of c.indexedColors) {\n colorParts.push(`<rgbColor rgb=\"${ic.rgb}\"/>`);\n }\n colorParts.push(\"</indexedColors>\");\n }\n if (c.mruColors && c.mruColors.length > 0) {\n colorParts.push(\"<mruColors>\");\n for (const mc of c.mruColors) {\n colorParts.push(`<color rgb=\"FF${mc}\"/>`);\n }\n colorParts.push(\"</mruColors>\");\n }\n colorParts.push(\"</colors>\");\n p.push(colorParts.join(\"\"));\n }\n\n // extLst — style sheet extensions\n if (this.styleExtensions && this.styleExtensions.length > 0) {\n const extParts: string[] = [\"<extLst>\"];\n for (const ext of this.styleExtensions) {\n if (ext.content) {\n extParts.push(`<ext uri=\"${ext.uri}\">${ext.content}</ext>`);\n } else {\n extParts.push(`<ext uri=\"${ext.uri}\"/>`);\n }\n }\n extParts.push(\"</extLst>\");\n p.push(extParts.join(\"\"));\n } else {\n p.push(\"<extLst/>\");\n }\n\n p.push(\"</styleSheet>\");\n return p.join(\"\");\n }\n\n private fontXmlStr(f: FontOptions): string {\n const parts: string[] = [];\n if (f.bold) parts.push(\"<b/>\");\n if (f.italic) parts.push(\"<i/>\");\n if (f.underline) parts.push(\"<u/>\");\n if (f.strike) parts.push(\"<strike/>\");\n if (f.outline) parts.push(\"<outline/>\");\n if (f.shadow) parts.push(\"<shadow/>\");\n if (f.condense) parts.push(\"<condense/>\");\n if (f.extend) parts.push(\"<extend/>\");\n if (f.size) parts.push(`<sz val=\"${f.size}\"/>`);\n if (f.autoColor) parts.push('<color auto=\"1\"/>');\n else if (f.color) parts.push(`<color rgb=\"FF${f.color}\"/>`);\n if (f.font) parts.push(`<name val=\"${escapeXml(f.font)}\"/>`);\n if (f.charset !== undefined) parts.push(`<charset val=\"${f.charset}\"/>`);\n if (f.family !== undefined) parts.push(`<family val=\"${f.family}\"/>`);\n if (f.vertAlign) parts.push(`<vertAlign val=\"${f.vertAlign}\"/>`);\n if (f.scheme) parts.push(`<scheme val=\"${f.scheme}\"/>`);\n return parts.join(\"\");\n }\n\n private borderXmlStr(b: BorderSideOptions): string {\n const parts: string[] = [];\n const renderSide = (name: string, opts: BorderOptions | undefined, required = true) => {\n if (opts && opts.style && opts.style !== \"none\") {\n const colorStr = opts.color ? `<color rgb=\"FF${opts.color}\"/>` : \"\";\n parts.push(`<${name} style=\"${opts.style}\">${colorStr}</${name}>`);\n } else if (required) {\n parts.push(`<${name}/>`);\n }\n };\n for (const side of [\n \"left\",\n \"right\",\n \"top\",\n \"bottom\",\n \"diagonal\",\n \"vertical\",\n \"horizontal\",\n ] as const) {\n renderSide(side, b[side] as BorderOptions | undefined);\n }\n // start/end not in transitional XSD — only emit when styled\n renderSide(\"start\", b.start, false);\n renderSide(\"end\", b.end, false);\n return parts.join(\"\");\n }\n\n private alignmentXmlStr(a: AlignmentOptions): string {\n const aAttrs: Record<string, string | number | boolean | undefined> = {};\n if (a.horizontal) aAttrs.horizontal = a.horizontal;\n if (a.vertical) aAttrs.vertical = a.vertical;\n if (a.wrapText) aAttrs.wrapText = 1;\n if (a.textRotation !== undefined) aAttrs.textRotation = a.textRotation;\n if (a.indent !== undefined) aAttrs.indent = a.indent;\n if (a.relativeIndent !== undefined) aAttrs.relativeIndent = a.relativeIndent;\n if (a.justifyLastLine) aAttrs.justifyLastLine = 1;\n if (a.shrinkToFit) aAttrs.shrinkToFit = 1;\n if (a.readingOrder !== undefined) aAttrs.readingOrder = a.readingOrder;\n return `<alignment${attrs(aAttrs)}/>`;\n }\n\n private protectionXmlStr(pr: CellProtectionOptions): string {\n const prAttrs: Record<string, string | number | boolean | undefined> = {};\n if (pr.locked !== undefined) prAttrs.locked = pr.locked ? 1 : 0;\n if (pr.hidden !== undefined) prAttrs.hidden = pr.hidden ? 1 : 0;\n return `<protection${attrs(prAttrs)}/>`;\n }\n}\n","/**\n * Styles — descriptor for xl/styles.xml (stringify delegates to\n * {@link Styles.serialize}; parse rebuilds the structured tables).\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, findChild, stringify } from \"@office-open/xml\";\n\nimport {\n parseAlignment,\n parseBorder,\n parseColorHex,\n parseFill,\n parseFont,\n parseProtection,\n} from \"./parse\";\nimport type {\n CellStyleXfOptions,\n ColorsOptions,\n CustomCellStyleOptions,\n CustomTableStyleOptions,\n DxfOptions,\n CellFillOptions,\n FontOptions,\n IndexedColorOptions,\n IndexedXfEntry,\n BorderSideOptions,\n StyleExtensionOptions,\n StylesDocOptions,\n StylesParseResult,\n TableStyleElementOptions,\n TableStyleElementType,\n TableStylesInfo,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const stylesDesc: CustomDescriptor<StylesDocOptions, WriteContext, StylesParseResult> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return opts.styles.serialize();\n },\n\n parse(el, _ctx) {\n const result: StylesParseResult = {};\n\n // numFmtById / fonts / fills / borders are hoisted so the cellStyleXfs\n // section can resolve index references into font/fill/border/numFmt defs.\n const numFmtById = new Map<number, string>();\n const fonts: FontOptions[] = [];\n const fills: CellFillOptions[] = [];\n const borders: BorderSideOptions[] = [];\n\n // numFmts\n const numFmtsEl = findChild(el, \"numFmts\");\n if (numFmtsEl) {\n for (const nf of numFmtsEl.elements ?? []) {\n if (nf.name !== \"numFmt\") continue;\n const id = attrNum(nf, \"numFmtId\");\n const code = attr(nf, \"formatCode\");\n if (id !== undefined && code) numFmtById.set(id, code);\n }\n result.customNumFmtById = numFmtById;\n }\n\n // fonts\n const fontsEl = findChild(el, \"fonts\");\n if (fontsEl) {\n for (const f of fontsEl.elements ?? []) {\n if (f.name !== \"font\") continue;\n fonts.push(parseFont(f));\n }\n result.fonts = fonts;\n }\n\n // fills\n const fillsEl = findChild(el, \"fills\");\n if (fillsEl) {\n for (const f of fillsEl.elements ?? []) {\n if (f.name !== \"fill\") continue;\n fills.push(parseFill(f));\n }\n result.fills = fills;\n }\n\n // borders\n const bordersEl = findChild(el, \"borders\");\n if (bordersEl) {\n for (const b of bordersEl.elements ?? []) {\n if (b.name !== \"border\") continue;\n borders.push(parseBorder(b));\n }\n result.borders = borders;\n }\n\n // cellStyleXfs — resolve indices into font/fill/border/numFmt definitions.\n // nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\" to numbers, so the\n // boolean applyXxx/quotePrefix/pivotButton checks use String() coercion.\n const cellStyleXfsEl = findChild(el, \"cellStyleXfs\");\n if (cellStyleXfsEl) {\n const xfs: CellStyleXfOptions[] = [];\n for (const xf of cellStyleXfsEl.elements ?? []) {\n if (xf.name !== \"xf\") continue;\n const entry: CellStyleXfOptions = {};\n const fontId = attrNum(xf, \"fontId\");\n const fillId = attrNum(xf, \"fillId\");\n const borderId = attrNum(xf, \"borderId\");\n const numFmtId = attrNum(xf, \"numFmtId\");\n if (fontId !== undefined && fontId < fonts.length) entry.font = fonts[fontId];\n if (fillId !== undefined && fillId < fills.length) entry.fill = fills[fillId];\n if (borderId !== undefined && borderId < borders.length) entry.border = borders[borderId];\n if (numFmtId !== undefined) {\n const code = numFmtById.get(numFmtId);\n if (code !== undefined) entry.numFmt = code;\n }\n const alignmentEl = findChild(xf, \"alignment\");\n if (alignmentEl) entry.alignment = parseAlignment(alignmentEl);\n const protectionEl = findChild(xf, \"protection\");\n if (protectionEl) entry.protection = parseProtection(protectionEl);\n if (parseOnOff(attr(xf, \"applyNumberFormat\"))) entry.applyNumberFormat = true;\n if (parseOnOff(attr(xf, \"applyFont\"))) entry.applyFont = true;\n if (parseOnOff(attr(xf, \"applyFill\"))) entry.applyFill = true;\n if (parseOnOff(attr(xf, \"applyBorder\"))) entry.applyBorder = true;\n if (parseOnOff(attr(xf, \"applyAlignment\"))) entry.applyAlignment = true;\n if (parseOnOff(attr(xf, \"applyProtection\"))) entry.applyProtection = true;\n if (parseOnOff(attr(xf, \"quotePrefix\"))) entry.quotePrefix = true;\n if (parseOnOff(attr(xf, \"pivotButton\"))) entry.pivotButton = true;\n xfs.push(entry);\n }\n result.cellStyleXfs = xfs;\n }\n\n // cellXfs\n const cellXfsEl = findChild(el, \"cellXfs\");\n if (cellXfsEl) {\n const xfs: IndexedXfEntry[] = [];\n for (const xf of cellXfsEl.elements ?? []) {\n if (xf.name !== \"xf\") continue;\n const fontId = attrNum(xf, \"fontId\") ?? 0;\n const fillId = attrNum(xf, \"fillId\") ?? 0;\n const borderId = attrNum(xf, \"borderId\") ?? 0;\n const numFmtId = attrNum(xf, \"numFmtId\") ?? 0;\n\n const alignmentEl = findChild(xf, \"alignment\");\n const alignment = alignmentEl ? parseAlignment(alignmentEl) : undefined;\n\n const protectionEl = findChild(xf, \"protection\");\n const protection = protectionEl ? parseProtection(protectionEl) : undefined;\n\n const style: IndexedXfEntry = {};\n if (fontId > 0) style.fontId = fontId;\n if (fillId > 0) style.fillId = fillId;\n if (borderId > 0) style.borderId = borderId;\n if (numFmtId > 0) style.numFmtId = numFmtId;\n if (alignment) style.alignment = alignment;\n if (protection) style.protection = protection;\n // nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\" to numbers\n if (parseOnOff(attr(xf, \"quotePrefix\"))) style.quotePrefix = true;\n if (parseOnOff(attr(xf, \"pivotButton\"))) style.pivotButton = true;\n\n xfs.push(style);\n }\n result.cellXfs = xfs;\n }\n\n // cellStyles\n const cellStylesEl = findChild(el, \"cellStyles\");\n if (cellStylesEl) {\n const styles: CustomCellStyleOptions[] = [];\n for (const cs of cellStylesEl.elements ?? []) {\n if (cs.name !== \"cellStyle\") continue;\n const style: Partial<CustomCellStyleOptions> = {};\n if (attr(cs, \"name\")) style.name = attr(cs, \"name\");\n const xfId = attrNum(cs, \"xfId\");\n if (xfId !== undefined) style.xfId = xfId;\n const builtinId = attrNum(cs, \"builtinId\");\n if (builtinId !== undefined) style.builtinId = builtinId;\n if (parseOnOff(attr(cs, \"customBuiltin\"))) style.customBuiltin = true;\n if (parseOnOff(attr(cs, \"hidden\"))) style.hidden = true;\n const iLevel = attrNum(cs, \"iLevel\");\n if (iLevel !== undefined) style.iLevel = iLevel;\n styles.push(style as CustomCellStyleOptions);\n }\n result.customCellStyles = styles;\n }\n\n // dxfs\n const dxfsEl = findChild(el, \"dxfs\");\n if (dxfsEl) {\n const dxfs: DxfOptions[] = [];\n for (const dxf of dxfsEl.elements ?? []) {\n if (dxf.name !== \"dxf\") continue;\n const d: DxfOptions = {};\n const fontEl = findChild(dxf, \"font\");\n if (fontEl) d.font = parseFont(fontEl);\n const fillEl = findChild(dxf, \"fill\");\n if (fillEl) d.fill = parseFill(fillEl);\n const borderEl = findChild(dxf, \"border\");\n if (borderEl) d.border = parseBorder(borderEl);\n const numFmtEl = findChild(dxf, \"numFmt\");\n if (numFmtEl && attr(numFmtEl, \"formatCode\")) d.numFmt = attr(numFmtEl, \"formatCode\");\n dxfs.push(d);\n }\n result.dxfs = dxfs;\n }\n\n // tableStyles\n const tableStylesEl = findChild(el, \"tableStyles\");\n if (tableStylesEl?.attributes) {\n const ts: TableStylesInfo = {};\n if (attr(tableStylesEl, \"count\") !== undefined)\n ts.count = attrNum(tableStylesEl, \"count\") ?? 0;\n if (attr(tableStylesEl, \"defaultTableStyle\"))\n ts.defaultTableStyle = attr(tableStylesEl, \"defaultTableStyle\");\n if (attr(tableStylesEl, \"defaultPivotStyle\"))\n ts.defaultPivotStyle = attr(tableStylesEl, \"defaultPivotStyle\");\n const customStyles: CustomTableStyleOptions[] = [];\n for (const tse of tableStylesEl.elements ?? []) {\n if (tse.name !== \"tableStyle\") continue;\n const style: Partial<CustomTableStyleOptions> = {};\n if (attr(tse, \"name\")) style.name = attr(tse, \"name\");\n if (parseOnOff(attr(tse, \"pivot\"))) style.pivot = true;\n const elements: TableStyleElementOptions[] = [];\n for (const tsee of tse.elements ?? []) {\n if (tsee.name !== \"tableStyleElement\") continue;\n const elOpts: Partial<TableStyleElementOptions> = {};\n if (attr(tsee, \"type\")) elOpts.type = attr(tsee, \"type\") as TableStyleElementType;\n const dxfId = attrNum(tsee, \"dxfId\");\n if (dxfId !== undefined) elOpts.dxfId = dxfId;\n if (parseOnOff(attr(tsee, \"button\"))) elOpts.button = true;\n elements.push(elOpts as TableStyleElementOptions);\n }\n if (elements.length > 0) style.elements = elements;\n customStyles.push(style as CustomTableStyleOptions);\n }\n if (customStyles.length > 0) ts.tableStyles = customStyles;\n result.tableStylesInfo = ts;\n }\n\n // colors\n const colorsEl = findChild(el, \"colors\");\n if (colorsEl) {\n const colors: ColorsOptions = {};\n const icEl = findChild(colorsEl, \"indexedColors\");\n if (icEl) {\n const indexed: IndexedColorOptions[] = [];\n for (const rgb of icEl.elements ?? []) {\n if (rgb.name === \"rgbColor\" && attr(rgb, \"rgb\")) {\n indexed.push({ rgb: attr(rgb, \"rgb\")! });\n }\n }\n colors.indexedColors = indexed;\n }\n const mruEl = findChild(colorsEl, \"mruColors\");\n if (mruEl) {\n const mru: string[] = [];\n for (const c of mruEl.elements ?? []) {\n if (c.name === \"color\") {\n const hex = parseColorHex(c);\n if (hex) mru.push(hex);\n }\n }\n colors.mruColors = mru;\n }\n result.colors = colors;\n }\n\n // styleExtensions (extLst)\n const extLstEl = findChild(el, \"extLst\");\n if (extLstEl) {\n const exts: StyleExtensionOptions[] = [];\n for (const ext of extLstEl.elements ?? []) {\n if (ext.name !== \"ext\") continue;\n const uri = attr(ext, \"uri\");\n if (uri) {\n // Reconstruct the inner XML of the <ext> element verbatim\n const content = (ext.elements ?? []).map((e) => stringify(e)).join(\"\");\n exts.push({ uri, content: content || undefined });\n }\n }\n result.styleExtensions = exts;\n }\n\n return result;\n },\n};\n","/**\n * AutoFilter shared stringify/parse helpers.\n *\n * CT_AutoFilter is the same content model in both worksheet (CT_Worksheet) and\n * table (CT_Table), so the XML round-trip lives here once and both consumers\n * delegate to it.\n *\n * Reference: OOXML transitional, sml.xsd, CT_AutoFilter / CT_FilterColumn /\n * CT_Filters / CT_SortState.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attrs, attr, attrNum, escapeXml, findChild, selfCloseElement } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n AutoFilterOptions,\n ColorFilterOptions,\n CustomFilterOptions,\n DateGroupFilterOptions,\n DynamicFilterOptions,\n FilterItemsOptions,\n IconFilterOptions,\n SortCondition,\n SortStateOptions,\n Top10FilterOptions,\n} from \"./worksheet\";\n\n/**\n * Stringify an autoFilter value (shorthand ref string or structured options)\n * into its `<autoFilter>` element. Returns \"\" for undefined so callers can push\n * unconditionally.\n */\nexport function stringifyAutoFilter(af: string | AutoFilterOptions | undefined): string {\n if (af === undefined) return \"\";\n if (typeof af === \"string\") {\n return selfCloseElement(\"autoFilter\", attrs({ ref: af }));\n }\n const inner: string[] = [];\n for (const t10 of af.top10 ?? []) {\n const fcAttrs: Record<string, string | number | boolean | undefined> = {\n colId: t10.colId,\n };\n if (t10.hiddenButton) fcAttrs.hiddenButton = 1;\n if (t10.showButton === false) fcAttrs.showButton = 0;\n const t10Attrs: Record<string, string | number | boolean | undefined> = { val: t10.val };\n if (t10.top === false) t10Attrs.top = 0;\n if (t10.percent) t10Attrs.percent = 1;\n if (t10.filterVal !== undefined) t10Attrs.filterVal = t10.filterVal;\n inner.push(`<filterColumn${attrs(fcAttrs)}><top10${attrs(t10Attrs)}/></filterColumn>`);\n }\n for (const cf of af.customFilters ?? []) {\n const fcAttrs: Record<string, string | number | boolean | undefined> = {\n colId: cf.colId,\n };\n if (cf.hiddenButton) fcAttrs.hiddenButton = 1;\n if (cf.showButton === false) fcAttrs.showButton = 0;\n const cfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (cf.and) cfAttrs.and = 1;\n const filters: string[] = [];\n if (cf.val !== undefined) {\n const fAttrs: Record<string, string | number | boolean | undefined> = { val: cf.val };\n if (cf.operator) fAttrs.operator = cf.operator;\n filters.push(selfCloseElement(\"customFilter\", attrs(fAttrs)));\n }\n if (cf.val2 !== undefined) {\n filters.push(selfCloseElement(\"customFilter\", attrs({ val: cf.val2 })));\n }\n if (filters.length > 0) {\n inner.push(\n `<filterColumn${attrs(fcAttrs)}><customFilters${attrs(cfAttrs)}>${filters.join(\"\")}</customFilters></filterColumn>`,\n );\n }\n }\n // Simple filters (CT_Filters)\n for (const fi of af.filters ?? []) {\n const fcAttrs: Record<string, string | number | boolean | undefined> = {\n colId: fi.colId,\n };\n const filtersAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fi.blank) filtersAttrs.blank = 1;\n if (fi.calendarType) filtersAttrs.calendarType = fi.calendarType;\n const valParts = (fi.values ?? []).map((v) => `<filter val=\"${escapeXml(v)}\"/>`);\n inner.push(\n `<filterColumn${attrs(fcAttrs)}><filters${attrs(filtersAttrs)}>${valParts.join(\"\")}</filters></filterColumn>`,\n );\n }\n if (af.sort && af.sort.length > 0) {\n const sortParts: string[] = [];\n for (const sc of af.sort) {\n const scAttrs: Record<string, string | number | boolean | undefined> = { ref: sc.ref };\n if (sc.descending) scAttrs.descending = 1;\n if (sc.sortBy) scAttrs.sortBy = sc.sortBy;\n if (sc.customList) scAttrs.customList = sc.customList;\n if (sc.iconId !== undefined) scAttrs.iconId = sc.iconId;\n sortParts.push(selfCloseElement(\"sortCondition\", attrs(scAttrs)));\n }\n const ssAttrs: Record<string, string | number | boolean | undefined> = { ref: af.ref };\n if (af.sortState?.columnSort) ssAttrs.columnSort = 1;\n if (af.sortState?.caseSensitive) ssAttrs.caseSensitive = 1;\n if (af.sortState?.sortMethod) ssAttrs.sortMethod = af.sortState.sortMethod;\n inner.push(`<sortState${attrs(ssAttrs)}>${sortParts.join(\"\")}</sortState>`);\n }\n // Color filters\n for (const cf of af.colorFilters ?? []) {\n const cfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (cf.dxfId !== undefined) cfAttrs.dxfId = cf.dxfId;\n if (cf.cellColor === false) cfAttrs.cellColor = 0;\n inner.push(`<filterColumn colId=\"${cf.colId}\"><colorFilter${attrs(cfAttrs)}/></filterColumn>`);\n }\n // Icon filters\n for (const if_ of af.iconFilters ?? []) {\n const ifAttrs: Record<string, string | number | boolean | undefined> = {\n iconSet: if_.iconSet,\n };\n if (if_.iconId !== undefined) ifAttrs.iconId = if_.iconId;\n inner.push(`<filterColumn colId=\"${if_.colId}\"><iconFilter${attrs(ifAttrs)}/></filterColumn>`);\n }\n // Dynamic filters\n for (const df of af.dynamicFilters ?? []) {\n const dfAttrs: Record<string, string | number | boolean | undefined> = { type: df.type };\n if (df.val !== undefined) dfAttrs.val = df.val;\n if (df.maxVal !== undefined) dfAttrs.maxVal = df.maxVal;\n if (df.valIso !== undefined) dfAttrs.valIso = df.valIso;\n if (df.maxValIso !== undefined) dfAttrs.maxValIso = df.maxValIso;\n inner.push(\n `<filterColumn colId=\"${df.colId}\"><dynamicFilter${attrs(dfAttrs)}/></filterColumn>`,\n );\n }\n // Date group filters (CT_Filters owns dateGroupItem)\n for (const dg of af.dateGroupItems ?? []) {\n const dgAttrs: Record<string, string | number | boolean | undefined> = {\n dateTimeGrouping: dg.dateTimeGrouping,\n };\n if (dg.year !== undefined) dgAttrs.year = dg.year;\n if (dg.month !== undefined) dgAttrs.month = dg.month;\n if (dg.day !== undefined) dgAttrs.day = dg.day;\n if (dg.hour !== undefined) dgAttrs.hour = dg.hour;\n if (dg.minute !== undefined) dgAttrs.minute = dg.minute;\n if (dg.second !== undefined) dgAttrs.second = dg.second;\n inner.push(\n `<filterColumn colId=\"${dg.colId}\"><filters><dateGroupItem${attrs(dgAttrs)}/></filters></filterColumn>`,\n );\n }\n if (inner.length > 0) {\n return `<autoFilter ref=\"${af.ref}\">${inner.join(\"\")}</autoFilter>`;\n }\n return selfCloseElement(\"autoFilter\", attrs({ ref: af.ref }));\n}\n\n/**\n * Parse an `<autoFilter>` element. Ref-only filters round-trip as the shorthand\n * string (matches the generate API); structured object only when filter columns\n * or sort state exist. nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\"\n * to numbers, so boolean checks use String() coercion.\n */\nexport function parseAutoFilter(afEl: XmlElement): string | AutoFilterOptions {\n const af: AutoFilterOptions = { ref: attr(afEl, \"ref\") ?? \"\" };\n for (const child of afEl.elements ?? []) {\n if (child.name === \"filterColumn\") {\n const colId = attrNum(child, \"colId\") ?? 0;\n const hiddenButton = parseOnOff(attr(child, \"hiddenButton\"));\n const showButtonOff = String(attr(child, \"showButton\")) === \"0\";\n for (const fc of child.elements ?? []) {\n if (fc.name === \"top10\") {\n af.top10 ??= [];\n const t: Top10FilterOptions = { colId, val: attrNum(fc, \"val\") ?? 0 };\n if (String(attr(fc, \"top\")) === \"0\") t.top = false;\n if (parseOnOff(attr(fc, \"percent\"))) t.percent = true;\n const fv = attrNum(fc, \"filterVal\");\n if (fv !== undefined) t.filterVal = fv;\n if (hiddenButton) t.hiddenButton = true;\n if (showButtonOff) t.showButton = false;\n af.top10.push(t);\n } else if (fc.name === \"customFilters\") {\n af.customFilters ??= [];\n const cf: CustomFilterOptions = { colId };\n if (parseOnOff(attr(fc, \"and\"))) cf.and = true;\n const cfs = (fc.elements ?? []).filter((e) => e.name === \"customFilter\");\n const first = cfs[0];\n if (first) {\n const op = attr(first, \"operator\");\n if (op) cf.operator = op as CustomFilterOptions[\"operator\"];\n const v = attr(first, \"val\");\n if (v !== undefined) cf.val = v;\n }\n const second = cfs[1];\n if (second) {\n const v2 = attr(second, \"val\");\n if (v2 !== undefined) cf.val2 = v2;\n }\n if (hiddenButton) cf.hiddenButton = true;\n if (showButtonOff) cf.showButton = false;\n af.customFilters.push(cf);\n } else if (fc.name === \"filters\") {\n // CT_Filters holds filter[] + dateGroupItem[]\n const fi: FilterItemsOptions = { colId };\n if (parseOnOff(attr(fc, \"blank\"))) fi.blank = true;\n const cal = attr(fc, \"calendarType\");\n if (cal) fi.calendarType = cal;\n const values: string[] = [];\n for (const f of fc.elements ?? []) {\n if (f.name === \"filter\") {\n const v = attr(f, \"val\");\n if (v !== undefined) values.push(v);\n } else if (f.name === \"dateGroupItem\") {\n af.dateGroupItems ??= [];\n const dg: DateGroupFilterOptions = {\n colId,\n dateTimeGrouping: attr(\n f,\n \"dateTimeGrouping\",\n ) as DateGroupFilterOptions[\"dateTimeGrouping\"],\n };\n const y = attrNum(f, \"year\");\n if (y !== undefined) dg.year = y;\n const mo = attrNum(f, \"month\");\n if (mo !== undefined) dg.month = mo;\n const d = attrNum(f, \"day\");\n if (d !== undefined) dg.day = d;\n const h = attrNum(f, \"hour\");\n if (h !== undefined) dg.hour = h;\n const mi = attrNum(f, \"minute\");\n if (mi !== undefined) dg.minute = mi;\n const s = attrNum(f, \"second\");\n if (s !== undefined) dg.second = s;\n af.dateGroupItems.push(dg);\n }\n }\n if (values.length > 0) fi.values = values;\n af.filters ??= [];\n af.filters.push(fi);\n } else if (fc.name === \"colorFilter\") {\n af.colorFilters ??= [];\n const cf2: ColorFilterOptions = { colId };\n const dxfId = attrNum(fc, \"dxfId\");\n if (dxfId !== undefined) cf2.dxfId = dxfId;\n if (String(attr(fc, \"cellColor\")) === \"0\") cf2.cellColor = false;\n af.colorFilters.push(cf2);\n } else if (fc.name === \"iconFilter\") {\n af.iconFilters ??= [];\n const if_: IconFilterOptions = { colId, iconSet: attrNum(fc, \"iconSet\") ?? 0 };\n const iconId = attrNum(fc, \"iconId\");\n if (iconId !== undefined) if_.iconId = iconId;\n af.iconFilters.push(if_);\n } else if (fc.name === \"dynamicFilter\") {\n af.dynamicFilters ??= [];\n const df: DynamicFilterOptions = {\n colId,\n type: attr(fc, \"type\") as DynamicFilterOptions[\"type\"],\n };\n const v = attrNum(fc, \"val\");\n if (v !== undefined) df.val = v;\n const mv = attrNum(fc, \"maxVal\");\n if (mv !== undefined) df.maxVal = mv;\n const vi = attr(fc, \"valIso\");\n if (vi) df.valIso = vi;\n const mvi = attr(fc, \"maxValIso\");\n if (mvi) df.maxValIso = mvi;\n af.dynamicFilters.push(df);\n }\n }\n } else if (child.name === \"sortState\") {\n const ss: SortStateOptions = {};\n if (parseOnOff(attr(child, \"columnSort\"))) ss.columnSort = true;\n if (parseOnOff(attr(child, \"caseSensitive\"))) ss.caseSensitive = true;\n const sm = attr(child, \"sortMethod\");\n if (sm) ss.sortMethod = sm as SortStateOptions[\"sortMethod\"];\n af.sortState = ss;\n for (const sc of child.elements ?? []) {\n if (sc.name !== \"sortCondition\") continue;\n af.sort ??= [];\n const cond: SortCondition = { ref: attr(sc, \"ref\") ?? \"\" };\n if (parseOnOff(attr(sc, \"descending\"))) cond.descending = true;\n const sb = attr(sc, \"sortBy\");\n if (sb) cond.sortBy = sb as SortCondition[\"sortBy\"];\n const cl = attr(sc, \"customList\");\n if (cl) cond.customList = cl;\n const ii = attrNum(sc, \"iconId\");\n if (ii !== undefined) cond.iconId = ii;\n af.sort.push(cond);\n }\n }\n }\n const hasFilters =\n af.top10 !== undefined ||\n af.customFilters !== undefined ||\n af.filters !== undefined ||\n af.colorFilters !== undefined ||\n af.iconFilters !== undefined ||\n af.dynamicFilters !== undefined ||\n af.dateGroupItems !== undefined ||\n af.sortState !== undefined ||\n af.sort !== undefined;\n return hasFilters ? af : af.ref;\n}\n\n/** Locate and parse an autoFilter child under a parent element. */\nexport function findAndParseAutoFilter(parent: XmlElement): string | AutoFilterOptions | undefined {\n const afEl = findChild(parent, \"autoFilter\");\n return afEl ? parseAutoFilter(afEl) : undefined;\n}\n","/**\n * PivotTable — parse helpers.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum, findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { PivotAreaOptions, PivotAreaReferenceOptions } from \"../pivot/pivot-utils\";\n\nexport function parsePivotArea(el: XmlElement): Partial<PivotAreaOptions> {\n const result: Partial<PivotAreaOptions> = {};\n const field = attrNum(el, \"field\");\n if (field !== undefined) result.field = field;\n const typeVal = attr(el, \"type\");\n if (typeVal) result.type = typeVal as PivotAreaOptions[\"type\"];\n if (String(attr(el, \"dataOnly\")) === \"0\") result.dataOnly = false;\n if (parseOnOff(attr(el, \"labelOnly\"))) result.labelOnly = true;\n if (parseOnOff(attr(el, \"grandRow\"))) result.grandRow = true;\n if (parseOnOff(attr(el, \"grandCol\"))) result.grandCol = true;\n if (parseOnOff(attr(el, \"cacheIndex\"))) result.cacheIndex = true;\n if (String(attr(el, \"outline\")) === \"0\") result.outline = false;\n if (attr(el, \"offset\")) result.offset = attr(el, \"offset\");\n if (parseOnOff(attr(el, \"collapsedLevelsAreSubtotals\")))\n result.collapsedLevelsAreSubtotals = true;\n const axisVal = attr(el, \"axis\");\n if (axisVal) result.axis = axisVal as PivotAreaOptions[\"axis\"];\n const fp = attrNum(el, \"fieldPosition\");\n if (fp !== undefined) result.fieldPosition = fp;\n const refsEl = findChild(el, \"references\");\n if (refsEl) {\n const refs: Partial<PivotAreaReferenceOptions>[] = [];\n for (const rEl of refsEl.elements ?? []) {\n if (rEl.name !== \"reference\") continue;\n const ref: Partial<PivotAreaReferenceOptions> = {};\n const rField = attrNum(rEl, \"field\");\n if (rField !== undefined) ref.field = rField;\n const rCount = attrNum(rEl, \"count\");\n if (rCount !== undefined) ref.count = rCount;\n if (String(attr(rEl, \"selected\")) === \"0\") ref.selected = false;\n if (parseOnOff(attr(rEl, \"byPosition\"))) ref.byPosition = true;\n if (parseOnOff(attr(rEl, \"relative\"))) ref.relative = true;\n if (parseOnOff(attr(rEl, \"defaultSubtotal\"))) ref.defaultSubtotal = true;\n if (parseOnOff(attr(rEl, \"sumSubtotal\"))) ref.sumSubtotal = true;\n if (parseOnOff(attr(rEl, \"avgSubtotal\"))) ref.avgSubtotal = true;\n if (parseOnOff(attr(rEl, \"countASubtotal\"))) ref.countASubtotal = true;\n if (parseOnOff(attr(rEl, \"maxSubtotal\"))) ref.maxSubtotal = true;\n if (parseOnOff(attr(rEl, \"minSubtotal\"))) ref.minSubtotal = true;\n const xArr: number[] = [];\n for (const xEl of rEl.elements ?? []) {\n if (xEl.name === \"x\") {\n const v = attrNum(xEl, \"v\");\n if (v !== undefined) xArr.push(v);\n }\n }\n if (xArr.length > 0) ref.x = xArr;\n refs.push(ref);\n }\n result.references = refs;\n }\n return result;\n}\n","/**\n * Worksheet — parse helpers shared by the descriptor.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, attrNum } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type { CfvoOptions, CfvoType, PageBreakOptions } from \"./types\";\n\n/** Parse a CT_PageBreak (w:rowBreaks / w:colBreaks) into break entries. */\nexport function parsePageBreaks(el: XmlElement): PageBreakOptions[] {\n const breaks: PageBreakOptions[] = [];\n for (const brkEl of el.elements ?? []) {\n if (brkEl.name !== \"brk\") continue;\n const id = attrNum(brkEl, \"id\");\n if (id === undefined) continue;\n const b: PageBreakOptions = { id };\n const min = attrNum(brkEl, \"min\");\n if (min !== undefined) b.min = min;\n const max = attrNum(brkEl, \"max\");\n if (max !== undefined) b.max = max;\n if (parseOnOff(attr(brkEl, \"man\"))) b.manual = true;\n if (parseOnOff(attr(brkEl, \"pt\"))) b.pivot = true;\n breaks.push(b);\n }\n return breaks;\n}\n\nexport function parseCfvo(el: XmlElement): CfvoOptions {\n const result: CfvoOptions = { type: (attr(el, \"type\") ?? \"num\") as CfvoType };\n const val = attr(el, \"val\");\n if (val !== undefined) result.val = isNaN(Number(val)) ? val : Number(val);\n if (String(attr(el, \"gte\")) === \"0\") result.gte = false;\n return result;\n}\n\nexport function parseCellRef(ref: string): { row: number; col: number } | undefined {\n const match = ref.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return undefined;\n const colStr = match[1] ?? \"\";\n const row = parseInt(match[2] ?? \"0\", 10);\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n return { row, col };\n}\n","/**\n * sheetData row scanner — the single parse implementation for worksheet rows.\n *\n * `parseWorkbook` requests `deferElements: [\"sheetData\"]` when reading\n * worksheet parts, so the XML parser captures the container's inner XML\n * verbatim (`Element.raw`) instead of materializing millions of row/cell\n * nodes (~1.75 GB of allocations on a 100k×20 sheet). This scanner walks\n * that string directly into RowOptions. Semantics are field-for-field\n * identical to the former Element-tree walk it replaced.\n *\n * @module\n */\n\nimport { unescapeXml } from \"@office-open/xml\";\n\nimport type { XlsxReadContext } from \"../../context\";\nimport type { CellOptions, FormulaOptions, RowOptions } from \"./types\";\n\n// ── Tag scanning primitives ──\n\n/** Index of the next `<name` whose following char is a tag boundary, or -1. */\nfunction indexOfTag(src: string, name: string, from: number, limit: number): number {\n const open = `<${name}`;\n const nameLen = name.length;\n let p = from;\n for (;;) {\n const idx = src.indexOf(open, p);\n if (idx === -1 || idx >= limit) return -1;\n const after = src.charCodeAt(idx + 1 + nameLen);\n if (\n after === 0x20 ||\n after === 0x09 ||\n after === 0x0a ||\n after === 0x0d ||\n after === 0x2f ||\n after === 0x3e\n ) {\n return idx;\n }\n p = idx + 1 + nameLen;\n }\n}\n\n/**\n * Index of the tag's closing `>`, honoring quoted attribute values (a quoted\n * `>` is not a tag end), or -1.\n */\nfunction findTagEnd(src: string, from: number): number {\n let i = from;\n const len = src.length;\n while (i < len) {\n const c = src.charCodeAt(i);\n if (c === 0x22) {\n const close = src.indexOf('\"', i + 1);\n if (close === -1) return -1;\n i = close + 1;\n continue;\n }\n if (c === 0x3e) return i;\n i++;\n }\n return -1;\n}\n\n/** Visit `name=\"value\"` pairs inside a tag (from = after tag name, to = before `>`/`/>`). */\nfunction scanAttrs(\n src: string,\n from: number,\n to: number,\n visit: (name: string, value: string) => void,\n): void {\n let i = from;\n while (i < to) {\n while (i < to) {\n const c = src.charCodeAt(i);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) break;\n i++;\n }\n if (i >= to) return;\n const nameStart = i;\n while (i < to && src.charCodeAt(i) !== 0x3d) i++;\n if (i >= to) return;\n const name = src.slice(nameStart, i);\n i++; // '='\n while (i < to) {\n const c = src.charCodeAt(i);\n if (c !== 0x20 && c !== 0x09 && c !== 0x0a && c !== 0x0d) break;\n i++;\n }\n const quote = src.charCodeAt(i);\n if (quote !== 0x22 && quote !== 0x27) return;\n i++;\n const valueStart = i;\n while (i < to && src.charCodeAt(i) !== quote) i++;\n visit(name, unescapeXml(src.slice(valueStart, i)));\n i++;\n }\n}\n\n/** parseOnOff truthiness for on/off attribute values (\"1\"/\"true\"/\"on\"). */\nfunction isOn(value: string): boolean {\n const lower = value.length <= 5 ? value.toLowerCase() : value;\n return lower === \"1\" || lower === \"true\" || lower === \"on\";\n}\n\n/**\n * Text content of a leaf element's inner XML slice, matching the Element-tree\n * `textOf` semantics: text is unescaped and CDATA sections are skipped\n * (text nodes only). Self-closing / empty content yields \"\".\n */\nfunction textContent(src: string, from: number, to: number): string {\n if (to <= from) return \"\";\n let text = src.slice(from, to);\n // CDATA would appear verbatim in the slice; textOf ignores cdata nodes.\n if (text.indexOf(\"<![CDATA[\") !== -1) {\n text = text.replace(/<![CDATA[.*?]]>/gs, \"\");\n }\n return unescapeXml(text);\n}\n\n/** Inner span of the first `<t>` that is a direct child of an `<is>` slice. */\nfunction inlineStringText(src: string, from: number, to: number): string | undefined {\n let q = from;\n while (q < to) {\n const lt = src.indexOf(\"<\", q);\n if (lt === -1 || lt >= to) break;\n const tEnd = findTagEnd(src, lt + 1);\n if (tEnd === -1 || tEnd >= to) break;\n const afterLt = lt + 1;\n let nameEnd = afterLt;\n while (nameEnd < tEnd) {\n const c = src.charCodeAt(nameEnd);\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d || c === 0x2f) break;\n nameEnd++;\n }\n const name = src.slice(afterLt, nameEnd);\n if (name === \"t\") {\n if (src.charCodeAt(tEnd - 1) === 0x2f) return \"\";\n const close = src.indexOf(\"</t>\", tEnd + 1);\n return close === -1 ? \"\" : textContent(src, tEnd + 1, close);\n }\n if (name === \"r\") {\n // Rich-text run: its <t> is nested, not a direct child — skip the run.\n const close = src.indexOf(\"</r>\", tEnd + 1);\n if (close === -1) break;\n q = close + 4;\n continue;\n }\n q = tEnd + 1;\n }\n return undefined;\n}\n\n// ── Row scanner ──\n\n/**\n * Scan `sheetData` inner XML into RowOptions. `ctx` mirrors the descriptor\n * read context (shared strings + style resolution); callers without one pass\n * `undefined` and get raw values/style indices.\n */\nexport function parseSheetDataRows(\n raw: string,\n strings: string[],\n ctx: XlsxReadContext | undefined,\n): RowOptions[] {\n const rows: RowOptions[] = [];\n const len = raw.length;\n let pos = 0;\n\n for (;;) {\n const rowOpen = indexOfTag(raw, \"row\", pos, len);\n if (rowOpen === -1) break;\n const tagEnd = findTagEnd(raw, rowOpen + 4);\n if (tagEnd === -1) break;\n const selfClosing = raw.charCodeAt(tagEnd - 1) === 0x2f;\n const attrEnd = selfClosing ? tagEnd - 1 : tagEnd;\n\n const row: RowOptions = {};\n let rowClose = tagEnd;\n scanAttrs(raw, rowOpen + 4, attrEnd, (name, value) => {\n switch (name) {\n case \"r\": {\n const n = Number(value);\n if (!isNaN(n)) row.rowNumber = n;\n break;\n }\n case \"ht\": {\n const n = Number(value);\n if (!isNaN(n)) row.height = n;\n break;\n }\n case \"hidden\":\n if (isOn(value)) row.hidden = true;\n break;\n case \"spans\":\n row.spans = value;\n break;\n case \"customFormat\":\n if (isOn(value)) row.customFormat = true;\n break;\n case \"thickTop\":\n if (isOn(value)) row.thickTop = true;\n break;\n case \"thickBot\":\n if (isOn(value)) row.thickBot = true;\n break;\n case \"ph\":\n if (isOn(value)) row.phonetic = true;\n break;\n }\n });\n\n const cells: CellOptions[] = [];\n if (!selfClosing) {\n rowClose = raw.indexOf(\"</row>\", tagEnd + 1);\n if (rowClose === -1) break;\n let cp = tagEnd + 1;\n for (;;) {\n const cellOpen = indexOfTag(raw, \"c\", cp, rowClose);\n if (cellOpen === -1) break;\n const cellTagEnd = findTagEnd(raw, cellOpen + 2);\n if (cellTagEnd === -1) break;\n const cellSelfClosing = raw.charCodeAt(cellTagEnd - 1) === 0x2f;\n const cell: CellOptions = {};\n let type: string | undefined;\n let styleIdx: number | undefined;\n\n scanAttrs(raw, cellOpen + 2, cellSelfClosing ? cellTagEnd - 1 : cellTagEnd, (n2, v2) => {\n switch (n2) {\n case \"r\":\n cell.reference = v2;\n break;\n case \"t\":\n type = v2;\n break;\n case \"s\": {\n const n = Number(v2);\n if (!isNaN(n)) styleIdx = n;\n break;\n }\n case \"cm\": {\n const n = Number(v2);\n if (!isNaN(n)) cell.cellMetadataId = n;\n break;\n }\n case \"vm\": {\n const n = Number(v2);\n if (!isNaN(n)) cell.valueMetadataId = n;\n break;\n }\n }\n });\n\n if (styleIdx !== undefined) {\n // Resolve to a concrete StyleOptions so re-stringify registers it in\n // the fresh Styles table (whose indices may differ). Keep styleIndex\n // as a fallback when the styles table cannot be resolved.\n const resolved = ctx ? ctx.resolveStyle(styleIdx) : undefined;\n if (resolved) cell.style = resolved;\n else cell.styleIndex = styleIdx;\n }\n\n let cellEnd = cellTagEnd + 1;\n if (!cellSelfClosing) {\n const cellClose = raw.indexOf(\"</c>\", cellTagEnd + 1);\n if (cellClose === -1) break;\n cellEnd = cellClose + 4;\n let vText: string | undefined;\n let inlineText: string | undefined;\n let hasInline = false;\n let formula: FormulaOptions | undefined;\n\n let p = cellTagEnd + 1;\n while (p < cellClose) {\n const lt = raw.indexOf(\"<\", p);\n if (lt === -1 || lt >= cellClose) break;\n const tEnd = findTagEnd(raw, lt + 1);\n if (tEnd === -1) break;\n let nameEnd = lt + 1;\n while (nameEnd < tEnd) {\n const c = raw.charCodeAt(nameEnd);\n if (c === 0x20 || c === 0x09 || c === 0x0a || c === 0x0d || c === 0x2f) break;\n nameEnd++;\n }\n const name = raw.slice(lt + 1, nameEnd);\n if (name === \"v\") {\n if (raw.charCodeAt(tEnd - 1) === 0x2f) {\n if (vText === undefined) vText = \"\";\n } else {\n const close = raw.indexOf(\"</v>\", tEnd + 1);\n if (close === -1) break;\n if (vText === undefined) vText = textContent(raw, tEnd + 1, close);\n p = close + 4;\n continue;\n }\n } else if (name === \"is\") {\n hasInline = true;\n const close = raw.indexOf(\"</is>\", tEnd + 1);\n const isEnd = close === -1 ? cellClose : close;\n if (inlineText === undefined) inlineText = inlineStringText(raw, tEnd + 1, isEnd);\n if (close === -1) break;\n p = close + 5;\n continue;\n } else if (name === \"f\") {\n const fSelfClosing = raw.charCodeAt(tEnd - 1) === 0x2f;\n const f: FormulaOptions = { formula: \"\" };\n scanAttrs(raw, nameEnd, fSelfClosing ? tEnd - 1 : tEnd, (n3, v3) => {\n switch (n3) {\n case \"t\":\n if (v3 !== \"normal\") f.type = v3 as FormulaOptions[\"type\"];\n break;\n case \"ref\":\n f.reference = v3;\n break;\n case \"si\": {\n const n = Number(v3);\n if (!isNaN(n)) f.sharedIndex = n;\n break;\n }\n case \"aca\":\n if (isOn(v3)) f.aca = true;\n break;\n case \"ca\":\n if (isOn(v3)) f.calculateCell = true;\n break;\n case \"bx\":\n if (isOn(v3)) f.arrayContext = true;\n break;\n }\n });\n if (fSelfClosing) {\n p = tEnd + 1;\n } else {\n const close = raw.indexOf(\"</f>\", tEnd + 1);\n if (close === -1) break;\n f.formula = textContent(raw, tEnd + 1, close);\n p = close + 4;\n }\n if (formula === undefined) formula = f;\n continue;\n }\n p = tEnd + 1;\n }\n\n // Cell value — resolution order matches the former tree walk.\n if (type === \"s\" && vText !== undefined) {\n cell.value = strings[parseInt(vText, 10)] ?? \"\";\n } else if (type === \"b\" && vText !== undefined) {\n cell.value = vText === \"1\";\n } else if (type === \"inlineStr\" && hasInline) {\n cell.value = inlineText ?? \"\";\n } else if (vText !== undefined) {\n const num = Number(vText);\n cell.value = isNaN(num) ? vText : num;\n }\n if (formula !== undefined) cell.formula = formula;\n }\n\n cells.push(cell);\n cp = cellEnd;\n }\n }\n\n row.cells = cells;\n rows.push(row);\n pos = selfClosing ? tagEnd + 1 : rowClose + 6;\n }\n\n return rows;\n}\n","/**\n * Worksheet — descriptor for xl/worksheets/sheet{n}.xml.\n *\n * stringify() intentionally throws: the compiler calls stringifyWorksheet()\n * directly (it needs the SharedStrings/Styles accumulators). This descriptor\n * exists for the read path only.\n *\n * @module\n */\nimport { parseOnOff } from \"@office-open/core\";\nimport type { PositiveUniversalMeasure } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrMeasure, attrNum, findChild, stringify, textOf } from \"@office-open/xml\";\n\nimport type { XlsxReadContext } from \"../../context\";\nimport { parseAutoFilter } from \"../auto-filter\";\nimport { parsePivotArea } from \"../pivot-table/parse\";\nimport { parseColorHex } from \"../styles/parse\";\nimport { parseCellRef, parseCfvo, parsePageBreaks } from \"./parse\";\nimport { parseSheetDataRows } from \"./sheet-data\";\nimport type {\n CellSmartTagsOptions,\n CellWatchOptions,\n CfvoOptions,\n ColumnOptions,\n ConditionalFormatOperator,\n ConditionalFormatOptions,\n ConditionalFormatRule,\n ConditionalFormatType,\n ControlOptions,\n CustomSheetPropertyOptions,\n CustomSheetViewOptions,\n DataConsolidateOptions,\n DataValidationOperator,\n DataValidationOptions,\n DataValidationType,\n DrawingHfOptions,\n FreezePaneOptions,\n HeaderFooterOptions,\n HyperlinkOptions,\n HyperlinkTarget,\n IconSetOptions,\n IconSetType,\n IgnoredErrorOptions,\n MergeCellOptions,\n OleObjectOptions,\n OleObjectPropertiesOptions,\n PageMarginsOptions,\n PageOrientation,\n PageSetupOptions,\n PhoneticPropertiesOptions,\n PivotSelectionOptions,\n PrintOptions,\n ProtectedRangeOptions,\n ScenarioCellOptions,\n ScenarioDefinition,\n ScenarioOptions,\n SelectionOptions,\n SheetCalculationPropertiesOptions,\n SheetFormatPropertiesOptions,\n SheetPropertiesOptions,\n SheetProtectionOptions,\n SheetViewOptions,\n TabColorOptions,\n WebPublishItemOptions,\n WorksheetOptions,\n} from \"./types\";\n\nconst DRAWING_HF_OFFSET_KEYS = [\n \"lho\",\n \"lhe\",\n \"lhf\",\n \"cho\",\n \"che\",\n \"chf\",\n \"rho\",\n \"rhe\",\n \"rhf\",\n \"lfo\",\n \"lfe\",\n \"lff\",\n \"cfo\",\n \"cfe\",\n \"cff\",\n \"rfo\",\n \"rfe\",\n \"rff\",\n] as const satisfies readonly (keyof DrawingHfOptions)[];\n\nexport const worksheetDesc: CustomDescriptor<WorksheetOptions> = {\n kind: \"custom\",\n\n /**\n * NOT intended for direct use by the compiler.\n * The compiler calls `stringifyWorksheet(opts, ctx)` instead, which has\n * access to the SharedStrings and Styles accumulators.\n * This method exists to satisfy the CustomDescriptor interface for the read path.\n */\n stringify(_opts, _ctx) {\n throw new Error(\n \"Use stringifyWorksheet(opts, ctx) for the write path. worksheetDesc.stringify() is not supported.\",\n );\n },\n\n parse(el, ctx) {\n const result: Partial<WorksheetOptions> = {};\n let pageSetUpPrCache: Partial<PageSetupOptions> | undefined;\n\n // Resolve shared strings from context (XlsxReadContext)\n const strings: string[] =\n ctx && \"sharedStrings\" in ctx ? (ctx as XlsxReadContext).sharedStrings : [];\n\n // Sheet properties\n const sheetPrEl = findChild(el, \"sheetPr\");\n if (sheetPrEl) {\n const sp: SheetPropertiesOptions = {};\n if (parseOnOff(attr(sheetPrEl, \"syncHorizontal\"))) sp.syncHorizontal = true;\n if (parseOnOff(attr(sheetPrEl, \"syncVertical\"))) sp.syncVertical = true;\n if (attr(sheetPrEl, \"syncRef\")) sp.syncRef = attr(sheetPrEl, \"syncRef\");\n if (parseOnOff(attr(sheetPrEl, \"transitionEvaluation\"))) sp.transitionEvaluation = true;\n if (parseOnOff(attr(sheetPrEl, \"transitionEntry\"))) sp.transitionEntry = true;\n if (parseOnOff(attr(sheetPrEl, \"published\"))) sp.published = true;\n if (parseOnOff(attr(sheetPrEl, \"filterMode\"))) sp.filterMode = true;\n if (parseOnOff(attr(sheetPrEl, \"enableFormatConditionsCalculation\")))\n sp.enableFormatConditionsCalculation = true;\n\n const outlinePr = findChild(sheetPrEl, \"outlinePr\");\n if (outlinePr) {\n if (parseOnOff(attr(outlinePr, \"applyStyles\"))) sp.outlineApplyStyles = true;\n if (String(attr(outlinePr, \"showOutlineSymbols\")) === \"0\") sp.outlineShowSymbols = false;\n if (String(attr(outlinePr, \"summaryBelow\")) === \"0\") sp.outlineSummaryBelow = false;\n if (String(attr(outlinePr, \"summaryRight\")) === \"0\") sp.outlineSummaryRight = false;\n }\n\n // pageSetUpPr (inside sheetPr) — stash on result.pageSetup; merged into\n // the <pageSetup> parse below, which owns result.pageSetup.\n const pageSetUpPr = findChild(sheetPrEl, \"pageSetUpPr\");\n if (pageSetUpPr) {\n const psup: Partial<PageSetupOptions> = {};\n if (parseOnOff(attr(pageSetUpPr, \"fitToPage\"))) psup.fitToPage = true;\n if (parseOnOff(attr(pageSetUpPr, \"autoPageBreaks\"))) psup.autoPageBreaks = true;\n if (Object.keys(psup).length > 0) pageSetUpPrCache = psup;\n }\n if (Object.keys(sp).length > 0) result.sheetPr = sp;\n\n // Tab color\n const tabColorEl = findChild(sheetPrEl, \"tabColor\");\n if (tabColorEl) {\n const tc: TabColorOptions = {};\n if (attr(tabColorEl, \"rgb\")) tc.rgb = attr(tabColorEl, \"rgb\");\n if (attrNum(tabColorEl, \"theme\") !== undefined) tc.theme = attrNum(tabColorEl, \"theme\");\n if (attrNum(tabColorEl, \"tint\") !== undefined) tc.tint = attrNum(tabColorEl, \"tint\");\n if (attrNum(tabColorEl, \"indexed\") !== undefined)\n tc.indexed = attrNum(tabColorEl, \"indexed\");\n result.tabColor = tc;\n }\n }\n\n // Sheet views\n const sheetViewsEl = findChild(el, \"sheetViews\");\n if (sheetViewsEl) {\n const svEl = findChild(sheetViewsEl, \"sheetView\");\n if (svEl) {\n const sv: SheetViewOptions = {};\n if (String(attr(svEl, \"showGridLines\")) === \"0\") sv.showGridLines = false;\n if (String(attr(svEl, \"showRowColHeaders\")) === \"0\") sv.showRowColHeaders = false;\n if (String(attr(svEl, \"showZeros\")) === \"0\") sv.showZeros = false;\n const zs = attrNum(svEl, \"zoomScale\");\n if (zs !== undefined) sv.zoomScale = zs;\n if (attr(svEl, \"tabSelected\") !== undefined)\n sv.tabSelected = parseOnOff(attr(svEl, \"tabSelected\")) ?? true;\n if (parseOnOff(attr(svEl, \"rightToLeft\"))) sv.rightToLeft = true;\n if (parseOnOff(attr(svEl, \"windowProtection\"))) sv.windowProtection = true;\n if (parseOnOff(attr(svEl, \"showFormulas\"))) sv.showFormulas = true;\n if (String(attr(svEl, \"showRuler\")) === \"0\") sv.showRuler = false;\n if (String(attr(svEl, \"showOutlineSymbols\")) === \"0\") sv.showOutlineSymbols = false;\n if (String(attr(svEl, \"defaultGridColor\")) === \"0\") sv.defaultGridColor = false;\n if (String(attr(svEl, \"showWhiteSpace\")) === \"0\") sv.showWhiteSpace = false;\n const viewVal = attr(svEl, \"view\");\n if (viewVal) sv.view = viewVal as SheetViewOptions[\"view\"];\n const colorId = attrNum(svEl, \"colorId\");\n if (colorId !== undefined) sv.colorId = colorId;\n const zsn = attrNum(svEl, \"zoomScaleNormal\");\n if (zsn !== undefined) sv.zoomScaleNormal = zsn;\n const zssl = attrNum(svEl, \"zoomScaleSheetLayoutView\");\n if (zssl !== undefined) sv.zoomScaleSheetLayoutView = zssl;\n const zspl = attrNum(svEl, \"zoomScalePageLayoutView\");\n if (zspl !== undefined) sv.zoomScalePageLayoutView = zspl;\n result.sheetView = sv;\n\n // Freeze pane\n const paneEl = findChild(svEl, \"pane\");\n if (paneEl && attr(paneEl, \"state\") === \"frozen\") {\n const fp: FreezePaneOptions = {};\n const ys = attrNum(paneEl, \"ySplit\");\n if (ys && ys > 0) fp.row = ys;\n const xs = attrNum(paneEl, \"xSplit\");\n if (xs && xs > 0) fp.col = xs;\n if (Object.keys(fp).length > 0) result.freezePanes = fp;\n }\n\n // Selection (CT_Selection)\n const selEl = findChild(svEl, \"selection\");\n if (selEl) {\n const sel: SelectionOptions = {};\n const pane = attr(selEl, \"pane\");\n if (pane) sel.pane = pane as SelectionOptions[\"pane\"];\n const activeCell = attr(selEl, \"activeCell\");\n if (activeCell) sel.activeCell = activeCell;\n const acId = attrNum(selEl, \"activeCellId\");\n if (acId !== undefined) sel.activeCellId = acId;\n const sqref = attr(selEl, \"sqref\");\n if (sqref) sel.sqref = sqref;\n result.selection = sel;\n }\n\n // Pivot selection (CT_PivotSelection)\n const psEl = findChild(svEl, \"pivotSelection\");\n if (psEl) {\n const ps: Partial<PivotSelectionOptions> = {};\n const pane = attr(psEl, \"pane\");\n if (pane) ps.pane = pane as PivotSelectionOptions[\"pane\"];\n if (parseOnOff(attr(psEl, \"showHeader\"))) ps.showHeader = true;\n if (parseOnOff(attr(psEl, \"label\"))) ps.label = true;\n if (parseOnOff(attr(psEl, \"data\"))) ps.data = true;\n if (parseOnOff(attr(psEl, \"extendable\"))) ps.extendable = true;\n const count = attrNum(psEl, \"count\");\n if (count !== undefined) ps.count = count;\n const axis = attr(psEl, \"axis\");\n if (axis) ps.axis = axis as PivotSelectionOptions[\"axis\"];\n for (const key of [\n \"dimension\",\n \"start\",\n \"min\",\n \"max\",\n \"activeRow\",\n \"activeCol\",\n \"previousRow\",\n \"previousCol\",\n \"click\",\n ] as const) {\n const v = attrNum(psEl, key);\n if (v !== undefined) ps[key] = v;\n }\n const rId = attr(psEl, \"r:id\");\n if (rId) ps.rId = rId;\n const paEl = findChild(psEl, \"pivotArea\");\n if (paEl) ps.pivotArea = parsePivotArea(paEl) as PivotSelectionOptions[\"pivotArea\"];\n result.pivotSelection = ps as PivotSelectionOptions;\n }\n }\n }\n\n // Sheet format properties\n const sfpEl = findChild(el, \"sheetFormatPr\");\n if (sfpEl) {\n const sfp: SheetFormatPropertiesOptions = {};\n const bcw = attrNum(sfpEl, \"baseColWidth\");\n if (bcw !== undefined) sfp.baseColWidth = bcw;\n const dcw = attrNum(sfpEl, \"defaultColWidth\");\n if (dcw !== undefined) sfp.defaultColWidth = dcw;\n const drh = attrNum(sfpEl, \"defaultRowHeight\");\n if (drh !== undefined) sfp.defaultRowHeight = drh;\n if (parseOnOff(attr(sfpEl, \"zeroHeight\"))) sfp.zeroHeight = true;\n if (parseOnOff(attr(sfpEl, \"thickTop\"))) sfp.thickTop = true;\n if (parseOnOff(attr(sfpEl, \"thickBottom\"))) sfp.thickBottom = true;\n const olr = attrNum(sfpEl, \"outlineLevelRow\");\n if (olr !== undefined) sfp.outlineLevelRow = olr;\n const olc = attrNum(sfpEl, \"outlineLevelCol\");\n if (olc !== undefined) sfp.outlineLevelCol = olc;\n result.sheetFormatPr = sfp;\n }\n\n // Dimension\n const dimensionEl = findChild(el, \"dimension\");\n if (dimensionEl) {\n const ref = attr(dimensionEl, \"ref\");\n if (ref) result.dimension = ref;\n }\n\n // Page margins\n const pageMarginsEl = findChild(el, \"pageMargins\");\n if (pageMarginsEl) {\n const pm: PageMarginsOptions = {};\n const pmL = attrNum(pageMarginsEl, \"left\");\n if (pmL !== undefined) pm.left = pmL;\n const pmR = attrNum(pageMarginsEl, \"right\");\n if (pmR !== undefined) pm.right = pmR;\n const pmT = attrNum(pageMarginsEl, \"top\");\n if (pmT !== undefined) pm.top = pmT;\n const pmB = attrNum(pageMarginsEl, \"bottom\");\n if (pmB !== undefined) pm.bottom = pmB;\n const pmH = attrNum(pageMarginsEl, \"header\");\n if (pmH !== undefined) pm.header = pmH;\n const pmF = attrNum(pageMarginsEl, \"footer\");\n if (pmF !== undefined) pm.footer = pmF;\n result.pageMargins = pm;\n }\n\n // Columns\n const colsEl = findChild(el, \"cols\");\n if (colsEl) {\n const columns: ColumnOptions[] = [];\n for (const colEl of colsEl.elements ?? []) {\n if (colEl.name !== \"col\") continue;\n const col: ColumnOptions = {\n min: attrNum(colEl, \"min\") ?? 0,\n max: attrNum(colEl, \"max\") ?? 0,\n };\n const w = attrNum(colEl, \"width\");\n if (w !== undefined) col.width = w;\n if (parseOnOff(attr(colEl, \"hidden\"))) col.hidden = true;\n if (parseOnOff(attr(colEl, \"customWidth\"))) col.customWidth = true;\n const ol = attrNum(colEl, \"outlineLevel\");\n if (ol !== undefined) col.outlineLevel = ol;\n if (parseOnOff(attr(colEl, \"collapsed\"))) col.collapsed = true;\n if (parseOnOff(attr(colEl, \"bestFit\"))) col.bestFit = true;\n if (parseOnOff(attr(colEl, \"phonetic\"))) col.phonetic = true;\n columns.push(col);\n }\n if (columns.length > 0) result.columns = columns;\n }\n\n // Sheet protection\n const protEl = findChild(el, \"sheetProtection\");\n if (protEl?.attributes) {\n const prot: SheetProtectionOptions = {};\n if (attr(protEl, \"password\")) prot.password = attr(protEl, \"password\");\n if (attr(protEl, \"algorithmName\")) prot.algorithmName = attr(protEl, \"algorithmName\");\n if (attr(protEl, \"hashValue\")) prot.hashValue = attr(protEl, \"hashValue\");\n if (attr(protEl, \"saltValue\")) prot.saltValue = attr(protEl, \"saltValue\");\n if (attrNum(protEl, \"spinCount\") !== undefined) prot.spinCount = attrNum(protEl, \"spinCount\");\n if (parseOnOff(attr(protEl, \"sheet\"))) prot.sheet = true;\n if (parseOnOff(attr(protEl, \"objects\"))) prot.objects = true;\n if (parseOnOff(attr(protEl, \"scenarios\"))) prot.scenarios = true;\n if (String(attr(protEl, \"formatCells\")) === \"0\") prot.formatCells = false;\n if (String(attr(protEl, \"formatColumns\")) === \"0\") prot.formatColumns = false;\n if (String(attr(protEl, \"formatRows\")) === \"0\") prot.formatRows = false;\n if (String(attr(protEl, \"insertColumns\")) === \"0\") prot.insertColumns = false;\n if (String(attr(protEl, \"insertRows\")) === \"0\") prot.insertRows = false;\n if (String(attr(protEl, \"insertHyperlinks\")) === \"0\") prot.insertHyperlinks = false;\n if (String(attr(protEl, \"deleteColumns\")) === \"0\") prot.deleteColumns = false;\n if (String(attr(protEl, \"deleteRows\")) === \"0\") prot.deleteRows = false;\n if (parseOnOff(attr(protEl, \"selectLockedCells\"))) prot.selectLockedCells = true;\n if (String(attr(protEl, \"sort\")) === \"0\") prot.sort = false;\n if (String(attr(protEl, \"autoFilter\")) === \"0\") prot.autoFilter = false;\n if (String(attr(protEl, \"pivotTables\")) === \"0\") prot.pivotTables = false;\n if (parseOnOff(attr(protEl, \"selectUnlockedCells\"))) prot.selectUnlockedCells = true;\n result.protection = prot;\n }\n\n // Protected ranges\n const prEl = findChild(el, \"protectedRanges\");\n if (prEl) {\n const ranges: ProtectedRangeOptions[] = [];\n for (const rEl of prEl.elements ?? []) {\n if (rEl.name !== \"protectedRange\") continue;\n const r: ProtectedRangeOptions = {\n sqref: attr(rEl, \"sqref\") ?? \"\",\n name: attr(rEl, \"name\") ?? \"\",\n };\n if (attr(rEl, \"password\")) r.password = attr(rEl, \"password\");\n if (attr(rEl, \"algorithmName\")) r.algorithmName = attr(rEl, \"algorithmName\");\n if (attr(rEl, \"hashValue\")) r.hashValue = attr(rEl, \"hashValue\");\n if (attr(rEl, \"saltValue\")) r.saltValue = attr(rEl, \"saltValue\");\n const spinCount = attrNum(rEl, \"spinCount\");\n if (spinCount !== undefined) r.spinCount = spinCount;\n const sdAttr = attr(rEl, \"securityDescriptor\");\n if (sdAttr !== undefined) r.securityDescriptor = sdAttr;\n const sdEl = findChild(rEl, \"securityDescriptor\");\n if (sdEl) r.securityDescriptor = textOf(sdEl) ?? undefined;\n ranges.push(r);\n }\n if (ranges.length > 0) result.protectedRanges = ranges;\n }\n\n // Auto filter (CT_AutoFilter is shared with table — logic in auto-filter.ts)\n const afEl = findChild(el, \"autoFilter\");\n if (afEl) {\n result.autoFilter = parseAutoFilter(afEl);\n }\n\n // Merge cells\n const mcEl = findChild(el, \"mergeCells\");\n if (mcEl) {\n const merges: MergeCellOptions[] = [];\n for (const mEl of mcEl.elements ?? []) {\n if (mEl.name !== \"mergeCell\") continue;\n const ref = attr(mEl, \"ref\") ?? \"\";\n const parts = ref.split(\":\");\n if (parts.length === 2) {\n const from = parseCellRef(parts[0] ?? \"\");\n const to = parseCellRef(parts[1] ?? \"\");\n if (from && to) merges.push({ from, to });\n }\n }\n if (merges.length > 0) result.mergeCells = merges;\n }\n\n // Conditional formatting\n const cfEls = el.elements?.filter((e) => e.name === \"conditionalFormatting\") ?? [];\n if (cfEls.length > 0) {\n const cfs: ConditionalFormatOptions[] = [];\n for (const cfEl of cfEls) {\n const sqref = attr(cfEl, \"sqref\") ?? \"\";\n const rules: ConditionalFormatRule[] = [];\n for (const ruleEl of cfEl.elements ?? []) {\n if (ruleEl.name !== \"cfRule\") continue;\n const rule: ConditionalFormatRule = {\n type: attr(ruleEl, \"type\") as ConditionalFormatType,\n priority: attrNum(ruleEl, \"priority\") ?? 1,\n };\n const opVal = attr(ruleEl, \"operator\");\n if (opVal) rule.operator = opVal as ConditionalFormatOperator;\n const dxfId = attrNum(ruleEl, \"dxfId\");\n if (dxfId !== undefined) rule.dxfId = dxfId;\n if (parseOnOff(attr(ruleEl, \"stopIfTrue\"))) rule.stopIfTrue = true;\n const tpVal = attr(ruleEl, \"timePeriod\");\n if (tpVal) rule.timePeriod = tpVal as ConditionalFormatRule[\"timePeriod\"];\n const rank = attrNum(ruleEl, \"rank\");\n if (rank !== undefined) rule.rank = rank;\n if (parseOnOff(attr(ruleEl, \"equalAverage\"))) rule.equalAverage = true;\n if (String(attr(ruleEl, \"aboveAverage\")) === \"0\") rule.aboveAverage = false;\n const stdDev = attrNum(ruleEl, \"stdDev\");\n if (stdDev !== undefined) rule.stdDev = stdDev;\n\n // Color scale\n const csEl = findChild(ruleEl, \"colorScale\");\n if (csEl) {\n const cfvo: CfvoOptions[] = [];\n const colors: string[] = [];\n for (const child of csEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n if (child.name === \"color\") {\n const hex = parseColorHex(child);\n if (hex) colors.push(hex);\n }\n }\n rule.colorScale = { cfvo, colors };\n }\n\n // Data bar\n const dbEl = findChild(ruleEl, \"dataBar\");\n if (dbEl) {\n const cfvo: CfvoOptions[] = [];\n let color = \"\";\n for (const child of dbEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n if (child.name === \"color\") {\n const hex = parseColorHex(child);\n if (hex) color = hex;\n }\n }\n rule.dataBar = { cfvo: cfvo as [CfvoOptions, CfvoOptions], color };\n }\n\n // Icon set\n const isEl = findChild(ruleEl, \"iconSet\");\n if (isEl) {\n const cfvo: CfvoOptions[] = [];\n for (const child of isEl.elements ?? []) {\n if (child.name === \"cfvo\") cfvo.push(parseCfvo(child));\n }\n const iconSet: IconSetOptions = { cfvo };\n const isVal = attr(isEl, \"iconSet\");\n if (isVal) iconSet.iconSet = isVal as IconSetType;\n if (String(attr(isEl, \"showValue\")) === \"0\") iconSet.showValue = false;\n if (String(attr(isEl, \"percent\")) === \"0\") iconSet.percent = false;\n if (parseOnOff(attr(isEl, \"reverse\"))) iconSet.reverse = true;\n rule.iconSet = iconSet;\n }\n\n // Formulas\n const formulas: string[] = [];\n for (const child of ruleEl.elements ?? []) {\n if (child.name === \"formula\") formulas.push(textOf(child) ?? \"\");\n }\n if (formulas.length > 0) rule.formulas = formulas;\n\n rules.push(rule);\n }\n cfs.push({ sqref, rules });\n }\n result.conditionalFormats = cfs;\n }\n\n // Data validations\n const dvEl = findChild(el, \"dataValidations\");\n if (dvEl) {\n const dvs: DataValidationOptions[] = [];\n for (const dEl of dvEl.elements ?? []) {\n if (dEl.name !== \"dataValidation\") continue;\n const dv: DataValidationOptions = { sqref: attr(dEl, \"sqref\") ?? \"\" };\n const typeVal = attr(dEl, \"type\");\n if (typeVal) dv.type = typeVal as DataValidationType;\n const opVal = attr(dEl, \"operator\");\n if (opVal) dv.operator = opVal as DataValidationOperator;\n if (parseOnOff(attr(dEl, \"allowBlank\"))) dv.allowBlank = true;\n if (parseOnOff(attr(dEl, \"showErrorMessage\"))) dv.showErrorMessage = true;\n if (parseOnOff(attr(dEl, \"showInputMessage\"))) dv.showInputMessage = true;\n if (attr(dEl, \"errorTitle\")) dv.errorTitle = attr(dEl, \"errorTitle\");\n if (attr(dEl, \"error\")) dv.error = attr(dEl, \"error\");\n if (attr(dEl, \"promptTitle\")) dv.promptTitle = attr(dEl, \"promptTitle\");\n if (attr(dEl, \"prompt\")) dv.prompt = attr(dEl, \"prompt\");\n const esVal = attr(dEl, \"errorStyle\");\n if (esVal) dv.errorStyle = esVal as DataValidationOptions[\"errorStyle\"];\n const imVal = attr(dEl, \"imeMode\");\n if (imVal) dv.imeMode = imVal as DataValidationOptions[\"imeMode\"];\n if (parseOnOff(attr(dEl, \"showDropDown\"))) dv.showDropDown = true;\n\n const f1El = findChild(dEl, \"formula1\");\n if (f1El) dv.formula1 = textOf(f1El);\n const f2El = findChild(dEl, \"formula2\");\n if (f2El) dv.formula2 = textOf(f2El);\n\n dvs.push(dv);\n }\n result.dataValidations = dvs;\n }\n\n // Hyperlinks\n const hlEl = findChild(el, \"hyperlinks\");\n if (hlEl) {\n const hyperlinks: HyperlinkOptions[] = [];\n for (const hEl of hlEl.elements ?? []) {\n if (hEl.name !== \"hyperlink\") continue;\n const rId = hEl.attributes?.[\"r:id\"] as string | undefined;\n const location = attr(hEl, \"location\");\n const target: HyperlinkTarget = rId\n ? { type: \"external\", url: rId }\n : { type: \"internal\", location: location ?? \"\" };\n const hl: HyperlinkOptions = { cell: attr(hEl, \"ref\") ?? \"\", target };\n if (attr(hEl, \"tooltip\")) hl.tooltip = attr(hEl, \"tooltip\");\n if (attr(hEl, \"display\")) hl.display = attr(hEl, \"display\");\n hyperlinks.push(hl);\n }\n result.hyperlinks = hyperlinks;\n }\n\n // Print options\n const poEl = findChild(el, \"printOptions\");\n if (poEl) {\n const po: PrintOptions = {};\n if (parseOnOff(attr(poEl, \"horizontalCentered\"))) po.horizontalCentered = true;\n if (parseOnOff(attr(poEl, \"verticalCentered\"))) po.verticalCentered = true;\n if (parseOnOff(attr(poEl, \"headings\"))) po.headings = true;\n if (parseOnOff(attr(poEl, \"gridLines\"))) po.gridLines = true;\n if (String(attr(poEl, \"gridLinesSet\")) === \"0\") po.gridLinesSet = false;\n result.printOptions = po;\n }\n\n // Page setup\n const psEl = findChild(el, \"pageSetup\");\n if (psEl) {\n const ps: PageSetupOptions = {};\n const pz = attrNum(psEl, \"paperSize\");\n if (pz !== undefined) ps.paperSize = pz;\n const ph = attrMeasure(psEl, \"paperHeight\");\n if (ph !== undefined) ps.paperHeight = ph as number | PositiveUniversalMeasure;\n const pw = attrMeasure(psEl, \"paperWidth\");\n if (pw !== undefined) ps.paperWidth = pw as number | PositiveUniversalMeasure;\n const orientVal = attr(psEl, \"orientation\");\n if (orientVal) ps.orientation = orientVal as PageOrientation;\n const sc = attrNum(psEl, \"scale\");\n if (sc !== undefined) ps.scale = sc;\n const ftw = attrNum(psEl, \"fitToWidth\");\n if (ftw !== undefined) ps.fitToWidth = ftw;\n const fth = attrNum(psEl, \"fitToHeight\");\n if (fth !== undefined) ps.fitToHeight = fth;\n const pageOrderVal = attr(psEl, \"pageOrder\");\n if (pageOrderVal) ps.pageOrder = pageOrderVal as PageSetupOptions[\"pageOrder\"];\n if (parseOnOff(attr(psEl, \"useFirstPageNumber\"))) ps.useFirstPageNumber = true;\n const fpn = attrNum(psEl, \"firstPageNumber\");\n if (fpn !== undefined) ps.firstPageNumber = fpn;\n if (pageSetUpPrCache) Object.assign(ps, pageSetUpPrCache);\n result.pageSetup = ps;\n } else if (pageSetUpPrCache) {\n result.pageSetup = pageSetUpPrCache;\n }\n\n // Header/footer\n const hfEl = findChild(el, \"headerFooter\");\n if (hfEl) {\n const hf: HeaderFooterOptions = {};\n if (parseOnOff(attr(hfEl, \"differentOddEven\"))) hf.differentOddEven = true;\n if (parseOnOff(attr(hfEl, \"differentFirst\"))) hf.differentFirst = true;\n if (String(attr(hfEl, \"scaleWithDoc\")) === \"0\") hf.scaleWithDoc = false;\n if (String(attr(hfEl, \"alignWithMargins\")) === \"0\") hf.alignWithMargins = false;\n const oh = findChild(hfEl, \"oddHeader\");\n if (oh) hf.oddHeader = textOf(oh);\n const of2 = findChild(hfEl, \"oddFooter\");\n if (of2) hf.oddFooter = textOf(of2);\n const eh = findChild(hfEl, \"evenHeader\");\n if (eh) hf.evenHeader = textOf(eh);\n const ef = findChild(hfEl, \"evenFooter\");\n if (ef) hf.evenFooter = textOf(ef);\n const fh = findChild(hfEl, \"firstHeader\");\n if (fh) hf.firstHeader = textOf(fh);\n const ff = findChild(hfEl, \"firstFooter\");\n if (ff) hf.firstFooter = textOf(ff);\n result.headerFooter = hf;\n }\n\n // Ignored errors\n const ieEl = findChild(el, \"ignoredErrors\");\n if (ieEl) {\n const errors: IgnoredErrorOptions[] = [];\n for (const eEl of ieEl.elements ?? []) {\n if (eEl.name !== \"ignoredError\") continue;\n const ie: IgnoredErrorOptions = { sqref: attr(eEl, \"sqref\") ?? \"\" };\n if (parseOnOff(attr(eEl, \"evalError\"))) ie.evalError = true;\n if (parseOnOff(attr(eEl, \"twoDigitTextYear\"))) ie.twoDigitTextYear = true;\n if (parseOnOff(attr(eEl, \"numberStoredAsText\"))) ie.numberStoredAsText = true;\n if (parseOnOff(attr(eEl, \"formula\"))) ie.formula = true;\n if (parseOnOff(attr(eEl, \"formulaRange\"))) ie.formulaRange = true;\n if (parseOnOff(attr(eEl, \"unlockedFormula\"))) ie.unlockedFormula = true;\n if (parseOnOff(attr(eEl, \"emptyCellReference\"))) ie.emptyCellReference = true;\n if (parseOnOff(attr(eEl, \"listDataValidation\"))) ie.listDataValidation = true;\n if (parseOnOff(attr(eEl, \"calculatedColumn\"))) ie.calculatedColumn = true;\n errors.push(ie);\n }\n result.ignoredErrors = errors;\n }\n\n // Cell smart tags (CT_SmartTags)\n const smartTagsEl = findChild(el, \"smartTags\");\n if (smartTagsEl) {\n const entries: CellSmartTagsOptions[] = [];\n for (const cstEl of smartTagsEl.elements ?? []) {\n if (cstEl.name !== \"cellSmartTags\") continue;\n const cst: CellSmartTagsOptions = {\n reference: attr(cstEl, \"r\") ?? \"\",\n smartTags: [],\n };\n for (const stEl of cstEl.elements ?? []) {\n if (stEl.name !== \"cellSmartTag\") continue;\n const st: {\n type: number;\n deleted?: boolean;\n xmlBased?: boolean;\n properties?: { key: string; val: string }[];\n } = {\n type: attrNum(stEl, \"type\") ?? 0,\n };\n if (parseOnOff(attr(stEl, \"deleted\"))) st.deleted = true;\n if (parseOnOff(attr(stEl, \"xmlBased\"))) st.xmlBased = true;\n const prEls = stEl.elements?.filter((e) => e.name === \"cellSmartTagPr\") ?? [];\n if (prEls.length > 0) {\n st.properties = prEls.map((prEl) => ({\n key: attr(prEl, \"key\") ?? \"\",\n val: attr(prEl, \"val\") ?? \"\",\n }));\n }\n cst.smartTags.push(st);\n }\n entries.push(cst);\n }\n if (entries.length > 0) result.smartTags = entries;\n }\n\n // Phonetic properties\n const ppEl = findChild(el, \"phoneticPr\");\n if (ppEl) {\n const pp: PhoneticPropertiesOptions = { fontId: attrNum(ppEl, \"fontId\") ?? 0 };\n const ppType = attr(ppEl, \"type\");\n if (ppType) pp.type = ppType as PhoneticPropertiesOptions[\"type\"];\n const ppAlign = attr(ppEl, \"alignment\");\n if (ppAlign) pp.alignment = ppAlign as PhoneticPropertiesOptions[\"alignment\"];\n result.phoneticPr = pp;\n }\n\n // Sheet calc properties\n const scEl = findChild(el, \"sheetCalcPr\");\n if (scEl) {\n const sc: SheetCalculationPropertiesOptions = {};\n if (parseOnOff(attr(scEl, \"fullCalcOnLoad\"))) sc.fullCalcOnLoad = true;\n result.sheetCalcPr = sc;\n }\n\n // Sheet data (rows and cells) — parsed by the dedicated sheetData scanner.\n // The archive read path defers sheetData (Element.raw, children never\n // materialized); a hand-built or non-deferred tree normalizes through\n // stringify first, so there is exactly one row parsing implementation.\n const sheetDataEl = findChild(el, \"sheetData\");\n if (sheetDataEl) {\n const rows = parseSheetDataRows(\n sheetDataEl.raw ?? stringify(sheetDataEl),\n strings,\n ctx && \"resolveStyle\" in ctx ? (ctx as XlsxReadContext) : undefined,\n );\n if (rows.length > 0) result.rows = rows;\n }\n\n // Row breaks (CT_PageBreak — after sheetData per XSD sequence)\n const rowBreaksEl = findChild(el, \"rowBreaks\");\n if (rowBreaksEl) {\n const breaks = parsePageBreaks(rowBreaksEl);\n if (breaks.length > 0) result.rowBreaks = breaks;\n }\n\n // Column breaks (CT_PageBreak)\n const colBreaksEl = findChild(el, \"colBreaks\");\n if (colBreaksEl) {\n const breaks = parsePageBreaks(colBreaksEl);\n if (breaks.length > 0) result.colBreaks = breaks;\n }\n\n // Custom properties (CT_CustomProperties — customPr name + r:id)\n const customPropsEl = findChild(el, \"customProperties\");\n if (customPropsEl) {\n const props: CustomSheetPropertyOptions[] = [];\n for (const cpEl of customPropsEl.elements ?? []) {\n if (cpEl.name !== \"customPr\") continue;\n const name = attr(cpEl, \"name\");\n const rId = cpEl.attributes?.[\"r:id\"] as string | undefined;\n if (name !== undefined && rId !== undefined) props.push({ name, rId });\n }\n if (props.length > 0) result.customProperties = props;\n }\n\n // Cell watches (CT_CellWatches — cellWatch @r)\n const cellWatchesEl = findChild(el, \"cellWatches\");\n if (cellWatchesEl) {\n const watches: CellWatchOptions[] = [];\n for (const cwEl of cellWatchesEl.elements ?? []) {\n if (cwEl.name !== \"cellWatch\") continue;\n const r = attr(cwEl, \"r\");\n if (r) watches.push({ reference: r });\n }\n if (watches.length > 0) result.cellWatches = watches;\n }\n\n // Legacy drawing header/footer (CT_LegacyDrawing @r:id)\n const legacyHFEl = findChild(el, \"legacyDrawingHF\");\n if (legacyHFEl) {\n const rId = legacyHFEl.attributes?.[\"r:id\"] as string | undefined;\n if (rId) result.legacyDrawingHF = rId;\n }\n\n // Data consolidation (CT_DataConsolidate — function/labels/link + dataRefs)\n const dcEl = findChild(el, \"dataConsolidate\");\n if (dcEl) {\n const dc: DataConsolidateOptions = {};\n const fn = attr(dcEl, \"function\");\n if (fn) dc.function = fn as DataConsolidateOptions[\"function\"];\n if (parseOnOff(attr(dcEl, \"topLabels\"))) dc.topLabels = true;\n if (parseOnOff(attr(dcEl, \"leftLabels\"))) dc.leftLabels = true;\n if (parseOnOff(attr(dcEl, \"startLabels\"))) dc.startLabels = true;\n if (parseOnOff(attr(dcEl, \"link\"))) dc.link = true;\n const refsEl = findChild(dcEl, \"dataRefs\");\n if (refsEl) {\n const refs: string[] = [];\n for (const refEl of refsEl.elements ?? []) {\n if (refEl.name !== \"dataRef\") continue;\n const r = attr(refEl, \"ref\");\n if (r) refs.push(r);\n }\n if (refs.length > 0) dc.refs = refs;\n }\n if (Object.keys(dc).length > 0) result.dataConsolidate = dc;\n }\n\n // What-if scenarios (CT_Scenarios — current/show + scenario/inputCells)\n const scenariosEl = findChild(el, \"scenarios\");\n if (scenariosEl) {\n const scenarios: ScenarioDefinition[] = [];\n for (const scEl of scenariosEl.elements ?? []) {\n if (scEl.name !== \"scenario\") continue;\n const name = attr(scEl, \"name\");\n if (name === undefined) continue;\n const scenario: ScenarioDefinition = { name, inputCells: [] };\n const count = attrNum(scEl, \"count\");\n if (count !== undefined) scenario.count = count;\n const user = attr(scEl, \"user\");\n if (user !== undefined) scenario.user = user;\n const comment = attr(scEl, \"comment\");\n if (comment !== undefined) scenario.comment = comment;\n if (parseOnOff(attr(scEl, \"hidden\"))) scenario.hidden = true;\n if (parseOnOff(attr(scEl, \"locked\"))) scenario.locked = true;\n for (const icEl of scEl.elements ?? []) {\n if (icEl.name !== \"inputCells\") continue;\n const r = attr(icEl, \"r\");\n const valRaw = attr(icEl, \"val\");\n if (r === undefined || valRaw === undefined) continue;\n const num = Number(valRaw);\n const cell: ScenarioCellOptions = {\n reference: r,\n val: String(num) === valRaw ? num : valRaw,\n };\n if (parseOnOff(attr(icEl, \"deleted\"))) cell.deleted = true;\n if (parseOnOff(attr(icEl, \"undone\"))) cell.undone = true;\n scenario.inputCells.push(cell);\n }\n scenarios.push(scenario);\n }\n if (scenarios.length > 0) {\n const so: ScenarioOptions = { scenarios };\n const current = attrNum(scenariosEl, \"current\");\n if (current !== undefined) so.current = current;\n const show = attrNum(scenariosEl, \"show\");\n if (show !== undefined) so.show = show;\n result.scenarios = so;\n }\n }\n\n // Custom sheet views (CT_CustomSheetViews — attribute bag per saved view)\n const csvListEl = findChild(el, \"customSheetViews\");\n if (csvListEl) {\n const views: CustomSheetViewOptions[] = [];\n for (const vEl of csvListEl.elements ?? []) {\n if (vEl.name !== \"customSheetView\") continue;\n const guid = attr(vEl, \"guid\");\n if (guid === undefined) continue;\n const view: CustomSheetViewOptions = { guid };\n const scale = attrNum(vEl, \"scale\");\n if (scale !== undefined) view.scale = scale;\n if (parseOnOff(attr(vEl, \"showPageBreaks\"))) view.showPageBreaks = true;\n if (parseOnOff(attr(vEl, \"showFormulas\"))) view.showFormulas = true;\n if (String(attr(vEl, \"showGridLines\")) === \"0\") view.showGridLines = false;\n if (String(attr(vEl, \"showRowCol\")) === \"0\") view.showRowColHeaders = false;\n if (String(attr(vEl, \"outlineSymbols\")) === \"0\") view.outlineSymbols = false;\n if (String(attr(vEl, \"zeroValues\")) === \"0\") view.zeroValues = false;\n if (parseOnOff(attr(vEl, \"fitToPage\"))) view.fitToPage = true;\n if (parseOnOff(attr(vEl, \"printArea\"))) view.printArea = true;\n if (parseOnOff(attr(vEl, \"filter\"))) view.filter = true;\n if (parseOnOff(attr(vEl, \"showAutoFilter\"))) view.showAutoFilter = true;\n if (parseOnOff(attr(vEl, \"hiddenRows\"))) view.hiddenRows = true;\n if (parseOnOff(attr(vEl, \"hiddenColumns\"))) view.hiddenColumns = true;\n const state = attr(vEl, \"state\");\n if (state !== undefined) view.state = state as CustomSheetViewOptions[\"state\"];\n if (parseOnOff(attr(vEl, \"filterUnique\"))) view.filterUnique = true;\n const viewType = attr(vEl, \"view\");\n if (viewType !== undefined) view.view = viewType as CustomSheetViewOptions[\"view\"];\n views.push(view);\n }\n if (views.length > 0) result.customSheetViews = views;\n }\n\n // OLE objects (CT_OleObjects — oleObject attrs + optional objectPr child)\n const oleObjsEl = findChild(el, \"oleObjects\");\n if (oleObjsEl) {\n const oleObjects: OleObjectOptions[] = [];\n for (const ooEl of oleObjsEl.elements ?? []) {\n if (ooEl.name !== \"oleObject\") continue;\n const shapeId = attrNum(ooEl, \"shapeId\");\n if (shapeId === undefined) continue;\n const oo: OleObjectOptions = { shapeId };\n const progId = attr(ooEl, \"progId\");\n if (progId !== undefined) oo.progId = progId;\n const dvAspect = attr(ooEl, \"dvAspect\");\n if (dvAspect !== undefined) oo.dvAspect = dvAspect as OleObjectOptions[\"dvAspect\"];\n const link = attr(ooEl, \"link\");\n if (link !== undefined) oo.link = link;\n const oleUpdate = attr(ooEl, \"oleUpdate\");\n if (oleUpdate !== undefined) oo.oleUpdate = oleUpdate as OleObjectOptions[\"oleUpdate\"];\n if (parseOnOff(attr(ooEl, \"autoLoad\"))) oo.autoLoad = true;\n const ooRid = attr(ooEl, \"r:id\");\n if (ooRid !== undefined) oo.rId = ooRid;\n const oprEl = findChild(ooEl, \"objectPr\");\n if (oprEl) {\n const opr: OleObjectPropertiesOptions = {};\n if (String(attr(oprEl, \"locked\")) === \"0\") opr.locked = false;\n if (String(attr(oprEl, \"defaultSize\")) === \"0\") opr.defaultSize = false;\n if (String(attr(oprEl, \"print\")) === \"0\") opr.print = false;\n if (parseOnOff(attr(oprEl, \"disabled\"))) opr.disabled = true;\n if (parseOnOff(attr(oprEl, \"uiObject\"))) opr.uiObject = true;\n if (String(attr(oprEl, \"autoFill\")) === \"0\") opr.autoFill = false;\n if (String(attr(oprEl, \"autoLine\")) === \"0\") opr.autoLine = false;\n if (String(attr(oprEl, \"autoPict\")) === \"0\") opr.autoPict = false;\n const macro = attr(oprEl, \"macro\");\n if (macro !== undefined) opr.macro = macro;\n const altText = attr(oprEl, \"altText\");\n if (altText !== undefined) opr.altText = altText;\n if (parseOnOff(attr(oprEl, \"dde\"))) opr.dde = true;\n const oprRid = attr(oprEl, \"r:id\");\n if (oprRid !== undefined) opr.rId = oprRid;\n if (Object.keys(opr).length > 0) oo.objectPr = opr;\n }\n oleObjects.push(oo);\n }\n if (oleObjects.length > 0) result.oleObjects = oleObjects;\n }\n\n // Controls (CT_Controls — control attrs + optional controlPr child)\n const controlsEl = findChild(el, \"controls\");\n if (controlsEl) {\n const controls: ControlOptions[] = [];\n for (const cEl of controlsEl.elements ?? []) {\n if (cEl.name !== \"control\") continue;\n const shapeId = attrNum(cEl, \"shapeId\");\n const cRid = attr(cEl, \"r:id\");\n if (shapeId === undefined || cRid === undefined) continue;\n const c: ControlOptions = { shapeId, rId: cRid };\n const name = attr(cEl, \"name\");\n if (name !== undefined) c.name = name;\n const prEl = findChild(cEl, \"controlPr\");\n if (prEl) {\n if (String(attr(prEl, \"locked\")) === \"0\") c.locked = false;\n if (parseOnOff(attr(prEl, \"uiObject\"))) c.uiObject = true;\n if (parseOnOff(attr(prEl, \"recalcAlways\"))) c.recalcAlways = true;\n const linkedCell = attr(prEl, \"linkedCell\");\n if (linkedCell !== undefined) c.linkedCell = linkedCell;\n const listFillRange = attr(prEl, \"listFillRange\");\n if (listFillRange !== undefined) c.listFillRange = listFillRange;\n const cf = attr(prEl, \"cf\");\n if (cf !== undefined) c.formula = cf;\n }\n controls.push(c);\n }\n if (controls.length > 0) result.controls = controls;\n }\n\n // Web publish items (CT_WebPublishItems — attribute bag per item)\n const wpEl = findChild(el, \"webPublishItems\");\n if (wpEl) {\n const items: WebPublishItemOptions[] = [];\n for (const wpiEl of wpEl.elements ?? []) {\n if (wpiEl.name !== \"webPublishItem\") continue;\n const id = attrNum(wpiEl, \"id\");\n const divId = attr(wpiEl, \"divId\");\n const sourceType = attr(wpiEl, \"sourceType\");\n const destinationFile = attr(wpiEl, \"destinationFile\");\n if (\n id === undefined ||\n divId === undefined ||\n sourceType === undefined ||\n destinationFile === undefined\n )\n continue;\n const wpi: WebPublishItemOptions = {\n id,\n divId,\n sourceType: sourceType as WebPublishItemOptions[\"sourceType\"],\n destinationFile,\n };\n const sourceRef = attr(wpiEl, \"sourceRef\");\n if (sourceRef !== undefined) wpi.sourceRef = sourceRef;\n const sourceObject = attr(wpiEl, \"sourceObject\");\n if (sourceObject !== undefined) wpi.sourceObject = sourceObject;\n const title = attr(wpiEl, \"title\");\n if (title !== undefined) wpi.title = title;\n if (parseOnOff(attr(wpiEl, \"autoRepublish\"))) wpi.autoRepublish = true;\n items.push(wpi);\n }\n if (items.length > 0) result.webPublishItems = items;\n }\n\n // Drawing in header/footer (CT_DrawingHF — r:id + 18 header/footer offsets)\n const drawingHfEl = findChild(el, \"drawingHF\");\n if (drawingHfEl) {\n const rId = attr(drawingHfEl, \"r:id\");\n if (rId !== undefined) {\n const dhf: DrawingHfOptions = { rId };\n for (const key of DRAWING_HF_OFFSET_KEYS) {\n const v = attrNum(drawingHfEl, key);\n if (v !== undefined) dhf[key] = v;\n }\n result.drawingHF = dhf;\n }\n }\n\n // Extension list (CT_ExtensionList — verbatim inner XML, open-ended content)\n const extLstEl = findChild(el, \"extLst\");\n if (extLstEl) {\n const inner = stringify(extLstEl);\n if (inner) result.ext = inner;\n }\n\n return result as WorksheetOptions;\n },\n};\n","/**\n * Convert a 1-based column number to Excel column letter(s).\n * 1 → \"A\", 26 → \"Z\", 27 → \"AA\", 28 → \"AB\"\n *\n * Memoized: sheet building calls this per cell (millions of times over a few\n * dozen distinct columns) — the cache turns each hit into an array read.\n */\nconst COLUMN_LETTERS: string[] = [];\n\nexport function columnToLetter(col: number): string {\n const cached = COLUMN_LETTERS[col];\n if (cached !== undefined) return cached;\n let result = \"\";\n let n = col;\n while (n > 0) {\n const remainder = (n - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n n = Math.floor((n - 1) / 26);\n }\n COLUMN_LETTERS[col] = result;\n return result;\n}\n\n/**\n * Convert Excel column letter(s) to a 1-based column number.\n * \"A\" → 1, \"Z\" → 26, \"AA\" → 27\n */\nexport function letterToColumn(letters: string): number {\n let col = 0;\n for (let i = 0; i < letters.length; i++) col = col * 26 + (letters.charCodeAt(i) - 64);\n return col;\n}\n\n/**\n * Convert a JavaScript Date to an Excel serial number.\n * Excel epoch: January 1, 1900 = 1 (with the 1900 leap year bug).\n */\nexport function dateToSerialNumber(date: Date): number {\n // Excel treats 1900 as a leap year (bug inherited from Lotus 1-2-3).\n // The epoch is effectively December 30, 1899 = 0, fixed in UTC so the\n // serial does not shift with the host timezone.\n const epochMs = Date.UTC(1899, 11, 30);\n return (date.getTime() - epochMs) / 86400000;\n}\n\n/**\n * Legacy 16-bit XOR password hash used by xlsx sheet/workbook protection\n * (the pre-Agile encryption hash). Shared by worksheet and workbook parts.\n */\nexport function hashPassword(password: string): string {\n let hash = 0;\n for (let i = 0; i < password.length; i++) {\n const c = password.charCodeAt(i);\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash ^= c;\n hash = hash & 0x4000 ? hash ^ 0x1 : hash;\n }\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash = ((hash >> 14) & 1) + ((hash << 1) & 0x7fff);\n hash ^= password.length;\n return hash.toString(16).toUpperCase().padStart(4, \"0\");\n}\n","/**\n * Pivot table utility types and helper functions.\n *\n * @module\n */\n\n/** Aggregation function for data fields (maps to ST_DataConsolidateFunction). */\nexport const ConsolidateFunction = {\n SUM: \"sum\",\n COUNT: \"count\",\n AVERAGE: \"average\",\n MAX: \"max\",\n MIN: \"min\",\n PRODUCT: \"product\",\n COUNT_NUMS: \"countNums\",\n STD_DEV: \"stdDev\",\n STD_DEV_P: \"stdDevp\",\n VAR: \"var\",\n VAR_P: \"varp\",\n} as const;\n\nexport type ConsolidateFunction = (typeof ConsolidateFunction)[keyof typeof ConsolidateFunction];\n\n/** A data field definition for pivot table aggregation. */\nexport interface PivotDataField {\n /** Source column name to aggregate */\n field: string;\n /** Aggregation function (default: \"sum\") */\n summarize?: ConsolidateFunction;\n /** Custom name for the data field (default: \"Sum of {field}\") */\n name?: string;\n /** Show data as (CT_DataField @showDataAs) */\n showDataAs?: string;\n /** Base field index for \"show data as\" calculations */\n baseField?: number;\n /** Base item index for \"show data as\" calculations */\n baseItem?: number;\n /** Sort by tuple items (CT_Tuples in sortByTuple) */\n sortByTupleItems?: number[];\n}\n\n/** Per-field overrides for pivotField XML attributes (CT_PivotField). */\nexport interface PivotFieldOverrideOptions {\n /** Field name to match (required) */\n field: string;\n /** All drilled (CT_PivotField @allDrilled) */\n allDrilled?: boolean;\n /** Auto show (CT_PivotField @autoShow) */\n autoShow?: boolean;\n /** Count subtotal (CT_PivotField @countSubtotal) */\n countSubtotal?: boolean;\n /** Average subtotal (CT_PivotField @avgSubtotal) */\n avgSubtotal?: boolean;\n /** CountA subtotal (CT_PivotField @countASubtotal) */\n countASubtotal?: boolean;\n /** Max subtotal (CT_PivotField @maxSubtotal) */\n maxSubtotal?: boolean;\n /** Min subtotal (CT_PivotField @minSubtotal) */\n minSubtotal?: boolean;\n /** Sum subtotal (CT_PivotField @sumSubtotal) */\n sumSubtotal?: boolean;\n /** Data source sort (CT_PivotField @dataSourceSort) */\n dataSourceSort?: boolean;\n /** Default attribute drill state (CT_PivotField @defaultAttributeDrillState) */\n defaultAttributeDrillState?: boolean;\n /** Hidden level (CT_PivotField @hiddenLevel) */\n hiddenLevel?: boolean;\n /** Hide new items (CT_PivotField @hideNewItems) */\n hideNewItems?: boolean;\n /** Insert blank row (CT_PivotField @insertBlankRow) */\n insertBlankRow?: boolean;\n /** Insert page break (CT_PivotField @insertPageBreak) */\n insertPageBreak?: boolean;\n /** Item page count (CT_PivotField @itemPageCount) */\n itemPageCount?: boolean;\n /** Measure filter (CT_PivotField @measureFilter) */\n measureFilter?: boolean;\n /** Non auto sort default (CT_PivotField @nonAutoSortDefault) */\n nonAutoSortDefault?: boolean;\n /** Product subtotal (CT_PivotField @productSubtotal) */\n productSubtotal?: boolean;\n /** Rank by (CT_PivotField @rankBy) */\n rankBy?: number;\n /** Server field (CT_PivotField @serverField) */\n serverField?: boolean;\n /** Show drop downs (CT_PivotField @showDropDowns) */\n showDropDowns?: boolean;\n /** Show property as caption (CT_PivotField @showPropAsCaption) */\n showPropAsCaption?: boolean;\n /** Show property cell (CT_PivotField @showPropCell) */\n showPropCell?: boolean;\n /** Show property tip (CT_PivotField @showPropTip) */\n showPropTip?: boolean;\n /** StdDevP subtotal (CT_PivotField @stdDevPSubtotal) */\n stdDevPSubtotal?: boolean;\n /** StdDev subtotal (CT_PivotField @stdDevSubtotal) */\n stdDevSubtotal?: boolean;\n /** Subtotal caption (CT_PivotField @subtotalCaption) */\n subtotalCaption?: string;\n /** Top auto show (CT_PivotField @topAutoShow) */\n topAutoShow?: boolean;\n /** Unique member property (CT_PivotField @uniqueMemberProperty) */\n uniqueMemberProperty?: boolean;\n /** VarP subtotal (CT_PivotField @varPSubtotal) */\n varPSubtotal?: boolean;\n /** Var subtotal (CT_PivotField @varSubtotal) */\n varSubtotal?: boolean;\n /** Show detail for default item (CT_Item @sd) */\n defaultItemSd?: boolean;\n}\n\n/** Pivot filter type (ST_PivotFilterType) */\nexport const PivotFilterType = {\n UNKNOWN: \"unknown\",\n COUNT: \"count\",\n PERCENT: \"percent\",\n SUM: \"sum\",\n CAPTION_EQUAL: \"captionEqual\",\n CAPTION_NOT_EQUAL: \"captionNotEqual\",\n CAPTION_BEGINS_WITH: \"captionBeginsWith\",\n CAPTION_NOT_BEGINS_WITH: \"captionNotBeginsWith\",\n CAPTION_ENDS_WITH: \"captionEndsWith\",\n CAPTION_NOT_ENDS_WITH: \"captionNotEndsWith\",\n CAPTION_CONTAINS: \"captionContains\",\n CAPTION_NOT_CONTAINS: \"captionNotContains\",\n CAPTION_GREATER_THAN: \"captionGreaterThan\",\n CAPTION_GREATER_THAN_OR_EQUAL: \"captionGreaterThanOrEqual\",\n CAPTION_LESS_THAN: \"captionLessThan\",\n CAPTION_LESS_THAN_OR_EQUAL: \"captionLessThanOrEqual\",\n CAPTION_BETWEEN: \"captionBetween\",\n CAPTION_NOT_BETWEEN: \"captionNotBetween\",\n VALUE_EQUAL: \"valueEqual\",\n VALUE_NOT_EQUAL: \"valueNotEqual\",\n VALUE_GREATER_THAN: \"valueGreaterThan\",\n VALUE_GREATER_THAN_OR_EQUAL: \"valueGreaterThanOrEqual\",\n VALUE_LESS_THAN: \"valueLessThan\",\n VALUE_LESS_THAN_OR_EQUAL: \"valueLessThanOrEqual\",\n VALUE_BETWEEN: \"valueBetween\",\n VALUE_NOT_BETWEEN: \"valueNotBetween\",\n DATE_EQUAL: \"dateEqual\",\n DATE_NOT_EQUAL: \"dateNotEqual\",\n DATE_OLDER_THAN: \"dateOlderThan\",\n DATE_OLDER_THAN_OR_EQUAL: \"dateOlderThanOrEqual\",\n DATE_NEWER_THAN: \"dateNewerThan\",\n DATE_NEWER_THAN_OR_EQUAL: \"dateNewerThanOrEqual\",\n DATE_BETWEEN: \"dateBetween\",\n DATE_NOT_BETWEEN: \"dateNotBetween\",\n TOMORROW: \"tomorrow\",\n TODAY: \"today\",\n YESTERDAY: \"yesterday\",\n NEXT_WEEK: \"nextWeek\",\n THIS_WEEK: \"thisWeek\",\n LAST_WEEK: \"lastWeek\",\n NEXT_MONTH: \"nextMonth\",\n THIS_MONTH: \"thisMonth\",\n LAST_MONTH: \"lastMonth\",\n NEXT_QUARTER: \"nextQuarter\",\n THIS_QUARTER: \"thisQuarter\",\n LAST_QUARTER: \"lastQuarter\",\n NEXT_YEAR: \"nextYear\",\n THIS_YEAR: \"thisYear\",\n LAST_YEAR: \"lastYear\",\n YEAR_TO_DATE: \"yearToDate\",\n Q1: \"Q1\",\n Q2: \"Q2\",\n Q3: \"Q3\",\n Q4: \"Q4\",\n M1: \"M1\",\n M2: \"M2\",\n M3: \"M3\",\n M4: \"M4\",\n M5: \"M5\",\n M6: \"M6\",\n M7: \"M7\",\n M8: \"M8\",\n M9: \"M9\",\n M10: \"M10\",\n M11: \"M11\",\n M12: \"M12\",\n} as const;\n\nexport type PivotFilterType = (typeof PivotFilterType)[keyof typeof PivotFilterType];\n\n/** A single pivot filter (CT_PivotFilter) */\nexport interface PivotFilterOptions {\n /** Field index to filter on (required) */\n fld: number;\n /** Filter type (required) */\n type: PivotFilterType;\n /** Filter ID — unique within this pivot table (required) */\n id: number;\n /** Measure field index for OLAP filters */\n mpFld?: number;\n /** Evaluation order */\n evalOrder?: number;\n /** Measure hierarchy */\n iMeasureHier?: number;\n /** Measure field */\n iMeasureFld?: number;\n /** Filter name */\n name?: string;\n /** Filter description */\n description?: string;\n /** First string value for caption/date filters */\n stringValue1?: string;\n /** Second string value for between filters */\n stringValue2?: string;\n}\n\n/** Options for a single pivot table on a worksheet. */\nexport interface PivotTableOptions {\n /** Pivot table name (default: \"PivotTable{N}\") */\n name?: string;\n /** Source data range, e.g. \"A1:D11\" — must be on the same or a different sheet */\n source: string;\n /** Source sheet name (default: current sheet) */\n sourceSheet?: string;\n /** Target cell for the pivot table output (default: \"A3\") */\n location?: string;\n /** Field names to use as row labels */\n rows: string[];\n /** Field names to use as column labels */\n columns?: string[];\n /** Data fields with aggregation settings */\n data: PivotDataField[];\n /** Pivot style name (default: \"PivotStyleLight16\") */\n style?: string;\n /** Pivot filters (CT_PivotFilters) */\n filters?: PivotFilterOptions[];\n /** Field names to use as page/report filters */\n pages?: string[];\n /** Page field captions (maps by index to pages array) */\n pageCaptions?: string[];\n /** Data fields on rows instead of columns (CT_PivotTableDefinition @dataOnRows) */\n dataOnRows?: boolean;\n /** Grand total caption text */\n grandTotalCaption?: string;\n /** Error caption text */\n errorCaption?: string;\n /** Show error messages */\n showError?: boolean;\n /** Missing caption text */\n missingCaption?: string;\n /** Show missing items */\n showMissing?: boolean;\n /** Custom page style name */\n pageStyle?: string;\n /** Custom pivot table style name */\n pivotTableStyle?: string;\n /** Tag string */\n tag?: string;\n /** Show items with no data */\n showItems?: boolean;\n /** Edit data in-place */\n editData?: boolean;\n /** Disable field list */\n disableFieldList?: boolean;\n /** Show calculated members */\n showCalcMbrs?: boolean;\n /** Visual totals */\n visualTotals?: boolean;\n /** Show multiple labels */\n showMultipleLabel?: boolean;\n /** Show data drop-down */\n showDataDropDown?: boolean;\n /** Show drill indicators */\n showDrill?: boolean;\n /** Print drill indicators */\n printDrill?: boolean;\n /** Show member property tips */\n showMemberPropertyTips?: boolean;\n /** Show data tips */\n showDataTips?: boolean;\n /** Enable layout wizard */\n enableWizard?: boolean;\n /** Enable drill-down */\n enableDrill?: boolean;\n /** Enable field properties */\n enableFieldProperties?: boolean;\n /** Number of page fields per row/column */\n pageWrap?: number;\n /** Page layout over then down */\n pageOverThenDown?: boolean;\n /** Subtotal hidden items */\n subtotalHiddenItems?: boolean;\n /** Field print titles */\n fieldPrintTitles?: boolean;\n /** Merge item labels */\n mergeItem?: boolean;\n /** Show drop zones */\n showDropZones?: boolean;\n /** Show empty row */\n showEmptyRow?: boolean;\n /** Show empty column */\n showEmptyCol?: boolean;\n /** Show headers */\n showHeaders?: boolean;\n /** Published to server */\n published?: boolean;\n /** Grid drop zones */\n gridDropZones?: boolean;\n /** Multiple field filters */\n multipleFieldFilters?: boolean;\n /** Row header caption */\n rowHeaderCaption?: string;\n /** Column header caption */\n colHeaderCaption?: string;\n /** Sort field list ascending */\n fieldListSortAscending?: boolean;\n /** MDX subqueries enabled */\n mdxSubqueries?: boolean;\n /** Custom list sort */\n customListSort?: boolean;\n /** Asterisk totals (CT_PivotTableDefinition @asteriskTotals) */\n asteriskTotals?: boolean;\n /** Data position (CT_PivotTableDefinition @dataPosition) */\n dataPosition?: number;\n /** Immersive (CT_PivotTableDefinition @immersive) */\n immersive?: boolean;\n /** Vacated style (CT_PivotTableDefinition @vacatedStyle) */\n vacatedStyle?: string;\n /** Calculated items (CT_CalculatedItems) */\n calculatedItems?: CalculatedItemOptions[];\n /** Calculated members (CT_CalculatedMembers) */\n calculatedMembers?: CalculatedMemberOptions[];\n /** Pivot hierarchies (CT_PivotHierarchies) */\n pivotHierarchies?: PivotHierarchyOptions[];\n /** Conditional formats (CT_ConditionalFormats for pivot) */\n pivotConditionalFormats?: PivotConditionalFormatOptions[];\n /** Chart formats (CT_ChartFormats) */\n chartFormats?: ChartFormatOptions[];\n /** Chart format applied (CT_PivotTableDefinition @chartFormat) */\n chartFormat?: boolean;\n /** Preserve formatting on refresh (CT_PivotTableDefinition @preserveFormatting, default true) */\n preserveFormatting?: boolean;\n /** Selected item index per page field (CT_PageField @item, by position) */\n pageFieldItems?: number[];\n /** Auto sort scope (CT_AutoSortScope) */\n autoSortScope?: PivotAreaOptions;\n /** Member properties per field (CT_MemberProperties → mps/mp) */\n memberProperties?: MemberPropertyOptions[];\n /** Pivot format areas (CT_Formats → format) */\n formats?: PivotFormatOptions[];\n /** Row hierarchy usage (CT_RowHierarchiesUsage) */\n rowHierarchiesUsage?: HierarchyUsageOptions[];\n /** Column hierarchy usage (CT_ColHierarchiesUsage) */\n colHierarchiesUsage?: HierarchyUsageOptions[];\n /** Location column page count (CT_Location @colPageCount) */\n locationColPageCount?: number;\n /** Location row page count (CT_Location @rowPageCount) */\n locationRowPageCount?: number;\n /** Per-field overrides for pivotField (CT_PivotField attributes) */\n fieldOverrides?: PivotFieldOverrideOptions[];\n}\n\n/** Pivot format (CT_Format). */\nexport interface PivotFormatOptions {\n /** Action type (default: \"formatting\") */\n action?: \"formatting\" | \"drill\" | \"formula\" | \"blank\" | \"subtotal\" | \"report\";\n /** Differential format index */\n dxfId?: number;\n /** Pivot area */\n pivotArea: PivotAreaOptions;\n}\n\n/** Calculated item in a pivot table (CT_CalculatedItem) */\nexport interface CalculatedItemOptions {\n /** Field index */\n field?: number;\n /** Formula */\n formula?: string;\n /** Pivot area reference */\n pivotArea?: PivotAreaOptions;\n}\n\n/** Calculated member in a pivot table (CT_CalculatedMember) */\nexport interface CalculatedMemberOptions {\n /** Name (required) */\n name: string;\n /** MDX expression (required) */\n mdx: string;\n /** Member name */\n memberName?: string;\n /** Hierarchy */\n hierarchy?: string;\n /** Parent member */\n parent?: string;\n /** Solve order (default: 0) */\n solveOrder?: number;\n /** Is a set (default: false) */\n set?: boolean;\n}\n\n/** Pivot hierarchy (CT_PivotHierarchy) */\nexport interface PivotHierarchyOptions {\n /** Outline mode (default: false) */\n outline?: boolean;\n /** Allow multiple item selection (default: false) */\n multipleItemSelectionAllowed?: boolean;\n /** Subtotal on top (default: false) */\n subtotalTop?: boolean;\n /** Show in field list (default: true) */\n showInFieldList?: boolean;\n /** Drag to row (default: true) */\n dragToRow?: boolean;\n /** Drag to column (default: true) */\n dragToCol?: boolean;\n /** Drag to page (default: true) */\n dragToPage?: boolean;\n /** Drag to data (default: false) */\n dragToData?: boolean;\n /** Drag off (default: true) */\n dragOff?: boolean;\n /** Include new items in filter (default: false) */\n includeNewItemsInFilter?: boolean;\n /** Caption */\n caption?: string;\n /** Members */\n members?: MemberOptions[];\n /** Member properties (CT_MemberProperties → mps/mp) */\n memberProperties?: MemberPropertyOptions[];\n}\n\n/** Member in pivot hierarchy (CT_Member) */\nexport interface MemberOptions {\n /** Member name (required) */\n name: string;\n /** Level (CT_Member @level) */\n level?: number;\n}\n\n/** Member property (CT_MemberProperty) */\nexport interface MemberPropertyOptions {\n /** Field index */\n field: number;\n /** Property name */\n name?: string;\n /** Show cell? */\n showCell?: boolean;\n /** Show tip? */\n showTip?: boolean;\n /** Show as caption (CT_MemberProperty @showAsCaption) */\n showAsCaption?: boolean;\n /** Name length (CT_MemberProperty @nameLen) */\n nameLen?: number;\n /** Property position (CT_MemberProperty @pPos) */\n pPos?: number;\n /** Property length (CT_MemberProperty @pLen) */\n pLen?: number;\n}\n\n/** Pivot area for conditional formats, chart formats, etc. (CT_PivotArea) */\nexport interface PivotAreaOptions {\n /** Field index */\n field?: number;\n /** Area type (default: \"normal\") */\n type?: \"none\" | \"normal\" | \"data\" | \"all\" | \"origin\" | \"button\" | \"topEnd\" | \"topRight\";\n /** Data only (default: true) */\n dataOnly?: boolean;\n /** Label only (default: false) */\n labelOnly?: boolean;\n /** Grand row (default: false) */\n grandRow?: boolean;\n /** Grand column (default: false) */\n grandCol?: boolean;\n /** Cache index (default: false) */\n cacheIndex?: boolean;\n /** Outline (default: true) */\n outline?: boolean;\n /** Offset reference */\n offset?: string;\n /** Collapsed levels are subtotals (default: false) */\n collapsedLevelsAreSubtotals?: boolean;\n /** Axis */\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n /** Field position */\n fieldPosition?: number;\n /** References */\n references?: PivotAreaReferenceOptions[];\n}\n\n/** Pivot area reference (CT_PivotAreaReference) */\nexport interface PivotAreaReferenceOptions {\n /** Field index */\n field?: number;\n /** Count */\n count?: number;\n /** Selected (default: true) */\n selected?: boolean;\n /** By position (default: false) */\n byPosition?: boolean;\n /** Relative (default: false) */\n relative?: boolean;\n /** Default subtotal */\n defaultSubtotal?: boolean;\n /** Sum subtotal */\n sumSubtotal?: boolean;\n /** CountA subtotal */\n countASubtotal?: boolean;\n /** Average subtotal */\n avgSubtotal?: boolean;\n /** Max subtotal */\n maxSubtotal?: boolean;\n /** Min subtotal */\n minSubtotal?: boolean;\n /** Count subtotal (CT_Reference @countSubtotal) */\n countSubtotal?: boolean;\n /** Product subtotal (CT_Reference @productSubtotal) */\n productSubtotal?: boolean;\n /** StdDevP subtotal (CT_Reference @stdDevPSubtotal) */\n stdDevPSubtotal?: boolean;\n /** StdDev subtotal (CT_Reference @stdDevSubtotal) */\n stdDevSubtotal?: boolean;\n /** VarP subtotal (CT_Reference @varPSubtotal) */\n varPSubtotal?: boolean;\n /** Var subtotal (CT_Reference @varSubtotal) */\n varSubtotal?: boolean;\n /** X indices */\n x?: number[];\n}\n\n/** Pivot conditional format (CT_ConditionalFormat for pivot) */\nexport interface PivotConditionalFormatOptions {\n /** Scope (default: \"selection\") */\n scope?: \"selection\" | \"data\" | \"field\";\n /** Type (default: \"none\") */\n type?: \"none\" | \"all\" | \"row\" | \"column\";\n /** Priority (required) */\n priority: number;\n /** Pivot areas */\n pivotAreas?: PivotAreaOptions[];\n}\n\n/** Chart format for pivot table (CT_ChartFormat) */\nexport interface ChartFormatOptions {\n /** Chart index (required) */\n chart: number;\n /** Format index (required) */\n format: number;\n /** Is series (default: false) */\n series?: boolean;\n /** Pivot area */\n pivotArea?: PivotAreaOptions;\n}\n\n/** Cache hierarchy for OLAP pivot caches (CT_CacheHierarchy) */\nexport interface CacheHierarchyOptions {\n /** Unique name (required) */\n uniqueName: string;\n /** Caption */\n caption?: string;\n /** Is measure (default: false) */\n measure?: boolean;\n /** Is set (default: false) */\n set?: boolean;\n /** Parent set index */\n parentSet?: number;\n /** Icon set (default: 0) */\n iconSet?: number;\n /** Is attribute (default: false) */\n attribute?: boolean;\n /** Is time dimension (default: false) */\n time?: boolean;\n /** Key attribute (default: false) */\n keyAttribute?: boolean;\n /** Default member unique name */\n defaultMemberUniqueName?: string;\n /** All unique name */\n allUniqueName?: string;\n /** All caption */\n allCaption?: string;\n /** Dimension unique name */\n dimensionUniqueName?: string;\n /** Display folder */\n displayFolder?: string;\n /** Measure group */\n measureGroup?: string;\n /** Is measures (default: false) */\n measures?: boolean;\n /** Count (required) */\n count: number;\n /** One field (default: false) */\n oneField?: boolean;\n /** Hidden (default: false) */\n hidden?: boolean;\n /** Member value datatype (CT_CacheHierarchy @memberValueDatatype) */\n memberValueDatatype?: \"string\" | \"number\" | \"integer\" | \"boolean\" | \"error\";\n /** Unbalanced (CT_CacheHierarchy @unbalanced) */\n unbalanced?: boolean;\n /** Unbalanced group (CT_CacheHierarchy @unbalancedGroup) */\n unbalancedGroup?: boolean;\n /** Group levels (CT_GroupLevels) */\n groupLevels?: GroupLevelOptions[];\n /** Fields usage (CT_FieldsUsage) */\n fieldsUsage?: FieldUsageOptions[];\n}\n\n/** KPI definition for pivot cache (CT_PCDKPI) */\nexport interface KpiOptions {\n /** Unique name (required) */\n uniqueName: string;\n /** Caption */\n caption?: string;\n /** Display folder */\n displayFolder?: string;\n /** Measure group */\n measureGroup?: string;\n /** Parent */\n parent?: string;\n /** Value expression (required) */\n value: string;\n /** Goal expression */\n goal?: string;\n /** Status expression */\n status?: string;\n /** Trend expression */\n trend?: string;\n /** Weight expression */\n weight?: string;\n /** Time expression */\n time?: string;\n}\n\n/** Measure group (CT_MeasureGroup) */\nexport interface MeasureGroupOptions {\n /** Name (required) */\n name: string;\n /** Caption (required) */\n caption: string;\n}\n\n/** Set definition (CT_Set) */\nexport interface SetOptions {\n /** Count */\n count?: number;\n /** Max rank (required) */\n maxRank: number;\n /** Set definition MDX (required) */\n setDefinition: string;\n /** Sort type (default: \"none\") */\n sortType?:\n | \"none\"\n | \"ascending\"\n | \"descending\"\n | \"ascendingAlpha\"\n | \"descendingAlpha\"\n | \"ascendingNatural\"\n | \"descendingNatural\";\n /** Query failed (default: false) */\n queryFailed?: boolean;\n /** Sort/filter tuples (CT_Set @tpls → CT_Tuples) */\n tpls?: TupleOptions[];\n /** Sort-by tuples (CT_Set @sortByTuple → CT_Tuples) */\n sortByTuple?: TupleOptions[];\n}\n\n/** Server format (CT_ServerFormat) */\nexport interface ServerFormatOptions {\n /** Culture */\n culture?: string;\n /** Format string */\n format?: string;\n}\n\n/** Field group for pivot cache (CT_FieldGroup) */\nexport interface FieldGroupOptions {\n /** Parent field index */\n parent?: number;\n /** Base field index */\n base?: number;\n /** Range properties */\n rangePr?: RangePropertiesOptions;\n /** Discrete properties */\n discretePr?: number[];\n /** Group items names */\n groupItems?: string[];\n}\n\n/** Range properties for field grouping (CT_RangePr) */\nexport interface RangePropertiesOptions {\n /** Auto start (default: true) */\n autoStart?: boolean;\n /** Auto end (default: true) */\n autoEnd?: boolean;\n /** Group by (default: \"range\") */\n groupBy?: \"range\" | \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"months\" | \"quarters\" | \"years\";\n /** Start number */\n startNum?: number;\n /** End number */\n endNum?: number;\n /** Start date ISO string */\n startDate?: string;\n /** End date ISO string */\n endDate?: string;\n /** Group interval (default: 1) */\n groupInterval?: number;\n}\n\n/** Pivot dimension (CT_PivotDimension) */\nexport interface PivotDimensionOptions {\n /** Is measure (default: false) */\n measure?: boolean;\n /** Name (required) */\n name: string;\n /** Unique name (required) */\n uniqueName: string;\n /** Caption (required) */\n caption: string;\n}\n\n/** Range set for consolidation source (CT_RangeSet) */\nexport interface RangeSetOptions {\n /** Index for page field 1 (CT_RangeSet @i1) */\n pageFieldIndex1?: number;\n /** Index for page field 2 (CT_RangeSet @i2) */\n pageFieldIndex2?: number;\n /** Index for page field 3 (CT_RangeSet @i3) */\n pageFieldIndex3?: number;\n /** Index for page field 4 (CT_RangeSet @i4) */\n pageFieldIndex4?: number;\n /** Cell reference */\n ref?: string;\n /** Named range */\n name?: string;\n /** Sheet name */\n sheet?: string;\n /** Relationship ID to external workbook */\n rId?: string;\n}\n\n/** Page item for consolidation (CT_PageItem) */\nexport interface ConsolidationPageItemOptions {\n /** Page item name */\n name: string;\n}\n\n/** Page for consolidation (CT_PCDSCPage) */\nexport interface ConsolidationPageOptions {\n /** Page items */\n items?: ConsolidationPageItemOptions[];\n}\n\n/** Consolidation source (CT_Consolidation) */\nexport interface ConsolidationOptions {\n /** Auto page (default: true) */\n autoPage?: boolean;\n /** Pages (max 4) */\n pages?: ConsolidationPageOptions[];\n /** Range sets (required) */\n rangeSets: RangeSetOptions[];\n}\n\n/** Tuple cache entry (CT_PCDSDTCEntries choice: m/n/e/s) */\nexport interface TupleCacheEntryOptions {\n /** Entry type */\n type: \"m\" | \"n\" | \"e\" | \"s\";\n /** Value (required for n/s, optional for e) */\n value?: number | string;\n /** Member-property count/caption index (CT_Number @cp) — OLAP caches only */\n captionIndex?: number;\n /** Property index (CT_Number @in) — OLAP caches only */\n propertyIndex?: number;\n /** Underline flag (CT_Number @un) */\n underline?: boolean;\n}\n\n/** Deleted field (CT_DeletedField) */\nexport interface DeletedFieldOptions {\n /** Field name */\n name: string;\n}\n\n/** Group member (CT_GroupMember) */\nexport interface GroupMemberOptions {\n /** Unique name (required) */\n uniqueName: string;\n /** Is group */\n group?: boolean;\n}\n\n/** Level group (CT_LevelGroup) */\nexport interface LevelGroupOptions {\n /** Name (required) */\n name: string;\n /** Unique name (required) */\n uniqueName: string;\n /** Caption (required) */\n caption: string;\n /** Unique parent */\n uniqueParent?: string;\n /** Group ID */\n id?: number;\n /** Members */\n members: GroupMemberOptions[];\n}\n\n/** Group level (CT_GroupLevel) */\nexport interface GroupLevelOptions {\n /** Unique name (required) */\n uniqueName: string;\n /** Caption (required) */\n caption: string;\n /** User-defined */\n user?: boolean;\n /** Custom roll-up */\n customRollUp?: boolean;\n /** Groups */\n groups?: LevelGroupOptions[];\n}\n\n/** Field usage (CT_FieldUsage) */\nexport interface FieldUsageOptions {\n /** Field index */\n value: number;\n}\n\n/** Hierarchy usage (CT_HierarchyUsage) */\nexport interface HierarchyUsageOptions {\n /** Hierarchy usage value (required) */\n hierarchyUsage: number;\n}\n\n/** Query cache entry (CT_Query) */\nexport interface QueryCacheEntryOptions {\n /** MDX query string (required) */\n mdx: string;\n /** Tuples */\n tpls?: TupleOptions[];\n}\n\n/** Tuple (CT_Tuple) */\nexport interface TupleOptions {\n /** Tuple items (field indices) */\n items?: number[];\n}\n\n/** Member property map (CT_X, used as mpMap child) */\nexport interface MpMapOptions {\n /** Field index */\n x: number;\n}\n\n/** Measure dimension map (CT_MeasureDimensionMap) */\nexport interface MeasureDimensionMapOptions {\n /** Measure group index */\n measureGroup?: number;\n /** Dimension index */\n dimension?: number;\n}\n\n/** OLAP properties for pivot cache (CT_OlapPr) */\nexport interface OLAPPropertiesOptions {\n /** Local cube connection string */\n local?: string;\n /** Local connection string */\n localConnection?: string;\n /** Send locale info to OLAP server */\n sendLocale?: boolean;\n /** Row dimensions */\n rowDrillCount?: number;\n /** Column dimensions */\n colDrillCount?: number;\n /** Local refresh (CT_OlapPr @localRefresh) */\n localRefresh?: boolean;\n /** Use server fill formatting */\n serverFill?: boolean;\n /** Use server number formatting */\n serverNumberFormat?: boolean;\n /** Use server font formatting */\n serverFont?: boolean;\n /** Use server font color */\n serverFontColor?: boolean;\n}\n\n/** Parsed source data for pivot cache generation. */\nexport interface PivotSourceData {\n fieldNames: string[];\n records: (string | number | null | Date)[][];\n}\n\n/**\n * Extract unique values from source data for a given field index.\n */\nexport function collectUniqueValues(\n records: (string | number | null | Date)[][],\n fieldIdx: number,\n): (string | number | null | Date)[] {\n const seen = new Set<string>();\n const result: (string | number | null | Date)[] = [];\n for (const row of records) {\n const val = row[fieldIdx];\n const key = val instanceof Date ? val.toISOString() : String(val);\n if (!seen.has(key)) {\n seen.add(key);\n result.push(val ?? null);\n }\n }\n return result;\n}\n\n/**\n * Check if a field is numeric (all non-empty values are numbers).\n */\nexport function isNumericField(\n records: (string | number | null | Date)[][],\n fieldIdx: number,\n): boolean {\n for (const row of records) {\n const val = row[fieldIdx];\n if (typeof val === \"string\" && val !== \"\") return false;\n }\n return true;\n}\n\n/**\n * Aggregate values using the specified function.\n */\nexport function aggregate(values: number[], func: ConsolidateFunction): number {\n if (values.length === 0) return 0;\n switch (func) {\n case \"sum\":\n return values.reduce((a, b) => a + b, 0);\n case \"count\":\n case \"countNums\":\n return values.length;\n case \"average\":\n return values.reduce((a, b) => a + b, 0) / values.length;\n case \"max\":\n // Two-arg reduce: Math.max is associative, so Math.max(a,b,c) ===\n // Math.max(Math.max(a,b),c) for all values incl. NaN/Infinity — fully\n // equivalent to Math.max(...values) without spreading onto the stack.\n return values.reduce((a, b) => Math.max(a, b));\n case \"min\":\n return values.reduce((a, b) => Math.min(a, b));\n case \"product\":\n return values.reduce((a, b) => a * b, 1);\n case \"var\":\n return sampleVariance(values);\n case \"varp\":\n return populationVariance(values);\n case \"stdDev\":\n return Math.sqrt(sampleVariance(values));\n case \"stdDevp\":\n return Math.sqrt(populationVariance(values));\n default:\n return values.reduce((a, b) => a + b, 0);\n }\n}\n\nfunction populationVariance(values: number[]): number {\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;\n}\n\nfunction sampleVariance(values: number[]): number {\n if (values.length < 2) return 0;\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n return values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / (values.length - 1);\n}\n\n// ── PivotCacheDefinition types (extracted from pivot-cache-definition-xml) ──\n\nexport interface CacheFieldExtraAttrs {\n /** Database field (CT_CacheField @databaseField) */\n databaseField?: boolean;\n /** Level (CT_CacheField @level) */\n level?: number;\n /** Mapping count (CT_CacheField @mappingCount) */\n mappingCount?: number;\n /** Member property field (CT_CacheField @memberPropertyField) */\n memberPropertyField?: number;\n /** Property name (CT_CacheField @propertyName) */\n propertyName?: string;\n /** Server field (CT_CacheField @serverField) */\n serverField?: boolean;\n /** Unique list (CT_CacheField @uniqueList) */\n uniqueList?: boolean;\n /** SQL data type (CT_CacheField @sqlType) */\n sqlType?: number;\n /** Shared items contains mixed types (CT_SharedItems @containsMixedTypes) */\n containsMixedTypes?: boolean;\n /** Shared items contains non-date (CT_SharedItems @containsNonDate) */\n containsNonDate?: boolean;\n /** Shared items long text (CT_SharedItems @longText) */\n longText?: boolean;\n /** Shared items max date (CT_SharedItems @maxDate) */\n maxDate?: string;\n /** Shared items min date (CT_SharedItems @minDate) */\n minDate?: string;\n}\n\nexport interface PivotCacheDefinitionOptions {\n /** Cache is invalid (CT_PivotCacheDefinition @invalid) */\n invalid?: boolean;\n /** Save data with cache (CT_PivotCacheDefinition @saveData) */\n saveData?: boolean;\n /** Optimize memory usage (CT_PivotCacheDefinition @optimizeMemory) */\n optimizeMemory?: boolean;\n /** Enable refresh (CT_PivotCacheDefinition @enableRefresh) */\n enableRefresh?: boolean;\n /** User who last refreshed */\n refreshedBy?: string;\n /** Date of last refresh (decimal) */\n refreshedDate?: number;\n /** Date of last refresh (ISO 8601) */\n refreshedDateIso?: string;\n /** Background query (CT_PivotCacheDefinition @backgroundQuery) */\n backgroundQuery?: boolean;\n /** Missing items limit */\n missingItemsLimit?: number;\n /** Upgrade on refresh */\n upgradeOnRefresh?: boolean;\n /** Support subquery */\n supportSubquery?: boolean;\n /** Support advanced drill */\n supportAdvancedDrill?: boolean;\n /** Refresh cache when the workbook opens (CT_PivotCacheDefinition @refreshOnLoad) */\n refreshOnLoad?: boolean;\n /** Tuple cache is stored (CT_PivotCacheDefinition @tupleCache) */\n tupleCache?: boolean;\n /** Cache hierarchies (CT_CacheHierarchies) */\n cacheHierarchies?: CacheHierarchyOptions[];\n /** KPIs (CT_PCDKPIs) */\n kpis?: KpiOptions[];\n /** Measure groups (CT_MeasureGroups) */\n measureGroups?: MeasureGroupOptions[];\n /** Dimensions (CT_Dimensions) */\n dimensions?: PivotDimensionOptions[];\n /** Sets (CT_Sets in tupleCache) */\n sets?: SetOptions[];\n /** Server formats (CT_ServerFormats) */\n serverFormats?: ServerFormatOptions[];\n /** Field groups per field index (CT_FieldGroup inside cacheField) */\n fieldGroups?: ReadonlyMap<number, FieldGroupOptions>;\n /** Consolidation source (alternative to worksheetSource) */\n consolidation?: ConsolidationOptions;\n /** Tuple cache entries (CT_PCDSDTCEntries) */\n entries?: TupleCacheEntryOptions[];\n /** Query cache (CT_QueryCache in tupleCache) */\n queryCache?: QueryCacheEntryOptions[];\n /** Member property map per cache field (mpMap) */\n mpMaps?: MpMapOptions[];\n /** Measure dimension maps (CT_MeasureDimensionMaps) */\n measureDimensionMaps?: MeasureDimensionMapOptions[];\n /** Per-field cache field overrides (mapped by field index) */\n cacheFieldOverrides?: ReadonlyMap<number, CacheFieldExtraAttrs>;\n /** OLAP properties (CT_OlapPr) */\n olapPr?: OLAPPropertiesOptions;\n}\n","/**\n * PivotTable — stringify implementation and helpers.\n *\n * @module\n */\n\nimport { attrs, escapeXml } from \"@office-open/xml\";\nimport { columnToLetter, letterToColumn } from \"@util/index\";\n\nimport { collectUniqueValues } from \"../pivot/pivot-utils\";\nimport type {\n PivotAreaOptions,\n PivotAreaReferenceOptions,\n PivotDataField,\n PivotFieldOverrideOptions,\n PivotHierarchyOptions,\n PivotSourceData,\n PivotTableOptions,\n} from \"../pivot/pivot-utils\";\n\n// ── Stringify implementation ──\n\nexport function stringifyPivotTable(\n o: PivotTableOptions,\n sd: PivotSourceData,\n cacheId: number,\n): string {\n const fields = sd.fieldNames;\n const rowFieldNames = o.rows;\n const colFieldNames = o.columns ?? [];\n const dataFields = o.data;\n const style = o.style ?? \"PivotStyleLight16\";\n const location = o.location ?? \"A3\";\n const name = o.name ?? \"PivotTable1\";\n\n const rowFieldIndices = rowFieldNames.map((n) => fields.indexOf(n));\n const colFieldIndices = colFieldNames.map((n) => fields.indexOf(n));\n const dataFieldIndices = dataFields.map((df) => fields.indexOf(df.field));\n const pageFieldNames = o.pages ?? [];\n const pageFieldIndices = pageFieldNames.map((n) => fields.indexOf(n));\n\n const pivotFieldsXml = buildPivotFields(\n o,\n sd,\n rowFieldIndices,\n colFieldIndices,\n dataFieldIndices,\n pageFieldIndices,\n );\n const pageFieldsXml = buildPageFields(o, pageFieldIndices);\n const rowFieldsXml = buildRowFields(rowFieldIndices);\n const rowItemsXml = buildRowItems(sd, rowFieldIndices);\n const colFieldsXml = buildColFields(colFieldIndices);\n const colItemsXml = buildColItems(sd, colFieldIndices, dataFields);\n const dataFieldsXml = buildDataFields(dataFields, dataFieldIndices);\n\n const locationRef = computeLocationRef(\n sd,\n location,\n rowFieldIndices,\n colFieldIndices,\n dataFields,\n );\n\n const p: string[] = [];\n const defAttrs: string[] = [\n `name=\"${escapeXml(name)}\"`,\n `cacheId=\"${cacheId}\"`,\n 'dataCaption=\"Values\"',\n 'updatedVersion=\"6\"',\n 'minRefreshableVersion=\"3\"',\n 'createdVersion=\"6\"',\n 'applyNumberFormats=\"0\"',\n 'applyBorderFormats=\"0\"',\n 'applyFontFormats=\"0\"',\n 'applyPatternFormats=\"0\"',\n 'applyAlignmentFormats=\"0\"',\n 'applyWidthHeightFormats=\"1\"',\n 'autoFormatId=\"0\"',\n 'useAutoFormatting=\"1\"',\n 'itemPrintTitles=\"1\"',\n 'indent=\"0\"',\n 'outline=\"1\"',\n 'outlineData=\"1\"',\n 'compact=\"1\"',\n 'compactData=\"1\"',\n 'rowGrandTotals=\"1\"',\n 'colGrandTotals=\"1\"',\n ];\n if (o.dataOnRows) defAttrs.push('dataOnRows=\"1\"');\n if (o.grandTotalCaption) defAttrs.push(`grandTotalCaption=\"${escapeXml(o.grandTotalCaption)}\"`);\n if (o.errorCaption) defAttrs.push(`errorCaption=\"${escapeXml(o.errorCaption)}\"`);\n if (o.showError) defAttrs.push('showError=\"1\"');\n if (o.missingCaption) defAttrs.push(`missingCaption=\"${escapeXml(o.missingCaption)}\"`);\n if (o.showMissing === false) defAttrs.push('showMissing=\"0\"');\n if (o.pageStyle) defAttrs.push(`pageStyle=\"${escapeXml(o.pageStyle)}\"`);\n if (o.pivotTableStyle) defAttrs.push(`pivotTableStyle=\"${escapeXml(o.pivotTableStyle)}\"`);\n if (o.tag) defAttrs.push(`tag=\"${escapeXml(o.tag)}\"`);\n if (o.showItems === false) defAttrs.push('showItems=\"0\"');\n if (o.editData) defAttrs.push('editData=\"1\"');\n if (o.disableFieldList) defAttrs.push('disableFieldList=\"1\"');\n if (o.showCalcMbrs === false) defAttrs.push('showCalcMbrs=\"0\"');\n if (o.visualTotals) defAttrs.push('visualTotals=\"1\"');\n if (o.showMultipleLabel === false) defAttrs.push('showMultipleLabel=\"0\"');\n if (o.showDataDropDown === false) defAttrs.push('showDataDropDown=\"0\"');\n if (o.showDrill === false) defAttrs.push('showDrill=\"0\"');\n if (o.printDrill) defAttrs.push('printDrill=\"1\"');\n if (o.showMemberPropertyTips) defAttrs.push('showMemberPropertyTips=\"1\"');\n if (o.showDataTips === false) defAttrs.push('showDataTips=\"0\"');\n if (o.enableWizard === false) defAttrs.push('enableWizard=\"0\"');\n if (o.enableDrill === false) defAttrs.push('enableDrill=\"0\"');\n if (o.enableFieldProperties === false) defAttrs.push('enableFieldProperties=\"0\"');\n if (o.pageWrap !== undefined) defAttrs.push(`pageWrap=\"${o.pageWrap}\"`);\n if (o.pageOverThenDown) defAttrs.push('pageOverThenDown=\"1\"');\n if (o.subtotalHiddenItems) defAttrs.push('subtotalHiddenItems=\"1\"');\n if (o.fieldPrintTitles) defAttrs.push('fieldPrintTitles=\"1\"');\n if (o.mergeItem) defAttrs.push('mergeItem=\"1\"');\n if (o.showDropZones === false) defAttrs.push('showDropZones=\"0\"');\n if (o.showEmptyRow) defAttrs.push('showEmptyRow=\"1\"');\n if (o.showEmptyCol) defAttrs.push('showEmptyCol=\"1\"');\n if (o.showHeaders === false) defAttrs.push('showHeaders=\"0\"');\n if (o.published) defAttrs.push('published=\"1\"');\n if (o.gridDropZones === false) defAttrs.push('gridDropZones=\"0\"');\n if (o.multipleFieldFilters === false) defAttrs.push('multipleFieldFilters=\"0\"');\n if (o.rowHeaderCaption) defAttrs.push(`rowHeaderCaption=\"${escapeXml(o.rowHeaderCaption)}\"`);\n if (o.colHeaderCaption) defAttrs.push(`colHeaderCaption=\"${escapeXml(o.colHeaderCaption)}\"`);\n if (o.fieldListSortAscending) defAttrs.push('fieldListSortAscending=\"1\"');\n if (o.mdxSubqueries) defAttrs.push('mdxSubqueries=\"1\"');\n if (o.customListSort === false) defAttrs.push('customListSort=\"0\"');\n if (o.asteriskTotals) defAttrs.push('asteriskTotals=\"1\"');\n if (o.dataPosition !== undefined) defAttrs.push(`dataPosition=\"${o.dataPosition}\"`);\n if (o.immersive) defAttrs.push('immersive=\"1\"');\n if (o.vacatedStyle) defAttrs.push(`vacatedStyle=\"${escapeXml(o.vacatedStyle)}\"`);\n if (o.chartFormat) defAttrs.push('chartFormat=\"1\"');\n if (o.preserveFormatting === false) defAttrs.push('preserveFormatting=\"0\"');\n\n p.push(\n `<pivotTableDefinition xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ${defAttrs.join(\" \")}>`,\n );\n\n // location\n const locAttrs: string[] = [\n `ref=\"${escapeXml(locationRef)}\"`,\n `firstHeaderRow=\"1\"`,\n `firstDataRow=\"${colFieldIndices.length + 1}\"`,\n `firstDataCol=\"${rowFieldIndices.length}\"`,\n ];\n if (o.locationColPageCount !== undefined)\n locAttrs.push(`colPageCount=\"${o.locationColPageCount}\"`);\n if (o.locationRowPageCount !== undefined)\n locAttrs.push(`rowPageCount=\"${o.locationRowPageCount}\"`);\n p.push(`<location ${locAttrs.join(\" \")}/>`);\n\n p.push(pivotFieldsXml);\n p.push(rowFieldsXml);\n p.push(rowItemsXml);\n if (colFieldIndices.length > 0) p.push(colFieldsXml);\n p.push(colItemsXml);\n if (pageFieldIndices.length > 0) p.push(pageFieldsXml);\n if (dataFields.length > 0) p.push(dataFieldsXml);\n\n // formats\n if (o.formats && o.formats.length > 0) {\n const fmtParts: string[] = [`<formats count=\"${o.formats.length}\">`];\n for (const fmt of o.formats) {\n const fmtAttrs: string[] = [];\n if (fmt.action && fmt.action !== \"formatting\") fmtAttrs.push(`action=\"${fmt.action}\"`);\n if (fmt.dxfId !== undefined) fmtAttrs.push(`dxfId=\"${fmt.dxfId}\"`);\n fmtParts.push(\n `<format${fmtAttrs.length ? \" \" + fmtAttrs.join(\" \") : \"\"}>${buildPivotAreaXml(fmt.pivotArea)}</format>`,\n );\n }\n fmtParts.push(\"</formats>\");\n p.push(fmtParts.join(\"\"));\n }\n\n // pivot conditionalFormats (CT_ConditionalFormats)\n if (o.pivotConditionalFormats && o.pivotConditionalFormats.length > 0) {\n const pcParts: string[] = [`<conditionalFormats count=\"${o.pivotConditionalFormats.length}\">`];\n for (const cf of o.pivotConditionalFormats) {\n const cfAttrs: string[] = [`priority=\"${cf.priority}\"`];\n if (cf.scope && cf.scope !== \"selection\") cfAttrs.push(`scope=\"${cf.scope}\"`);\n if (cf.type && cf.type !== \"none\") cfAttrs.push(`type=\"${cf.type}\"`);\n const areasXml = cf.pivotAreas?.length\n ? `<pivotAreas count=\"${cf.pivotAreas.length}\">${cf.pivotAreas.map((a) => buildPivotAreaXml(a)).join(\"\")}</pivotAreas>`\n : '<pivotAreas count=\"0\"/>';\n pcParts.push(`<conditionalFormat ${cfAttrs.join(\" \")}>${areasXml}</conditionalFormat>`);\n }\n pcParts.push(\"</conditionalFormats>\");\n p.push(pcParts.join(\"\"));\n }\n\n // chartFormats\n if (o.chartFormats && o.chartFormats.length > 0) {\n const cfParts: string[] = [`<chartFormats count=\"${o.chartFormats.length}\">`];\n for (const cf of o.chartFormats) {\n const cfAttrs: string[] = [`chart=\"${cf.chart}\"`, `format=\"${cf.format}\"`];\n if (cf.series) cfAttrs.push('series=\"1\"');\n const areaXml = cf.pivotArea ? buildPivotAreaXml(cf.pivotArea) : \"\";\n cfParts.push(`<chartFormat ${cfAttrs.join(\" \")}>${areaXml}</chartFormat>`);\n }\n cfParts.push(\"</chartFormats>\");\n p.push(cfParts.join(\"\"));\n }\n\n // pivotHierarchies\n if (o.pivotHierarchies && o.pivotHierarchies.length > 0) {\n p.push(buildPivotHierarchies(o.pivotHierarchies));\n }\n\n // pivotTableStyleInfo\n p.push(\n `<pivotTableStyleInfo name=\"${escapeXml(style)}\" showRowHeaders=\"1\" showColHeaders=\"1\" showRowStripes=\"0\" showColStripes=\"0\" showLastColumn=\"1\"/>`,\n );\n\n // filters\n if (o.filters && o.filters.length > 0) {\n const fParts: string[] = [`<filters count=\"${o.filters.length}\">`];\n for (const f of o.filters) {\n const fAttrs: Record<string, string | number | boolean | undefined> = {\n fld: f.fld,\n type: f.type,\n id: f.id,\n };\n if (f.mpFld !== undefined) fAttrs.mpFld = f.mpFld;\n if (f.evalOrder !== undefined) fAttrs.evalOrder = f.evalOrder;\n if (f.iMeasureHier !== undefined) fAttrs.iMeasureHier = f.iMeasureHier;\n if (f.iMeasureFld !== undefined) fAttrs.iMeasureFld = f.iMeasureFld;\n if (f.name) fAttrs.name = f.name;\n if (f.description) fAttrs.description = f.description;\n if (f.stringValue1) fAttrs.stringValue1 = f.stringValue1;\n if (f.stringValue2) fAttrs.stringValue2 = f.stringValue2;\n fParts.push(`<filter${attrs(fAttrs)}><autoFilter></autoFilter></filter>`);\n }\n fParts.push(\"</filters>\");\n p.push(fParts.join(\"\"));\n }\n\n // rowHierarchiesUsage\n if (o.rowHierarchiesUsage && o.rowHierarchiesUsage.length > 0) {\n const rhu = o.rowHierarchiesUsage;\n p.push(\n `<rowHierarchiesUsage count=\"${rhu.length}\">${rhu.map((h) => `<rowHierarchyUsage hierarchyUsage=\"${h.hierarchyUsage}\"/>`).join(\"\")}</rowHierarchiesUsage>`,\n );\n }\n\n // colHierarchiesUsage\n if (o.colHierarchiesUsage && o.colHierarchiesUsage.length > 0) {\n const chu = o.colHierarchiesUsage;\n p.push(\n `<colHierarchiesUsage count=\"${chu.length}\">${chu.map((h) => `<colHierarchyUsage hierarchyUsage=\"${h.hierarchyUsage}\"/>`).join(\"\")}</colHierarchiesUsage>`,\n );\n }\n\n p.push(\"</pivotTableDefinition>\");\n return p.join(\"\");\n}\n\n// ── Stringify helpers ──\n\nfunction buildFieldOverrideAttrs(fo: PivotFieldOverrideOptions): string {\n const a: string[] = [];\n if (fo.allDrilled) a.push('allDrilled=\"1\"');\n if (fo.autoShow) a.push('autoShow=\"1\"');\n if (fo.countSubtotal) a.push('countSubtotal=\"1\"');\n if (fo.avgSubtotal) a.push('avgSubtotal=\"1\"');\n if (fo.countASubtotal) a.push('countASubtotal=\"1\"');\n if (fo.maxSubtotal) a.push('maxSubtotal=\"1\"');\n if (fo.minSubtotal) a.push('minSubtotal=\"1\"');\n if (fo.sumSubtotal) a.push('sumSubtotal=\"1\"');\n if (fo.dataSourceSort) a.push('dataSourceSort=\"1\"');\n if (fo.defaultAttributeDrillState) a.push('defaultAttributeDrillState=\"1\"');\n if (fo.hiddenLevel) a.push('hiddenLevel=\"1\"');\n if (fo.hideNewItems) a.push('hideNewItems=\"1\"');\n if (fo.insertBlankRow) a.push('insertBlankRow=\"1\"');\n if (fo.insertPageBreak) a.push('insertPageBreak=\"1\"');\n if (fo.itemPageCount) a.push('itemPageCount=\"1\"');\n if (fo.measureFilter) a.push('measureFilter=\"1\"');\n if (fo.nonAutoSortDefault) a.push('nonAutoSortDefault=\"1\"');\n if (fo.productSubtotal) a.push('productSubtotal=\"1\"');\n if (fo.rankBy !== undefined) a.push(`rankBy=\"${fo.rankBy}\"`);\n if (fo.serverField) a.push('serverField=\"1\"');\n if (fo.showDropDowns) a.push('showDropDowns=\"1\"');\n if (fo.showPropAsCaption) a.push('showPropAsCaption=\"1\"');\n if (fo.showPropCell) a.push('showPropCell=\"1\"');\n if (fo.showPropTip) a.push('showPropTip=\"1\"');\n if (fo.stdDevPSubtotal) a.push('stdDevPSubtotal=\"1\"');\n if (fo.stdDevSubtotal) a.push('stdDevSubtotal=\"1\"');\n if (fo.subtotalCaption) a.push(`subtotalCaption=\"${escapeXml(fo.subtotalCaption)}\"`);\n if (fo.topAutoShow) a.push('topAutoShow=\"1\"');\n if (fo.uniqueMemberProperty) a.push('uniqueMemberProperty=\"1\"');\n if (fo.varPSubtotal) a.push('varPSubtotal=\"1\"');\n if (fo.varSubtotal) a.push('varSubtotal=\"1\"');\n return a.join(\" \");\n}\n\nfunction buildPivotFields(\n o: PivotTableOptions,\n sd: PivotSourceData,\n rowIndices: number[],\n colIndices: number[],\n dataIndices: number[],\n pageIndices: number[],\n): string {\n const fieldNames = sd.fieldNames;\n const parts: string[] = [`<pivotFields count=\"${fieldNames.length}\">`];\n\n for (let i = 0; i < fieldNames.length; i++) {\n const isRow = rowIndices.includes(i);\n const isCol = colIndices.includes(i);\n const isData = dataIndices.includes(i);\n const isPage = pageIndices.includes(i);\n const override = o.fieldOverrides?.find((fo) => fo.field === fieldNames[i]);\n const extraAttrs = override ? buildFieldOverrideAttrs(override) : \"\";\n\n if (isData) {\n const dataFieldIdx = dataIndices.indexOf(i);\n const df = o.data[dataFieldIdx];\n const dfAttrs: string[] = ['dataField=\"1\"', 'showAll=\"0\"'];\n if (extraAttrs) dfAttrs.push(extraAttrs);\n if (df?.showDataAs) dfAttrs.push(`showDataAs=\"${df.showDataAs}\"`);\n if (df?.baseField !== undefined) dfAttrs.push(`baseField=\"${df.baseField}\"`);\n if (df?.baseItem !== undefined) dfAttrs.push(`baseItem=\"${df.baseItem}\"`);\n if (o.autoSortScope) {\n parts.push(\n `<pivotField ${dfAttrs.join(\" \")}><autoSortScope>${buildPivotAreaXml(o.autoSortScope)}</autoSortScope></pivotField>`,\n );\n } else {\n parts.push(`<pivotField ${dfAttrs.join(\" \")}/>`);\n }\n } else if (isRow) {\n const uniqueVals = collectUniqueValues(sd.records, i);\n const rAttrs = extraAttrs\n ? ` axis=\"axisRow\" showAll=\"0\" ${extraAttrs}`\n : ' axis=\"axisRow\" showAll=\"0\"';\n parts.push(`<pivotField${rAttrs}>`);\n parts.push(`<items count=\"${uniqueVals.length + 1}\">`);\n for (let j = 0; j < uniqueVals.length; j++) parts.push(`<item x=\"${j}\"/>`);\n parts.push(`<item t=\"default\"${override?.defaultItemSd === false ? ' sd=\"0\"' : \"\"}/>`);\n parts.push(\"</items></pivotField>\");\n } else if (isCol) {\n const uniqueVals = collectUniqueValues(sd.records, i);\n const cAttrs = extraAttrs\n ? ` axis=\"axisCol\" showAll=\"0\" ${extraAttrs}`\n : ' axis=\"axisCol\" showAll=\"0\"';\n parts.push(`<pivotField${cAttrs}>`);\n parts.push(`<items count=\"${uniqueVals.length + 1}\">`);\n for (let j = 0; j < uniqueVals.length; j++) parts.push(`<item x=\"${j}\"/>`);\n parts.push(`<item t=\"default\"${override?.defaultItemSd === false ? ' sd=\"0\"' : \"\"}/>`);\n parts.push(\"</items></pivotField>\");\n } else if (isPage) {\n const uniqueVals = collectUniqueValues(sd.records, i);\n const pAttrs = extraAttrs\n ? ` axis=\"axisPage\" showAll=\"0\" ${extraAttrs}`\n : ' axis=\"axisPage\" showAll=\"0\"';\n parts.push(`<pivotField${pAttrs}>`);\n parts.push(`<items count=\"${uniqueVals.length + 1}\">`);\n for (let j = 0; j < uniqueVals.length; j++) parts.push(`<item x=\"${j}\"/>`);\n parts.push(`<item t=\"default\"${override?.defaultItemSd === false ? ' sd=\"0\"' : \"\"}/>`);\n parts.push(\"</items></pivotField>\");\n } else {\n const nAttrs = extraAttrs ? ` showAll=\"0\" ${extraAttrs}` : ' showAll=\"0\"';\n parts.push(`<pivotField${nAttrs}/>`);\n }\n }\n\n parts.push(\"</pivotFields>\");\n return parts.join(\"\");\n}\n\nfunction buildPageFields(o: PivotTableOptions, pageIndices: number[]): string {\n if (pageIndices.length === 0) return \"\";\n const parts: string[] = [`<pageFields count=\"${pageIndices.length}\">`];\n for (let i = 0; i < pageIndices.length; i++) {\n const cap = o.pageCaptions?.[i];\n const capAttr = cap ? ` cap=\"${escapeXml(cap)}\"` : \"\";\n const item = o.pageFieldItems?.[i];\n const itemAttr = item !== undefined ? ` item=\"${item}\"` : \"\";\n parts.push(`<pageField fld=\"${pageIndices[i]}\" hier=\"${i}\"${capAttr}${itemAttr}/>`);\n }\n parts.push(\"</pageFields>\");\n return parts.join(\"\");\n}\n\nfunction buildRowFields(rowIndices: number[]): string {\n if (rowIndices.length === 0) return '<rowFields count=\"0\"/>';\n const parts: string[] = [`<rowFields count=\"${rowIndices.length}\">`];\n for (const idx of rowIndices) parts.push(`<field x=\"${idx}\"/>`);\n parts.push(\"</rowFields>\");\n return parts.join(\"\");\n}\n\nfunction buildRowItems(sd: PivotSourceData, rowIndices: number[]): string {\n if (rowIndices.length === 0) return '<rowItems count=\"1\"><i/></rowItems>';\n\n const allUniqueCounts: number[] = [];\n for (const idx of rowIndices) {\n allUniqueCounts.push(collectUniqueValues(sd.records, idx).length);\n }\n\n if (rowIndices.length === 1) {\n const count = allUniqueCounts[0] ?? 0;\n const parts: string[] = [`<rowItems count=\"${count + 1}\">`];\n for (let i = 0; i < count; i++) parts.push(`<i><x v=\"${i}\"/></i>`);\n parts.push(`<i t=\"grand\"><x/></i>`);\n parts.push(\"</rowItems>\");\n return parts.join(\"\");\n }\n\n const combos = cartesianOfCounts(allUniqueCounts);\n const rowItems: string[] = [];\n for (const combo of combos) {\n rowItems.push(`<i>${combo.map((v) => `<x v=\"${v}\"/>`).join(\"\")}</i>`);\n }\n rowItems.push(`<i t=\"grand\">${rowIndices.map(() => \"<x/>\").join(\"\")}</i>`);\n return `<rowItems count=\"${rowItems.length}\">${rowItems.join(\"\")}</rowItems>`;\n}\n\nfunction buildColFields(colIndices: number[]): string {\n if (colIndices.length === 0) return '<colFields count=\"0\"/>';\n const parts: string[] = [`<colFields count=\"${colIndices.length}\">`];\n for (const idx of colIndices) parts.push(`<field x=\"${idx}\"/>`);\n parts.push(\"</colFields>\");\n return parts.join(\"\");\n}\n\nfunction buildColItems(\n sd: PivotSourceData,\n colIndices: number[],\n dataFields: PivotDataField[],\n): string {\n if (colIndices.length > 0) {\n const allUniqueCounts: number[] = [];\n for (const idx of colIndices) {\n allUniqueCounts.push(collectUniqueValues(sd.records, idx).length);\n }\n const combos = cartesianOfCounts(allUniqueCounts);\n const items: string[] = [];\n for (const combo of combos) {\n items.push(`<i>${combo.map((v) => `<x v=\"${v}\"/>`).join(\"\")}</i>`);\n }\n items.push(`<i t=\"grand\">${colIndices.map(() => \"<x/>\").join(\"\")}</i>`);\n return `<colItems count=\"${items.length}\">${items.join(\"\")}</colItems>`;\n }\n if (dataFields.length > 1) {\n const items = dataFields.map((_, i) => `<i><x v=\"${i}\"/></i>`);\n return `<colItems count=\"${items.length}\">${items.join(\"\")}</colItems>`;\n }\n return '<colItems count=\"1\"><i/></colItems>';\n}\n\nfunction buildDataFields(dataFields: PivotDataField[], dataFieldIndices: number[]): string {\n if (dataFields.length === 0) return '<dataFields count=\"0\"/>';\n const parts: string[] = [`<dataFields count=\"${dataFields.length}\">`];\n for (const [i, df] of dataFields.entries()) {\n const subtotal = df.summarize ?? \"sum\";\n const name = df.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df.field}`;\n const dfAttrs: string[] = [\n `name=\"${escapeXml(name)}\"`,\n `fld=\"${dataFieldIndices[i] ?? 0}\"`,\n `subtotal=\"${subtotal}\"`,\n ];\n if (df.showDataAs) dfAttrs.push(`showDataAs=\"${df.showDataAs}\"`);\n if (df.baseField !== undefined) dfAttrs.push(`baseField=\"${df.baseField}\"`);\n if (df.baseItem !== undefined) dfAttrs.push(`baseItem=\"${df.baseItem}\"`);\n parts.push(`<dataField ${dfAttrs.join(\" \")}/>`);\n }\n parts.push(\"</dataFields>\");\n return parts.join(\"\");\n}\n\nfunction computeLocationRef(\n sd: PivotSourceData,\n location: string,\n rowFieldIndices: number[],\n colFieldIndices: number[],\n dataFields: PivotDataField[],\n): string {\n const startCell = location.split(\":\")[0] ?? location;\n const match = startCell.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return location;\n const startCol = match[1] ?? \"\";\n const startRow = parseInt(match[2] ?? \"0\", 10);\n\n let rowCount = 1;\n const rowFieldIndex0 = rowFieldIndices[0];\n if (rowFieldIndex0 !== undefined) {\n rowCount += collectUniqueValues(sd.records, rowFieldIndex0).length;\n }\n rowCount += 1;\n\n let colCount = Math.max(rowFieldIndices.length, 1);\n const colFieldIndex0 = colFieldIndices[0];\n if (colFieldIndex0 !== undefined) {\n colCount += collectUniqueValues(sd.records, colFieldIndex0).length;\n } else if (dataFields.length > 1) {\n colCount += dataFields.length - 1;\n }\n colCount += 1;\n\n const endCol = columnToLetter(letterToColumn(startCol) + colCount - 1);\n const endRow = startRow + rowCount - 1;\n return `${startCol}${startRow}:${endCol}${endRow}`;\n}\n\nfunction buildPivotHierarchies(hierarchies: PivotHierarchyOptions[]): string {\n const parts: string[] = [`<pivotHierarchies count=\"${hierarchies.length}\">`];\n for (const h of hierarchies) {\n const hAttrs: string[] = [];\n if (h.outline) hAttrs.push('outline=\"1\"');\n if (h.multipleItemSelectionAllowed) hAttrs.push('multipleItemSelectionAllowed=\"1\"');\n if (h.subtotalTop) hAttrs.push('subtotalTop=\"1\"');\n if (h.showInFieldList === false) hAttrs.push('showInFieldList=\"0\"');\n if (h.dragToRow === false) hAttrs.push('dragToRow=\"0\"');\n if (h.dragToCol === false) hAttrs.push('dragToCol=\"0\"');\n if (h.dragToPage === false) hAttrs.push('dragToPage=\"0\"');\n if (h.dragToData) hAttrs.push('dragToData=\"1\"');\n if (h.dragOff === false) hAttrs.push('dragOff=\"0\"');\n if (h.includeNewItemsInFilter) hAttrs.push('includeNewItemsInFilter=\"1\"');\n if (h.caption) hAttrs.push(`caption=\"${escapeXml(h.caption)}\"`);\n const inner =\n (h.memberProperties\n ? `<mps count=\"${h.memberProperties.length}\">${h.memberProperties\n .map((mp) => {\n const mpAttrs: string[] = [`field=\"${mp.field}\"`];\n if (mp.name !== undefined) mpAttrs.push(`name=\"${escapeXml(mp.name)}\"`);\n if (mp.showCell) mpAttrs.push('showCell=\"1\"');\n if (mp.showTip) mpAttrs.push('showTip=\"1\"');\n if (mp.showAsCaption) mpAttrs.push('showAsCaption=\"1\"');\n if (mp.nameLen !== undefined) mpAttrs.push(`nameLen=\"${mp.nameLen}\"`);\n if (mp.pPos !== undefined) mpAttrs.push(`pPos=\"${mp.pPos}\"`);\n if (mp.pLen !== undefined) mpAttrs.push(`pLen=\"${mp.pLen}\"`);\n return `<mp ${mpAttrs.join(\" \")}/>`;\n })\n .join(\"\")}</mps>`\n : \"\") +\n (h.members\n ? `<members count=\"${h.members.length}\">${h.members.map((m) => `<member name=\"${escapeXml(m.name)}\"${m.level !== undefined ? ` level=\"${m.level}\"` : \"\"}/>`).join(\"\")}</members>`\n : \"\");\n if (inner) {\n parts.push(`<pivotHierarchy ${hAttrs.join(\" \")}>${inner}</pivotHierarchy>`);\n } else {\n parts.push(`<pivotHierarchy ${hAttrs.join(\" \")}/>`);\n }\n }\n parts.push(\"</pivotHierarchies>\");\n return parts.join(\"\");\n}\n\nexport function buildPivotAreaXml(area: PivotAreaOptions): string {\n const aAttrs: string[] = [];\n if (area.field !== undefined) aAttrs.push(`field=\"${area.field}\"`);\n if (area.type) aAttrs.push(`type=\"${area.type}\"`);\n if (area.dataOnly === false) aAttrs.push('dataOnly=\"0\"');\n if (area.labelOnly) aAttrs.push('labelOnly=\"1\"');\n if (area.grandRow) aAttrs.push('grandRow=\"1\"');\n if (area.grandCol) aAttrs.push('grandCol=\"1\"');\n if (area.cacheIndex) aAttrs.push('cacheIndex=\"1\"');\n if (area.outline === false) aAttrs.push('outline=\"0\"');\n if (area.offset) aAttrs.push(`offset=\"${escapeXml(area.offset)}\"`);\n if (area.collapsedLevelsAreSubtotals) aAttrs.push('collapsedLevelsAreSubtotals=\"1\"');\n if (area.axis) aAttrs.push(`axis=\"${area.axis}\"`);\n if (area.fieldPosition !== undefined) aAttrs.push(`fieldPosition=\"${area.fieldPosition}\"`);\n const refsXml = area.references ? buildPivotAreaReferences(area.references) : \"\";\n if (refsXml) return `<pivotArea ${aAttrs.join(\" \")}>${refsXml}</pivotArea>`;\n return `<pivotArea ${aAttrs.join(\" \")}/>`;\n}\n\nfunction buildPivotAreaReferences(refs: PivotAreaReferenceOptions[]): string {\n const parts: string[] = [`<references count=\"${refs.length}\">`];\n for (const ref of refs) {\n const rAttrs: string[] = [];\n if (ref.field !== undefined) rAttrs.push(`field=\"${ref.field}\"`);\n if (ref.count !== undefined) rAttrs.push(`count=\"${ref.count}\"`);\n if (ref.selected === false) rAttrs.push('selected=\"0\"');\n if (ref.byPosition) rAttrs.push('byPosition=\"1\"');\n if (ref.relative) rAttrs.push('relative=\"1\"');\n if (ref.defaultSubtotal) rAttrs.push('defaultSubtotal=\"1\"');\n if (ref.sumSubtotal) rAttrs.push('sumSubtotal=\"1\"');\n if (ref.avgSubtotal) rAttrs.push('avgSubtotal=\"1\"');\n if (ref.countASubtotal) rAttrs.push('countASubtotal=\"1\"');\n if (ref.maxSubtotal) rAttrs.push('maxSubtotal=\"1\"');\n if (ref.minSubtotal) rAttrs.push('minSubtotal=\"1\"');\n const xXml = ref.x ? ref.x.map((v) => `<x v=\"${v}\"/>`).join(\"\") : \"\";\n if (xXml) {\n parts.push(`<reference ${rAttrs.join(\" \")}>${xXml}</reference>`);\n } else {\n parts.push(`<reference ${rAttrs.join(\" \")}/>`);\n }\n }\n parts.push(\"</references>\");\n return parts.join(\"\");\n}\n\nfunction cartesianOfCounts(counts: number[]): number[][] {\n if (counts.length === 0) return [[]];\n let result: number[][] = [[]];\n for (const count of counts) {\n const next: number[][] = [];\n for (const prefix of result) {\n for (let i = 0; i < count; i++) next.push([...prefix, i]);\n }\n result = next;\n }\n return result;\n}\n","/**\n * Worksheet — option types for xl/worksheets/sheet{n}.xml.\n *\n * @module\n */\nimport type {\n BasePictureOptions,\n ChartSpaceOptions,\n DataType,\n PositiveUniversalMeasure,\n UniversalMeasure,\n} from \"@office-open/core\";\n\nimport type { ConnectorOptions, GroupOptions, ShapeOptions } from \"../drawing\";\nimport type { PivotTableOptions } from \"../pivot\";\nimport type { PivotAreaOptions } from \"../pivot/pivot-utils\";\nimport type { QueryTableOptions } from \"../query-table\";\nimport type { SharedStrings } from \"../shared-strings\";\nimport type { Styles, StyleOptions } from \"../styles\";\nimport type { TableOptions } from \"../table\";\nimport type { SingleXmlCellOptions } from \"../xml-mapping\";\n\n// ── Option interfaces ──\n\nexport interface ColumnOptions {\n min: number;\n max: number;\n width?: number;\n hidden?: boolean;\n customWidth?: boolean;\n outlineLevel?: number;\n collapsed?: boolean;\n /** Best-fit column width (CT_Col @bestFit) */\n bestFit?: boolean;\n /** Phonetic text for CJK (CT_Col @phonetic) */\n phonetic?: boolean;\n}\n\nexport interface RowOptions {\n cells?: CellOptions[];\n height?: number | UniversalMeasure;\n hidden?: boolean;\n rowNumber?: number;\n /** Spans for the row, e.g. \"1:15\" (CT_Row @spans) */\n spans?: string;\n /** Custom format applied (CT_Row @customFormat) */\n customFormat?: boolean;\n /** Thick top border (CT_Row @thickTop) */\n thickTop?: boolean;\n /** Thick bottom border (CT_Row @thickBot) */\n thickBot?: boolean;\n /** Phonetic text (CT_Row @ph) */\n phonetic?: boolean;\n}\n\n/** Rich text run properties (CT_RPrElt). */\nexport interface RichTextRunPropertiesOptions {\n /** Font name (CT_FontName → rFont) */\n font?: string;\n /** Character set (CT_IntProperty) */\n charset?: number;\n /** Font family (CT_IntProperty) */\n family?: number;\n /** Bold */\n bold?: boolean;\n /** Italic */\n italic?: boolean;\n /** Strikethrough */\n strike?: boolean;\n /** Outline */\n outline?: boolean;\n /** Shadow */\n shadow?: boolean;\n /** Condense */\n condense?: boolean;\n /** Extend */\n extend?: boolean;\n /** Font color (hex RGB, e.g. \"FF0000\") */\n color?: string;\n /** Font size in points */\n size?: number;\n /** Underline type */\n underline?: \"single\" | \"double\" | \"singleAccounting\" | \"doubleAccounting\" | \"none\";\n /** Vertical alignment */\n vertAlign?: \"superscript\" | \"subscript\" | \"baseline\";\n /** Font scheme */\n scheme?: \"major\" | \"minor\" | \"none\";\n}\n\n/** A single rich text run (CT_RElt). */\nexport interface RichTextRunOptions {\n /** Run properties (optional = inherits from parent) */\n properties?: RichTextRunPropertiesOptions;\n /** Run text content */\n text: string;\n}\n\n/** Phonetics run for CJK (CT_PhoneticRun → rPh). */\nexport interface PhoneticRunOptions {\n /** Start byte offset in base text (CT_PhoneticRun @sb) */\n startByte: number;\n /** End byte offset in base text (CT_PhoneticRun @eb) */\n endByte: number;\n /** Phonetic text */\n text: string;\n}\n\n/** Rich text content (CT_Rst). Either plain text or rich runs. */\nexport interface RichTextOptions {\n /** Plain text (mutually exclusive with runs) */\n text?: string;\n /** Rich text runs (mutually exclusive with text) */\n runs?: RichTextRunOptions[];\n /** Phonetic runs for CJK (CT_PhoneticRun) */\n phonetics?: PhoneticRunOptions[];\n}\n\nexport interface CellOptions {\n value?: string | number | boolean | Date | RichTextOptions | null;\n reference?: string;\n /** Direct style index (for pre-resolved styles) */\n styleIndex?: number;\n /** Style options (resolved to index at compile time) */\n style?: StyleOptions;\n /**\n * Formula options. When set, value becomes the cached result. A bare string\n * is shorthand for `{ formula: \"...\" }`.\n */\n formula?: string | FormulaOptions;\n /** Cell metadata block id, 1-based index into metadata.cellMetadata (CT_Cell @cm) */\n cellMetadataId?: number;\n /** Value metadata block id, 1-based index into metadata.valueMetadata (CT_Cell @vm) */\n valueMetadataId?: number;\n}\n\n/** Cell formula type (maps to ST_CellFormulaType). */\nexport const FormulaType = {\n NORMAL: \"normal\",\n ARRAY: \"array\",\n SHARED: \"shared\",\n} as const;\n\nexport type FormulaType = (typeof FormulaType)[keyof typeof FormulaType];\n\n/** Options for a cell formula (maps to CT_CellFormula). */\nexport interface FormulaOptions {\n /** Formula expression, e.g. \"SUM(A1:B1)\" */\n formula: string;\n /** Formula type (default: \"normal\") */\n type?: FormulaType;\n /** Reference range for array/shared formulas, e.g. \"C1:C10\" */\n reference?: string;\n /** Shared formula group index (required for shared formulas) */\n sharedIndex?: number;\n /** Always calculate array (CT_CellFormula @aca) */\n aca?: boolean;\n /** 2-D data table (CT_CellFormula @dt2D) */\n dt2D?: boolean;\n /** Data table row (CT_CellFormula @dtr) */\n dtr?: boolean;\n /** Delete input cell 1 (CT_CellFormula @del1) */\n del1?: boolean;\n /** Delete input cell 2 (CT_CellFormula @del2) */\n del2?: boolean;\n /** Input cell 1 reference (CT_CellFormula @r1) */\n inputCell1?: string;\n /** Input cell 2 reference (CT_CellFormula @r2) */\n inputCell2?: string;\n /** Calculate cell (CT_CellFormula @ca) */\n calculateCell?: boolean;\n /** Array formula context (CT_CellFormula @bx) */\n arrayContext?: boolean;\n}\n\n/** Input cell for a what-if scenario (maps to CT_InputCells). */\nexport interface ScenarioCellOptions {\n /** Cell reference, e.g. \"B2\" (CT_InputCells @r) */\n reference: string;\n /** Cell value for this scenario */\n val: string | number;\n /** Whether the value is deleted */\n deleted?: boolean;\n /** Whether undone (CT_InputCells @undone) */\n undone?: boolean;\n}\n\n/** A single what-if scenario (maps to CT_Scenario). */\nexport interface ScenarioDefinition {\n /** Scenario name */\n name: string;\n /** Input cells with their values for this scenario */\n inputCells: ScenarioCellOptions[];\n /** Sort/order count */\n count?: number;\n /** Creator user name */\n user?: string;\n /** Comment */\n comment?: string;\n /** Whether the scenario is hidden */\n hidden?: boolean;\n /** Whether the scenario is locked */\n locked?: boolean;\n}\n\n/** Scenarios for what-if analysis (maps to CT_Scenarios). */\nexport interface ScenarioOptions {\n /** Named scenarios */\n scenarios: ScenarioDefinition[];\n /** Current scenario index (0-based) */\n current?: number;\n /** Show scenario index (0-based) */\n show?: number;\n}\n\nexport interface MergeCellOptions {\n from: { row: number; col: number };\n to: { row: number; col: number };\n}\n\nexport interface SheetProtectionOptions {\n /** Plain-text password — legacy Excel hash is computed automatically */\n password?: string;\n /** Modern encryption: algorithm name (e.g. \"SHA-512\") */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: string;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: string;\n /** Modern encryption: spin count for hash iteration */\n spinCount?: number;\n /** Set true to enable sheet protection (required for protection flags to take effect) */\n sheet?: boolean;\n objects?: boolean;\n scenarios?: boolean;\n formatCells?: boolean;\n formatColumns?: boolean;\n formatRows?: boolean;\n insertColumns?: boolean;\n insertRows?: boolean;\n insertHyperlinks?: boolean;\n deleteColumns?: boolean;\n deleteRows?: boolean;\n selectLockedCells?: boolean;\n sort?: boolean;\n autoFilter?: boolean;\n pivotTables?: boolean;\n selectUnlockedCells?: boolean;\n}\n\n/** A named protected range within a sheet (CT_ProtectedRange) */\nexport interface ProtectedRangeOptions {\n /** Range reference (required), e.g. \"A1:C10\" */\n sqref: string;\n /** Range name (required) */\n name: string;\n /** Plain-text password — legacy hash computed automatically */\n password?: string;\n /** Modern encryption: algorithm name */\n algorithmName?: string;\n /** Modern encryption: base64-encoded hash value */\n hashValue?: string;\n /** Modern encryption: base64-encoded salt value */\n saltValue?: string;\n /** Modern encryption: spin count */\n spinCount?: number;\n /** Security descriptor (SID string, emitted as the attribute form) */\n securityDescriptor?: string;\n}\n\nexport interface FreezePaneOptions {\n /** Row split position (1-based, freezes rows above) */\n row?: number;\n /** Column split position (1-based, freezes columns to the left) */\n col?: number;\n}\n\n/**\n * Picture anchored to a worksheet cell.\n *\n * Extends the cross-format {@link BasePictureOptions} (binary data + non-visual\n * drawing properties) with a 1-based cell anchor. The base cNvPr fields\n * (name/description/title/hidden) flow through to the drawing's cNvPr.\n */\nexport interface PictureOptions extends Omit<BasePictureOptions, \"type\"> {\n type: \"png\" | \"jpg\";\n col: number;\n row: number;\n}\n\nexport interface WorksheetChartOptions extends ChartSpaceOptions {\n /** 1-based column position for the chart */\n col: number;\n /** 1-based row position for the chart */\n row: number;\n}\n\nexport interface SheetViewOptions {\n showGridLines?: boolean;\n showRowColHeaders?: boolean;\n showZeros?: boolean;\n zoomScale?: number;\n tabSelected?: boolean;\n rightToLeft?: boolean;\n /** Window protection (CT_SheetView @windowProtection) */\n windowProtection?: boolean;\n /** Show formulas instead of values (CT_SheetView @showFormulas) */\n showFormulas?: boolean;\n /** Show ruler (CT_SheetView @showRuler) */\n showRuler?: boolean;\n /** Show outline symbols (CT_SheetView @showOutlineSymbols) */\n showOutlineSymbols?: boolean;\n /** Default grid color (CT_SheetView @defaultGridColor) */\n defaultGridColor?: boolean;\n /** Show white space (CT_SheetView @showWhiteSpace) */\n showWhiteSpace?: boolean;\n /** View type (CT_SheetView @view) */\n view?: \"normal\" | \"pageBreakPreview\" | \"pageLayout\";\n /** Tab color ID (CT_SheetView @colorId) */\n colorId?: number;\n /** Zoom scale for normal view (CT_SheetView @zoomScaleNormal) */\n zoomScaleNormal?: number;\n /** Zoom scale for sheet layout view (CT_SheetView @zoomScaleSheetLayoutView) */\n zoomScaleSheetLayoutView?: number;\n /** Zoom scale for page layout view (CT_SheetView @zoomScalePageLayoutView) */\n zoomScalePageLayoutView?: number;\n}\n\nexport type HyperlinkTarget =\n | { type: \"external\"; url: string }\n | { type: \"internal\"; location: string };\n\nexport interface HyperlinkOptions {\n /** Cell reference, e.g. \"A1\" */\n cell: string;\n /** Hyperlink target */\n target: HyperlinkTarget;\n /** Tooltip text */\n tooltip?: string;\n /** Display text */\n display?: string;\n}\n\nexport interface HeaderFooterOptions {\n oddHeader?: string;\n oddFooter?: string;\n evenHeader?: string;\n evenFooter?: string;\n firstHeader?: string;\n firstFooter?: string;\n differentOddEven?: boolean;\n differentFirst?: boolean;\n /** Scale header/footer with document (CT_HeaderFooter @scaleWithDoc) */\n scaleWithDoc?: boolean;\n /** Align with page margins (CT_HeaderFooter @alignWithMargins) */\n alignWithMargins?: boolean;\n}\n\nexport type PageOrientation = \"default\" | \"portrait\" | \"landscape\";\n\nexport interface PageSetupOptions {\n paperSize?: number;\n orientation?: PageOrientation;\n scale?: number;\n fitToWidth?: number;\n fitToHeight?: number;\n pageOrder?: \"downThenOver\" | \"overThenDown\";\n useFirstPageNumber?: boolean;\n firstPageNumber?: number;\n /** Paper height (CT_PageSetup @paperHeight, ST_PositiveUniversalMeasure) */\n paperHeight?: number | PositiveUniversalMeasure;\n /** Paper width (CT_PageSetup @paperWidth, ST_PositiveUniversalMeasure) */\n paperWidth?: number | PositiveUniversalMeasure;\n /** Use printer defaults (CT_PageSetup @usePrinterDefaults) */\n usePrinterDefaults?: boolean;\n /** Black and white printing (CT_PageSetup @blackAndWhite) */\n blackAndWhite?: boolean;\n /** Draft quality printing (CT_PageSetup @draft) */\n draft?: boolean;\n /** Print cell comments mode (CT_PageSetup @cellComments) */\n cellComments?: \"none\" | \"asDisplayed\" | \"atEnd\";\n /** Print error display mode (CT_PageSetup @errors) */\n errors?: \"displayed\" | \"blank\" | \"dash\" | \"NA\";\n /** Auto page breaks (CT_PageSetUpPr @autoPageBreaks) */\n autoPageBreaks?: boolean;\n /** Fit to page (CT_PageSetUpPr @fitToPage) */\n fitToPage?: boolean;\n}\n\nexport interface TabColorOptions {\n /** RGB color string, e.g. \"FF0000\" */\n rgb?: string;\n /** Theme color index (0-based) */\n theme?: number;\n /** Tint value (-1.0 to 1.0) */\n tint?: number;\n /** Indexed color (CT_Color @indexed) */\n indexed?: number;\n}\n\n/** Cell corner marker (CT_Marker): 0-based column/row plus EMU offsets. */\nexport interface AnchorMarkerOptions {\n /** 0-based column index */\n col: number;\n /** Offset within the column, in EMU (default: 0) */\n colOff?: number;\n /** 0-based row index */\n row: number;\n /** Offset within the row, in EMU (default: 0) */\n rowOff?: number;\n}\n\n/** Object anchor (CT_ObjectAnchor). */\nexport interface ObjectAnchorOptions {\n /** Move with cells (default: false) */\n moveWithCells?: boolean;\n /** Size with cells (default: false) */\n sizeWithCells?: boolean;\n /** Anchor start corner (xdr:from, CT_Marker) */\n from?: AnchorMarkerOptions;\n /** Anchor end corner (xdr:to, CT_Marker) */\n to?: AnchorMarkerOptions;\n}\n\n/**\n * Comment property (CT_CommentPr).\n *\n * Parsed but never re-emitted: a commentPr alongside the sheet's legacy VML\n * note drawing produces a file Excel refuses to open — commentPr and the VML\n * note shape are rival property systems for the same note, and Excel reads\n * note properties from the shape's x:ClientData. The fields survive parse so\n * callers can inspect them; stringify always drops them.\n */\nexport interface CommentPropertiesOptions {\n /** Locked */\n locked?: boolean;\n /** Default size */\n defaultSize?: boolean;\n /** Print */\n print?: boolean;\n /** Disabled */\n disabled?: boolean;\n /** Auto fill */\n autoFill?: boolean;\n /** Auto line */\n autoLine?: boolean;\n /** Alt text */\n altText?: string;\n /** Text horizontal alignment */\n textHAlign?: \"left\" | \"center\" | \"right\" | \"justify\" | \"distributed\";\n /** Text vertical alignment */\n textVAlign?: \"top\" | \"center\" | \"bottom\" | \"justify\" | \"distributed\";\n /** Lock text */\n lockText?: boolean;\n /** Justify last line */\n justLastX?: boolean;\n /** Auto scale */\n autoScale?: boolean;\n /** Object anchor position */\n anchor?: ObjectAnchorOptions;\n}\n\nexport interface CommentOptions {\n /** Cell reference, e.g. \"A1\" */\n cell: string;\n /** Author name */\n author: string;\n /** Comment text (plain string or rich text) */\n text: string | RichTextOptions;\n /** Comment properties (CT_CommentPr) — parsed but never re-emitted (see CommentPropertiesOptions) */\n commentPr?: CommentPropertiesOptions;\n /**\n * Note shape anchor (x:Anchor in the VML part) — 8 numbers: fromColumn,\n * fromColumnOffsetPx, fromRow, fromRowOffsetPx, toColumn, toColumnOffsetPx,\n * toRow, toRowOffsetPx. Absent → the default 2×2-cell offset anchored at\n * the comment's cell.\n */\n anchor?: number[];\n /** Whether the note is pinned visible. Default false (hidden until hover). */\n visible?: boolean;\n /** Note shape size in points. Absent → 108 × 59.25 pt. */\n size?: { width: number; height: number };\n}\n\nexport type DataValidationType =\n | \"none\"\n | \"whole\"\n | \"decimal\"\n | \"list\"\n | \"date\"\n | \"time\"\n | \"textLength\"\n | \"custom\";\nexport type DataValidationOperator =\n | \"between\"\n | \"notBetween\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"lessThan\"\n | \"greaterThanOrEqual\"\n | \"lessThanOrEqual\";\n\nexport interface DataValidationOptions {\n /** Cell range, e.g. \"A1:A10\" */\n sqref: string;\n type?: DataValidationType;\n operator?: DataValidationOperator;\n formula1?: string;\n formula2?: string;\n allowBlank?: boolean;\n showErrorMessage?: boolean;\n errorTitle?: string;\n error?: string;\n showInputMessage?: boolean;\n promptTitle?: string;\n prompt?: string;\n /** Error style (CT_DataValidation @errorStyle) */\n errorStyle?: \"stop\" | \"warning\" | \"information\";\n /** IME mode (CT_DataValidation @imeMode) */\n imeMode?:\n | \"noControl\"\n | \"on\"\n | \"off\"\n | \"disabled\"\n | \"hiragana\"\n | \"fullKatakana\"\n | \"halfKatakana\"\n | \"fullAlpha\"\n | \"halfAlpha\"\n | \"fullHangul\"\n | \"halfHangul\";\n /** Show drop-down (CT_DataValidation @showDropDown — note inverted semantics in OOXML) */\n showDropDown?: boolean;\n}\n\nexport type ConditionalFormatType =\n | \"cellIs\"\n | \"containsText\"\n | \"expression\"\n | \"top10\"\n | \"aboveAverage\"\n | \"colorScale\"\n | \"dataBar\"\n | \"iconSet\";\nexport type ConditionalFormatOperator =\n | \"lessThan\"\n | \"lessThanOrEqual\"\n | \"equal\"\n | \"notEqual\"\n | \"greaterThanOrEqual\"\n | \"greaterThan\"\n | \"between\"\n | \"notBetween\"\n | \"containsText\"\n | \"notContains\"\n | \"beginsWith\"\n | \"endsWith\";\n\n/** Conditional format value object type (ST_CfvoType) */\nexport type CfvoType = \"num\" | \"percent\" | \"max\" | \"min\" | \"formula\" | \"percentile\";\n\n/** Conditional format value object */\nexport interface CfvoOptions {\n type: CfvoType;\n val?: string | number;\n /** Greater than or equal (default: true) */\n gte?: boolean;\n}\n\n/** Icon set type (ST_IconSetType) */\nexport type IconSetType =\n | \"3Arrows\"\n | \"3ArrowsGray\"\n | \"3Flags\"\n | \"3TrafficLights1\"\n | \"3TrafficLights2\"\n | \"3Signs\"\n | \"3Symbols\"\n | \"3Symbols2\"\n | \"4Arrows\"\n | \"4ArrowsGray\"\n | \"4RedToBlack\"\n | \"4Rating\"\n | \"4TrafficLights\"\n | \"5Arrows\"\n | \"5ArrowsGray\"\n | \"5Rating\"\n | \"5Quarters\";\n\n/** Color scale rule configuration */\nexport interface ColorScaleOptions {\n /** Conditional format values (minimum 2, typically 2 or 3) */\n cfvo: CfvoOptions[];\n /** Colors for each value (same count as cfvo) — RGB hex without alpha, e.g. \"FF0000\" */\n colors: string[];\n}\n\n/** Data bar rule configuration */\nexport interface DataBarOptions {\n /** Minimum and maximum value objects (exactly 2) */\n cfvo: [CfvoOptions, CfvoOptions];\n /** Bar color — RGB hex without alpha, e.g. \"638EC6\" */\n color: string;\n /** Minimum bar length as percentage (default: 10) */\n minLength?: number;\n /** Maximum bar length as percentage (default: 90) */\n maxLength?: number;\n /** Whether to show cell values (default: true) */\n showValue?: boolean;\n}\n\n/** Icon set rule configuration */\nexport interface IconSetOptions {\n /** Conditional format values (minimum 2) */\n cfvo: CfvoOptions[];\n /** Icon set type (default: \"3TrafficLights1\") */\n iconSet?: IconSetType;\n /** Whether to show cell values (default: true) */\n showValue?: boolean;\n /** Whether values are percentages (default: true) */\n percent?: boolean;\n /** Whether to reverse icon order (default: false) */\n reverse?: boolean;\n}\n\nexport interface ConditionalFormatRule {\n type: ConditionalFormatType;\n operator?: ConditionalFormatOperator;\n /** Formula(s) — up to 3 */\n formulas?: string[];\n priority?: number;\n /** Reference to a dxf (differential format) in the styles table */\n dxfId?: number;\n /** Color scale configuration (when type is \"colorScale\") */\n colorScale?: ColorScaleOptions;\n /** Data bar configuration (when type is \"dataBar\") */\n dataBar?: DataBarOptions;\n /** Icon set configuration (when type is \"iconSet\") */\n iconSet?: IconSetOptions;\n /** Stop if true — skip remaining rules (CT_CfRule @stopIfTrue) */\n stopIfTrue?: boolean;\n /** Time period for date-based highlighting (CT_CfRule @timePeriod) */\n timePeriod?:\n | \"today\"\n | \"yesterday\"\n | \"tomorrow\"\n | \"last7Days\"\n | \"thisMonth\"\n | \"lastMonth\"\n | \"nextMonth\"\n | \"thisWeek\"\n | \"lastWeek\"\n | \"nextWeek\";\n /** Rank for top/bottom rules (CT_CfRule @rank) */\n rank?: number;\n /** Equal average flag (CT_CfRule @equalAverage) */\n equalAverage?: boolean;\n /** Above average flag (CT_CfRule @aboveAverage, default true for aboveAverage rules) */\n aboveAverage?: boolean;\n /** Standard deviations for above-average rules (CT_CfRule @stdDev) */\n stdDev?: number;\n}\n\nexport interface ConditionalFormatOptions {\n /** Cell range, e.g. \"A1:A10\" */\n sqref: string;\n rules: ConditionalFormatRule[];\n}\n\nexport interface Top10FilterOptions {\n colId: number;\n top?: boolean;\n percent?: boolean;\n val: number;\n /** Filter value (CT_Top10 @filterVal) */\n filterVal?: number;\n /** Hide auto-filter button (CT_FilterColumn @hiddenButton) */\n hiddenButton?: boolean;\n /** Show filter button (CT_FilterColumn @showButton) */\n showButton?: boolean;\n}\n\nexport interface CustomFilterOptions {\n colId: number;\n operator?:\n | \"equal\"\n | \"notEqual\"\n | \"greaterThan\"\n | \"greaterThanOrEqual\"\n | \"lessThan\"\n | \"lessThanOrEqual\";\n val?: string;\n and?: boolean;\n val2?: string;\n /** Hide auto-filter button (CT_FilterColumn @hiddenButton) */\n hiddenButton?: boolean;\n /** Show filter button (CT_FilterColumn @showButton) */\n showButton?: boolean;\n}\n\nexport interface SortCondition {\n /** Cell reference for the sort column, e.g. \"B1\" */\n ref: string;\n descending?: boolean;\n /** Sort by (CT_SortCondition @sortBy) */\n sortBy?: \"value\" | \"cellColor\" | \"fontColor\" | \"icon\";\n /** Custom sort list (CT_SortCondition @customList) */\n customList?: string;\n /** Icon set index (CT_SortCondition @iconId) */\n iconId?: number;\n}\n\nexport interface AutoFilterOptions {\n /** Range, e.g. \"A1:D10\" */\n ref: string;\n top10?: Top10FilterOptions[];\n customFilters?: CustomFilterOptions[];\n sort?: SortCondition[];\n /** Sort state options */\n sortState?: SortStateOptions;\n /** Color filters (CT_ColorFilter) */\n colorFilters?: ColorFilterOptions[];\n /** Icon filters (CT_IconFilter) */\n iconFilters?: IconFilterOptions[];\n /** Dynamic filters (CT_DynamicFilter) */\n dynamicFilters?: DynamicFilterOptions[];\n /** Date group items in filters (CT_DateGroupItem) */\n dateGroupItems?: DateGroupFilterOptions[];\n /** Simple filters with values (CT_Filters) */\n filters?: FilterItemsOptions[];\n}\n\n/** Color filter (CT_ColorFilter) */\nexport interface ColorFilterOptions {\n /** Column ID */\n colId: number;\n /** Cell color RGB (dxfId used if not set) */\n dxfId?: number;\n /** Filter by cell color (CT_ColorFilter @cellColor) */\n cellColor?: boolean;\n}\n\n/** Icon filter (CT_IconFilter) */\nexport interface IconFilterOptions {\n /** Column ID */\n colId: number;\n /** Icon set index (CT_IconFilter @iconSet) */\n iconSet: number;\n /** Icon ID within set (CT_IconFilter @iconId) */\n iconId?: number;\n}\n\n/** Filter items (CT_Filters) */\nexport interface FilterItemsOptions {\n /** Column ID */\n colId: number;\n /** Blank filter (CT_Filters @blank) */\n blank?: boolean;\n /** Calendar type (CT_Filters @calendarType) */\n calendarType?: string;\n /** Filter values */\n values?: string[];\n}\n\n/** Dynamic filter (CT_DynamicFilter) */\nexport interface DynamicFilterOptions {\n /** Column ID */\n colId: number;\n /** Dynamic filter type (CT_DynamicFilter @type) */\n type:\n | \"null\"\n | \"aboveAverage\"\n | \"belowAverage\"\n | \"tomorrow\"\n | \"today\"\n | \"yesterday\"\n | \"nextWeek\"\n | \"thisWeek\"\n | \"lastWeek\"\n | \"nextMonth\"\n | \"thisMonth\"\n | \"lastMonth\"\n | \"nextQuarter\"\n | \"thisQuarter\"\n | \"lastQuarter\"\n | \"nextYear\"\n | \"thisYear\"\n | \"lastYear\"\n | \"yearToDate\"\n | \"Q1\"\n | \"Q2\"\n | \"Q3\"\n | \"Q4\"\n | \"M1\"\n | \"M2\"\n | \"M3\"\n | \"M4\"\n | \"M5\"\n | \"M6\"\n | \"M7\"\n | \"M8\"\n | \"M9\"\n | \"M10\"\n | \"M11\"\n | \"M12\";\n /** Max value (CT_DynamicFilter @val) */\n val?: number;\n /** Max value as date ISO string (CT_DynamicFilter @maxVal) */\n maxVal?: number;\n /** Value ISO date string (CT_DynamicFilter @valIso) */\n valIso?: string;\n /** Max value ISO date string (CT_DynamicFilter @maxValIso) */\n maxValIso?: string;\n}\n\n/** Date group filter item (CT_DateGroupItem) */\nexport interface DateGroupFilterOptions {\n /** Column ID */\n colId: number;\n /** Date grouping level (CT_DateGroupItem @dateTimeGrouping) */\n dateTimeGrouping: \"year\" | \"month\" | \"day\" | \"hour\" | \"minute\" | \"second\";\n /** Year (CT_DateGroupItem @year) */\n year?: number;\n /** Month (1-12, CT_DateGroupItem @month) */\n month?: number;\n /** Day (1-31, CT_DateGroupItem @day) */\n day?: number;\n /** Hour (0-23, CT_DateGroupItem @hour) */\n hour?: number;\n /** Minute (0-59, CT_DateGroupItem @minute) */\n minute?: number;\n /** Second (0-59, CT_DateGroupItem @second) */\n second?: number;\n}\n\n/** Sort state configuration (CT_SortState) */\nexport interface SortStateOptions {\n /** Column sort mode (CT_SortState @columnSort) */\n columnSort?: boolean;\n /** Case sensitive sorting (CT_SortState @caseSensitive) */\n caseSensitive?: boolean;\n /** Sort method (CT_SortState @sortMethod) */\n sortMethod?: \"pinYin\" | \"stroke\" | \"none\";\n}\n\n/** Print options (CT_PrintOptions) */\nexport interface PrintOptions {\n /** Center horizontally on page */\n horizontalCentered?: boolean;\n /** Center vertically on page */\n verticalCentered?: boolean;\n /** Print row/column headings */\n headings?: boolean;\n /** Print grid lines */\n gridLines?: boolean;\n /** Grid lines set flag */\n gridLinesSet?: boolean;\n}\n\n/** Sheet format properties (CT_SheetFormatPr) */\nexport interface SheetFormatPropertiesOptions {\n /** Base column width (CT_SheetFormatPr @baseColWidth) */\n baseColWidth?: number;\n /** Default column width (CT_SheetFormatPr @defaultColWidth) */\n defaultColWidth?: number;\n /** Default row height */\n defaultRowHeight?: number;\n /** Zero height rows hidden (CT_SheetFormatPr @zeroHeight) */\n zeroHeight?: boolean;\n /** Thick top borders (CT_SheetFormatPr @thickTop) */\n thickTop?: boolean;\n /** Thick bottom borders (CT_SheetFormatPr @thickBottom) */\n thickBottom?: boolean;\n /** Outline level row (CT_SheetFormatPr @outlineLevelRow) */\n outlineLevelRow?: number;\n /** Outline level column (CT_SheetFormatPr @outlineLevelCol) */\n outlineLevelCol?: number;\n}\n\n/** Sheet properties extended options (CT_SheetPr attributes) */\nexport interface SheetPropertiesOptions {\n /** Sync horizontal scroll (CT_SheetPr @syncHorizontal) */\n syncHorizontal?: boolean;\n /** Sync vertical scroll (CT_SheetPr @syncVertical) */\n syncVertical?: boolean;\n /** Sync reference (CT_SheetPr @syncRef) */\n syncRef?: string;\n /** Transition evaluation mode (CT_SheetPr @transitionEvaluation) */\n transitionEvaluation?: boolean;\n /** Transition entry mode (CT_SheetPr @transitionEntry) */\n transitionEntry?: boolean;\n /** Published to server (CT_SheetPr @published) */\n published?: boolean;\n /** Filter mode (CT_SheetPr @filterMode) */\n filterMode?: boolean;\n /** Enable format conditions calculation (CT_SheetPr @enableFormatConditionsCalculation) */\n enableFormatConditionsCalculation?: boolean;\n /** Outline apply styles (CT_OutlinePr @applyStyles) */\n outlineApplyStyles?: boolean;\n /** Outline show symbols (CT_OutlinePr @showOutlineSymbols) */\n outlineShowSymbols?: boolean;\n /** Outline summary rows below detail (CT_OutlinePr @summaryBelow) */\n outlineSummaryBelow?: boolean;\n /** Outline summary columns right of detail (CT_OutlinePr @summaryRight) */\n outlineSummaryRight?: boolean;\n}\n\n/** An ignored error entry — suppresses specific Excel error checks for a range. */\nexport interface IgnoredErrorOptions {\n /** Cell range, e.g. \"A1:A10\" (required) */\n sqref: string;\n evalError?: boolean;\n twoDigitTextYear?: boolean;\n numberStoredAsText?: boolean;\n formula?: boolean;\n formulaRange?: boolean;\n unlockedFormula?: boolean;\n emptyCellReference?: boolean;\n listDataValidation?: boolean;\n calculatedColumn?: boolean;\n}\n\n/** Phonetic properties for CJK text (CT_PhoneticPr) */\nexport interface PhoneticPropertiesOptions {\n /** Font ID from the styles table (required) */\n fontId: number;\n /** Phonetic type (default: \"fullwidthKatakana\") */\n type?: \"fullwidthKatakana\" | \"halfwidthKatakana\" | \"Hiragana\" | \"noConversion\";\n /** Alignment (default: \"left\") */\n alignment?: \"left\" | \"center\" | \"distributed\";\n}\n\n/** Background image for a worksheet */\nexport interface SheetBackgroundImageOptions {\n data: DataType;\n type: \"png\" | \"jpg\";\n}\n\n/** Page break entry (CT_Break) */\nexport interface PageBreakOptions {\n /** Row or column ID (1-based) */\n id: number;\n /** Min value (CT_Break @min) */\n min?: number;\n /** Max value (CT_Break @max) */\n max?: number;\n /** Manual break (CT_Break @man) */\n manual?: boolean;\n /** Pivot break (CT_Break @pt) */\n pivot?: boolean;\n}\n\n/** Selection in sheet view (CT_Selection) */\nexport interface SelectionOptions {\n /** Pane (CT_Selection @pane) */\n pane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n /** Active cell (CT_Selection @activeCell) */\n activeCell?: string;\n /** Active cell index (CT_Selection @activeCellId) */\n activeCellId?: number;\n /** Selected range (CT_Selection @sqref) */\n sqref?: string;\n}\n\n/** Pivot selection in sheet view (CT_PivotSelection) */\nexport interface PivotSelectionOptions {\n /** Pane (CT_PivotSelection @pane, default \"topLeft\") */\n pane?: \"bottomRight\" | \"topRight\" | \"bottomLeft\" | \"topLeft\";\n /** Show header (default false) */\n showHeader?: boolean;\n /** Label selection (default false) */\n label?: boolean;\n /** Data selection (default false) */\n data?: boolean;\n /** Extendable (default false) */\n extendable?: boolean;\n /** Selection count (default 0) */\n count?: number;\n /** Axis */\n axis?: \"axisRow\" | \"axisCol\" | \"axisPage\" | \"axisValues\";\n /** Dimension (default 0) */\n dimension?: number;\n /** Start (default 0) */\n start?: number;\n /** Min (default 0) */\n min?: number;\n /** Max (default 0) */\n max?: number;\n /** Active row (default 0) */\n activeRow?: number;\n /** Active column (default 0) */\n activeCol?: number;\n /** Previous row (default 0) */\n previousRow?: number;\n /** Previous column (default 0) */\n previousCol?: number;\n /** Click count (default 0) */\n click?: number;\n /** Relationship id (r:id, OLAP pivot selection part) */\n rId?: string;\n /** Pivot area (required child) */\n pivotArea?: PivotAreaOptions;\n}\n\n/** Smart tag property (CT_CellSmartTagPr) */\nexport interface CellSmartTagPropertyOptions {\n /** Property key (required) */\n key: string;\n /** Property value (required) */\n val: string;\n}\n\n/** Smart tag on a cell (CT_CellSmartTag) */\nexport interface CellSmartTagOptions {\n /** Smart tag type index (required) */\n type: number;\n /** Deleted (default false) */\n deleted?: boolean;\n /** XML-based (default false) */\n xmlBased?: boolean;\n /** Properties */\n properties?: CellSmartTagPropertyOptions[];\n}\n\n/** Cell smart tags (CT_CellSmartTags) */\nexport interface CellSmartTagsOptions {\n /** Cell reference (required) */\n reference: string;\n /** Smart tags */\n smartTags: CellSmartTagOptions[];\n}\n\n/** Custom sheet view (CT_CustomSheetView) */\nexport interface CustomSheetViewOptions {\n /** GUID identifier (required, CT_CustomSheetView @guid) */\n guid: string;\n /** Zoom scale (CT_CustomSheetView @scale) */\n scale?: number;\n /** Show page breaks (CT_CustomSheetView @showPageBreaks) */\n showPageBreaks?: boolean;\n /** Show formulas (CT_CustomSheetView @showFormulas) */\n showFormulas?: boolean;\n /** Show grid lines (CT_CustomSheetView @showGridLines) */\n showGridLines?: boolean;\n /** Show row/column headers (CT_CustomSheetView @showRowCol) */\n showRowColHeaders?: boolean;\n /** Show outline symbols (CT_CustomSheetView @outlineSymbols) */\n outlineSymbols?: boolean;\n /** Show zero values (CT_CustomSheetView @zeroValues) */\n zeroValues?: boolean;\n /** Fit to page (CT_CustomSheetView @fitToPage) */\n fitToPage?: boolean;\n /** Print area (CT_CustomSheetView @printArea) */\n printArea?: boolean;\n /** Filter applied (CT_CustomSheetView @filter) */\n filter?: boolean;\n /** Show auto filter (CT_CustomSheetView @showAutoFilter) */\n showAutoFilter?: boolean;\n /** Hidden rows (CT_CustomSheetView @hiddenRows) */\n hiddenRows?: boolean;\n /** Hidden columns (CT_CustomSheetView @hiddenColumns) */\n hiddenColumns?: boolean;\n /** Sheet state (CT_CustomSheetView @state) */\n state?: \"visible\" | \"hidden\" | \"veryHidden\";\n /** Filter unique (CT_CustomSheetView @filterUnique) */\n filterUnique?: boolean;\n /** View type (CT_CustomSheetView @view) */\n view?: \"normal\" | \"pageBreakPreview\" | \"pageLayout\";\n}\n\n/** Cell watch entry (CT_CellWatch) */\nexport interface CellWatchOptions {\n /** Cell reference, e.g. \"A1\" (CT_CellWatch @r) */\n reference: string;\n}\n\n/** Data consolidation (CT_DataConsolidate) */\nexport interface DataConsolidateOptions {\n /** Consolidation function (CT_DataConsolidate @function) */\n function?:\n | \"average\"\n | \"count\"\n | \"countNums\"\n | \"max\"\n | \"min\"\n | \"product\"\n | \"stdDev\"\n | \"stdDevp\"\n | \"sum\"\n | \"var\"\n | \"varp\";\n /** Use top row labels (CT_DataConsolidate @topLabels) */\n topLabels?: boolean;\n /** Use left column labels (CT_DataConsolidate @leftLabels) */\n leftLabels?: boolean;\n /** Use start labels (CT_DataConsolidate @startLabels) */\n startLabels?: boolean;\n /** Link to source data (CT_DataConsolidate @link) */\n link?: boolean;\n /** Source data references */\n refs?: string[];\n}\n\n/** Drawing in header/footer (CT_DrawingHF) */\nexport interface DrawingHfOptions {\n /** Relationship ID for the drawing (required) */\n rId: string;\n lho?: number;\n lhe?: number;\n lhf?: number;\n cho?: number;\n che?: number;\n chf?: number;\n rho?: number;\n rhe?: number;\n rhf?: number;\n lfo?: number;\n lfe?: number;\n lff?: number;\n cfo?: number;\n cfe?: number;\n cff?: number;\n rfo?: number;\n rfe?: number;\n rff?: number;\n}\n\nexport interface WorksheetOptions {\n name?: string;\n rows?: RowOptions[];\n columns?: ColumnOptions[];\n mergeCells?: MergeCellOptions[];\n freezePanes?: FreezePaneOptions;\n protection?: SheetProtectionOptions;\n /** Named protected ranges within this sheet */\n protectedRanges?: ProtectedRangeOptions[];\n /** What-if scenarios */\n scenarios?: ScenarioOptions;\n /** Auto-filter configuration */\n autoFilter?: string | AutoFilterOptions;\n images?: PictureOptions[];\n charts?: WorksheetChartOptions[];\n /** Anchored shapes (xdr:sp): geometry + optional text body. */\n shapes?: ShapeOptions[];\n /** Anchored connectors (xdr:cxnSp): line/arrow geometry. */\n connectors?: ConnectorOptions[];\n /** Anchored groups (xdr:grpSp): group transform + nested children. */\n groups?: GroupOptions[];\n dataValidations?: DataValidationOptions[];\n /** Disable data validation prompts (CT_DataValidations @disablePrompts) */\n dataValidationsDisablePrompts?: boolean;\n conditionalFormats?: ConditionalFormatOptions[];\n hyperlinks?: HyperlinkOptions[];\n comments?: CommentOptions[];\n headerFooter?: HeaderFooterOptions;\n pageSetup?: PageSetupOptions;\n tabColor?: TabColorOptions;\n sheetView?: SheetViewOptions;\n pivotTables?: PivotTableOptions[];\n /** Tables (list objects) for this worksheet */\n tables?: TableOptions[];\n /** Ignored errors — suppress specific Excel error checks for cell ranges */\n ignoredErrors?: IgnoredErrorOptions[];\n /** Phonetic properties for CJK text */\n phoneticPr?: PhoneticPropertiesOptions;\n /** Background image for the worksheet */\n backgroundImage?: SheetBackgroundImageOptions;\n /** Print options (CT_PrintOptions) */\n printOptions?: PrintOptions;\n /** Sheet format properties (CT_SheetFormatPr) */\n sheetFormatPr?: SheetFormatPropertiesOptions;\n /** Sheet extended properties (CT_SheetPr attributes) */\n sheetPr?: SheetPropertiesOptions;\n /** Row page breaks (CT_PageBreaks) */\n rowBreaks?: PageBreakOptions[];\n /** Column page breaks (CT_PageBreaks) */\n colBreaks?: PageBreakOptions[];\n /** Custom sheet views (CT_CustomSheetViews) */\n customSheetViews?: CustomSheetViewOptions[];\n /** Cell watches (CT_CellWatches) */\n cellWatches?: CellWatchOptions[];\n /** Data consolidation (CT_DataConsolidate) */\n dataConsolidate?: DataConsolidateOptions;\n /** OLE embedded range (CT_OleSize) */\n oleSize?: string;\n /** Drawing in header/footer (CT_DrawingHF) */\n drawingHF?: DrawingHfOptions;\n /** Legacy drawing for header/footer r:id (CT_LegacyDrawingHF) */\n legacyDrawingHF?: string;\n /** Selection in sheet view (CT_Selection) */\n selection?: SelectionOptions;\n /** Pivot selection in sheet view (CT_PivotSelection) */\n pivotSelection?: PivotSelectionOptions;\n /** Cell smart tags (CT_SmartTags) */\n smartTags?: CellSmartTagsOptions[];\n /** Query tables on this sheet (xl/queryTables/queryTableN.xml) */\n queryTables?: QueryTableOptions[];\n /** Single-cell XML tables on this sheet (xl/tables/tableSingleCellsN.xml) */\n singleXmlCells?: SingleXmlCellOptions[];\n /** Sheet calc properties (CT_SheetCalcPr) */\n sheetCalcPr?: SheetCalculationPropertiesOptions;\n /** Extension list (extLst) */\n ext?: string;\n /** Control objects (CT_Controls) */\n controls?: ControlOptions[];\n /** Custom sheet properties (CT_CustomProperties) */\n customProperties?: CustomSheetPropertyOptions[];\n /** OLE objects (CT_OleObjects) */\n oleObjects?: OleObjectOptions[];\n /** Web publish items (CT_WebPublishItems) */\n webPublishItems?: WebPublishItemOptions[];\n /** Page margins in inches (CT_PageMargins) */\n pageMargins?: PageMarginsOptions;\n /** Cell range dimension (CT_Dimension ref); auto-computed when omitted */\n dimension?: string;\n}\n\n/** Page margins in inches (CT_PageMargins). Numbers are inches; strings are UniversalMeasure. */\nexport interface PageMarginsOptions {\n left?: number | UniversalMeasure;\n right?: number | UniversalMeasure;\n top?: number | UniversalMeasure;\n bottom?: number | UniversalMeasure;\n header?: number | UniversalMeasure;\n footer?: number | UniversalMeasure;\n}\n\n/** Sheet calc properties (CT_SheetCalcPr) */\nexport interface SheetCalculationPropertiesOptions {\n /** Full calc on load (CT_SheetCalcPr @fullCalcOnLoad) */\n fullCalcOnLoad?: boolean;\n}\n\n/** Form control object (CT_Control) */\nexport interface ControlOptions {\n /** Shape ID (CT_Control @shapeId) */\n shapeId: number;\n /** Control r:id (CT_ControlPr @r:id) */\n rId: string;\n /** Control name (CT_ControlPr @name) */\n name?: string;\n /** Locked (CT_ControlPr @locked) */\n locked?: boolean;\n /** UI-locked (CT_ControlPr @uiObject) */\n uiObject?: boolean;\n /** Recalc always (CT_ControlPr @recalcAlways) */\n recalcAlways?: boolean;\n /** Linked cell (CT_ControlPr @linkedCell) */\n linkedCell?: string;\n /** List fill range (CT_ControlPr @listFillRange) */\n listFillRange?: string;\n /** Control formula (CT_ControlPr @cf) */\n formula?: string;\n}\n\n/** Custom property (CT_CustomProperty) */\nexport interface CustomSheetPropertyOptions {\n /** Property name */\n name: string;\n /** Relationship ID to binary data */\n rId: string;\n}\n\n/** OLE object (CT_OleObject) */\nexport interface OleObjectOptions {\n /** Program ID (CT_OleObject @progId) */\n progId?: string;\n /** Display aspect (CT_OleObject @dvAspect) */\n dvAspect?: \"DVASPECT_CONTENT\" | \"DVASPECT_ICON\";\n /** Linked source (CT_OleObject @link) */\n link?: string;\n /** OLE update mode (CT_OleObject @oleUpdate) */\n oleUpdate?: \"OLEUPDATE_ALWAYS\" | \"OLEUPDATE_ONCALL\";\n /** Auto load (CT_OleObject @autoLoad) */\n autoLoad?: boolean;\n /** Shape ID (CT_OleObject @shapeId) */\n shapeId: number;\n /** Relationship ID (CT_OleObject @r:id) */\n rId?: string;\n /** Object properties (CT_ObjectPr) */\n objectPr?: OleObjectPropertiesOptions;\n}\n\n/** OLE object properties (CT_ObjectPr) */\nexport interface OleObjectPropertiesOptions {\n /** Locked */\n locked?: boolean;\n /** Default size */\n defaultSize?: boolean;\n /** Print */\n print?: boolean;\n /** Disabled */\n disabled?: boolean;\n /** UI object */\n uiObject?: boolean;\n /** Auto fill */\n autoFill?: boolean;\n /** Auto line */\n autoLine?: boolean;\n /** Auto picture */\n autoPict?: boolean;\n /** Macro */\n macro?: string;\n /** Alt text */\n altText?: string;\n /** DDE */\n dde?: boolean;\n /** Relationship ID */\n rId?: string;\n}\n\n/** Web publish item (CT_WebPublishItem) */\nexport interface WebPublishItemOptions {\n /** Item ID */\n id: number;\n /** HTML div ID */\n divId: string;\n /** Source type */\n sourceType:\n | \"sheet\"\n | \"printArea\"\n | \"autoFilter\"\n | \"range\"\n | \"chart\"\n | \"pivotTable\"\n | \"query\"\n | \"label\";\n /** Source cell reference */\n sourceRef?: string;\n /** Source object name */\n sourceObject?: string;\n /** Destination file path */\n destinationFile: string;\n /** Title */\n title?: string;\n /** Auto republish */\n autoRepublish?: boolean;\n}\n\n// ── Worksheet XML builder context ──\n\n/** Minimal context needed by buildWorksheetXml. */\nexport interface WorksheetContext {\n sharedStrings?: SharedStrings;\n styles?: Styles;\n}\n","/**\n * Worksheet — stringify implementation for xl/worksheets/sheet{n}.xml.\n *\n * Zero-allocation fast path: directly concatenates XML string, bypassing\n * the intermediate object tree entirely.\n *\n * @module\n */\nimport { convertToInch, convertToPt, derivePasswordHash } from \"@office-open/core\";\nimport { attrs, escapeXml, selfCloseElement } from \"@office-open/xml\";\nimport { columnToLetter, dateToSerialNumber, hashPassword } from \"@util/index\";\n\nimport { stringifyAutoFilter } from \"../auto-filter\";\nimport { buildPivotAreaXml } from \"../pivot-table/stringify\";\nimport { buildRstXml } from \"../shared-strings\";\nimport type { SharedStrings } from \"../shared-strings\";\nimport type { Styles } from \"../styles\";\nimport { FormulaType } from \"./types\";\nimport type {\n CellOptions,\n CfvoOptions,\n FormulaOptions,\n PivotSelectionOptions,\n RowOptions,\n SelectionOptions,\n SheetViewOptions,\n WorksheetContext,\n WorksheetOptions,\n} from \"./types\";\n\n/**\n * Build the complete worksheet XML string.\n *\n * Zero-allocation fast path: directly concatenates XML string,\n * bypassing the intermediate object tree entirely.\n */\nexport function stringifyWorksheet(opts: WorksheetOptions, ctx: WorksheetContext): string {\n const sharedStrings = ctx.sharedStrings;\n const styles = ctx.styles;\n\n const rows = opts.rows ?? [];\n const columns = opts.columns ?? [];\n const mergeCells = opts.mergeCells ?? [];\n const protectedRanges = opts.protectedRanges ?? [];\n const ignoredErrors = opts.ignoredErrors ?? [];\n const rowBreaks = opts.rowBreaks ?? [];\n const colBreaks = opts.colBreaks ?? [];\n const customSheetViews = opts.customSheetViews ?? [];\n const cellWatches = opts.cellWatches ?? [];\n const controls = opts.controls ?? [];\n const customProperties = opts.customProperties ?? [];\n const oleObjects = opts.oleObjects ?? [];\n const webPublishItems = opts.webPublishItems ?? [];\n\n const p: string[] = [\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' +\n ' mc:Ignorable=\"x14ac xr xr2 xr3\"' +\n ' xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\"' +\n ' xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"' +\n ' xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"' +\n ' xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\">',\n ];\n\n // Sheet properties (tabColor, outlinePr go here)\n const hasTabColor = !!opts.tabColor;\n const hasOutline = columns.some((c) => c.outlineLevel !== undefined);\n const sp = opts.sheetPr;\n const hasSheetPrAttrs =\n sp &&\n (sp.syncHorizontal ||\n sp.syncVertical ||\n sp.syncRef ||\n sp.transitionEvaluation ||\n sp.transitionEntry ||\n sp.published ||\n sp.filterMode ||\n sp.enableFormatConditionsCalculation);\n const hasPageSetUpPr =\n !!opts.pageSetup?.fitToWidth ||\n !!opts.pageSetup?.fitToHeight ||\n !!opts.pageSetup?.autoPageBreaks;\n if (hasTabColor || hasOutline || hasSheetPrAttrs || hasPageSetUpPr) {\n const prParts: string[] = [];\n const prAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sp?.syncHorizontal) prAttrs.syncHorizontal = 1;\n if (sp?.syncVertical) prAttrs.syncVertical = 1;\n if (sp?.syncRef) prAttrs.syncRef = sp.syncRef;\n if (sp?.transitionEvaluation) prAttrs.transitionEvaluation = 1;\n if (sp?.transitionEntry) prAttrs.transitionEntry = 1;\n if (sp?.published) prAttrs.published = 1;\n if (sp?.filterMode) prAttrs.filterMode = 1;\n if (sp?.enableFormatConditionsCalculation) prAttrs.enableFormatConditionsCalculation = 1;\n if (opts.tabColor) {\n const tc = opts.tabColor;\n const tcAttrs: Record<string, string | number | boolean | undefined> = {};\n if (tc.rgb) tcAttrs.rgb = tc.rgb;\n if (tc.theme !== undefined) tcAttrs.theme = tc.theme;\n if (tc.tint !== undefined) tcAttrs.tint = tc.tint;\n if (tc.indexed !== undefined) tcAttrs.indexed = tc.indexed;\n prParts.push(`<tabColor${attrs(tcAttrs)}/>`);\n }\n if (hasOutline) {\n const outAttrs: Record<string, string | number | boolean | undefined> = {\n summaryBelow: 1,\n summaryRight: 1,\n };\n if (sp?.outlineSummaryBelow === false) outAttrs.summaryBelow = 0;\n if (sp?.outlineSummaryRight === false) outAttrs.summaryRight = 0;\n if (sp?.outlineApplyStyles) outAttrs.applyStyles = 1;\n if (sp?.outlineShowSymbols === false) outAttrs.showOutlineSymbols = 0;\n prParts.push(`<outlinePr${attrs(outAttrs)}/>`);\n }\n // pageSetUpPr (inside sheetPr when fitToPage or autoPageBreaks needed)\n if (\n opts.pageSetup?.fitToWidth ||\n opts.pageSetup?.fitToHeight ||\n opts.pageSetup?.autoPageBreaks\n ) {\n const psupAttrs: Record<string, string | number | boolean | undefined> = {};\n if (opts.pageSetup?.fitToWidth || opts.pageSetup?.fitToHeight) psupAttrs.fitToPage = 1;\n if (opts.pageSetup?.autoPageBreaks) psupAttrs.autoPageBreaks = 1;\n prParts.push(`<pageSetUpPr${attrs(psupAttrs)}/>`);\n }\n const prAttrStr = Object.keys(prAttrs).length > 0 ? attrs(prAttrs) : \"\";\n p.push(`<sheetPr${prAttrStr}>${prParts.join(\"\")}</sheetPr>`);\n }\n\n // Dimension — defines the used range of the sheet\n const maxRow = rows.length;\n let maxCol = 0;\n for (const row of rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n if (opts.dimension) {\n p.push(`<dimension ref=\"${opts.dimension}\"/>`);\n } else if (maxRow > 0 && maxCol > 0) {\n const dimRef = `A1:${defaultCellRef(maxRow, maxCol)}`;\n p.push(`<dimension ref=\"${dimRef}\"/>`);\n }\n\n // Sheet views\n if (opts.freezePanes) {\n const fp = opts.freezePanes;\n const ySplit = fp.row ? fp.row : 0;\n const xSplit = fp.col ? fp.col : 0;\n const topRow = fp.row ? fp.row + 1 : 1;\n const leftCol = fp.col ? fp.col + 1 : 1;\n const topLeftCell = defaultCellRef(topRow, leftCol);\n const activePane =\n ySplit > 0 && xSplit > 0 ? \"bottomRight\" : ySplit > 0 ? \"bottomLeft\" : \"topRight\";\n const svAttrs = buildSheetViewAttrs(opts.sheetView);\n p.push(\n `<sheetViews><sheetView${svAttrs}>`,\n `<pane ySplit=\"${ySplit}\" xSplit=\"${xSplit}\" topLeftCell=\"${topLeftCell}\" activePane=\"${activePane}\" state=\"frozen\"/>`,\n opts.selection ? buildSelectionXml(opts.selection) : \"\",\n opts.pivotSelection ? buildPivotSelectionXml(opts.pivotSelection) : \"\",\n \"</sheetView></sheetViews>\",\n );\n } else {\n const svAttrs = buildSheetViewAttrs(opts.sheetView);\n const innerXml =\n (opts.selection ? buildSelectionXml(opts.selection) : \"\") +\n (opts.pivotSelection ? buildPivotSelectionXml(opts.pivotSelection) : \"\");\n if (innerXml) {\n p.push(`<sheetViews><sheetView${svAttrs}>${innerXml}</sheetView></sheetViews>`);\n } else {\n p.push(`<sheetViews><sheetView${svAttrs}/></sheetViews>`);\n }\n }\n\n // Sheet format — default row height\n if (opts.sheetFormatPr) {\n const sfp = opts.sheetFormatPr;\n const sfpAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sfp.baseColWidth !== undefined) sfpAttrs.baseColWidth = sfp.baseColWidth;\n if (sfp.defaultColWidth !== undefined) sfpAttrs.defaultColWidth = sfp.defaultColWidth;\n sfpAttrs.defaultRowHeight = sfp.defaultRowHeight ?? 15;\n if (sfp.zeroHeight) sfpAttrs.zeroHeight = 1;\n if (sfp.thickTop) sfpAttrs.thickTop = 1;\n if (sfp.thickBottom) sfpAttrs.thickBottom = 1;\n if (sfp.outlineLevelRow !== undefined) sfpAttrs.outlineLevelRow = sfp.outlineLevelRow;\n if (sfp.outlineLevelCol !== undefined) sfpAttrs.outlineLevelCol = sfp.outlineLevelCol;\n p.push(`<sheetFormatPr${attrs(sfpAttrs)}/>`);\n } else {\n p.push('<sheetFormatPr baseColWidth=\"10\" defaultRowHeight=\"15\"/>');\n }\n\n // Column definitions\n if (columns.length > 0) {\n p.push(\"<cols>\");\n for (const col of columns) {\n const colAttrs: Record<string, string | number | boolean | undefined> = {\n min: col.min,\n max: col.max,\n };\n if (col.width !== undefined) {\n colAttrs.width = col.width;\n colAttrs.customWidth = 1;\n }\n // A column can carry customWidth=\"1\" without a width (parse fills it);\n // preserve the explicit flag so round-trip does not drop the attribute.\n if (col.customWidth) colAttrs.customWidth = 1;\n if (col.hidden) {\n colAttrs.hidden = 1;\n }\n if (col.outlineLevel !== undefined) {\n colAttrs.outlineLevel = col.outlineLevel;\n }\n if (col.collapsed) {\n colAttrs.collapsed = 1;\n }\n if (col.bestFit) {\n colAttrs.bestFit = 1;\n }\n if (col.phonetic) {\n colAttrs.phonetic = 1;\n }\n p.push(selfCloseElement(\"col\", attrs(colAttrs)));\n }\n p.push(\"</cols>\");\n }\n\n // Sheet data (rows + cells) — the hot path, shared with the streaming writer.\n p.push(\"<sheetData>\");\n appendSheetDataRows(rows, p, sharedStrings, styles);\n p.push(\"</sheetData>\");\n\n // Sheet calc properties (after sheetData per XSD sequence)\n if (opts.sheetCalcPr) {\n const scAttrs: string[] = [];\n if (opts.sheetCalcPr.fullCalcOnLoad) scAttrs.push('fullCalcOnLoad=\"1\"');\n p.push(`<sheetCalcPr${scAttrs.length ? \" \" + scAttrs.join(\" \") : \"\"}/>`);\n }\n\n // Row breaks (after sheetCalcPr per XSD sequence)\n if (rowBreaks.length > 0) {\n let manualCount = 0;\n const brkParts = rowBreaks.map((b) => {\n const bAttrs: Record<string, string | number | boolean | undefined> = { id: b.id };\n if (b.min !== undefined) bAttrs.min = b.min;\n if (b.max !== undefined) bAttrs.max = b.max;\n if (b.manual) {\n bAttrs.man = 1;\n manualCount++;\n }\n if (b.pivot) bAttrs.pt = 1;\n return `<brk${attrs(bAttrs)}/>`;\n });\n p.push(\n `<rowBreaks count=\"${rowBreaks.length}\" manualBreakCount=\"${manualCount}\">${brkParts.join(\"\")}</rowBreaks>`,\n );\n }\n\n // Column breaks\n if (colBreaks.length > 0) {\n let manualCount = 0;\n const brkParts = colBreaks.map((b) => {\n const bAttrs: Record<string, string | number | boolean | undefined> = { id: b.id };\n if (b.min !== undefined) bAttrs.min = b.min;\n if (b.max !== undefined) bAttrs.max = b.max;\n if (b.manual) {\n bAttrs.man = 1;\n manualCount++;\n }\n if (b.pivot) bAttrs.pt = 1;\n return `<brk${attrs(bAttrs)}/>`;\n });\n p.push(\n `<colBreaks count=\"${colBreaks.length}\" manualBreakCount=\"${manualCount}\">${brkParts.join(\"\")}</colBreaks>`,\n );\n }\n\n // Custom properties (CT_CustomProperties, after colBreaks per XSD sequence)\n if (customProperties.length > 0) {\n const cpParts: string[] = [\"<customProperties>\"];\n for (const cp of customProperties) {\n cpParts.push(`<customPr name=\"${escapeXml(cp.name)}\" r:id=\"${escapeXml(cp.rId)}\"/>`);\n }\n cpParts.push(\"</customProperties>\");\n p.push(cpParts.join(\"\"));\n }\n\n // OLE size\n if (opts.oleSize) {\n p.push(`<oleSize ref=\"${escapeXml(opts.oleSize)}\"/>`);\n }\n\n // Custom sheet views (after oleSize per XSD sequence)\n if (customSheetViews.length > 0) {\n p.push(\"<customSheetViews>\");\n for (const csv of customSheetViews) {\n const csvAttrs: Record<string, string | number | boolean | undefined> = { guid: csv.guid };\n if (csv.scale !== undefined) csvAttrs.scale = csv.scale;\n if (csv.showPageBreaks) csvAttrs.showPageBreaks = 1;\n if (csv.showFormulas) csvAttrs.showFormulas = 1;\n if (csv.showGridLines === false) csvAttrs.showGridLines = 0;\n if (csv.showRowColHeaders === false) csvAttrs.showRowCol = 0;\n if (csv.outlineSymbols === false) csvAttrs.outlineSymbols = 0;\n if (csv.zeroValues === false) csvAttrs.zeroValues = 0;\n if (csv.fitToPage) csvAttrs.fitToPage = 1;\n if (csv.printArea) csvAttrs.printArea = 1;\n if (csv.filter) csvAttrs.filter = 1;\n if (csv.showAutoFilter) csvAttrs.showAutoFilter = 1;\n if (csv.hiddenRows) csvAttrs.hiddenRows = 1;\n if (csv.hiddenColumns) csvAttrs.hiddenColumns = 1;\n if (csv.state && csv.state !== \"visible\") csvAttrs.state = csv.state;\n if (csv.filterUnique) csvAttrs.filterUnique = 1;\n if (csv.view && csv.view !== \"normal\") csvAttrs.view = csv.view;\n p.push(`<customSheetView${attrs(csvAttrs)}/>`);\n }\n p.push(\"</customSheetViews>\");\n }\n\n // Cell watches\n if (cellWatches.length > 0) {\n p.push(\"<cellWatches>\");\n for (const cw of cellWatches) {\n p.push(`<cellWatch r=\"${escapeXml(cw.reference)}\"/>`);\n }\n p.push(\"</cellWatches>\");\n }\n\n // Data consolidation\n if (opts.dataConsolidate) {\n const dc = opts.dataConsolidate;\n const dcAttrs: Record<string, string | number | boolean | undefined> = {};\n if (dc.function && dc.function !== \"sum\") dcAttrs.function = dc.function;\n if (dc.topLabels) dcAttrs.topLabels = 1;\n if (dc.leftLabels) dcAttrs.leftLabels = 1;\n if (dc.startLabels) dcAttrs.startLabels = 1;\n if (dc.link) dcAttrs.link = 1;\n const refsInner = dc.refs?.map((r) => `<dataRef ref=\"${escapeXml(r)}\"/>`).join(\"\") ?? \"\";\n const refsXml = refsInner ? `<dataRefs>${refsInner}</dataRefs>` : \"\";\n if (refsXml || Object.keys(dcAttrs).length > 0) {\n p.push(`<dataConsolidate${attrs(dcAttrs)}>${refsXml}</dataConsolidate>`);\n }\n }\n\n // Sheet protection (after sheetData, before protectedRanges per XSD sequence)\n if (opts.protection) {\n const prot = opts.protection;\n const protAttrs: Record<string, string | number | boolean | undefined> = {};\n if (prot.password) protAttrs.password = hashPassword(prot.password);\n // Auto-derive modern hash when password provided without explicit hashValue\n let derived: ReturnType<typeof derivePasswordHash> | undefined;\n if (prot.password !== undefined && prot.hashValue === undefined) {\n derived = derivePasswordHash(prot.password);\n }\n protAttrs.algorithmName = prot.algorithmName ?? derived?.algorithmName;\n protAttrs.hashValue = prot.hashValue ?? derived?.hashValue;\n protAttrs.saltValue = prot.saltValue ?? derived?.saltValue;\n if (prot.spinCount !== undefined) protAttrs.spinCount = prot.spinCount;\n else if (derived) protAttrs.spinCount = derived.spinCount;\n if (prot.sheet) protAttrs.sheet = 1;\n if (prot.objects) protAttrs.objects = 1;\n if (prot.scenarios) protAttrs.scenarios = 1;\n if (prot.formatCells === false) protAttrs.formatCells = 0;\n if (prot.formatColumns === false) protAttrs.formatColumns = 0;\n if (prot.formatRows === false) protAttrs.formatRows = 0;\n if (prot.insertColumns === false) protAttrs.insertColumns = 0;\n if (prot.insertRows === false) protAttrs.insertRows = 0;\n if (prot.insertHyperlinks === false) protAttrs.insertHyperlinks = 0;\n if (prot.deleteColumns === false) protAttrs.deleteColumns = 0;\n if (prot.deleteRows === false) protAttrs.deleteRows = 0;\n if (prot.selectLockedCells) protAttrs.selectLockedCells = 1;\n if (prot.sort === false) protAttrs.sort = 0;\n if (prot.autoFilter === false) protAttrs.autoFilter = 0;\n if (prot.pivotTables === false) protAttrs.pivotTables = 0;\n if (prot.selectUnlockedCells) protAttrs.selectUnlockedCells = 1;\n p.push(selfCloseElement(\"sheetProtection\", attrs(protAttrs)));\n }\n\n // Protected ranges (after sheetProtection per XSD sequence)\n if (protectedRanges.length > 0) {\n const prParts: string[] = [\"<protectedRanges>\"];\n for (const pr of protectedRanges) {\n const prAttrs: Record<string, string | number | boolean | undefined> = {\n name: pr.name,\n sqref: pr.sqref,\n };\n if (pr.password) prAttrs.password = hashPassword(pr.password);\n // Auto-derive modern hash when password provided without explicit hashValue\n let prDerived: ReturnType<typeof derivePasswordHash> | undefined;\n if (pr.password !== undefined && pr.hashValue === undefined) {\n prDerived = derivePasswordHash(pr.password);\n }\n prAttrs.algorithmName = pr.algorithmName ?? prDerived?.algorithmName;\n prAttrs.hashValue = pr.hashValue ?? prDerived?.hashValue;\n prAttrs.saltValue = pr.saltValue ?? prDerived?.saltValue;\n if (pr.spinCount !== undefined) prAttrs.spinCount = pr.spinCount;\n else if (prDerived) prAttrs.spinCount = prDerived.spinCount;\n if (pr.securityDescriptor) prAttrs.securityDescriptor = pr.securityDescriptor;\n const hasSecurityDescriptor = !!pr.securityDescriptor;\n if (hasSecurityDescriptor) {\n prParts.push(\n `<protectedRange${attrs(prAttrs)}><securityDescriptor>${escapeXml(pr.securityDescriptor!)}</securityDescriptor></protectedRange>`,\n );\n } else {\n prParts.push(selfCloseElement(\"protectedRange\", attrs(prAttrs)));\n }\n }\n prParts.push(\"</protectedRanges>\");\n p.push(prParts.join(\"\"));\n }\n\n // Scenarios (what-if analysis)\n if (opts.scenarios) {\n const scParts: string[] = [\"<scenarios\"];\n const scAttrs: Record<string, string | number> = {};\n if (opts.scenarios.current !== undefined) scAttrs.current = opts.scenarios.current;\n if (opts.scenarios.show !== undefined) scAttrs.show = opts.scenarios.show;\n scParts[0] = `<scenarios${attrs(scAttrs)}>`;\n\n for (const scenario of opts.scenarios.scenarios) {\n const sAttrs: Record<string, string | number | boolean | undefined> = {\n name: scenario.name,\n };\n if (scenario.count !== undefined) sAttrs.count = scenario.count;\n if (scenario.user) sAttrs.user = scenario.user;\n if (scenario.comment) sAttrs.comment = scenario.comment;\n if (scenario.hidden) sAttrs.hidden = true;\n if (scenario.locked) sAttrs.locked = true;\n\n const sParts: string[] = [`<scenario${attrs(sAttrs)}>`];\n for (const cell of scenario.inputCells) {\n const icAttrs: Record<string, string | number | boolean | undefined> = {\n r: cell.reference,\n val: String(cell.val),\n };\n if (cell.deleted) icAttrs.deleted = true;\n if (cell.undone) icAttrs.undone = true;\n sParts.push(`<inputCells${attrs(icAttrs)}/>`);\n }\n sParts.push(\"</scenario>\");\n scParts.push(sParts.join(\"\"));\n }\n scParts.push(\"</scenarios>\");\n p.push(scParts.join(\"\"));\n }\n\n // Auto filter (CT_AutoFilter is shared with table — logic in auto-filter.ts)\n if (opts.autoFilter) {\n p.push(stringifyAutoFilter(opts.autoFilter));\n }\n\n // Merge cells\n if (mergeCells.length > 0) {\n p.push(`<mergeCells count=\"${mergeCells.length}\">`);\n for (const mc of mergeCells) {\n const fromRef = defaultCellRef(mc.from.row, mc.from.col);\n const toRef = defaultCellRef(mc.to.row, mc.to.col);\n p.push(selfCloseElement(\"mergeCell\", attrs({ ref: `${fromRef}:${toRef}` })));\n }\n p.push(\"</mergeCells>\");\n }\n\n // Phonetic properties (after mergeCells per XSD sequence)\n if (opts.phoneticPr) {\n const pp = opts.phoneticPr;\n const ppAttrs: Record<string, string | number> = { fontId: pp.fontId };\n if (pp.type && pp.type !== \"fullwidthKatakana\") ppAttrs.type = pp.type;\n if (pp.alignment && pp.alignment !== \"left\") ppAttrs.alignment = pp.alignment;\n p.push(selfCloseElement(\"phoneticPr\", attrs(ppAttrs)));\n }\n\n // Conditional formatting\n const conditionalFormats = opts.conditionalFormats ?? [];\n if (conditionalFormats.length > 0) {\n for (const cf of conditionalFormats) {\n p.push(`<conditionalFormatting sqref=\"${cf.sqref}\">`);\n for (const [ri, rule] of cf.rules.entries()) {\n const ruleAttrs: Record<string, string | number | boolean | undefined> = {\n type: rule.type,\n priority: rule.priority ?? ri + 1,\n };\n if (rule.operator) ruleAttrs.operator = rule.operator;\n if (rule.dxfId !== undefined) ruleAttrs.dxfId = rule.dxfId;\n if (rule.stopIfTrue) ruleAttrs.stopIfTrue = 1;\n if (rule.timePeriod) ruleAttrs.timePeriod = rule.timePeriod;\n if (rule.rank !== undefined) ruleAttrs.rank = rule.rank;\n if (rule.equalAverage) ruleAttrs.equalAverage = 1;\n if (rule.aboveAverage === false) ruleAttrs.aboveAverage = 0;\n if (rule.stdDev !== undefined) ruleAttrs.stdDev = rule.stdDev;\n\n // Color scale\n if (rule.type === \"colorScale\" && rule.colorScale) {\n const cs = rule.colorScale;\n const inner: string[] = [];\n for (const v of cs.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n for (const c of cs.colors) {\n inner.push(`<color rgb=\"FF${c}\"/>`);\n }\n p.push(`<cfRule${attrs(ruleAttrs)}><colorScale>${inner.join(\"\")}</colorScale></cfRule>`);\n }\n // Data bar\n else if (rule.type === \"dataBar\" && rule.dataBar) {\n const db = rule.dataBar;\n const inner: string[] = [];\n for (const v of db.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n inner.push(`<color rgb=\"FF${db.color}\"/>`);\n const dbAttrs: Record<string, string | number | boolean | undefined> = {};\n if (db.minLength !== undefined && db.minLength !== 10) dbAttrs.minLength = db.minLength;\n if (db.maxLength !== undefined && db.maxLength !== 90) dbAttrs.maxLength = db.maxLength;\n if (db.showValue === false) dbAttrs.showValue = 0;\n const attrStr = Object.keys(dbAttrs).length > 0 ? attrs(dbAttrs) : \"\";\n p.push(\n `<cfRule${attrs(ruleAttrs)}><dataBar${attrStr}>${inner.join(\"\")}</dataBar></cfRule>`,\n );\n }\n // Icon set\n else if (rule.type === \"iconSet\" && rule.iconSet) {\n const is = rule.iconSet;\n const inner: string[] = [];\n for (const v of is.cfvo) {\n inner.push(buildCfvoXml(v));\n }\n const isAttrs: Record<string, string | number | boolean | undefined> = {};\n if (is.iconSet !== undefined && is.iconSet !== \"3TrafficLights1\")\n isAttrs.iconSet = is.iconSet;\n if (is.showValue === false) isAttrs.showValue = 0;\n if (is.percent === false) isAttrs.percent = 0;\n if (is.reverse) isAttrs.reverse = 1;\n const attrStr = Object.keys(isAttrs).length > 0 ? attrs(isAttrs) : \"\";\n p.push(\n `<cfRule${attrs(ruleAttrs)}><iconSet${attrStr}>${inner.join(\"\")}</iconSet></cfRule>`,\n );\n }\n // Standard rules (cellIs, containsText, expression, top10, aboveAverage)\n else {\n if (rule.formulas && rule.formulas.length > 0) {\n const formulaParts = rule.formulas.map((f) => `<formula>${escapeXml(f)}</formula>`);\n p.push(`<cfRule${attrs(ruleAttrs)}>`, ...formulaParts, \"</cfRule>\");\n } else {\n p.push(selfCloseElement(\"cfRule\", attrs(ruleAttrs)));\n }\n }\n }\n p.push(\"</conditionalFormatting>\");\n }\n }\n\n // Data validations\n const dataValidations = opts.dataValidations ?? [];\n if (dataValidations.length > 0) {\n const dvContainerAttrs: Record<string, string | number | boolean | undefined> = {\n count: dataValidations.length,\n };\n if (opts.dataValidationsDisablePrompts) dvContainerAttrs.disablePrompts = 1;\n p.push(`<dataValidations${attrs(dvContainerAttrs)}>`);\n for (const dv of dataValidations) {\n const dvAttrs: Record<string, string | number | boolean | undefined> = { sqref: dv.sqref };\n if (dv.type && dv.type !== \"none\") dvAttrs.type = dv.type;\n if (dv.operator) dvAttrs.operator = dv.operator;\n if (dv.allowBlank) dvAttrs.allowBlank = 1;\n if (dv.showErrorMessage) dvAttrs.showErrorMessage = 1;\n if (dv.showInputMessage) dvAttrs.showInputMessage = 1;\n if (dv.errorTitle) dvAttrs.errorTitle = dv.errorTitle;\n if (dv.error) dvAttrs.error = dv.error;\n if (dv.promptTitle) dvAttrs.promptTitle = dv.promptTitle;\n if (dv.prompt) dvAttrs.prompt = dv.prompt;\n if (dv.errorStyle) dvAttrs.errorStyle = dv.errorStyle;\n if (dv.imeMode) dvAttrs.imeMode = dv.imeMode;\n if (dv.showDropDown) dvAttrs.showDropDown = 1;\n const inner: string[] = [];\n if (dv.formula1 !== undefined) inner.push(`<formula1>${escapeXml(dv.formula1)}</formula1>`);\n if (dv.formula2 !== undefined) inner.push(`<formula2>${escapeXml(dv.formula2)}</formula2>`);\n if (inner.length > 0) {\n p.push(`<dataValidation${attrs(dvAttrs)}>`, ...inner, \"</dataValidation>\");\n } else {\n p.push(selfCloseElement(\"dataValidation\", attrs(dvAttrs)));\n }\n }\n p.push(\"</dataValidations>\");\n }\n\n // Hyperlinks — r:id numbering must match worksheet rels order (compiler handles rels)\n const hyperlinks = opts.hyperlinks ?? [];\n if (hyperlinks.length > 0) {\n p.push(\"<hyperlinks>\");\n let hlIdx = 0;\n for (const hl of hyperlinks) {\n const hlAttrs: Record<string, string | number | boolean | undefined> = { ref: hl.cell };\n if (hl.target.type === \"external\") {\n hlIdx++;\n hlAttrs[\"r:id\"] = `rId${hlIdx}`;\n } else {\n hlAttrs.location = hl.target.location;\n }\n if (hl.tooltip) hlAttrs.tooltip = hl.tooltip;\n if (hl.display) hlAttrs.display = hl.display;\n p.push(selfCloseElement(\"hyperlink\", attrs(hlAttrs)));\n }\n p.push(\"</hyperlinks>\");\n }\n\n // Print options\n if (opts.printOptions) {\n const po = opts.printOptions;\n const poAttrs: Record<string, string | number | boolean | undefined> = {};\n if (po.horizontalCentered) poAttrs.horizontalCentered = 1;\n if (po.verticalCentered) poAttrs.verticalCentered = 1;\n if (po.headings) poAttrs.headings = 1;\n if (po.gridLines) poAttrs.gridLines = 1;\n if (po.gridLinesSet === false) poAttrs.gridLinesSet = 0;\n p.push(selfCloseElement(\"printOptions\", attrs(poAttrs)));\n }\n\n if (opts.pageMargins) {\n const pm = opts.pageMargins;\n p.push(\n `<pageMargins${attrs({\n left: convertToInch(pm.left ?? 0.75),\n right: convertToInch(pm.right ?? 0.75),\n top: convertToInch(pm.top ?? 1),\n bottom: convertToInch(pm.bottom ?? 1),\n header: convertToInch(pm.header ?? 0.5),\n footer: convertToInch(pm.footer ?? 0.5),\n })}/>`,\n );\n } else {\n p.push('<pageMargins left=\"0.75\" right=\"0.75\" top=\"1\" bottom=\"1\" header=\"0.5\" footer=\"0.5\"/>');\n }\n\n // Page setup\n if (opts.pageSetup) {\n const ps = opts.pageSetup;\n const psAttrs: Record<string, string | number | boolean | undefined> = {};\n if (ps.paperSize !== undefined) psAttrs.paperSize = ps.paperSize;\n if (ps.orientation && ps.orientation !== \"default\") psAttrs.orientation = ps.orientation;\n if (ps.scale !== undefined) psAttrs.scale = ps.scale;\n if (ps.fitToWidth !== undefined) psAttrs.fitToWidth = ps.fitToWidth;\n if (ps.fitToHeight !== undefined) psAttrs.fitToHeight = ps.fitToHeight;\n if (ps.pageOrder && ps.pageOrder !== \"downThenOver\") psAttrs.pageOrder = ps.pageOrder;\n if (ps.useFirstPageNumber) psAttrs.useFirstPageNumber = 1;\n if (ps.firstPageNumber !== undefined) psAttrs.firstPageNumber = ps.firstPageNumber;\n if (ps.paperHeight !== undefined) psAttrs.paperHeight = ps.paperHeight;\n if (ps.paperWidth !== undefined) psAttrs.paperWidth = ps.paperWidth;\n if (ps.usePrinterDefaults) psAttrs.usePrinterDefaults = 1;\n if (ps.blackAndWhite) psAttrs.blackAndWhite = 1;\n if (ps.draft) psAttrs.draft = 1;\n if (ps.cellComments && ps.cellComments !== \"none\") psAttrs.cellComments = ps.cellComments;\n if (ps.errors && ps.errors !== \"displayed\") psAttrs.errors = ps.errors;\n p.push(selfCloseElement(\"pageSetup\", attrs(psAttrs)));\n }\n\n // Header/footer\n if (opts.headerFooter) {\n const hf = opts.headerFooter;\n const hfAttrs: Record<string, string | number | boolean | undefined> = {};\n if (hf.differentOddEven) hfAttrs.differentOddEven = 1;\n if (hf.differentFirst) hfAttrs.differentFirst = 1;\n if (hf.scaleWithDoc === false) hfAttrs.scaleWithDoc = 0;\n if (hf.alignWithMargins === false) hfAttrs.alignWithMargins = 0;\n const inner: string[] = [];\n if (hf.oddHeader) inner.push(`<oddHeader>${escapeXml(hf.oddHeader)}</oddHeader>`);\n if (hf.oddFooter) inner.push(`<oddFooter>${escapeXml(hf.oddFooter)}</oddFooter>`);\n if (hf.evenHeader) inner.push(`<evenHeader>${escapeXml(hf.evenHeader)}</evenHeader>`);\n if (hf.evenFooter) inner.push(`<evenFooter>${escapeXml(hf.evenFooter)}</evenFooter>`);\n if (hf.firstHeader) inner.push(`<firstHeader>${escapeXml(hf.firstHeader)}</firstHeader>`);\n if (hf.firstFooter) inner.push(`<firstFooter>${escapeXml(hf.firstFooter)}</firstFooter>`);\n if (inner.length > 0) {\n p.push(`<headerFooter${attrs(hfAttrs)}>`, ...inner, \"</headerFooter>\");\n } else if (hfAttrs.differentOddEven || hfAttrs.differentFirst) {\n p.push(selfCloseElement(\"headerFooter\", attrs(hfAttrs)));\n }\n }\n\n // Drawing in header/footer (after headerFooter per XSD sequence)\n if (opts.drawingHF) {\n const dhf = opts.drawingHF;\n const dhfAttrs: Record<string, string | number | boolean | undefined> = { \"r:id\": dhf.rId };\n if (dhf.lho !== undefined) dhfAttrs.lho = dhf.lho;\n if (dhf.lhe !== undefined) dhfAttrs.lhe = dhf.lhe;\n if (dhf.lhf !== undefined) dhfAttrs.lhf = dhf.lhf;\n if (dhf.cho !== undefined) dhfAttrs.cho = dhf.cho;\n if (dhf.che !== undefined) dhfAttrs.che = dhf.che;\n if (dhf.chf !== undefined) dhfAttrs.chf = dhf.chf;\n if (dhf.rho !== undefined) dhfAttrs.rho = dhf.rho;\n if (dhf.rhe !== undefined) dhfAttrs.rhe = dhf.rhe;\n if (dhf.rhf !== undefined) dhfAttrs.rhf = dhf.rhf;\n if (dhf.lfo !== undefined) dhfAttrs.lfo = dhf.lfo;\n if (dhf.lfe !== undefined) dhfAttrs.lfe = dhf.lfe;\n if (dhf.lff !== undefined) dhfAttrs.lff = dhf.lff;\n if (dhf.cfo !== undefined) dhfAttrs.cfo = dhf.cfo;\n if (dhf.cfe !== undefined) dhfAttrs.cfe = dhf.cfe;\n if (dhf.cff !== undefined) dhfAttrs.cff = dhf.cff;\n if (dhf.rfo !== undefined) dhfAttrs.rfo = dhf.rfo;\n if (dhf.rfe !== undefined) dhfAttrs.rfe = dhf.rfe;\n if (dhf.rff !== undefined) dhfAttrs.rff = dhf.rff;\n p.push(selfCloseElement(\"drawingHF\", attrs(dhfAttrs)));\n }\n\n // Legacy drawing in header/footer\n if (opts.legacyDrawingHF) {\n p.push(`<legacyDrawingHF r:id=\"${escapeXml(opts.legacyDrawingHF)}\"/>`);\n }\n\n // Ignored errors (after headerFooter per XSD sequence)\n if (ignoredErrors.length > 0) {\n const ieParts: string[] = [\"<ignoredErrors>\"];\n for (const ie of ignoredErrors) {\n const ieAttrs: Record<string, string | number | boolean | undefined> = {\n sqref: ie.sqref,\n };\n if (ie.evalError) ieAttrs.evalError = 1;\n if (ie.twoDigitTextYear) ieAttrs.twoDigitTextYear = 1;\n if (ie.numberStoredAsText) ieAttrs.numberStoredAsText = 1;\n if (ie.formula) ieAttrs.formula = 1;\n if (ie.formulaRange) ieAttrs.formulaRange = 1;\n if (ie.unlockedFormula) ieAttrs.unlockedFormula = 1;\n if (ie.emptyCellReference) ieAttrs.emptyCellReference = 1;\n if (ie.listDataValidation) ieAttrs.listDataValidation = 1;\n if (ie.calculatedColumn) ieAttrs.calculatedColumn = 1;\n ieParts.push(selfCloseElement(\"ignoredError\", attrs(ieAttrs)));\n }\n ieParts.push(\"</ignoredErrors>\");\n p.push(ieParts.join(\"\"));\n }\n\n // Cell smart tags (after ignoredErrors per XSD sequence)\n if (opts.smartTags && opts.smartTags.length > 0) {\n const stParts: string[] = [\"<smartTags>\"];\n for (const cst of opts.smartTags) {\n stParts.push(`<cellSmartTags r=\"${escapeXml(cst.reference)}\">`);\n for (const st of cst.smartTags) {\n const stAttrs: string[] = [`type=\"${st.type}\"`];\n if (st.deleted) stAttrs.push('deleted=\"1\"');\n if (st.xmlBased) stAttrs.push('xmlBased=\"1\"');\n const prXml = st.properties\n ? st.properties\n .map(\n (pr) => `<cellSmartTagPr key=\"${escapeXml(pr.key)}\" val=\"${escapeXml(pr.val)}\"/>`,\n )\n .join(\"\")\n : \"\";\n stParts.push(\n prXml\n ? `<cellSmartTag ${stAttrs.join(\" \")}>${prXml}</cellSmartTag>`\n : `<cellSmartTag ${stAttrs.join(\" \")}/>`,\n );\n }\n stParts.push(\"</cellSmartTags>\");\n }\n stParts.push(\"</smartTags>\");\n p.push(stParts.join(\"\"));\n }\n\n // Background picture placeholder — compiler replaces with <picture r:id=\"rIdN\"/>\n if (opts.backgroundImage) {\n p.push(\"<!--BACKGROUND_PICTURE-->\");\n }\n\n // OLE objects (CT_OleObjects, after picture per XSD sequence)\n if (oleObjects.length > 0) {\n const oleParts: string[] = [\"<oleObjects>\"];\n for (const ole of oleObjects) {\n const oleAttrs: string[] = [`shapeId=\"${ole.shapeId}\"`];\n if (ole.progId) oleAttrs.push(`progId=\"${escapeXml(ole.progId)}\"`);\n if (ole.dvAspect && ole.dvAspect !== \"DVASPECT_CONTENT\")\n oleAttrs.push(`dvAspect=\"${ole.dvAspect}\"`);\n if (ole.link) oleAttrs.push(`link=\"${escapeXml(ole.link)}\"`);\n if (ole.oleUpdate) oleAttrs.push(`oleUpdate=\"${ole.oleUpdate}\"`);\n if (ole.autoLoad) oleAttrs.push('autoLoad=\"1\"');\n if (ole.rId) oleAttrs.push(`r:id=\"${escapeXml(ole.rId)}\"`);\n // objectPr (CT_ObjectPr, optional child)\n if (ole.objectPr) {\n const opr = ole.objectPr;\n const oprAttrs: string[] = [];\n if (opr.locked === false) oprAttrs.push('locked=\"0\"');\n if (opr.defaultSize === false) oprAttrs.push('defaultSize=\"0\"');\n if (opr.print === false) oprAttrs.push('print=\"0\"');\n if (opr.disabled) oprAttrs.push('disabled=\"1\"');\n if (opr.uiObject) oprAttrs.push('uiObject=\"1\"');\n if (opr.autoFill === false) oprAttrs.push('autoFill=\"0\"');\n if (opr.autoLine === false) oprAttrs.push('autoLine=\"0\"');\n if (opr.autoPict === false) oprAttrs.push('autoPict=\"0\"');\n if (opr.macro) oprAttrs.push(`macro=\"${escapeXml(opr.macro)}\"`);\n if (opr.altText) oprAttrs.push(`altText=\"${escapeXml(opr.altText)}\"`);\n if (opr.dde) oprAttrs.push('dde=\"1\"');\n if (opr.rId) oprAttrs.push(`r:id=\"${escapeXml(opr.rId)}\"`);\n oleParts.push(\n `<oleObject ${oleAttrs.join(\" \")}><objectPr${oprAttrs.length ? \" \" + oprAttrs.join(\" \") : \"\"}/></oleObject>`,\n );\n } else {\n oleParts.push(`<oleObject ${oleAttrs.join(\" \")}/>`);\n }\n }\n oleParts.push(\"</oleObjects>\");\n p.push(oleParts.join(\"\"));\n }\n\n // Controls (CT_Controls, after oleObjects per XSD sequence)\n if (controls.length > 0) {\n const ctrlParts: string[] = [\"<controls>\"];\n for (const c of controls) {\n const cAttrs: string[] = [`shapeId=\"${c.shapeId}\"`, `r:id=\"${escapeXml(c.rId)}\"`];\n if (c.name) cAttrs.push(`name=\"${escapeXml(c.name)}\"`);\n // controlPr (optional)\n const prAttrs: string[] = [];\n if (c.locked === false) prAttrs.push('locked=\"0\"');\n if (c.uiObject) prAttrs.push('uiObject=\"1\"');\n if (c.recalcAlways) prAttrs.push('recalcAlways=\"1\"');\n if (c.linkedCell) prAttrs.push(`linkedCell=\"${escapeXml(c.linkedCell)}\"`);\n if (c.listFillRange) prAttrs.push(`listFillRange=\"${escapeXml(c.listFillRange)}\"`);\n if (c.formula) prAttrs.push(`cf=\"${escapeXml(c.formula)}\"`);\n if (prAttrs.length > 0) {\n ctrlParts.push(\n `<control ${cAttrs.join(\" \")}><controlPr${prAttrs.length ? \" \" + prAttrs.join(\" \") : \"\"}/></control>`,\n );\n } else {\n ctrlParts.push(`<control ${cAttrs.join(\" \")}/>`);\n }\n }\n ctrlParts.push(\"</controls>\");\n p.push(ctrlParts.join(\"\"));\n }\n\n // Web publish items (CT_WebPublishItems, after controls per XSD sequence)\n if (webPublishItems.length > 0) {\n const wpParts: string[] = [`<webPublishItems count=\"${webPublishItems.length}\">`];\n for (const wpi of webPublishItems) {\n const wpiAttrs: string[] = [\n `id=\"${wpi.id}\"`,\n `divId=\"${escapeXml(wpi.divId)}\"`,\n `sourceType=\"${wpi.sourceType}\"`,\n `destinationFile=\"${escapeXml(wpi.destinationFile)}\"`,\n ];\n if (wpi.sourceRef) wpiAttrs.push(`sourceRef=\"${escapeXml(wpi.sourceRef)}\"`);\n if (wpi.sourceObject) wpiAttrs.push(`sourceObject=\"${escapeXml(wpi.sourceObject)}\"`);\n if (wpi.title) wpiAttrs.push(`title=\"${escapeXml(wpi.title)}\"`);\n if (wpi.autoRepublish) wpiAttrs.push('autoRepublish=\"1\"');\n wpParts.push(`<webPublishItem ${wpiAttrs.join(\" \")}/>`);\n }\n wpParts.push(\"</webPublishItems>\");\n p.push(wpParts.join(\"\"));\n }\n\n // Extension list (extLst, last per XSD sequence)\n if (opts.ext) {\n p.push(`<extLst>${opts.ext}</extLst>`);\n }\n\n p.push(\"</worksheet>\");\n return p.join(\"\");\n}\n\n// ── Stringify helpers ──\n\nfunction buildCfvoXml(cfvo: CfvoOptions): string {\n const a: Record<string, string | number | boolean | undefined> = { type: cfvo.type };\n if (cfvo.val !== undefined) a.val = cfvo.val;\n if (cfvo.gte === false) a.gte = 0;\n return `<cfvo${attrs(a)}/>`;\n}\n\nfunction buildSheetViewAttrs(sv?: SheetViewOptions): string {\n const svMap: Record<string, string | number | boolean | undefined> = {\n workbookViewId: 0,\n };\n if (sv?.tabSelected !== undefined) svMap.tabSelected = sv.tabSelected ? 1 : 0;\n // Omit tabSelected otherwise: only the active sheet carries it (Excel uses\n // workbookView activeTab), so injecting it on every sheet marks all active.\n if (sv?.showGridLines === false) svMap.showGridLines = 0;\n if (sv?.showRowColHeaders === false) svMap.showRowColHeaders = 0;\n if (sv?.showZeros === false) svMap.showZeros = 0;\n if (sv?.zoomScale !== undefined) svMap.zoomScale = sv.zoomScale;\n if (sv?.rightToLeft) svMap.rightToLeft = 1;\n if (sv?.windowProtection) svMap.windowProtection = 1;\n if (sv?.showFormulas) svMap.showFormulas = 1;\n if (sv?.showRuler === false) svMap.showRuler = 0;\n if (sv?.showOutlineSymbols === false) svMap.showOutlineSymbols = 0;\n if (sv?.defaultGridColor === false) svMap.defaultGridColor = 0;\n if (sv?.showWhiteSpace === false) svMap.showWhiteSpace = 0;\n if (sv?.view) svMap.view = sv.view;\n if (sv?.colorId !== undefined) svMap.colorId = sv.colorId;\n if (sv?.zoomScaleNormal !== undefined) svMap.zoomScaleNormal = sv.zoomScaleNormal;\n if (sv?.zoomScaleSheetLayoutView !== undefined)\n svMap.zoomScaleSheetLayoutView = sv.zoomScaleSheetLayoutView;\n if (sv?.zoomScalePageLayoutView !== undefined)\n svMap.zoomScalePageLayoutView = sv.zoomScalePageLayoutView;\n return attrs(svMap);\n}\n\nfunction buildPivotSelectionXml(ps: PivotSelectionOptions): string {\n const psAttrs: string[] = [];\n if (ps.pane) psAttrs.push(`pane=\"${ps.pane}\"`);\n if (ps.showHeader) psAttrs.push('showHeader=\"1\"');\n if (ps.label) psAttrs.push('label=\"1\"');\n if (ps.data) psAttrs.push('data=\"1\"');\n if (ps.extendable) psAttrs.push('extendable=\"1\"');\n if (ps.count !== undefined) psAttrs.push(`count=\"${ps.count}\"`);\n if (ps.axis) psAttrs.push(`axis=\"${ps.axis}\"`);\n if (ps.dimension !== undefined) psAttrs.push(`dimension=\"${ps.dimension}\"`);\n if (ps.start !== undefined) psAttrs.push(`start=\"${ps.start}\"`);\n if (ps.min !== undefined) psAttrs.push(`min=\"${ps.min}\"`);\n if (ps.max !== undefined) psAttrs.push(`max=\"${ps.max}\"`);\n if (ps.activeRow !== undefined) psAttrs.push(`activeRow=\"${ps.activeRow}\"`);\n if (ps.activeCol !== undefined) psAttrs.push(`activeCol=\"${ps.activeCol}\"`);\n if (ps.previousRow !== undefined) psAttrs.push(`previousRow=\"${ps.previousRow}\"`);\n if (ps.previousCol !== undefined) psAttrs.push(`previousCol=\"${ps.previousCol}\"`);\n if (ps.click !== undefined) psAttrs.push(`click=\"${ps.click}\"`);\n if (ps.rId) psAttrs.push(`r:id=\"${escapeXml(ps.rId)}\"`);\n const areaXml = ps.pivotArea ? buildPivotAreaXml(ps.pivotArea) : \"\";\n const attrStr = psAttrs.join(\" \");\n return areaXml\n ? `<pivotSelection ${attrStr}>${areaXml}</pivotSelection>`\n : `<pivotSelection ${attrStr}/>`;\n}\n\nfunction buildSelectionXml(sel: SelectionOptions): string {\n const selAttrs: Record<string, string | number | boolean | undefined> = {};\n if (sel.pane) selAttrs.pane = sel.pane;\n if (sel.activeCell) selAttrs.activeCell = sel.activeCell;\n if (sel.activeCellId !== undefined) selAttrs.activeCellId = sel.activeCellId;\n if (sel.sqref) selAttrs.sqref = sel.sqref;\n return `<selection${attrs(selAttrs)}/>`;\n}\n\nfunction buildFormulaString(cellFormula: string | FormulaOptions): string {\n const fOpts = typeof cellFormula === \"string\" ? { formula: cellFormula } : cellFormula;\n const fAttrs: Record<string, string | number | boolean | undefined> = {};\n if (fOpts.type && fOpts.type !== FormulaType.NORMAL) fAttrs.t = fOpts.type;\n if (fOpts.reference) fAttrs.ref = fOpts.reference;\n if (fOpts.sharedIndex !== undefined) fAttrs.si = fOpts.sharedIndex;\n if (fOpts.aca) fAttrs.aca = 1;\n if (fOpts.dt2D) fAttrs.dt2D = 1;\n if (fOpts.dtr) fAttrs.dtr = 1;\n if (fOpts.del1) fAttrs.del1 = 1;\n if (fOpts.del2) fAttrs.del2 = 1;\n if (fOpts.inputCell1) fAttrs.r1 = fOpts.inputCell1;\n if (fOpts.inputCell2) fAttrs.r2 = fOpts.inputCell2;\n if (fOpts.calculateCell) fAttrs.ca = 1;\n if (fOpts.arrayContext) fAttrs.bx = 1;\n\n const hasContent = fOpts.formula !== undefined && fOpts.formula !== \"\";\n\n if (hasContent) {\n return `<f${attrs(fAttrs)}>${escapeXml(fOpts.formula)}</f>`;\n }\n if (Object.keys(fAttrs).length > 0) {\n return selfCloseElement(\"f\", attrs(fAttrs));\n }\n return \"\";\n}\n\n/**\n * Serialize the sheetData rows into `out` (strings appended in order, caller\n * wraps with `<sheetData>`/`</sheetData>`). Shared by the full stringify and\n * the streaming writer so the row/cell serialization cannot drift — passing\n * `sharedStrings: undefined` switches string cells to `t=\"inlineStr\"`, the\n * constant-memory mode used when streaming. `startRowNumber` seeds the\n * implicit row numbering for callers streaming a slice of the full row list.\n */\nexport function appendSheetDataRows(\n rows: RowOptions[],\n out: string[],\n sharedStrings: SharedStrings | undefined,\n styles: Styles | undefined,\n startRowNumber = 1,\n): void {\n // Indexed loops (not `entries()` destructuring) — at 100k rows × 20 cells the\n // per-iteration [index, value] entry arrays were a dominant Scavenge source.\n for (let i = 0; i < rows.length; i++) {\n const rowOpts = rows[i]!;\n const rowNumber = rowOpts.rowNumber ?? startRowNumber + i;\n // Flat attribute assembly (no per-row Record + for-in) keeps young-gen\n // pressure near zero at 100k+ rows.\n let rowAttr = ` r=\"${rowNumber}\"`;\n if (rowOpts.height !== undefined) {\n rowAttr += ` ht=\"${convertToPt(rowOpts.height)}\" customHeight=\"1\"`;\n }\n if (rowOpts.hidden) rowAttr += ' hidden=\"1\"';\n if (rowOpts.spans) rowAttr += ` spans=\"${rowOpts.spans}\"`;\n if (rowOpts.customFormat) rowAttr += ' customFormat=\"1\"';\n if (rowOpts.thickTop) rowAttr += ' thickTop=\"1\"';\n if (rowOpts.thickBot) rowAttr += ' thickBot=\"1\"';\n if (rowOpts.phonetic) rowAttr += ' ph=\"1\"';\n\n const cells = rowOpts.cells;\n if (cells) {\n out.push(`<row${rowAttr}>`);\n for (let j = 0; j < cells.length; j++) {\n const cell = cells[j]!;\n const ref = cell.reference ?? defaultCellRef(rowNumber, j + 1);\n const cellStr = buildCellString(ref, cell, sharedStrings, styles);\n if (cellStr) out.push(cellStr);\n }\n out.push(\"</row>\");\n } else {\n out.push(`<row${rowAttr}/>`);\n }\n }\n}\n\nfunction buildCellString(\n ref: string,\n cell: CellOptions,\n sharedStrings?: SharedStrings,\n styles?: Styles,\n): string {\n // Flat attribute assembly (r → s → t, matching the former Record insertion\n // order byte-for-byte). No per-cell Record + for-in enumeration — at 2M cells\n // the dynamic-shape objects were a dominant Scavenge source.\n const rAttr = ` r=\"${ref}\"`;\n let sAttr = \"\";\n if (cell.style !== undefined && styles) {\n sAttr = ` s=\"${styles.register(cell.style)}\"`;\n } else if (cell.styleIndex !== undefined) {\n sAttr = ` s=\"${cell.styleIndex}\"`;\n }\n let mdAttr = \"\";\n if (cell.cellMetadataId !== undefined) mdAttr += ` cm=\"${cell.cellMetadataId}\"`;\n if (cell.valueMetadataId !== undefined) mdAttr += ` vm=\"${cell.valueMetadataId}\"`;\n\n const value = cell.value;\n\n // Formula path — formula takes precedence; value is the cached result.\n if (cell.formula) {\n const fStr = buildFormulaString(cell.formula);\n if (value === null || value === undefined) {\n return `<c${rAttr}${sAttr}${mdAttr}>${fStr}</c>`;\n }\n let vStr = \"\";\n let tAttr = \"\";\n if (typeof value === \"number\") {\n vStr = `<v>${value}</v>`;\n } else if (typeof value === \"boolean\") {\n tAttr = ' t=\"b\"';\n vStr = `<v>${value ? 1 : 0}</v>`;\n } else if (typeof value === \"string\") {\n tAttr = ' t=\"str\"';\n vStr = `<v>${escapeXml(value)}</v>`;\n } else if (value instanceof Date) {\n vStr = `<v>${dateToSerialNumber(value)}</v>`;\n }\n if (vStr) {\n return `<c${rAttr}${sAttr}${mdAttr}${tAttr}>${fStr}${vStr}</c>`;\n }\n return `<c${rAttr}${sAttr}${mdAttr}>${fStr}</c>`;\n }\n\n if (value === null || value === undefined) {\n if (cell.styleIndex !== undefined) {\n return `<c${rAttr}${sAttr}${mdAttr}/>`;\n }\n return \"\";\n }\n\n // Rich text value (RichTextOptions)\n if (typeof value === \"object\" && !(value instanceof Date)) {\n if (sharedStrings) {\n const idx = sharedStrings.registerRich(value);\n return `<c${rAttr}${sAttr}${mdAttr} t=\"s\"><v>${idx}</v></c>`;\n }\n return `<c${rAttr}${sAttr}${mdAttr} t=\"inlineStr\"><is>${buildRstXml(value)}</is></c>`;\n }\n\n if (typeof value === \"string\") {\n if (sharedStrings) {\n const idx = sharedStrings.register(value);\n return `<c${rAttr}${sAttr}${mdAttr} t=\"s\"><v>${idx}</v></c>`;\n }\n return `<c${rAttr}${sAttr}${mdAttr} t=\"inlineStr\"><is><t>${escapeXml(value)}</t></is></c>`;\n }\n\n if (typeof value === \"number\") {\n return `<c${rAttr}${sAttr}${mdAttr}><v>${value}</v></c>`;\n }\n\n if (typeof value === \"boolean\") {\n return `<c${rAttr}${sAttr}${mdAttr} t=\"b\"><v>${value ? 1 : 0}</v></c>`;\n }\n\n if (value instanceof Date) {\n const serial = dateToSerialNumber(value);\n return `<c${rAttr}${sAttr}${mdAttr}><v>${serial}</v></c>`;\n }\n\n return \"\";\n}\n\nfunction defaultCellRef(row: number, col: number): string {\n return columnToLetter(col) + row;\n}\n","/**\n * Calculation Chain types and descriptor.\n *\n * Reference: OOXML transitional, sml.xsd, CT_CalcChain / CT_CalcCell\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs } from \"@office-open/xml\";\n\n// ── Types ──\n\nexport interface CalcCell {\n /** Cell reference, e.g. \"A1\" */\n reference: string;\n /** Sheet index (1-based) */\n sheetIndex: number;\n /** Array formula */\n array?: boolean;\n /** Child chain — calculations farmed out to another thread (CT_CalcCell @l) */\n childChain?: boolean;\n}\n\nexport interface CalcChainOptions {\n cells: CalcCell[];\n}\n\n// ── Descriptor ──\n\nexport const calcChainDesc: CustomDescriptor<CalcChainOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const parts: string[] = [\n '<calcChain xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n for (const cell of opts.cells) {\n const cellAttrs: Record<string, string | number | boolean> = {\n r: cell.reference,\n i: cell.sheetIndex,\n };\n if (cell.array) cellAttrs.a = true;\n if (cell.childChain) cellAttrs.l = true;\n parts.push(`<c${attrs(cellAttrs)}/>`);\n }\n parts.push(\"</calcChain>\");\n return parts.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<CalcChainOptions> = {};\n const cells: CalcCell[] = [];\n for (const child of el.elements ?? []) {\n if (child.name !== \"c\") continue;\n const r = child.attributes?.[\"r\"];\n const i = child.attributes?.[\"i\"];\n if (r && i) {\n const cell: CalcCell = {\n reference: String(r),\n sheetIndex: Number(i),\n };\n if (child.attributes?.[\"a\"]) cell.array = true;\n if (parseOnOff(child.attributes?.[\"l\"])) cell.childChain = true;\n cells.push(cell);\n }\n }\n result.cells = cells;\n return result as CalcChainOptions;\n },\n};\n","/**\n * Chartsheet types and descriptor for SpreadsheetML documents.\n *\n * A chartsheet is a worksheet that contains only a chart (no cells).\n *\n * Reference: OOXML transitional, sml.xsd, CT_Chartsheet\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport { convertToInch } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, attr, attrNum, escapeXml, findChild, textOf } from \"@office-open/xml\";\n\n// ── Types ──\n\nexport interface ChartsheetPageMargins {\n left?: number | UniversalMeasure;\n right?: number | UniversalMeasure;\n top?: number | UniversalMeasure;\n bottom?: number | UniversalMeasure;\n header?: number | UniversalMeasure;\n footer?: number | UniversalMeasure;\n}\n\nexport interface ChartsheetPageSetup {\n /** Paper size (1=Letter, 9=A4, etc.) */\n paperSize?: number;\n /** Orientation (\"default\" | \"portrait\" | \"landscape\") */\n orientation?: string;\n /** Horizontal DPI */\n horizontalDpi?: number;\n /** Vertical DPI */\n verticalDpi?: number;\n /** Copies to print */\n copies?: number;\n}\n\nexport interface ChartsheetProtectionOptions {\n /** Content is protected */\n content?: boolean;\n /** Objects are protected */\n objects?: boolean;\n}\n\nexport interface ChartsheetHeaderFooterOptions {\n /** Different first page header/footer */\n differentFirst?: boolean;\n /** Different odd/even page headers/footers */\n differentOddEven?: boolean;\n /** Odd page header */\n oddHeader?: string;\n /** Odd page footer */\n oddFooter?: string;\n}\n\nexport interface ChartsheetOptions {\n /** Sheet name */\n name?: string;\n /** Tab color (hex ARGB, e.g. \"FF4472C4\") */\n tabColor?: string;\n /** Page margins */\n pageMargins?: ChartsheetPageMargins;\n /** Page setup */\n pageSetup?: ChartsheetPageSetup;\n /** Header/footer */\n headerFooter?: ChartsheetHeaderFooterOptions;\n /** Sheet protection */\n sheetProtection?: ChartsheetProtectionOptions;\n /** Published to server (CT_ChartsheetPr @published) */\n published?: boolean;\n /** VBA code name (CT_ChartsheetPr @codeName) */\n codeName?: string;\n /** Zoom to fit (CT_ChartsheetView @zoomToFit) */\n zoomToFit?: boolean;\n /** Chart definition (type, title, series, etc.) */\n chart: {\n type: string;\n title?: string;\n categories?: string[];\n series: {\n name: string;\n values: number[];\n }[];\n };\n}\n\n// ── Descriptor Types ──\n\nexport interface ChartsheetDescriptorOptions extends ChartsheetOptions {\n /** Relationship ID for the drawing (set by compiler) */\n drawingRId: string;\n}\n\n// ── Descriptor ──\n\nexport const chartsheetDesc: CustomDescriptor<ChartsheetDescriptorOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<chartsheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n // sheetPr (optional)\n if (opts.tabColor || opts.published || opts.codeName) {\n const prAttrs: string[] = [];\n if (opts.tabColor) prAttrs.push(`<tabColor${attrs({ rgb: opts.tabColor })}/>`);\n const spAttrs: string[] = [];\n if (opts.published) spAttrs.push(' published=\"1\"');\n if (opts.codeName) spAttrs.push(` codeName=\"${escapeXml(opts.codeName)}\"`);\n p.push(`<sheetPr${spAttrs.join(\"\")}>${prAttrs.join(\"\")}</sheetPr>`);\n }\n\n // sheetViews (required)\n const svAttrs: string[] = ['workbookViewId=\"0\"'];\n if (opts.zoomToFit) svAttrs.push('zoomToFit=\"1\"');\n p.push(`<sheetViews><sheetView ${svAttrs.join(\" \")}/></sheetViews>`);\n\n // sheetProtection (optional)\n if (opts.sheetProtection) {\n const sp = opts.sheetProtection;\n const spAttrs: string[] = [];\n if (sp.content) spAttrs.push(` content=\"1\"`);\n if (sp.objects) spAttrs.push(` objects=\"1\"`);\n if (spAttrs.length > 0) {\n p.push(`<sheetProtection${spAttrs.join(\"\")}/>`);\n }\n }\n\n // pageMargins (optional)\n if (opts.pageMargins) {\n const pm = opts.pageMargins;\n p.push(\n `<pageMargins${attrs({\n left: convertToInch(pm.left ?? 0.7),\n right: convertToInch(pm.right ?? 0.7),\n top: convertToInch(pm.top ?? 0.75),\n bottom: convertToInch(pm.bottom ?? 0.75),\n header: convertToInch(pm.header ?? 0.3),\n footer: convertToInch(pm.footer ?? 0.3),\n })}/>`,\n );\n }\n\n // pageSetup (optional)\n if (opts.pageSetup) {\n const ps = opts.pageSetup;\n p.push(\n `<pageSetup${attrs({\n paperSize: ps.paperSize,\n orientation: ps.orientation,\n horizontalDpi: ps.horizontalDpi,\n verticalDpi: ps.verticalDpi,\n copies: ps.copies,\n })}/>`,\n );\n }\n\n // headerFooter (optional)\n if (opts.headerFooter) {\n const hf = opts.headerFooter;\n const hfParts: string[] = [];\n if (hf.differentFirst) hfParts.push(` differentFirst=\"1\"`);\n if (hf.differentOddEven) hfParts.push(` differentOddEven=\"1\"`);\n const hfContent: string[] = [];\n if (hf.oddHeader) hfContent.push(`<oddHeader>${escapeXml(hf.oddHeader)}</oddHeader>`);\n if (hf.oddFooter) hfContent.push(`<oddFooter>${escapeXml(hf.oddFooter)}</oddFooter>`);\n p.push(`<headerFooter${hfParts.join(\"\")}>${hfContent.join(\"\")}</headerFooter>`);\n }\n\n // drawing (required)\n p.push(`<drawing r:id=\"${escapeXml(opts.drawingRId)}\"/>`);\n\n p.push(\"</chartsheet>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<ChartsheetDescriptorOptions> = {};\n\n // nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\" to numbers, so\n // boolean attribute checks use String() coercion.\n // sheetPr\n const sheetPr = findChild(el, \"sheetPr\");\n if (sheetPr) {\n if (parseOnOff(attr(sheetPr, \"published\"))) result.published = true;\n if (attr(sheetPr, \"codeName\")) result.codeName = attr(sheetPr, \"codeName\");\n const tabColor = findChild(sheetPr, \"tabColor\");\n if (tabColor) {\n const rgb = attr(tabColor, \"rgb\");\n if (rgb) result.tabColor = String(rgb);\n }\n }\n\n // sheetViews\n const sheetViews = findChild(el, \"sheetViews\");\n if (sheetViews) {\n const sv = findChild(sheetViews, \"sheetView\");\n if (sv && parseOnOff(attr(sv, \"zoomToFit\"))) result.zoomToFit = true;\n }\n\n // sheetProtection\n const sheetProtectionEl = findChild(el, \"sheetProtection\");\n if (sheetProtectionEl) {\n const sp: Partial<ChartsheetProtectionOptions> = {};\n if (parseOnOff(attr(sheetProtectionEl, \"content\"))) sp.content = true;\n if (parseOnOff(attr(sheetProtectionEl, \"objects\"))) sp.objects = true;\n result.sheetProtection = sp;\n }\n\n // pageMargins\n const pageMarginsEl = findChild(el, \"pageMargins\");\n if (pageMarginsEl) {\n const pm: Partial<ChartsheetPageMargins> = {};\n const ml = attrNum(pageMarginsEl, \"left\");\n if (ml !== undefined) pm.left = ml;\n const mr = attrNum(pageMarginsEl, \"right\");\n if (mr !== undefined) pm.right = mr;\n const mt = attrNum(pageMarginsEl, \"top\");\n if (mt !== undefined) pm.top = mt;\n const mb = attrNum(pageMarginsEl, \"bottom\");\n if (mb !== undefined) pm.bottom = mb;\n const mh = attrNum(pageMarginsEl, \"header\");\n if (mh !== undefined) pm.header = mh;\n const mf = attrNum(pageMarginsEl, \"footer\");\n if (mf !== undefined) pm.footer = mf;\n result.pageMargins = pm;\n }\n\n // pageSetup\n const pageSetupEl = findChild(el, \"pageSetup\");\n if (pageSetupEl) {\n const ps: Partial<ChartsheetPageSetup> = {};\n const pz = attrNum(pageSetupEl, \"paperSize\");\n if (pz !== undefined) ps.paperSize = pz;\n const orient = attr(pageSetupEl, \"orientation\");\n if (orient) ps.orientation = orient;\n const hdpi = attrNum(pageSetupEl, \"horizontalDpi\");\n if (hdpi !== undefined) ps.horizontalDpi = hdpi;\n const vdpi = attrNum(pageSetupEl, \"verticalDpi\");\n if (vdpi !== undefined) ps.verticalDpi = vdpi;\n const copies = attrNum(pageSetupEl, \"copies\");\n if (copies !== undefined) ps.copies = copies;\n result.pageSetup = ps;\n }\n\n // headerFooter\n const headerFooterEl = findChild(el, \"headerFooter\");\n if (headerFooterEl) {\n const hf: Partial<ChartsheetHeaderFooterOptions> = {};\n if (parseOnOff(attr(headerFooterEl, \"differentFirst\"))) hf.differentFirst = true;\n if (parseOnOff(attr(headerFooterEl, \"differentOddEven\"))) hf.differentOddEven = true;\n const oh = findChild(headerFooterEl, \"oddHeader\");\n if (oh) hf.oddHeader = textOf(oh);\n const of2 = findChild(headerFooterEl, \"oddFooter\");\n if (of2) hf.oddFooter = textOf(of2);\n result.headerFooter = hf;\n }\n\n return result as ChartsheetDescriptorOptions;\n },\n};\n","/**\n * Comments + VML notes descriptor for XLSX.\n *\n * Generates both xl/comments{n}.xml and xl/drawings/vmlDrawing{n}.vml\n * from the same CommentOptions array. Follows PPTX CustomDescriptor pattern.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { convertToPt } from \"@office-open/core\";\nimport { parseVmlShape } from \"@office-open/core\";\nimport { stringifyVmlShape } from \"@office-open/core\";\nimport { stringifyVmlShapetype } from \"@office-open/core\";\nimport { stringifyVmlShapeLayout } from \"@office-open/core\";\nimport type { LengthUnit, UniversalMeasure, VmlShapeStyle } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { WriteContext } from \"@office-open/core/descriptor\";\nimport { findChild, attr, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\nimport { escapeXml } from \"@office-open/xml\";\n\nimport type {\n AnchorMarkerOptions,\n CommentOptions,\n CommentPropertiesOptions,\n ObjectAnchorOptions,\n RichTextOptions,\n RichTextRunOptions,\n RichTextRunPropertiesOptions,\n} from \"./worksheet\";\n\n// ── Comments descriptor (xl/comments{n}.xml) ──\n\nexport interface CommentsDocOptions {\n comments: CommentOptions[];\n}\n\nexport const commentsDesc: CustomDescriptor<CommentsDocOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.comments.length === 0) return undefined;\n const authors = collectAuthors(opts.comments);\n const p: string[] = [\n `<comments xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:xdr=\"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\">`,\n `<authors>`,\n ];\n\n for (const author of authors) {\n p.push(`<author>${escapeXml(author)}</author>`);\n }\n\n p.push(\"</authors><commentList>\");\n\n for (const entry of opts.comments) {\n const authorId = authors.indexOf(entry.author);\n const textXml =\n typeof entry.text === \"string\"\n ? `<t>${escapeXml(entry.text)}</t>`\n : buildRstXml(entry.text);\n // commentPr is parsed but never re-emitted: Excel refuses to open a\n // third-party file carrying commentPr beside the VML note drawing this\n // compiler always writes (rival property systems — it reads the VML\n // shape's x:ClientData instead).\n p.push(\n `<comment ref=\"${entry.cell}\" authorId=\"${authorId}\"><text>${textXml}</text></comment>`,\n );\n }\n\n p.push(\"</commentList></comments>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const comments: CommentOptions[] = [];\n const authors: string[] = [];\n\n const authorsEl = findChild(el, \"authors\");\n if (authorsEl) {\n for (const a of authorsEl.elements ?? []) {\n if (a.name === \"author\") authors.push(textOf(a) ?? \"\");\n }\n }\n\n const listEl = findChild(el, \"commentList\");\n if (listEl) {\n for (const c of listEl.elements ?? []) {\n if (c.name !== \"comment\") continue;\n const ref = attr(c, \"ref\") ?? \"\";\n const authorId = Number(attr(c, \"authorId\") ?? 0);\n const textEl = findChild(c, \"text\");\n const text = textEl ? parseRst(textEl) : \"\";\n const commentPrEl = findChild(c, \"commentPr\");\n const comment: CommentOptions = {\n cell: ref,\n author: authors[authorId] ?? \"\",\n text,\n };\n if (commentPrEl) comment.commentPr = parseCommentPr(commentPrEl);\n comments.push(comment);\n }\n }\n\n return { comments } as CommentsDocOptions;\n },\n};\n\n// ── VML notes descriptor (xl/drawings/vmlDrawing{n}.vml) ──\n\n/** Per-note placement facts read from a vmlDrawing part (one per v:shape). */\nexport interface VmlNoteAnchor {\n /** 0-based row (x:Row). */\n row: number;\n /** 0-based column (x:Column). */\n column: number;\n /** x:Anchor 8-tuple when present. */\n anchor?: number[];\n /** Whether the note shape is visible (style visibility ≠ hidden). */\n visible: boolean;\n /** Shape width in points when present in the style. */\n width?: number;\n /** Shape height in points when present in the style. */\n height?: number;\n}\n\nexport const vmlNotesDesc: CustomDescriptor<CommentsDocOptions, WriteContext, VmlNoteAnchor[]> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.comments.length === 0) return undefined;\n\n const p: string[] = [\n '<xml xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\">',\n stringifyVmlShapeLayout({ ext: \"edit\", idmap: { ext: \"edit\", data: \"1\" } }),\n stringifyVmlShapetype({\n id: \"_x0000_t202\",\n coordsize: \"21600,21600\",\n spt: 202,\n path: \"m,l,21600r21600,l21600,xe\",\n stroke: { joinstyle: \"miter\" },\n pathElement: { gradientshapeok: true, connecttype: \"rect\" },\n }),\n ];\n\n for (const [i, c] of opts.comments.entries()) {\n const { col, row } = cellRefToVmlCoords(c.cell);\n const anchor = c.anchor ?? [col, 0, row, 0, col + 2, 0, row + 2, 0];\n const style = {\n position: \"absolute\",\n marginLeft: \"59.25pt\",\n marginTop: \"1.5pt\",\n width: `${c.size?.width ?? DEFAULT_NOTE_WIDTH}pt` as UniversalMeasure,\n height: `${c.size?.height ?? DEFAULT_NOTE_HEIGHT}pt` as UniversalMeasure,\n zIndex: 1,\n } as VmlShapeStyle;\n if (!c.visible) style.visibility = \"hidden\";\n p.push(\n stringifyVmlShape({\n id: `_x0000_s${1025 + i}`,\n type: \"#_x0000_t202\",\n style,\n fillcolor: \"infoBackground [80]\",\n strokecolor: \"none [81]\",\n insetmode: \"auto\",\n fill: { color2: \"infoBackground [80]\" },\n shadow: { color: \"none [81]\", obscured: true },\n pathElement: { connecttype: \"none\" },\n textbox: {\n style: { directionAlt: \"auto\" },\n content: '<div style=\"text-align:left\"></div>',\n },\n clientData: {\n objectType: \"Note\",\n MoveWithCells: \"\",\n SizeWithCells: \"\",\n Anchor: anchor.join(\", \"),\n AutoFill: false,\n Row: row,\n Column: col,\n },\n }),\n );\n }\n\n p.push(\"</xml>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const anchors: VmlNoteAnchor[] = [];\n for (const child of el.elements ?? []) {\n if (child.type !== \"element\" || child.name !== \"v:shape\") continue;\n const shape = parseVmlShape(child);\n const cd = shape.clientData;\n if (!cd || cd.objectType !== \"Note\" || cd.Row === undefined || cd.Column === undefined) {\n continue;\n }\n const note: VmlNoteAnchor = {\n row: cd.Row,\n column: cd.Column,\n visible: shape.style?.visibility !== \"hidden\",\n };\n const nums = (cd.Anchor ?? \"\")\n .split(/[,\\s]+/)\n .filter(Boolean)\n .map(Number);\n if (nums.length === 8 && nums.every((n) => !Number.isNaN(n))) note.anchor = nums;\n const width = lengthToPt(shape.style?.width);\n if (width !== undefined) note.width = width;\n const height = lengthToPt(shape.style?.height);\n if (height !== undefined) note.height = height;\n anchors.push(note);\n }\n return anchors;\n },\n};\n\n/** Coerce a style length (number or measure string) to points; non-measure tokens yield undefined. */\nfunction lengthToPt(value: LengthUnit | undefined): number | undefined {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\" || !/^-?[\\d.]/.test(value)) return undefined;\n return convertToPt(value as UniversalMeasure);\n}\n\n/** Excel's default note shape size (points). */\nconst DEFAULT_NOTE_WIDTH = 108;\nconst DEFAULT_NOTE_HEIGHT = 59.25;\n\n/** Merge parsed VML note placement into comments by cell (column, row) pairing. */\nexport function mergeNoteAnchors(\n comments: CommentOptions[] | undefined,\n anchors: VmlNoteAnchor[],\n): void {\n if (!comments || anchors.length === 0) return;\n for (const note of anchors) {\n const comment = comments.find((c) => {\n const { col, row } = cellRefToVmlCoords(c.cell);\n return col === note.column && row === note.row;\n });\n if (!comment) continue;\n if (note.anchor !== undefined) comment.anchor = note.anchor;\n if (note.visible) comment.visible = true;\n if (note.width !== undefined || note.height !== undefined) {\n comment.size = {\n width: note.width ?? DEFAULT_NOTE_WIDTH,\n height: note.height ?? DEFAULT_NOTE_HEIGHT,\n };\n }\n }\n}\n\n// ── Helpers ──\n\nfunction collectAuthors(comments: CommentOptions[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const entry of comments) {\n if (!seen.has(entry.author)) {\n seen.add(entry.author);\n result.push(entry.author);\n }\n }\n return result.length > 0 ? result : [\"\"];\n}\n\n// ── Comment properties (CT_CommentPr) parse — stringify never emits it (see above) ──\n\nfunction parseCommentPr(el: XmlElement): CommentPropertiesOptions {\n const pr: CommentPropertiesOptions = {};\n const locked = attr(el, \"locked\");\n if (locked !== undefined) pr.locked = parseOnOff(locked) ?? false;\n const defaultSize = attr(el, \"defaultSize\");\n if (defaultSize !== undefined) pr.defaultSize = parseOnOff(defaultSize) ?? false;\n const print = attr(el, \"print\");\n if (print !== undefined) pr.print = parseOnOff(print) ?? false;\n const disabled = attr(el, \"disabled\");\n if (disabled !== undefined) pr.disabled = parseOnOff(disabled) ?? false;\n const autoFill = attr(el, \"autoFill\");\n if (autoFill !== undefined) pr.autoFill = parseOnOff(autoFill) ?? false;\n const autoLine = attr(el, \"autoLine\");\n if (autoLine !== undefined) pr.autoLine = parseOnOff(autoLine) ?? false;\n const altText = attr(el, \"altText\");\n if (altText !== undefined) pr.altText = altText;\n const textHAlign = attr(el, \"textHAlign\");\n if (textHAlign !== undefined)\n pr.textHAlign = textHAlign as CommentPropertiesOptions[\"textHAlign\"];\n const textVAlign = attr(el, \"textVAlign\");\n if (textVAlign !== undefined)\n pr.textVAlign = textVAlign as CommentPropertiesOptions[\"textVAlign\"];\n const lockText = attr(el, \"lockText\");\n if (lockText !== undefined) pr.lockText = parseOnOff(lockText) ?? false;\n const justLastX = attr(el, \"justLastX\");\n if (justLastX !== undefined) pr.justLastX = parseOnOff(justLastX) ?? false;\n const autoScale = attr(el, \"autoScale\");\n if (autoScale !== undefined) pr.autoScale = parseOnOff(autoScale) ?? false;\n const anchorEl = findChild(el, \"anchor\");\n if (anchorEl) pr.anchor = parseAnchor(anchorEl);\n return pr;\n}\n\nfunction parseAnchor(el: XmlElement): ObjectAnchorOptions {\n const anchor: ObjectAnchorOptions = {\n moveWithCells: parseOnOff(attr(el, \"moveWithCells\")),\n sizeWithCells: parseOnOff(attr(el, \"sizeWithCells\")),\n };\n const from = findChild(el, \"xdr:from\");\n if (from) anchor.from = parseMarker(from);\n const to = findChild(el, \"xdr:to\");\n if (to) anchor.to = parseMarker(to);\n return anchor;\n}\n\nfunction parseMarker(el: XmlElement): AnchorMarkerOptions {\n const num = (tag: string) => Number(textOf(findChild(el, tag)!) ?? 0);\n return {\n col: num(\"xdr:col\"),\n colOff: num(\"xdr:colOff\"),\n row: num(\"xdr:row\"),\n rowOff: num(\"xdr:rowOff\"),\n };\n}\n\n// VML anchors use 0-based column/row; cell refs are 1-based uppercase letters + digits.\nfunction cellRefToVmlCoords(ref: string): { col: number; row: number } {\n let i = 0;\n while (i < ref.length && ref.charCodeAt(i) >= 65 && ref.charCodeAt(i) <= 90) i++;\n let col = 0;\n for (let j = 0; j < i; j++) col = col * 26 + (ref.charCodeAt(j) - 64);\n return { col: col - 1, row: parseInt(ref.slice(i), 10) - 1 };\n}\n\n/** Build rich text (CT_Rst) XML from runs. */\nfunction buildRstXml(rst: RichTextOptions): string {\n const runs = rst.runs ?? [];\n const parts: string[] = [];\n for (const run of runs) {\n const props = run.properties;\n if (!props) {\n parts.push(`<r><t>${escapeXml(run.text)}</t></r>`);\n continue;\n }\n const rPr: string[] = [];\n if (props.bold) rPr.push(\"<b/>\");\n if (props.italic) rPr.push(\"<i/>\");\n if (props.underline) rPr.push(`<u val=\"${props.underline}\"/>`);\n if (props.strike) rPr.push(\"<strike/>\");\n if (props.size) rPr.push(`<sz val=\"${props.size}\"/>`);\n if (props.color) rPr.push(`<color rgb=\"${props.color}\"/>`);\n if (props.font) rPr.push(`<rFont val=\"${props.font}\"/>`);\n const rPrXml = rPr.length ? `<rPr>${rPr.join(\"\")}</rPr>` : \"\";\n parts.push(`<r>${rPrXml}<t>${escapeXml(run.text)}</t></r>`);\n }\n return parts.join(\"\");\n}\n\n/** Parse rich text element into a plain string or rich runs. */\nfunction parseRst(textEl: XmlElement): string | RichTextOptions {\n const runs: RichTextRunOptions[] = [];\n const parts: string[] = [];\n let hasRuns = false;\n for (const child of textEl.elements ?? []) {\n if (child.name === \"t\") {\n parts.push(textOf(child) ?? \"\");\n } else if (child.name === \"r\") {\n hasRuns = true;\n const t = findChild(child, \"t\");\n const run: RichTextRunOptions = { text: t ? (textOf(t) ?? \"\") : \"\" };\n const rPr = findChild(child, \"rPr\");\n if (rPr) {\n const props: RichTextRunPropertiesOptions = {};\n if (findChild(rPr, \"b\")) props.bold = true;\n if (findChild(rPr, \"i\")) props.italic = true;\n const uEl = findChild(rPr, \"u\");\n if (uEl)\n props.underline =\n (attr(uEl, \"val\") as RichTextRunPropertiesOptions[\"underline\"]) ?? \"single\";\n if (findChild(rPr, \"strike\")) props.strike = true;\n const szEl = findChild(rPr, \"sz\");\n if (szEl) {\n const sz = Number(attr(szEl, \"val\"));\n if (!Number.isNaN(sz)) props.size = sz;\n }\n const colorEl = findChild(rPr, \"color\");\n if (colorEl && attr(colorEl, \"rgb\")) props.color = attr(colorEl, \"rgb\");\n const rFontEl = findChild(rPr, \"rFont\");\n if (rFontEl && attr(rFontEl, \"val\")) props.font = attr(rFontEl, \"val\");\n run.properties = props;\n }\n runs.push(run);\n }\n }\n if (hasRuns) return { runs };\n return parts.join(\"\");\n}\n","/**\n * XLSX Drawing — anchor object types.\n *\n * Option interfaces for spreadsheetDrawing anchors: images, charts, shapes,\n * connectors, groups, and content parts bound to worksheet cells.\n *\n * @module\n */\n\nimport type { BaseConnectorOptions, BaseGroupOptions, UniversalMeasure } from \"@office-open/core\";\nimport type {\n GroupTransform2DOptions,\n NonVisualDrawingPropertiesOptions,\n ShapePropertiesOptions,\n TextBodyOptions,\n} from \"@office-open/core/drawing\";\n\n// ── Types (used by compiler) ──\n\nexport interface ImageOptions {\n /** 1-based column */\n col: number;\n /** Column offset in EMU (default 0) */\n colOffset?: number | UniversalMeasure;\n /** 1-based row */\n row: number;\n /** Row offset in EMU (default 0) */\n rowOffset?: number | UniversalMeasure;\n /** Relationship ID for the image */\n rId: string;\n /** Lock anchor with sheet (default true) */\n locksWithSheet?: boolean;\n /** Print with sheet (default true) */\n printsWithSheet?: boolean;\n}\n\nexport interface ChartAnchorOptions {\n /** 1-based column */\n col: number;\n /** Column offset in EMU (default 0) */\n colOffset?: number | UniversalMeasure;\n /** 1-based row */\n row: number;\n /** Row offset in EMU (default 0) */\n rowOffset?: number | UniversalMeasure;\n /** Relationship ID for the chart */\n rId: string;\n /** Lock anchor with sheet (default true) */\n locksWithSheet?: boolean;\n /** Print with sheet (default true) */\n printsWithSheet?: boolean;\n}\n\n// ── Descriptor Types ──\n\n/** How a drawing is anchored to the worksheet (xdr:*Anchor element). */\nexport const ANCHOR_TYPES = {\n twoCell: \"twoCell\",\n oneCell: \"oneCell\",\n absolute: \"absolute\",\n} as const;\nexport type AnchorType = (typeof ANCHOR_TYPES)[keyof typeof ANCHOR_TYPES];\n\n/** editAs behavior for twoCellAnchor (ST_EditAs). */\nexport const EDIT_AS_TYPES = {\n twoCell: \"twoCell\",\n oneCell: \"oneCell\",\n absolute: \"absolute\",\n} as const;\nexport type EditAsType = (typeof EDIT_AS_TYPES)[keyof typeof EDIT_AS_TYPES];\n\n/** Shared anchor fields for all anchored drawing objects. */\nexport interface DrawingAnchorOptions {\n /** 1-based column (from marker) */\n col: number;\n /** Column offset in EMU (default 0) */\n colOffset?: number | UniversalMeasure;\n /** 1-based row (from marker) */\n row: number;\n /** Row offset in EMU (default 0) */\n rowOffset?: number | UniversalMeasure;\n /** To cell column (1-based) for twoCellAnchor. Defaults to col + 1. */\n toCol?: number;\n /** To cell row (1-based) for twoCellAnchor. Defaults to row + 1. */\n toRow?: number;\n /** To cell column offset in EMU. */\n toColOffset?: number | UniversalMeasure;\n /** To cell row offset in EMU. */\n toRowOffset?: number | UniversalMeasure;\n /** Anchor type (default \"twoCell\"). */\n anchorType?: AnchorType;\n /** editAs for twoCellAnchor (default \"oneCell\"). */\n editAs?: EditAsType;\n /** Absolute X in EMU (absoluteAnchor). */\n absoluteX?: number | UniversalMeasure;\n /** Absolute Y in EMU (absoluteAnchor). */\n absoluteY?: number | UniversalMeasure;\n /** Anchor extent width in EMU (oneCell/absoluteAnchor ext, default 400000). */\n extentCx?: number | UniversalMeasure;\n /** Anchor extent height in EMU (oneCell/absoluteAnchor ext, default 300000). */\n extentCy?: number | UniversalMeasure;\n /** Lock anchor with sheet (default true) */\n locksWithSheet?: boolean;\n /** Print with sheet (default true) */\n printsWithSheet?: boolean;\n}\n\nexport interface DrawingPictureOptions\n extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /** Relationship ID for the image */\n rId: string;\n}\n\nexport interface DrawingChartOptions extends NonVisualDrawingPropertiesOptions {\n /** 1-based column */\n col: number;\n /** Column offset in EMU (default 0) */\n colOffset?: number | UniversalMeasure;\n /** 1-based row */\n row: number;\n /** Row offset in EMU (default 0) */\n rowOffset?: number | UniversalMeasure;\n /** Relationship ID for the chart */\n rId: string;\n /** Lock anchor with sheet (default true) */\n locksWithSheet?: boolean;\n /** Print with sheet (default true) */\n printsWithSheet?: boolean;\n}\n\n/** Anchored shape (xdr:sp): geometry + optional text body. */\nexport interface ShapeOptions extends DrawingAnchorOptions, NonVisualDrawingPropertiesOptions {\n /** Shape properties (a:CT_ShapeProperties). */\n spPr: ShapePropertiesOptions;\n /** Text body (a:CT_TextBody). */\n textBody?: TextBodyOptions;\n /** macro attribute (CT_Shape). */\n macro?: string;\n /** textlink attribute (CT_Shape). */\n textlink?: string;\n}\n\n/** Anchored connector (xdr:cxnSp): line/arrow geometry via spPr. */\nexport interface ConnectorOptions extends DrawingAnchorOptions, BaseConnectorOptions {\n /** Shape properties (a:CT_ShapeProperties, typically prstGeom=\"line\"). */\n spPr: ShapePropertiesOptions;\n /** macro attribute (CT_Connector). */\n macro?: string;\n}\n\n/** Shape nested inside a group (no anchor — positioned via spPr.xfrm). */\nexport interface GroupShapeChildOptions extends NonVisualDrawingPropertiesOptions {\n spPr: ShapePropertiesOptions;\n textBody?: TextBodyOptions;\n macro?: string;\n textlink?: string;\n}\n\n/** Connector nested inside a group (no anchor). */\nexport interface GroupConnectorChildOptions extends BaseConnectorOptions {\n spPr: ShapePropertiesOptions;\n macro?: string;\n}\n\n/** Anchored group (xdr:grpSp): group transform + nested shapes/connectors. */\nexport interface GroupOptions extends DrawingAnchorOptions, BaseGroupOptions {\n /** Group shape properties (a:CT_GroupShapeProperties: group xfrm + fill/ln). */\n grpSpPr: GroupTransform2DOptions;\n /** Nested shapes. */\n shapes?: GroupShapeChildOptions[];\n /** Nested connectors. */\n connectors?: GroupConnectorChildOptions[];\n}\n\n/** Anchored external content reference (xdr:contentPart, r:id only). */\nexport interface DrawingContentPartOptions extends DrawingAnchorOptions {\n /** Relationship ID for the external content. */\n rId: string;\n}\n\nexport interface DrawingOptions {\n images?: DrawingPictureOptions[];\n charts?: DrawingChartOptions[];\n shapes?: ShapeOptions[];\n connectors?: ConnectorOptions[];\n groups?: GroupOptions[];\n contentParts?: DrawingContentPartOptions[];\n}\n","/**\n * XLSX Drawing — parse helpers for spreadsheetDrawing anchors.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport {\n connectorLockingDesc,\n parseEndpointConnection,\n groupShapePropertiesDesc,\n parseNonVisualDrawingProperties,\n shapePropertiesDesc,\n textBodyDesc,\n} from \"@office-open/core/drawing\";\nimport type {\n ConnectorLockingOptions,\n EndpointConnectionOptions,\n NonVisualDrawingPropertiesOptions,\n} from \"@office-open/core/drawing\";\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n DrawingAnchorOptions,\n DrawingChartOptions,\n DrawingContentPartOptions,\n ConnectorOptions,\n GroupOptions,\n DrawingPictureOptions,\n ShapeOptions,\n GroupConnectorChildOptions,\n GroupShapeChildOptions,\n} from \"./types\";\nimport { ANCHOR_TYPES } from \"./types\";\nimport type { EditAsType } from \"./types\";\n\n// ── Parse helpers ──\n\nfunction readNumChild(el: XmlElement, tag: string): number {\n const child = findChild(el, tag);\n if (!child?.elements?.length) return 0;\n const n = Number(child.elements[0]?.text ?? \"\");\n return Number.isNaN(n) ? 0 : n;\n}\n\ninterface Marker {\n col: number;\n colOffset?: number | UniversalMeasure;\n row: number;\n rowOffset?: number | UniversalMeasure;\n}\n\nfunction readMarker(el: XmlElement): Marker {\n return {\n col: readNumChild(el, \"col\") + 1,\n colOffset: readNumChild(el, \"colOff\") || undefined,\n row: readNumChild(el, \"row\") + 1,\n rowOffset: readNumChild(el, \"rowOff\") || undefined,\n };\n}\n\n/** Populate anchor fields (col/row/extent/anchorType/editAs/locks) from an anchor element. */\nfunction readAnchorFields(anchor: XmlElement, name: string, result: DrawingAnchorOptions): void {\n result.col = 1;\n result.row = 1;\n\n const clientData = findChild(anchor, \"clientData\");\n if (clientData?.attributes) {\n if (clientData.attributes[\"fLocksWithSheet\"] !== undefined) {\n result.locksWithSheet = parseOnOff(clientData.attributes[\"fLocksWithSheet\"]) ?? true;\n }\n if (clientData.attributes[\"fPrintsWithSheet\"] !== undefined) {\n result.printsWithSheet = parseOnOff(clientData.attributes[\"fPrintsWithSheet\"]) ?? true;\n }\n }\n\n const readExt = (el: XmlElement | undefined): void => {\n if (!el?.attributes) return;\n const cx = Number(el.attributes[\"cx\"]);\n const cy = Number(el.attributes[\"cy\"]);\n if (!Number.isNaN(cx)) result.extentCx = cx;\n if (!Number.isNaN(cy)) result.extentCy = cy;\n };\n\n if (name === \"absoluteAnchor\") {\n result.anchorType = ANCHOR_TYPES.absolute;\n const pos = findChild(anchor, \"pos\");\n if (pos?.attributes) {\n const x = Number(pos.attributes[\"x\"]);\n const y = Number(pos.attributes[\"y\"]);\n if (!Number.isNaN(x)) result.absoluteX = x;\n if (!Number.isNaN(y)) result.absoluteY = y;\n }\n readExt(findChild(anchor, \"ext\"));\n return;\n }\n\n const from = findChild(anchor, \"from\");\n if (from) {\n const m = readMarker(from);\n result.col = m.col;\n result.row = m.row;\n if (m.colOffset !== undefined) result.colOffset = m.colOffset;\n if (m.rowOffset !== undefined) result.rowOffset = m.rowOffset;\n }\n\n if (name === \"oneCellAnchor\") {\n result.anchorType = ANCHOR_TYPES.oneCell;\n readExt(findChild(anchor, \"ext\"));\n return;\n }\n\n // twoCellAnchor\n result.anchorType = ANCHOR_TYPES.twoCell;\n const to = findChild(anchor, \"to\");\n if (to) {\n const m = readMarker(to);\n result.toCol = m.col;\n result.toRow = m.row;\n if (m.colOffset !== undefined) result.toColOffset = m.colOffset;\n if (m.rowOffset !== undefined) result.toRowOffset = m.rowOffset;\n }\n const editAs = anchor.attributes?.[\"editAs\"] as EditAsType | undefined;\n if (editAs) result.editAs = editAs;\n}\n\n/** Read cNvPr (a:CT_NonVisualDrawingProps) from a non-visual properties child. */\nfunction readCNvPr(\n parent: XmlElement,\n nonVisualTag: string,\n): Partial<NonVisualDrawingPropertiesOptions> {\n const nonVisual = findChild(parent, nonVisualTag);\n const cNvPr = nonVisual ? findChild(nonVisual, \"cNvPr\") : undefined;\n return parseNonVisualDrawingProperties(cNvPr);\n}\n\nexport function parseImageAnchor(\n anchor: XmlElement,\n pic: XmlElement,\n name: string,\n): DrawingPictureOptions {\n const result: DrawingPictureOptions = {\n col: 1,\n row: 1,\n rId: readPicRId(pic) ?? \"\",\n };\n\n // Actual image size (applies to all anchor types).\n const ext = readPicExtent(pic);\n if (ext.cx !== undefined) result.extentCx = ext.cx;\n if (ext.cy !== undefined) result.extentCy = ext.cy;\n\n readAnchorFields(anchor, name, result);\n return result;\n}\n\nfunction readPicRId(pic: XmlElement): string | undefined {\n const blipFill = findChild(pic, \"blipFill\") ?? pic;\n const blip = findChild(blipFill, \"a:blip\");\n return blip?.attributes?.[\"r:embed\"] as string | undefined;\n}\n\n/** Picture extent from pic/spPr/a:xfrm/a:ext (actual image size in EMU). */\nfunction readPicExtent(pic: XmlElement): { cx?: number; cy?: number } {\n const spPr = findChild(pic, \"spPr\");\n const xfrm = spPr ? findChild(spPr, \"a:xfrm\") : undefined;\n const ext = xfrm ? findChild(xfrm, \"a:ext\") : undefined;\n if (!ext?.attributes) return {};\n const cx = Number(ext.attributes[\"cx\"]);\n const cy = Number(ext.attributes[\"cy\"]);\n return {\n cx: Number.isNaN(cx) ? undefined : cx,\n cy: Number.isNaN(cy) ? undefined : cy,\n };\n}\n\nexport function parseChartAnchor(\n anchor: XmlElement,\n graphicFrame: XmlElement,\n): DrawingChartOptions | undefined {\n const graphicData = findChild(\n findChild(graphicFrame, \"a:graphic\") ?? graphicFrame,\n \"a:graphicData\",\n );\n const chartEl = graphicData ? findChild(graphicData, \"c:chart\") : undefined;\n const rId = chartEl?.attributes?.[\"r:id\"] as string | undefined;\n if (!rId) return undefined;\n\n const result: DrawingChartOptions = { col: 1, row: 1, rId };\n const from = findChild(anchor, \"from\");\n if (from) {\n const m = readMarker(from);\n result.col = m.col;\n result.row = m.row;\n if (m.colOffset !== undefined) result.colOffset = m.colOffset;\n if (m.rowOffset !== undefined) result.rowOffset = m.rowOffset;\n }\n const clientData = findChild(anchor, \"clientData\");\n if (clientData?.attributes) {\n if (clientData.attributes[\"fLocksWithSheet\"] !== undefined) {\n result.locksWithSheet = parseOnOff(clientData.attributes[\"fLocksWithSheet\"]) ?? true;\n }\n if (clientData.attributes[\"fPrintsWithSheet\"] !== undefined) {\n result.printsWithSheet = parseOnOff(clientData.attributes[\"fPrintsWithSheet\"]) ?? true;\n }\n }\n return result;\n}\n\nexport function parseShapeAnchor(\n anchor: XmlElement,\n sp: XmlElement,\n name: string,\n ctx: ReadContext,\n): ShapeOptions {\n const result = { col: 1, row: 1, spPr: {} } as ShapeOptions;\n readAnchorFields(anchor, name, result);\n\n Object.assign(result, readCNvPr(sp, \"nvSpPr\"));\n\n const spPr = findChild(sp, \"spPr\");\n if (spPr) result.spPr = shapePropertiesDesc.parse(spPr, ctx);\n\n const txBody = findChild(sp, \"txBody\");\n if (txBody) result.textBody = textBodyDesc.parse(txBody, ctx);\n\n if (sp.attributes?.[\"macro\"] !== undefined) result.macro = String(sp.attributes[\"macro\"]);\n if (sp.attributes?.[\"textlink\"] !== undefined)\n result.textlink = String(sp.attributes[\"textlink\"]);\n return result;\n}\n\n/** Read cNvCxnSpPr children (cxnSpLocks/stCxn/endCxn) onto a connector target. */\nfunction readConnectorNonVisual(\n target: {\n locking?: ConnectorLockingOptions;\n startConnection?: EndpointConnectionOptions;\n endConnection?: EndpointConnectionOptions;\n },\n cxnSp: XmlElement,\n ctx: ReadContext,\n): void {\n const nvCxnSpPr = findChild(cxnSp, \"nvCxnSpPr\");\n if (!nvCxnSpPr) return;\n const cNvCxnSpPr = findChild(nvCxnSpPr, \"cNvCxnSpPr\");\n if (!cNvCxnSpPr) return;\n const cxnSpLocks = findChild(cNvCxnSpPr, \"a:cxnSpLocks\");\n if (cxnSpLocks) {\n const locks = connectorLockingDesc.parse(cxnSpLocks, ctx);\n if (locks && Object.keys(locks).length > 0) target.locking = locks;\n }\n const stCxn = findChild(cNvCxnSpPr, \"a:stCxn\");\n if (stCxn) {\n const conn = parseEndpointConnection(stCxn);\n if (conn) target.startConnection = conn;\n }\n const endCxn = findChild(cNvCxnSpPr, \"a:endCxn\");\n if (endCxn) {\n const conn = parseEndpointConnection(endCxn);\n if (conn) target.endConnection = conn;\n }\n}\n\nexport function parseConnectorAnchor(\n anchor: XmlElement,\n cxnSp: XmlElement,\n name: string,\n ctx: ReadContext,\n): ConnectorOptions {\n const result = { col: 1, row: 1, spPr: {} } as ConnectorOptions;\n readAnchorFields(anchor, name, result);\n\n Object.assign(result, readCNvPr(cxnSp, \"nvCxnSpPr\"));\n\n const spPr = findChild(cxnSp, \"spPr\");\n if (spPr) result.spPr = shapePropertiesDesc.parse(spPr, ctx);\n\n if (cxnSp.attributes?.[\"macro\"] !== undefined) result.macro = String(cxnSp.attributes[\"macro\"]);\n\n readConnectorNonVisual(result, cxnSp, ctx);\n return result;\n}\n\nexport function parseGroupAnchor(\n anchor: XmlElement,\n grpSp: XmlElement,\n name: string,\n ctx: ReadContext,\n): GroupOptions {\n const result = { col: 1, row: 1, grpSpPr: {} } as GroupOptions;\n readAnchorFields(anchor, name, result);\n\n Object.assign(result, readCNvPr(grpSp, \"nvGrpSpPr\"));\n\n const grpSpPrEl = findChild(grpSp, \"grpSpPr\");\n if (grpSpPrEl) {\n result.grpSpPr = groupShapePropertiesDesc.parse(grpSpPrEl, ctx);\n }\n\n const shapes: GroupShapeChildOptions[] = [];\n const childConnectors: GroupConnectorChildOptions[] = [];\n for (const child of grpSp.elements ?? []) {\n if (child.name === \"sp\") {\n const spPr = findChild(child, \"spPr\");\n const childShape = {\n spPr: spPr ? shapePropertiesDesc.parse(spPr, ctx) : {},\n } as GroupShapeChildOptions;\n Object.assign(childShape, readCNvPr(child, \"nvSpPr\"));\n const txBody = findChild(child, \"txBody\");\n if (txBody) childShape.textBody = textBodyDesc.parse(txBody, ctx);\n if (child.attributes?.[\"macro\"] !== undefined)\n childShape.macro = String(child.attributes[\"macro\"]);\n if (child.attributes?.[\"textlink\"] !== undefined)\n childShape.textlink = String(child.attributes[\"textlink\"]);\n shapes.push(childShape);\n } else if (child.name === \"cxnSp\") {\n const spPr = findChild(child, \"spPr\");\n const childConn = {\n spPr: spPr ? shapePropertiesDesc.parse(spPr, ctx) : {},\n } as GroupConnectorChildOptions;\n Object.assign(childConn, readCNvPr(child, \"nvCxnSpPr\"));\n if (child.attributes?.[\"macro\"] !== undefined)\n childConn.macro = String(child.attributes[\"macro\"]);\n readConnectorNonVisual(childConn, child, ctx);\n childConnectors.push(childConn);\n }\n }\n if (shapes.length > 0) result.shapes = shapes;\n if (childConnectors.length > 0) result.connectors = childConnectors;\n return result;\n}\n\nexport function parseContentPartAnchor(\n anchor: XmlElement,\n contentPart: XmlElement,\n name: string,\n): DrawingContentPartOptions | undefined {\n const rId = contentPart.attributes?.[\"r:id\"] as string | undefined;\n if (!rId) return undefined;\n const result = { col: 1, row: 1, rId } as DrawingContentPartOptions;\n readAnchorFields(anchor, name, result);\n return result;\n}\n","/**\n * XLSX Drawing — stringify helpers for spreadsheetDrawing anchors.\n *\n * @module\n */\n\nimport { convertToEmu } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport type { WriteContext } from \"@office-open/core/descriptor\";\nimport {\n connectorLockingDesc,\n groupShapePropertiesDesc,\n shapePropertiesDesc,\n stringifyEndpointConnection,\n stringifyNonVisualDrawingProperties,\n textBodyDesc,\n} from \"@office-open/core/drawing\";\nimport type {\n ConnectorLockingOptions,\n EndpointConnectionOptions,\n NonVisualDrawingPropertiesOptions,\n ShapePropertiesOptions,\n TextBodyOptions,\n} from \"@office-open/core/drawing\";\nimport { escapeXml } from \"@office-open/xml\";\n\nimport type {\n DrawingAnchorOptions,\n DrawingContentPartOptions,\n ConnectorOptions,\n GroupOptions,\n DrawingPictureOptions,\n DrawingChartOptions,\n ShapeOptions,\n} from \"./types\";\nimport { ANCHOR_TYPES, EDIT_AS_TYPES } from \"./types\";\n\n// ── Constants ──\n\nexport const XDR_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nexport const A_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nexport const R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nexport const C_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\n\nexport const DEFAULT_EXTENT_CX = 400000;\nexport const DEFAULT_EXTENT_CY = 300000;\n\n// ── Stringify helpers ──\n\n/** Marker cell (0-based col/row + EMU offsets). */\nfunction markerXml(\n col: number,\n colOff: number | UniversalMeasure,\n row: number,\n rowOff: number | UniversalMeasure,\n): string {\n return `<col>${col - 1}</col><colOff>${convertToEmu(colOff)}</colOff><row>${row - 1}</row><rowOff>${convertToEmu(rowOff)}</rowOff>`;\n}\n\nexport function clientDataXml(obj: {\n locksWithSheet?: boolean;\n printsWithSheet?: boolean;\n}): string {\n const locks = obj.locksWithSheet !== false ? 1 : 0;\n const prints = obj.printsWithSheet !== false ? 1 : 0;\n return `<clientData fLocksWithSheet=\"${locks}\" fPrintsWithSheet=\"${prints}\"/>`;\n}\n\n/** Wrap an anchored object in the appropriate xdr:*Anchor element. */\nexport function wrapAnchor(opts: DrawingAnchorOptions, inner: string): string {\n const anchorType = opts.anchorType ?? ANCHOR_TYPES.twoCell;\n const cx = convertToEmu(opts.extentCx ?? DEFAULT_EXTENT_CX);\n const cy = convertToEmu(opts.extentCy ?? DEFAULT_EXTENT_CY);\n\n if (anchorType === ANCHOR_TYPES.absolute) {\n const x = convertToEmu(opts.absoluteX ?? 0);\n const y = convertToEmu(opts.absoluteY ?? 0);\n return `<absoluteAnchor><pos x=\"${x}\" y=\"${y}\"/><ext cx=\"${cx}\" cy=\"${cy}\"/>${inner}</absoluteAnchor>`;\n }\n\n const from = markerXml(opts.col, opts.colOffset ?? 0, opts.row, opts.rowOffset ?? 0);\n\n if (anchorType === ANCHOR_TYPES.oneCell) {\n return `<oneCellAnchor><from>${from}</from><ext cx=\"${cx}\" cy=\"${cy}\"/>${inner}</oneCellAnchor>`;\n }\n\n // twoCell\n const editAs = opts.editAs ?? EDIT_AS_TYPES.oneCell;\n const to = markerXml(\n opts.toCol ?? opts.col + 1,\n opts.toColOffset ?? 0,\n opts.toRow ?? opts.row + 1,\n opts.toRowOffset ?? 0,\n );\n return `<twoCellAnchor editAs=\"${editAs}\"><from>${from}</from><to>${to}</to>${inner}</twoCellAnchor>`;\n}\n\nfunction picXml(\n img: DrawingPictureOptions,\n id: number,\n cx: number,\n cy: number,\n ctx: WriteContext,\n): string {\n const spPr =\n shapePropertiesDesc.stringify({ x: 0, y: 0, width: cx, height: cy, geometry: \"rect\" }, ctx) ??\n \"\";\n return (\n `<pic><nvPicPr>${stringifyNonVisualDrawingProperties(\"cNvPr\", id, img, `Picture ${id}`)}<cNvPicPr preferRelativeResize=\"1\"/></nvPicPr>` +\n `<blipFill><a:blip r:embed=\"${img.rId}\"/><a:stretch><a:fillRect/></a:stretch></blipFill>` +\n `<spPr>${spPr}</spPr></pic>`\n );\n}\n\nexport function stringifyImage(img: DrawingPictureOptions, id: number, ctx: WriteContext): string {\n const cx = convertToEmu(img.extentCx ?? DEFAULT_EXTENT_CX);\n const cy = convertToEmu(img.extentCy ?? DEFAULT_EXTENT_CY);\n const pic = picXml(img, id, cx, cy, ctx);\n return wrapAnchor(img, `${pic}${clientDataXml(img)}`);\n}\n\n/**\n * Build an xdr:graphicFrame hosting a chart reference. The xfrm extent is the\n * caller's choice: twoCell anchors carry 0×0 (position comes from the cell\n * markers), absolute anchors carry the real frame size.\n */\nexport function graphicFrameXml(\n id: number,\n cNvPr: NonVisualDrawingPropertiesOptions | undefined,\n name: string,\n rId: string,\n cx: number,\n cy: number,\n): string {\n return (\n `<graphicFrame><nvGraphicFramePr>${stringifyNonVisualDrawingProperties(\"cNvPr\", id, cNvPr, name)}` +\n `<cNvGraphicFramePr><a:graphicFrameLocks noGrp=\"1\"/></cNvGraphicFramePr></nvGraphicFramePr>` +\n `<xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></xfrm>` +\n `<a:graphic><a:graphicData uri=\"${C_URI}\">` +\n `<c:chart xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" xmlns:r=\"${R_NS}\" r:id=\"${rId}\"/>` +\n `</a:graphicData></a:graphic></graphicFrame>`\n );\n}\n\nexport function stringifyChart(chart: DrawingChartOptions, id: number): string {\n // Charts default to twoCellAnchor (existing behavior).\n const from = markerXml(chart.col, chart.colOffset ?? 0, chart.row, chart.rowOffset ?? 0);\n const to = markerXml(chart.col + 9, 0, chart.row + 16, 0);\n const clientData = clientDataXml(chart);\n const frame = graphicFrameXml(id, chart, `Chart ${id}`, chart.rId, 0, 0);\n return `<twoCellAnchor editAs=\"oneCell\"><from>${from}</from><to>${to}</to>${frame}${clientData}</twoCellAnchor>`;\n}\n\n/** Build the inner xdr:sp content (nvSpPr + spPr + optional txBody). */\nfunction buildShapeContent(\n cNvPr: NonVisualDrawingPropertiesOptions | undefined,\n id: number,\n fallbackName: string,\n spPr: ShapePropertiesOptions,\n textBody: TextBodyOptions | undefined,\n ctx: WriteContext,\n attrs = \"\",\n): string {\n const spPrXml = shapePropertiesDesc.stringify(spPr, ctx) ?? \"\";\n const txBodyXml = textBody ? `<txBody>${textBodyDesc.stringify(textBody, ctx)}</txBody>` : \"\";\n return `<sp${attrs}><nvSpPr>${stringifyNonVisualDrawingProperties(\"cNvPr\", id, cNvPr, fallbackName)}<cNvSpPr/></nvSpPr><spPr>${spPrXml}</spPr>${txBodyXml}</sp>`;\n}\n\n/** Build the inner xdr:cxnSp content (nvCxnSpPr + spPr). */\nfunction buildConnectorContent(\n cNvPr: NonVisualDrawingPropertiesOptions | undefined,\n id: number,\n fallbackName: string,\n spPr: ShapePropertiesOptions,\n ctx: WriteContext,\n attrs = \"\",\n connector?: {\n locking?: ConnectorLockingOptions;\n startConnection?: EndpointConnectionOptions;\n endConnection?: EndpointConnectionOptions;\n },\n): string {\n const spPrXml = shapePropertiesDesc.stringify(spPr, ctx) ?? \"\";\n const cNvCxnSpPrInner: string[] = [];\n if (connector?.locking) {\n const locks = connectorLockingDesc.stringify(connector.locking, ctx);\n if (locks) cNvCxnSpPrInner.push(locks);\n }\n if (connector?.startConnection) {\n cNvCxnSpPrInner.push(stringifyEndpointConnection(\"stCxn\", connector.startConnection));\n }\n if (connector?.endConnection) {\n cNvCxnSpPrInner.push(stringifyEndpointConnection(\"endCxn\", connector.endConnection));\n }\n const cNvCxnSpPr = cNvCxnSpPrInner.length\n ? `<cNvCxnSpPr>${cNvCxnSpPrInner.join(\"\")}</cNvCxnSpPr>`\n : \"<cNvCxnSpPr/>\";\n return `<cxnSp${attrs}><nvCxnSpPr>${stringifyNonVisualDrawingProperties(\"cNvPr\", id, cNvPr, fallbackName)}${cNvCxnSpPr}</nvCxnSpPr><spPr>${spPrXml}</spPr></cxnSp>`;\n}\n\nexport function stringifyShape(shape: ShapeOptions, id: number, ctx: WriteContext): string {\n const xml = buildShapeContent(\n shape,\n id,\n `Shape ${id}`,\n shape.spPr,\n shape.textBody,\n ctx,\n macroTextlinkAttrs(shape),\n );\n return wrapAnchor(shape, `${xml}${clientDataXml(shape)}`);\n}\n\nexport function stringifyConnector(conn: ConnectorOptions, id: number, ctx: WriteContext): string {\n const xml = buildConnectorContent(\n conn,\n id,\n `Connector ${id}`,\n conn.spPr,\n ctx,\n macroTextlinkAttrs(conn),\n conn,\n );\n return wrapAnchor(conn, `${xml}${clientDataXml(conn)}`);\n}\n\nexport function stringifyContentPart(cp: DrawingContentPartOptions): string {\n return wrapAnchor(cp, `<contentPart r:id=\"${cp.rId}\"/>${clientDataXml(cp)}`);\n}\n\n/** Build xdr:grpSp content and return the next available cNvPr id. */\nexport function buildGroup(\n grp: GroupOptions,\n id: number,\n ctx: WriteContext,\n): { xml: string; nextId: number } {\n const grpSpPrXml = groupShapePropertiesDesc.stringify(grp.grpSpPr, ctx) ?? \"\";\n let childId = id + 1;\n const children: string[] = [];\n for (const childShape of grp.shapes ?? []) {\n children.push(\n buildShapeContent(\n childShape,\n childId,\n `Shape ${childId}`,\n childShape.spPr,\n childShape.textBody,\n ctx,\n macroTextlinkAttrs(childShape),\n ),\n );\n childId++;\n }\n for (const childConn of grp.connectors ?? []) {\n children.push(\n buildConnectorContent(\n childConn,\n childId,\n `Connector ${childId}`,\n childConn.spPr,\n ctx,\n macroTextlinkAttrs(childConn),\n childConn,\n ),\n );\n childId++;\n }\n const xml =\n `<grpSp><nvGrpSpPr>${stringifyNonVisualDrawingProperties(\"cNvPr\", id, grp, `Group ${id}`)}<cNvGrpSpPr/></nvGrpSpPr>` +\n `<grpSpPr>${grpSpPrXml}</grpSpPr>${children.join(\"\")}</grpSp>`;\n return { xml, nextId: childId };\n}\n\n/** CT_Shape attribute string (macro/textlink) with leading space, or empty. */\nfunction macroTextlinkAttrs(shape: { macro?: string; textlink?: string }): string {\n const a: string[] = [];\n if (shape.macro !== undefined) a.push(`macro=\"${escapeXml(shape.macro)}\"`);\n if (shape.textlink !== undefined) a.push(`textlink=\"${escapeXml(shape.textlink)}\"`);\n return a.length ? \" \" + a.join(\" \") : \"\";\n}\n","/**\n * XLSX Drawing — anchor objects and descriptor.\n *\n * Generates xl/drawings/drawing{n}.xml using the spreadsheetDrawing\n * namespace for anchoring drawing objects (images, charts, shapes, groups,\n * connectors, content parts) to worksheet cells.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { findChild } from \"@office-open/xml\";\n\nimport {\n parseChartAnchor,\n parseConnectorAnchor,\n parseContentPartAnchor,\n parseGroupAnchor,\n parseImageAnchor,\n parseShapeAnchor,\n} from \"./parse\";\nimport {\n buildGroup,\n clientDataXml,\n stringifyChart,\n stringifyConnector,\n stringifyContentPart,\n stringifyImage,\n stringifyShape,\n wrapAnchor,\n A_NS,\n R_NS,\n XDR_NS,\n} from \"./stringify\";\nimport type {\n DrawingChartOptions,\n DrawingContentPartOptions,\n ConnectorOptions,\n GroupOptions,\n DrawingPictureOptions,\n DrawingOptions,\n ShapeOptions,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const drawingDesc: CustomDescriptor<DrawingOptions> = {\n kind: \"custom\",\n\n stringify(opts, ctx) {\n const images = opts.images ?? [];\n const charts = opts.charts ?? [];\n const shapes = opts.shapes ?? [];\n const connectors = opts.connectors ?? [];\n const groups = opts.groups ?? [];\n const contentParts = opts.contentParts ?? [];\n const total =\n images.length +\n charts.length +\n shapes.length +\n connectors.length +\n groups.length +\n contentParts.length;\n if (total === 0) return undefined;\n\n const p: string[] = [`<wsDr xmlns=\"${XDR_NS}\" xmlns:a=\"${A_NS}\" xmlns:r=\"${R_NS}\">`];\n let id = 1;\n\n for (const img of images) {\n p.push(stringifyImage(img, id, ctx));\n id++;\n }\n for (const chart of charts) {\n p.push(stringifyChart(chart, id));\n id++;\n }\n for (const shape of shapes) {\n p.push(stringifyShape(shape, id, ctx));\n id++;\n }\n for (const conn of connectors) {\n p.push(stringifyConnector(conn, id, ctx));\n id++;\n }\n for (const grp of groups) {\n const built = buildGroup(grp, id, ctx);\n p.push(wrapAnchor(grp, `${built.xml}${clientDataXml(grp)}`));\n id = built.nextId;\n }\n for (const cp of contentParts) {\n p.push(stringifyContentPart(cp));\n id++;\n }\n\n p.push(\"</wsDr>\");\n return p.join(\"\");\n },\n\n parse(el, ctx) {\n const result: Partial<DrawingOptions> = {};\n const images: DrawingPictureOptions[] = [];\n const charts: DrawingChartOptions[] = [];\n const shapes: ShapeOptions[] = [];\n const connectors: ConnectorOptions[] = [];\n const groups: GroupOptions[] = [];\n const contentParts: DrawingContentPartOptions[] = [];\n\n for (const anchor of el.elements ?? []) {\n const name = anchor.name;\n if (name !== \"twoCellAnchor\" && name !== \"oneCellAnchor\" && name !== \"absoluteAnchor\") {\n continue;\n }\n\n const pic = findChild(anchor, \"pic\");\n if (pic) {\n images.push(parseImageAnchor(anchor, pic, name));\n continue;\n }\n\n const graphicFrame = findChild(anchor, \"graphicFrame\");\n if (graphicFrame) {\n const chart = parseChartAnchor(anchor, graphicFrame);\n if (chart) charts.push(chart);\n continue;\n }\n\n const sp = findChild(anchor, \"sp\");\n if (sp) {\n shapes.push(parseShapeAnchor(anchor, sp, name, ctx));\n continue;\n }\n\n const cxnSp = findChild(anchor, \"cxnSp\");\n if (cxnSp) {\n connectors.push(parseConnectorAnchor(anchor, cxnSp, name, ctx));\n continue;\n }\n\n const grpSp = findChild(anchor, \"grpSp\");\n if (grpSp) {\n groups.push(parseGroupAnchor(anchor, grpSp, name, ctx));\n continue;\n }\n\n const contentPart = findChild(anchor, \"contentPart\");\n if (contentPart) {\n const cp = parseContentPartAnchor(anchor, contentPart, name);\n if (cp) contentParts.push(cp);\n }\n }\n\n if (images.length > 0) result.images = images;\n if (charts.length > 0) result.charts = charts;\n if (shapes.length > 0) result.shapes = shapes;\n if (connectors.length > 0) result.connectors = connectors;\n if (groups.length > 0) result.groups = groups;\n if (contentParts.length > 0) result.contentParts = contentParts;\n return result as DrawingOptions;\n },\n};\n","/**\n * External Link types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_ExternalLink\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, findChild } from \"@office-open/xml\";\n\n// ── Types ──\n\nexport interface ExternalDefinedNameOptions {\n name: string;\n refersTo?: string;\n sheetId?: number;\n /** Publish to server (CT_DefinedName @publishToServer) */\n publishToServer?: boolean;\n /** VBA procedure (CT_DefinedName @vbProcedure) */\n vbProcedure?: boolean;\n /** Workbook parameter (CT_DefinedName @workbookParameter) */\n workbookParameter?: boolean;\n /** XLM macro (CT_DefinedName @xlm) */\n xlm?: boolean;\n}\n\nexport interface ExternalCellOptions {\n /** Cell reference, e.g. \"A1\" */\n reference: string;\n /** Cell data type */\n type?: string;\n /** Cell value */\n value?: string;\n /** Value metadata index (CT_ExternalCell @vm) */\n valueMetadataIndex?: number;\n}\n\nexport interface ExternalBookOptions {\n /** Target path of the external workbook */\n target?: string;\n /** Sheet names from the external workbook */\n sheetNames?: string[];\n /** Defined names from the external workbook */\n definedNames?: ExternalDefinedNameOptions[];\n /** Cached sheet data from the external workbook */\n sheetDataSet?: ExternalSheetDataOptions[];\n}\n\nexport interface ExternalRowOptions {\n /** Row number (1-based) */\n rowNumber: number;\n cells?: ExternalCellOptions[];\n}\n\nexport interface ExternalSheetDataOptions {\n sheetId: number;\n refreshError?: boolean;\n rows?: ExternalRowOptions[];\n}\n\nexport interface ExternalLinkOptions {\n /** External book configuration */\n externalBook?: ExternalBookOptions;\n /** Relationship ID for the external book (set by compiler) */\n bookRId?: string;\n /** DDE link configuration (CT_DdeLink) */\n ddeLink?: DdeLinkOptions;\n /** OLE link configuration (CT_OleLink) */\n oleLink?: OleLinkOptions;\n /** Relationship ID for the OLE link (set by compiler) */\n oleRId?: string;\n}\n\n/** One cached DDE value (CT_DdeValue — val element + type attribute). */\nexport interface DdeValueOptions {\n /** Value type (ST_DdeValueType, default \"n\") */\n type?: \"nil\" | \"b\" | \"n\" | \"e\" | \"str\";\n /** Value text (the val element) */\n value: string;\n}\n\n/** Cached DDE value grid (CT_DdeValues) */\nexport interface DdeValuesOptions {\n /** Row count of the cached grid (default 1) */\n rows?: number;\n /** Column count of the cached grid (default 1) */\n cols?: number;\n values: DdeValueOptions[];\n}\n\n/** One DDE item (CT_DdeItem) */\nexport interface DdeItemOptions {\n /** Item name (default \"0\") */\n name?: string;\n /** Item is an OLE link */\n ole?: boolean;\n /** Advise events on the item */\n advise?: boolean;\n /** Prefer picture representation */\n preferPic?: boolean;\n /** Cached values */\n values?: DdeValuesOptions;\n}\n\n/** DDE link (CT_DdeLink — ddeService/ddeTopic + items) */\nexport interface DdeLinkOptions {\n /** DDE service name */\n ddeService: string;\n /** DDE topic */\n ddeTopic: string;\n /** DDE items */\n ddeItems?: DdeItemOptions[];\n}\n\nexport interface OleItemOptions {\n /** OLE item name (required) */\n name: string;\n /** Show as icon */\n icon?: boolean;\n /** Whether to advise events */\n advise?: boolean;\n /** Prefer picture representation */\n preferPic?: boolean;\n}\n\nexport interface OleLinkOptions {\n /** OLE program identifier (CT_OleLink @progId) */\n progId?: string;\n /** OLE items */\n oleItems?: OleItemOptions[];\n}\n\n// ── Descriptor ──\n\nexport const externalLinkDesc: CustomDescriptor<ExternalLinkOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<externalLink xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n if (opts.externalBook) {\n const book = opts.externalBook;\n const bookParts: string[] = [];\n\n if (book.sheetNames && book.sheetNames.length > 0) {\n bookParts.push(\"<sheetNames>\");\n for (const name of book.sheetNames) {\n bookParts.push(`<sheetName val=\"${escapeXml(name)}\"/>`);\n }\n bookParts.push(\"</sheetNames>\");\n }\n\n if (book.definedNames && book.definedNames.length > 0) {\n bookParts.push(\"<definedNames>\");\n for (const dn of book.definedNames) {\n const dnAttrs: Record<string, string | number | boolean | undefined> = { name: dn.name };\n if (dn.refersTo !== undefined) dnAttrs.refersTo = dn.refersTo;\n if (dn.sheetId !== undefined) dnAttrs.sheetId = dn.sheetId;\n if (dn.publishToServer) dnAttrs.publishToServer = 1;\n if (dn.vbProcedure) dnAttrs.vbProcedure = 1;\n if (dn.workbookParameter) dnAttrs.workbookParameter = 1;\n if (dn.xlm) dnAttrs.xlm = 1;\n bookParts.push(`<definedName${attrs(dnAttrs)}/>`);\n }\n bookParts.push(\"</definedNames>\");\n }\n\n if (book.sheetDataSet && book.sheetDataSet.length > 0) {\n bookParts.push(\"<sheetDataSet>\");\n for (const sd of book.sheetDataSet) {\n const sdAttrs: Record<string, string | number | boolean | undefined> = {\n sheetId: sd.sheetId,\n };\n if (sd.refreshError) sdAttrs.refreshError = 1;\n bookParts.push(`<sheetData${attrs(sdAttrs)}>`);\n\n if (sd.rows) {\n for (const row of sd.rows) {\n bookParts.push(`<row r=\"${row.rowNumber}\">`);\n if (row.cells) {\n for (const cell of row.cells) {\n const cellAttrs: Record<string, string | number | undefined> = {\n r: cell.reference,\n };\n if (cell.type !== undefined) cellAttrs.t = cell.type;\n if (cell.valueMetadataIndex !== undefined) cellAttrs.vm = cell.valueMetadataIndex;\n if (cell.value !== undefined) {\n bookParts.push(\n `<cell${attrs(cellAttrs)}><v>${escapeXml(cell.value)}</v></cell>`,\n );\n } else {\n bookParts.push(`<cell${attrs(cellAttrs)}/>`);\n }\n }\n }\n bookParts.push(\"</row>\");\n }\n }\n bookParts.push(\"</sheetData>\");\n }\n bookParts.push(\"</sheetDataSet>\");\n }\n\n const ridAttr = opts.bookRId ? ` r:id=\"${opts.bookRId}\"` : \"\";\n p.push(\n `<externalBook${ridAttr}${bookParts.length > 0 ? `>${bookParts.join(\"\")}</externalBook>` : \"/>\"}`,\n );\n }\n\n // ddeLink (CT_DdeLink — ddeService/ddeTopic + items with cached values)\n if (opts.ddeLink) {\n const dde = opts.ddeLink;\n const ddeParts: string[] = [];\n if (dde.ddeItems && dde.ddeItems.length > 0) {\n ddeParts.push(\"<ddeItems>\");\n for (const item of dde.ddeItems) {\n const itemAttrs: string[] = [];\n if (item.name !== undefined) itemAttrs.push(`name=\"${escapeXml(item.name)}\"`);\n if (item.ole) itemAttrs.push('ole=\"1\"');\n if (item.advise) itemAttrs.push('advise=\"1\"');\n if (item.preferPic) itemAttrs.push('preferPic=\"1\"');\n if (item.values) {\n const v = item.values;\n const valuesAttrs: string[] = [];\n if (v.rows !== undefined) valuesAttrs.push(`rows=\"${v.rows}\"`);\n if (v.cols !== undefined) valuesAttrs.push(`cols=\"${v.cols}\"`);\n const valueParts: string[] = [];\n for (const dv of v.values) {\n const valueAttrs = dv.type !== undefined ? ` t=\"${dv.type}\"` : \"\";\n valueParts.push(`<value${valueAttrs}><val>${escapeXml(dv.value)}</val></value>`);\n }\n ddeParts.push(\n `<ddeItem${itemAttrs.length > 0 ? \" \" + itemAttrs.join(\" \") : \"\"}><values${valuesAttrs.length > 0 ? \" \" + valuesAttrs.join(\" \") : \"\"}>${valueParts.join(\"\")}</values></ddeItem>`,\n );\n } else {\n ddeParts.push(`<ddeItem${itemAttrs.length > 0 ? \" \" + itemAttrs.join(\" \") : \"\"}/>`);\n }\n }\n ddeParts.push(\"</ddeItems>\");\n }\n p.push(\n `<ddeLink ddeService=\"${escapeXml(dde.ddeService)}\" ddeTopic=\"${escapeXml(dde.ddeTopic)}\"${ddeParts.length > 0 ? `>${ddeParts.join(\"\")}</ddeLink>` : \"/>\"}`,\n );\n }\n\n // oleLink (CT_OleLink)\n if (opts.oleLink) {\n const oleRId = opts.oleRId ? ` r:id=\"${escapeXml(opts.oleRId)}\"` : \"\";\n const progIdAttr = opts.oleLink.progId ? ` progId=\"${escapeXml(opts.oleLink.progId)}\"` : \"\";\n const oleChildren: string[] = [];\n if (opts.oleLink.oleItems && opts.oleLink.oleItems.length > 0) {\n const itemParts: string[] = [`<oleItems>`];\n for (const item of opts.oleLink.oleItems) {\n const itemAttrs: string[] = [`name=\"${escapeXml(item.name)}\"`];\n if (item.icon) itemAttrs.push('icon=\"1\"');\n if (item.advise) itemAttrs.push('advise=\"1\"');\n if (item.preferPic) itemAttrs.push('preferPic=\"1\"');\n itemParts.push(`<oleItem ${itemAttrs.join(\" \")}/>`);\n }\n itemParts.push(\"</oleItems>\");\n oleChildren.push(itemParts.join(\"\"));\n }\n if (oleChildren.length > 0) {\n p.push(`<oleLink${oleRId}${progIdAttr}>${oleChildren.join(\"\")}</oleLink>`);\n } else {\n p.push(`<oleLink${oleRId}${progIdAttr}/>`);\n }\n }\n\n p.push(\"</externalLink>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<ExternalLinkOptions> = {};\n\n const bookEl = findChild(el, \"externalBook\");\n if (bookEl) {\n const book: ExternalBookOptions = {};\n if (bookEl.attributes?.[\"r:id\"]) result.bookRId = String(bookEl.attributes[\"r:id\"]);\n\n // sheetNames\n const sheetNamesEl = findChild(bookEl, \"sheetNames\");\n if (sheetNamesEl) {\n const names: string[] = [];\n for (const child of sheetNamesEl.elements ?? []) {\n if (child.name === \"sheetName\" && child.attributes?.[\"val\"]) {\n names.push(String(child.attributes[\"val\"]));\n }\n }\n if (names.length > 0) book.sheetNames = names;\n }\n\n // definedNames\n const definedNamesEl = findChild(bookEl, \"definedNames\");\n if (definedNamesEl) {\n const dns: ExternalDefinedNameOptions[] = [];\n for (const child of definedNamesEl.elements ?? []) {\n if (child.name !== \"definedName\") continue;\n const dn: ExternalDefinedNameOptions = { name: String(child.attributes?.[\"name\"] ?? \"\") };\n if (child.attributes?.[\"refersTo\"]) dn.refersTo = String(child.attributes[\"refersTo\"]);\n if (child.attributes?.[\"sheetId\"] !== undefined)\n dn.sheetId = Number(child.attributes[\"sheetId\"]);\n if (child.attributes?.[\"publishToServer\"]) dn.publishToServer = true;\n if (child.attributes?.[\"vbProcedure\"]) dn.vbProcedure = true;\n if (child.attributes?.[\"workbookParameter\"]) dn.workbookParameter = true;\n if (child.attributes?.[\"xlm\"]) dn.xlm = true;\n dns.push(dn);\n }\n if (dns.length > 0) book.definedNames = dns;\n }\n\n // sheetDataSet\n const sheetDataSetEl = findChild(bookEl, \"sheetDataSet\");\n if (sheetDataSetEl) {\n const sds: ExternalSheetDataOptions[] = [];\n for (const sdChild of sheetDataSetEl.elements ?? []) {\n if (sdChild.name !== \"sheetData\") continue;\n const sd: ExternalSheetDataOptions = {\n sheetId: Number(sdChild.attributes?.[\"sheetId\"] ?? 0),\n };\n if (sdChild.attributes?.[\"refreshError\"]) sd.refreshError = true;\n\n const rows: ExternalRowOptions[] = [];\n for (const rowChild of sdChild.elements ?? []) {\n if (rowChild.name !== \"row\") continue;\n const row: ExternalRowOptions = {\n rowNumber: Number(rowChild.attributes?.[\"r\"] ?? 0),\n };\n\n const cells: ExternalCellOptions[] = [];\n for (const cellChild of rowChild.elements ?? []) {\n if (cellChild.name !== \"cell\") continue;\n const cell: ExternalCellOptions = {\n reference: String(cellChild.attributes?.[\"r\"] ?? \"\"),\n };\n if (cellChild.attributes?.[\"t\"]) cell.type = String(cellChild.attributes[\"t\"]);\n if (cellChild.attributes?.[\"vm\"] !== undefined)\n cell.valueMetadataIndex = Number(cellChild.attributes[\"vm\"]);\n const vEl = findChild(cellChild, \"v\");\n if (vEl && vEl.elements?.[0]?.text !== undefined) {\n cell.value = String(vEl.elements[0].text);\n }\n cells.push(cell);\n }\n if (cells.length > 0) row.cells = cells;\n rows.push(row);\n }\n if (rows.length > 0) sd.rows = rows;\n sds.push(sd);\n }\n if (sds.length > 0) book.sheetDataSet = sds;\n }\n\n result.externalBook = book;\n }\n\n // ddeLink\n const ddeEl = findChild(el, \"ddeLink\");\n if (ddeEl) {\n const dde: DdeLinkOptions = {\n ddeService: String(ddeEl.attributes?.[\"ddeService\"] ?? \"\"),\n ddeTopic: String(ddeEl.attributes?.[\"ddeTopic\"] ?? \"\"),\n };\n\n const ddeItemsEl = findChild(ddeEl, \"ddeItems\");\n if (ddeItemsEl) {\n const items: DdeItemOptions[] = [];\n for (const child of ddeItemsEl.elements ?? []) {\n if (child.name !== \"ddeItem\") continue;\n const item: DdeItemOptions = {};\n if (child.attributes?.[\"name\"] !== undefined)\n item.name = String(child.attributes[\"name\"]);\n if (child.attributes?.[\"ole\"]) item.ole = true;\n if (child.attributes?.[\"advise\"]) item.advise = true;\n if (child.attributes?.[\"preferPic\"]) item.preferPic = true;\n\n const valuesEl = findChild(child, \"values\");\n if (valuesEl) {\n const values: DdeValuesOptions = { values: [] };\n if (valuesEl.attributes?.[\"rows\"] !== undefined)\n values.rows = Number(valuesEl.attributes[\"rows\"]);\n if (valuesEl.attributes?.[\"cols\"] !== undefined)\n values.cols = Number(valuesEl.attributes[\"cols\"]);\n for (const valueChild of valuesEl.elements ?? []) {\n if (valueChild.name !== \"value\") continue;\n const valEl = findChild(valueChild, \"val\");\n const dv: DdeValueOptions = {\n value: valEl ? String(valEl.elements?.[0]?.text ?? \"\") : \"\",\n };\n if (valueChild.attributes?.[\"t\"])\n dv.type = valueChild.attributes[\"t\"] as DdeValueOptions[\"type\"];\n values.values.push(dv);\n }\n item.values = values;\n }\n items.push(item);\n }\n if (items.length > 0) dde.ddeItems = items;\n }\n\n result.ddeLink = dde;\n }\n\n // oleLink\n const oleEl = findChild(el, \"oleLink\");\n if (oleEl) {\n const ole: OleLinkOptions = {};\n if (oleEl.attributes?.[\"r:id\"]) result.oleRId = String(oleEl.attributes[\"r:id\"]);\n if (oleEl.attributes?.[\"progId\"]) ole.progId = String(oleEl.attributes[\"progId\"]);\n\n const oleItemsEl = findChild(oleEl, \"oleItems\");\n if (oleItemsEl) {\n const items: OleItemOptions[] = [];\n for (const child of oleItemsEl.elements ?? []) {\n if (child.name !== \"oleItem\") continue;\n const item: OleItemOptions = { name: String(child.attributes?.[\"name\"] ?? \"\") };\n if (child.attributes?.[\"icon\"]) item.icon = true;\n if (child.attributes?.[\"advise\"]) item.advise = true;\n if (child.attributes?.[\"preferPic\"]) item.preferPic = true;\n items.push(item);\n }\n if (items.length > 0) ole.oleItems = items;\n }\n\n result.oleLink = ole;\n }\n\n return result as ExternalLinkOptions;\n },\n};\n","/**\n * Connection types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_Connections\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, escapeXml, findChild } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** Database (OLE DB) connection properties (CT_DbPr). */\nexport interface DatabasePropertiesOptions {\n /** OLE DB connection string (required) */\n connection: string;\n /** Command text */\n command?: string;\n /** Server command text (CT_DbPr @serverCommand) */\n serverCommand?: string;\n /** Command type: 1=cube, 2=SQL, 3=table (default 2) */\n commandType?: number;\n}\n\n/** One web-query table selection (CT_Tables choice: m/s/x). */\nexport type WebTableSelection = string | number | null;\n\n/** Web query properties (CT_WebPr). */\nexport interface WebPropertiesOptions {\n /** Source URL (CT_WebPr @url) */\n url?: string;\n /** XML source query (CT_WebPr @xml) */\n xml?: boolean;\n /** Source data included (CT_WebPr @sourceData) */\n sourceData?: boolean;\n /** Parse PRE tags into columns (CT_WebPr @parsePre) */\n parsePre?: boolean;\n /** Consecutive delimiters as one (CT_WebPr @consecutive) */\n consecutive?: boolean;\n /** First row contains headers (CT_WebPr @firstRow) */\n firstRow?: boolean;\n /** XL97 compatible (CT_WebPr @xl97) */\n xl97?: boolean;\n /** Dates as text (CT_WebPr @textDates) */\n textDates?: boolean;\n /** XL2000 compatible (CT_WebPr @xl2000) */\n xl2000?: boolean;\n /** POST request body (CT_WebPr @post) */\n post?: string;\n /** HTML tables only (CT_WebPr @htmlTables) */\n htmlTables?: boolean;\n /** HTML formatting: \"all\" | \"rtf\" | \"none\" (default \"none\") */\n htmlFormat?: string;\n /** Edit page URL (CT_WebPr @editPage) */\n editPage?: string;\n /** Selected tables (CT_Tables: string name, number index, null = all/missing) */\n tables?: WebTableSelection[];\n}\n\n/** Text import field (CT_TextField). */\nexport interface ConnectionTextFieldOptions {\n /** Field data type (ST_ExternalConnectionType, default \"general\") */\n type?: string;\n /** Field position (default 0) */\n position?: number;\n}\n\n/** Text import properties (CT_TextPr). */\nexport interface TextPropertiesOptions {\n /** Prompt for file name (default true) */\n prompt?: boolean;\n /** File type: \"mac\" | \"win\" | \"dos\" (default \"win\") */\n fileType?: \"mac\" | \"win\" | \"dos\";\n /** Code page (default 1252) */\n codePage?: number;\n /** Character set */\n characterSet?: string;\n /** First row to import (default 1) */\n firstRow?: number;\n /** Source file path */\n sourceFile?: string;\n /** Tab-delimited (default true) */\n delimited?: boolean;\n /** User-defined delimiter character (CT_TextPr @delimiter) */\n delimiter?: string;\n /** Decimal separator (default \".\") */\n decimal?: string;\n /** Thousands separator (default \",\") */\n thousands?: string;\n /** Tab delimiter (default true) */\n tab?: boolean;\n /** Space delimiter (default false) */\n space?: boolean;\n /** Comma delimiter (default false) */\n comma?: boolean;\n /** Semicolon delimiter (default false) */\n semicolon?: boolean;\n /** Consecutive delimiters as one (default false) */\n consecutive?: boolean;\n /** Text qualifier: \"doubleQuote\" | \"singleQuote\" | \"none\" */\n qualifier?: \"doubleQuote\" | \"singleQuote\" | \"none\";\n /** Field layout (CT_TextFields) */\n textFields?: ConnectionTextFieldOptions[];\n}\n\n/** Query parameter (CT_Parameter). */\nexport interface ParameterOptions {\n /** Parameter name */\n name?: string;\n /** SQL data type (default 0) */\n sqlType?: number;\n /** Parameter type: \"prompt\" | \"value\" | \"cell\" (default \"prompt\") */\n parameterType?: \"prompt\" | \"value\" | \"cell\";\n /** Refresh when the parameter value changes (default false) */\n refreshOnChange?: boolean;\n /** Prompt text */\n prompt?: string;\n /** Boolean value */\n boolean?: boolean;\n /** Numeric value */\n double?: number;\n /** Integer value */\n integer?: number;\n /** String value */\n string?: string;\n /** Cell reference for the value */\n cell?: string;\n}\n\n/** Workbook connection (CT_Connection). */\nexport interface ConnectionOptions {\n /** Unique connection ID (required) */\n id: number;\n /** Connection name */\n name?: string;\n /**\n * Source type code (ECMA 18.13.1; Excel-verified: 6 = text file source —\n * Office writes it for textPr connections. Excel rejects a type-2 dbPr\n * connection whose provider string it cannot resolve.)\n */\n type?: number;\n /** Version of the application that last refreshed the connection (required by XSD) */\n refreshedVersion: number;\n /** Minimum refreshable version (default 0) */\n minRefreshableVersion?: number;\n /** Refresh on load (default false) */\n refreshOnLoad?: boolean;\n /** Background refresh (default false) */\n backgroundRefresh?: boolean;\n /** Save data with the workbook (default false) */\n saveData?: boolean;\n /** Save password (default false) */\n savePassword?: boolean;\n /** Connection description */\n description?: string;\n /** Credentials method: \"integrated\" | \"none\" | \"stored\" | \"prompt\" (default \"integrated\") */\n credentials?: string;\n /** Refresh interval in minutes (default 0) */\n interval?: number;\n /** Keep connection alive (default false) */\n keepAlive?: boolean;\n /** Newly added connection (default false) */\n new?: boolean;\n /** Connection deleted (default false) */\n deleted?: boolean;\n /** Source file path (CT_Connection @sourceFile) */\n sourceFile?: string;\n /** ODC file path (CT_Connection @odcFile) */\n odcFile?: string;\n /** Only use the connection file (default false) */\n onlyUseConnectionFile?: boolean;\n /** Reconnection method (default 1) */\n reconnectionMethod?: number;\n /** Single sign-on ID (CT_Connection @singleSignOnId) */\n singleSignOnId?: string;\n /** Database properties (CT_DbPr) */\n dbPr?: DatabasePropertiesOptions;\n /** Web query properties (CT_WebPr) */\n webPr?: WebPropertiesOptions;\n /** Text import properties (CT_TextPr) */\n textPr?: TextPropertiesOptions;\n /** Parameters (CT_Parameters) */\n parameters?: ParameterOptions[];\n}\n\n/** Options for xl/connections.xml (CT_Connections). */\nexport interface ConnectionsOptions {\n /** Workbook connections */\n connections: ConnectionOptions[];\n}\n\n// ── Descriptor ──\n\nexport const connectionsDesc: CustomDescriptor<ConnectionsOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<connections xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n for (const c of opts.connections) {\n const cAttrs: string[] = [`id=\"${c.id}\"`];\n if (c.sourceFile !== undefined) cAttrs.push(`sourceFile=\"${escapeXml(c.sourceFile)}\"`);\n if (c.odcFile !== undefined) cAttrs.push(`odcFile=\"${escapeXml(c.odcFile)}\"`);\n if (c.keepAlive) cAttrs.push('keepAlive=\"1\"');\n if (c.interval !== undefined) cAttrs.push(`interval=\"${c.interval}\"`);\n if (c.name !== undefined) cAttrs.push(`name=\"${escapeXml(c.name)}\"`);\n if (c.description !== undefined) cAttrs.push(`description=\"${escapeXml(c.description)}\"`);\n if (c.type !== undefined) cAttrs.push(`type=\"${c.type}\"`);\n if (c.reconnectionMethod !== undefined)\n cAttrs.push(`reconnectionMethod=\"${c.reconnectionMethod}\"`);\n cAttrs.push(`refreshedVersion=\"${c.refreshedVersion}\"`);\n if (c.minRefreshableVersion !== undefined)\n cAttrs.push(`minRefreshableVersion=\"${c.minRefreshableVersion}\"`);\n if (c.savePassword) cAttrs.push('savePassword=\"1\"');\n if (c.new) cAttrs.push('new=\"1\"');\n if (c.deleted) cAttrs.push('deleted=\"1\"');\n if (c.onlyUseConnectionFile) cAttrs.push('onlyUseConnectionFile=\"1\"');\n if (c.backgroundRefresh) cAttrs.push('background=\"1\"');\n if (c.refreshOnLoad) cAttrs.push('refreshOnLoad=\"1\"');\n if (c.saveData) cAttrs.push('saveData=\"1\"');\n if (c.credentials !== undefined) cAttrs.push(`credentials=\"${escapeXml(c.credentials)}\"`);\n if (c.singleSignOnId !== undefined)\n cAttrs.push(`singleSignOnId=\"${escapeXml(c.singleSignOnId)}\"`);\n\n const inner: string[] = [];\n if (c.dbPr) {\n const dAttrs: string[] = [`connection=\"${escapeXml(c.dbPr.connection)}\"`];\n if (c.dbPr.command !== undefined) dAttrs.push(`command=\"${escapeXml(c.dbPr.command)}\"`);\n if (c.dbPr.serverCommand !== undefined)\n dAttrs.push(`serverCommand=\"${escapeXml(c.dbPr.serverCommand)}\"`);\n if (c.dbPr.commandType !== undefined) dAttrs.push(`commandType=\"${c.dbPr.commandType}\"`);\n inner.push(`<dbPr ${dAttrs.join(\" \")}/>`);\n }\n if (c.webPr) {\n const w = c.webPr;\n const wAttrs: string[] = [];\n if (w.xml) wAttrs.push('xml=\"1\"');\n if (w.sourceData) wAttrs.push('sourceData=\"1\"');\n if (w.parsePre) wAttrs.push('parsePre=\"1\"');\n if (w.consecutive) wAttrs.push('consecutive=\"1\"');\n if (w.firstRow) wAttrs.push('firstRow=\"1\"');\n if (w.xl97) wAttrs.push('xl97=\"1\"');\n if (w.textDates) wAttrs.push('textDates=\"1\"');\n if (w.xl2000) wAttrs.push('xl2000=\"1\"');\n if (w.url !== undefined) wAttrs.push(`url=\"${escapeXml(w.url)}\"`);\n if (w.post !== undefined) wAttrs.push(`post=\"${escapeXml(w.post)}\"`);\n if (w.htmlTables) wAttrs.push('htmlTables=\"1\"');\n if (w.htmlFormat !== undefined) wAttrs.push(`htmlFormat=\"${escapeXml(w.htmlFormat)}\"`);\n if (w.editPage !== undefined) wAttrs.push(`editPage=\"${escapeXml(w.editPage)}\"`);\n const tablesXml =\n w.tables && w.tables.length > 0\n ? `<tables count=\"${w.tables.length}\">${w.tables\n .map((t) =>\n t === null\n ? \"<m/>\"\n : typeof t === \"number\"\n ? `<x v=\"${t}\"/>`\n : `<s v=\"${escapeXml(t)}\"/>`,\n )\n .join(\"\")}</tables>`\n : \"\";\n if (tablesXml) inner.push(`<webPr ${wAttrs.join(\" \")}>${tablesXml}</webPr>`);\n else inner.push(`<webPr ${wAttrs.join(\" \")}/>`);\n }\n if (c.textPr) {\n const t = c.textPr;\n const tAttrs: string[] = [];\n if (t.prompt === false) tAttrs.push('prompt=\"0\"');\n if (t.fileType !== undefined) tAttrs.push(`fileType=\"${t.fileType}\"`);\n if (t.codePage !== undefined) tAttrs.push(`codePage=\"${t.codePage}\"`);\n if (t.characterSet !== undefined)\n tAttrs.push(`characterSet=\"${escapeXml(t.characterSet)}\"`);\n if (t.firstRow !== undefined) tAttrs.push(`firstRow=\"${t.firstRow}\"`);\n if (t.sourceFile !== undefined) tAttrs.push(`sourceFile=\"${escapeXml(t.sourceFile)}\"`);\n if (t.delimited === false) tAttrs.push('delimited=\"0\"');\n if (t.delimiter !== undefined) tAttrs.push(`delimiter=\"${escapeXml(t.delimiter)}\"`);\n if (t.decimal !== undefined) tAttrs.push(`decimal=\"${escapeXml(t.decimal)}\"`);\n if (t.thousands !== undefined) tAttrs.push(`thousands=\"${escapeXml(t.thousands)}\"`);\n if (t.tab === false) tAttrs.push('tab=\"0\"');\n if (t.space) tAttrs.push('space=\"1\"');\n if (t.comma) tAttrs.push('comma=\"1\"');\n if (t.semicolon) tAttrs.push('semicolon=\"1\"');\n if (t.consecutive) tAttrs.push('consecutive=\"1\"');\n if (t.qualifier !== undefined) tAttrs.push(`qualifier=\"${t.qualifier}\"`);\n const fieldsXml =\n t.textFields && t.textFields.length > 0\n ? `<textFields count=\"${t.textFields.length}\">${t.textFields\n .map((f) => {\n const fAttrs: string[] = [];\n if (f.type !== undefined) fAttrs.push(`type=\"${escapeXml(f.type)}\"`);\n if (f.position !== undefined) fAttrs.push(`position=\"${f.position}\"`);\n return `<textField ${fAttrs.join(\" \")}/>`;\n })\n .join(\"\")}</textFields>`\n : \"\";\n if (fieldsXml) inner.push(`<textPr ${tAttrs.join(\" \")}>${fieldsXml}</textPr>`);\n else inner.push(`<textPr ${tAttrs.join(\" \")}/>`);\n }\n if (c.parameters && c.parameters.length > 0) {\n const pmParts: string[] = [`<parameters count=\"${c.parameters.length}\">`];\n for (const pm of c.parameters) {\n const pmAttrs: string[] = [];\n if (pm.name !== undefined) pmAttrs.push(`name=\"${escapeXml(pm.name)}\"`);\n if (pm.sqlType !== undefined) pmAttrs.push(`sqlType=\"${pm.sqlType}\"`);\n if (pm.parameterType !== undefined) pmAttrs.push(`parameterType=\"${pm.parameterType}\"`);\n if (pm.refreshOnChange) pmAttrs.push('refreshOnChange=\"1\"');\n if (pm.prompt !== undefined) pmAttrs.push(`prompt=\"${escapeXml(pm.prompt)}\"`);\n if (pm.boolean !== undefined) pmAttrs.push(`boolean=\"${pm.boolean ? 1 : 0}\"`);\n if (pm.double !== undefined) pmAttrs.push(`double=\"${pm.double}\"`);\n if (pm.integer !== undefined) pmAttrs.push(`integer=\"${pm.integer}\"`);\n if (pm.string !== undefined) pmAttrs.push(`string=\"${escapeXml(pm.string)}\"`);\n if (pm.cell !== undefined) pmAttrs.push(`cell=\"${escapeXml(pm.cell)}\"`);\n pmParts.push(`<parameter ${pmAttrs.join(\" \")}/>`);\n }\n pmParts.push(\"</parameters>\");\n inner.push(pmParts.join(\"\"));\n }\n\n if (inner.length > 0)\n p.push(`<connection ${cAttrs.join(\" \")}>${inner.join(\"\")}</connection>`);\n else p.push(`<connection ${cAttrs.join(\" \")}/>`);\n }\n p.push(\"</connections>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const connections: ConnectionOptions[] = [];\n for (const cEl of el.elements ?? []) {\n if (cEl.name !== \"connection\") continue;\n const c: Partial<ConnectionOptions> = { id: attrNum(cEl, \"id\") ?? 0 };\n if (attr(cEl, \"sourceFile\") !== undefined) c.sourceFile = attr(cEl, \"sourceFile\");\n if (attr(cEl, \"odcFile\") !== undefined) c.odcFile = attr(cEl, \"odcFile\");\n if (parseOnOff(attr(cEl, \"keepAlive\"))) c.keepAlive = true;\n const interval = attrNum(cEl, \"interval\");\n if (interval !== undefined) c.interval = interval;\n if (attr(cEl, \"name\") !== undefined) c.name = attr(cEl, \"name\");\n if (attr(cEl, \"description\") !== undefined) c.description = attr(cEl, \"description\");\n const type = attrNum(cEl, \"type\");\n if (type !== undefined) c.type = type;\n const rm = attrNum(cEl, \"reconnectionMethod\");\n if (rm !== undefined) c.reconnectionMethod = rm;\n const rv = attrNum(cEl, \"refreshedVersion\");\n if (rv !== undefined) c.refreshedVersion = rv;\n const mrv = attrNum(cEl, \"minRefreshableVersion\");\n if (mrv !== undefined) c.minRefreshableVersion = mrv;\n if (parseOnOff(attr(cEl, \"savePassword\"))) c.savePassword = true;\n if (parseOnOff(attr(cEl, \"new\"))) c.new = true;\n if (parseOnOff(attr(cEl, \"deleted\"))) c.deleted = true;\n if (parseOnOff(attr(cEl, \"onlyUseConnectionFile\"))) c.onlyUseConnectionFile = true;\n if (parseOnOff(attr(cEl, \"background\"))) c.backgroundRefresh = true;\n if (parseOnOff(attr(cEl, \"refreshOnLoad\"))) c.refreshOnLoad = true;\n if (parseOnOff(attr(cEl, \"saveData\"))) c.saveData = true;\n if (attr(cEl, \"credentials\") !== undefined) c.credentials = attr(cEl, \"credentials\");\n if (attr(cEl, \"singleSignOnId\") !== undefined) c.singleSignOnId = attr(cEl, \"singleSignOnId\");\n\n const dbEl = findChild(cEl, \"dbPr\");\n if (dbEl) {\n c.dbPr = {\n connection: attr(dbEl, \"connection\") ?? \"\",\n command: attr(dbEl, \"command\"),\n serverCommand: attr(dbEl, \"serverCommand\"),\n commandType: attrNum(dbEl, \"commandType\"),\n };\n }\n const webEl = findChild(cEl, \"webPr\");\n if (webEl) {\n const w: Partial<WebPropertiesOptions> = {};\n if (parseOnOff(attr(webEl, \"xml\"))) w.xml = true;\n if (parseOnOff(attr(webEl, \"sourceData\"))) w.sourceData = true;\n if (parseOnOff(attr(webEl, \"parsePre\"))) w.parsePre = true;\n if (parseOnOff(attr(webEl, \"consecutive\"))) w.consecutive = true;\n if (parseOnOff(attr(webEl, \"firstRow\"))) w.firstRow = true;\n if (parseOnOff(attr(webEl, \"xl97\"))) w.xl97 = true;\n if (parseOnOff(attr(webEl, \"textDates\"))) w.textDates = true;\n if (parseOnOff(attr(webEl, \"xl2000\"))) w.xl2000 = true;\n if (attr(webEl, \"url\") !== undefined) w.url = attr(webEl, \"url\");\n if (attr(webEl, \"post\") !== undefined) w.post = attr(webEl, \"post\");\n if (parseOnOff(attr(webEl, \"htmlTables\"))) w.htmlTables = true;\n if (attr(webEl, \"htmlFormat\") !== undefined) w.htmlFormat = attr(webEl, \"htmlFormat\");\n if (attr(webEl, \"editPage\") !== undefined) w.editPage = attr(webEl, \"editPage\");\n const tablesEl = findChild(webEl, \"tables\");\n if (tablesEl) {\n const tables: WebTableSelection[] = [];\n for (const tEl of tablesEl.elements ?? []) {\n if (tEl.name === \"m\") tables.push(null);\n else if (tEl.name === \"s\") tables.push(attr(tEl, \"v\") ?? \"\");\n else if (tEl.name === \"x\") tables.push(attrNum(tEl, \"v\") ?? 0);\n }\n if (tables.length > 0) w.tables = tables;\n }\n c.webPr = w as WebPropertiesOptions;\n }\n const textEl = findChild(cEl, \"textPr\");\n if (textEl) {\n const t: Partial<TextPropertiesOptions> = {};\n if (String(attr(textEl, \"prompt\")) === \"0\") t.prompt = false;\n const ft = attr(textEl, \"fileType\");\n if (ft !== undefined) t.fileType = ft as TextPropertiesOptions[\"fileType\"];\n const cp = attrNum(textEl, \"codePage\");\n if (cp !== undefined) t.codePage = cp;\n if (attr(textEl, \"characterSet\") !== undefined)\n t.characterSet = attr(textEl, \"characterSet\");\n const fr = attrNum(textEl, \"firstRow\");\n if (fr !== undefined) t.firstRow = fr;\n if (attr(textEl, \"sourceFile\") !== undefined) t.sourceFile = attr(textEl, \"sourceFile\");\n if (String(attr(textEl, \"delimited\")) === \"0\") t.delimited = false;\n if (attr(textEl, \"delimiter\") !== undefined) t.delimiter = attr(textEl, \"delimiter\");\n if (attr(textEl, \"decimal\") !== undefined) t.decimal = attr(textEl, \"decimal\");\n if (attr(textEl, \"thousands\") !== undefined) t.thousands = attr(textEl, \"thousands\");\n if (String(attr(textEl, \"tab\")) === \"0\") t.tab = false;\n if (parseOnOff(attr(textEl, \"space\"))) t.space = true;\n if (parseOnOff(attr(textEl, \"comma\"))) t.comma = true;\n if (parseOnOff(attr(textEl, \"semicolon\"))) t.semicolon = true;\n if (parseOnOff(attr(textEl, \"consecutive\"))) t.consecutive = true;\n const q = attr(textEl, \"qualifier\");\n if (q !== undefined) t.qualifier = q as TextPropertiesOptions[\"qualifier\"];\n const fieldsEl = findChild(textEl, \"textFields\");\n if (fieldsEl) {\n const fields: ConnectionTextFieldOptions[] = [];\n for (const fEl of fieldsEl.elements ?? []) {\n if (fEl.name !== \"textField\") continue;\n const f: ConnectionTextFieldOptions = {};\n if (attr(fEl, \"type\") !== undefined) f.type = attr(fEl, \"type\");\n const pos = attrNum(fEl, \"position\");\n if (pos !== undefined) f.position = pos;\n fields.push(f);\n }\n if (fields.length > 0) t.textFields = fields;\n }\n c.textPr = t as TextPropertiesOptions;\n }\n const paramsEl = findChild(cEl, \"parameters\");\n if (paramsEl) {\n const params: ParameterOptions[] = [];\n for (const pmEl of paramsEl.elements ?? []) {\n if (pmEl.name !== \"parameter\") continue;\n const pm: ParameterOptions = {};\n if (attr(pmEl, \"name\") !== undefined) pm.name = attr(pmEl, \"name\");\n const st = attrNum(pmEl, \"sqlType\");\n if (st !== undefined) pm.sqlType = st;\n const pt = attr(pmEl, \"parameterType\");\n if (pt !== undefined) pm.parameterType = pt as ParameterOptions[\"parameterType\"];\n if (parseOnOff(attr(pmEl, \"refreshOnChange\"))) pm.refreshOnChange = true;\n if (attr(pmEl, \"prompt\") !== undefined) pm.prompt = attr(pmEl, \"prompt\");\n if (attr(pmEl, \"boolean\") !== undefined) pm.boolean = parseOnOff(attr(pmEl, \"boolean\"));\n const dbl = attrNum(pmEl, \"double\");\n if (dbl !== undefined) pm.double = dbl;\n const int = attrNum(pmEl, \"integer\");\n if (int !== undefined) pm.integer = int;\n if (attr(pmEl, \"string\") !== undefined) pm.string = attr(pmEl, \"string\");\n if (attr(pmEl, \"cell\") !== undefined) pm.cell = attr(pmEl, \"cell\");\n params.push(pm);\n }\n if (params.length > 0) c.parameters = params;\n }\n connections.push(c as ConnectionOptions);\n }\n return { connections };\n },\n};\n","/**\n * QueryTable types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_QueryTable\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, escapeXml, findChild } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** Deleted query-table field (CT_DeletedField). */\nexport interface QueryTableDeletedFieldOptions {\n /** Field name that was deleted (required) */\n name: string;\n}\n\n/** Query-table field (CT_QueryTableField). */\nexport interface QueryTableFieldOptions {\n /** Field ID (required, unique within the query table) */\n id: number;\n /** Field name */\n name?: string;\n /** Bound to a table column (default true) */\n dataBound?: boolean;\n /** Field shows row numbers (default false) */\n rowNumbers?: boolean;\n /** Fill formulas (default false) */\n fillFormulas?: boolean;\n /** Clipped (default false) */\n clipped?: boolean;\n /** Owning table column id (default 0) */\n tableColumnId?: number;\n}\n\n/** Query-table refresh info (CT_QueryTableRefresh). */\nexport interface QueryTableRefreshOptions {\n /** Preserve sort/filter layout (default true) */\n preserveSortFilterLayout?: boolean;\n /** Field ID wrapped (default false) */\n fieldIdWrapped?: boolean;\n /** Headers in last refresh (default true) */\n headersInLastRefresh?: boolean;\n /** Minimum refresh version (default 0) */\n minimumVersion?: number;\n /** Next unique ID for new rows (default 1) */\n nextId?: number;\n /** Unbound columns inserted left (default 0) */\n unboundColumnsLeft?: number;\n /** Unbound columns appended right (default 0) */\n unboundColumnsRight?: number;\n /** Field layout after refresh (CT_QueryTableRefresh → queryTableFields) */\n queryTableFields?: QueryTableFieldOptions[];\n /** Deleted fields (CT_QueryTableDeletedFields) */\n deletedFields?: QueryTableDeletedFieldOptions[];\n}\n\n/** Options for xl/queryTables/queryTable{n}.xml (CT_QueryTable). */\nexport interface QueryTableOptions {\n /** Query table name (required by XSD) */\n name?: string;\n /** Headers row shown (default true) */\n headers?: boolean;\n /** Row numbers shown (default false) */\n rowNumbers?: boolean;\n /** Refresh disabled (default false) */\n disableRefresh?: boolean;\n /** Background refresh (default true) */\n backgroundRefresh?: boolean;\n /** First background refresh (default false) */\n firstBackgroundRefresh?: boolean;\n /** Refresh on load (default false) */\n refreshOnLoad?: boolean;\n /** Grow/shrink behavior: \"insertDelete\" | \"insertWhole\" | \"overwriteWhole\" (default \"insertDelete\") */\n growShrinkType?: \"insertDelete\" | \"insertWhole\" | \"overwriteWhole\";\n /** Fill formulas on refresh (default false) */\n fillFormulas?: boolean;\n /** Remove data on save (default false) */\n removeDataOnSave?: boolean;\n /** Edit disabled (default false) */\n disableEdit?: boolean;\n /** Preserve formatting (default true) */\n preserveFormatting?: boolean;\n /** Adjust column width on refresh (default false) */\n adjustColumnWidth?: boolean;\n /** Connection ID referencing the workbook connection */\n connectionId: number;\n /** Auto format applied */\n autoFormat?: boolean;\n /** Intermediate rows preserved (CT_QueryTable @intermediate) */\n intermediate?: boolean;\n /** Refresh info (CT_QueryTableRefresh) */\n queryTableRefresh?: QueryTableRefreshOptions;\n}\n\n// ── Descriptor ──\n\nexport const queryTableDesc: CustomDescriptor<QueryTableOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const attrs: string[] = [];\n if (opts.name !== undefined) attrs.push(`name=\"${escapeXml(opts.name)}\"`);\n if (opts.headers === false) attrs.push('headers=\"0\"');\n if (opts.rowNumbers) attrs.push('rowNumbers=\"1\"');\n if (opts.disableRefresh) attrs.push('disableRefresh=\"1\"');\n if (opts.backgroundRefresh === false) attrs.push('backgroundRefresh=\"0\"');\n if (opts.firstBackgroundRefresh) attrs.push('firstBackgroundRefresh=\"1\"');\n if (opts.refreshOnLoad) attrs.push('refreshOnLoad=\"1\"');\n if (opts.growShrinkType !== undefined) attrs.push(`growShrinkType=\"${opts.growShrinkType}\"`);\n if (opts.fillFormulas) attrs.push('fillFormulas=\"1\"');\n if (opts.removeDataOnSave) attrs.push('removeDataOnSave=\"1\"');\n if (opts.disableEdit) attrs.push('disableEdit=\"1\"');\n if (opts.preserveFormatting === false) attrs.push('preserveFormatting=\"0\"');\n if (opts.adjustColumnWidth) attrs.push('adjustColumnWidth=\"1\"');\n if (opts.autoFormat) attrs.push('autoFormat=\"1\"');\n if (opts.intermediate) attrs.push('intermediate=\"1\"');\n attrs.push(`connectionId=\"${opts.connectionId}\"`);\n\n let inner = \"\";\n const r = opts.queryTableRefresh;\n if (r) {\n const rAttrs: string[] = [];\n if (r.preserveSortFilterLayout === false) rAttrs.push('preserveSortFilterLayout=\"0\"');\n if (r.fieldIdWrapped) rAttrs.push('fieldIdWrapped=\"1\"');\n if (r.headersInLastRefresh === false) rAttrs.push('headersInLastRefresh=\"0\"');\n if (r.minimumVersion !== undefined) rAttrs.push(`minimumVersion=\"${r.minimumVersion}\"`);\n if (r.nextId !== undefined) rAttrs.push(`nextId=\"${r.nextId}\"`);\n if (r.unboundColumnsLeft !== undefined)\n rAttrs.push(`unboundColumnsLeft=\"${r.unboundColumnsLeft}\"`);\n if (r.unboundColumnsRight !== undefined)\n rAttrs.push(`unboundColumnsRight=\"${r.unboundColumnsRight}\"`);\n const rInner: string[] = [];\n if (r.queryTableFields && r.queryTableFields.length > 0) {\n const fParts: string[] = [`<queryTableFields count=\"${r.queryTableFields.length}\">`];\n for (const f of r.queryTableFields) {\n const fAttrs: string[] = [`id=\"${f.id}\"`];\n if (f.name !== undefined) fAttrs.push(`name=\"${escapeXml(f.name)}\"`);\n if (f.dataBound === false) fAttrs.push('dataBound=\"0\"');\n if (f.rowNumbers) fAttrs.push('rowNumbers=\"1\"');\n if (f.fillFormulas) fAttrs.push('fillFormulas=\"1\"');\n if (f.clipped) fAttrs.push('clipped=\"1\"');\n if (f.tableColumnId !== undefined) fAttrs.push(`tableColumnId=\"${f.tableColumnId}\"`);\n fParts.push(`<queryTableField ${fAttrs.join(\" \")}/>`);\n }\n fParts.push(\"</queryTableFields>\");\n rInner.push(fParts.join(\"\"));\n }\n if (r.deletedFields && r.deletedFields.length > 0) {\n const dParts: string[] = [`<queryTableDeletedFields count=\"${r.deletedFields.length}\">`];\n for (const d of r.deletedFields) {\n dParts.push(`<deletedField name=\"${escapeXml(d.name)}\"/>`);\n }\n dParts.push(\"</queryTableDeletedFields>\");\n rInner.push(dParts.join(\"\"));\n }\n if (rInner.length > 0)\n inner = `<queryTableRefresh ${rAttrs.join(\" \")}>${rInner.join(\"\")}</queryTableRefresh>`;\n else inner = `<queryTableRefresh ${rAttrs.join(\" \")}/>`;\n }\n\n return (\n `<queryTable xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" ${attrs.join(\" \")}>` +\n `${inner}</queryTable>`\n );\n },\n\n parse(el, _ctx) {\n const result: Partial<QueryTableOptions> = {};\n if (attr(el, \"name\") !== undefined) result.name = attr(el, \"name\");\n if (String(attr(el, \"headers\")) === \"0\") result.headers = false;\n if (parseOnOff(attr(el, \"rowNumbers\"))) result.rowNumbers = true;\n if (parseOnOff(attr(el, \"disableRefresh\"))) result.disableRefresh = true;\n if (String(attr(el, \"backgroundRefresh\")) === \"0\") result.backgroundRefresh = false;\n if (parseOnOff(attr(el, \"firstBackgroundRefresh\"))) result.firstBackgroundRefresh = true;\n if (parseOnOff(attr(el, \"refreshOnLoad\"))) result.refreshOnLoad = true;\n const gst = attr(el, \"growShrinkType\");\n if (gst !== undefined) result.growShrinkType = gst as QueryTableOptions[\"growShrinkType\"];\n if (parseOnOff(attr(el, \"fillFormulas\"))) result.fillFormulas = true;\n if (parseOnOff(attr(el, \"removeDataOnSave\"))) result.removeDataOnSave = true;\n if (parseOnOff(attr(el, \"disableEdit\"))) result.disableEdit = true;\n if (String(attr(el, \"preserveFormatting\")) === \"0\") result.preserveFormatting = false;\n if (parseOnOff(attr(el, \"adjustColumnWidth\"))) result.adjustColumnWidth = true;\n if (parseOnOff(attr(el, \"autoFormat\"))) result.autoFormat = true;\n if (parseOnOff(attr(el, \"intermediate\"))) result.intermediate = true;\n const cid = attrNum(el, \"connectionId\");\n if (cid !== undefined) result.connectionId = cid;\n\n const rEl = findChild(el, \"queryTableRefresh\");\n if (rEl) {\n const r: Partial<QueryTableRefreshOptions> = {};\n if (String(attr(rEl, \"preserveSortFilterLayout\")) === \"0\") r.preserveSortFilterLayout = false;\n if (parseOnOff(attr(rEl, \"fieldIdWrapped\"))) r.fieldIdWrapped = true;\n if (String(attr(rEl, \"headersInLastRefresh\")) === \"0\") r.headersInLastRefresh = false;\n const mv = attrNum(rEl, \"minimumVersion\");\n if (mv !== undefined) r.minimumVersion = mv;\n const nid = attrNum(rEl, \"nextId\");\n if (nid !== undefined) r.nextId = nid;\n const ucl = attrNum(rEl, \"unboundColumnsLeft\");\n if (ucl !== undefined) r.unboundColumnsLeft = ucl;\n const ucr = attrNum(rEl, \"unboundColumnsRight\");\n if (ucr !== undefined) r.unboundColumnsRight = ucr;\n const fieldsEl = findChild(rEl, \"queryTableFields\");\n if (fieldsEl) {\n const fields: QueryTableFieldOptions[] = [];\n for (const fEl of fieldsEl.elements ?? []) {\n if (fEl.name !== \"queryTableField\") continue;\n const f: QueryTableFieldOptions = { id: attrNum(fEl, \"id\") ?? 0 };\n if (attr(fEl, \"name\") !== undefined) f.name = attr(fEl, \"name\");\n if (String(attr(fEl, \"dataBound\")) === \"0\") f.dataBound = false;\n if (parseOnOff(attr(fEl, \"rowNumbers\"))) f.rowNumbers = true;\n if (parseOnOff(attr(fEl, \"fillFormulas\"))) f.fillFormulas = true;\n if (parseOnOff(attr(fEl, \"clipped\"))) f.clipped = true;\n const tci = attrNum(fEl, \"tableColumnId\");\n if (tci !== undefined) f.tableColumnId = tci;\n fields.push(f);\n }\n if (fields.length > 0) r.queryTableFields = fields;\n }\n const delEl = findChild(rEl, \"queryTableDeletedFields\");\n if (delEl) {\n const deleted: QueryTableDeletedFieldOptions[] = [];\n for (const dEl of delEl.elements ?? []) {\n if (dEl.name !== \"deletedField\") continue;\n deleted.push({ name: attr(dEl, \"name\") ?? \"\" });\n }\n if (deleted.length > 0) r.deletedFields = deleted;\n }\n result.queryTableRefresh = r as QueryTableRefreshOptions;\n }\n return result as QueryTableOptions;\n },\n};\n","/**\n * Metadata part types and descriptor for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd, CT_Metadata\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr, attrNum, escapeXml, findChild, stringifyElement } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** Metadata type declaration (CT_MetadataType). */\nexport interface MetadataTypeOptions {\n /** Type name (required) */\n name: string;\n /** Minimum supported version (required by XSD) */\n minSupportedVersion: number;\n /** Ghost row flag */\n ghostRow?: boolean;\n /** Ghost column flag */\n ghostCol?: boolean;\n /** Edit flag */\n edit?: boolean;\n /** Delete flag */\n delete?: boolean;\n /** Copy flag */\n copy?: boolean;\n /** Paste all */\n pasteAll?: boolean;\n /** Paste formulas */\n pasteFormulas?: boolean;\n /** Paste values */\n pasteValues?: boolean;\n /** Paste formats */\n pasteFormats?: boolean;\n /** Paste comments */\n pasteComments?: boolean;\n /** Paste data validation */\n pasteDataValidation?: boolean;\n /** Paste borders */\n pasteBorders?: boolean;\n /** Paste column widths */\n pasteColWidths?: boolean;\n /** Paste number formats */\n pasteNumberFormats?: boolean;\n /** Merge cells */\n merge?: boolean;\n /** Split first */\n splitFirst?: boolean;\n /** Split all */\n splitAll?: boolean;\n /** Row/column shift */\n rowColShift?: boolean;\n /** Clear all */\n clearAll?: boolean;\n /** Clear formats */\n clearFormats?: boolean;\n /** Clear contents */\n clearContents?: boolean;\n /** Clear comments */\n clearComments?: boolean;\n /** Assign */\n assign?: boolean;\n /** Coerce */\n coerce?: boolean;\n /** Adjust */\n adjust?: boolean;\n /** Cell metadata */\n cellMeta?: boolean;\n}\n\n/** Metadata string entry (CT_MetadataStrings → s, CT_XStringElement @v). */\nexport interface MetadataStringOptions {\n /** String value (required) */\n value: string;\n}\n\n/** Metadata string index reference (CT_MetadataStringIndex). */\nexport interface MetadataStringIndexOptions {\n /** Index into metadataStrings (@x, required) */\n index: number;\n /** Show string flag */\n show?: boolean;\n}\n\n/** MDX tuple (CT_MdxTuple, the t child of mdx). */\nexport interface MdxTupleOptions {\n /** Tuple count */\n count?: number;\n /** Culture (CT_MdxTuple @ct) */\n culture?: string;\n /** Style index (CT_MdxTuple @si) */\n styleIndex?: number;\n /** Format index (CT_MdxTuple @fi) */\n formatIndex?: number;\n /** Background color ARGB hex (CT_MdxTuple @bc) */\n backgroundColor?: string;\n /** Foreground color ARGB hex (CT_MdxTuple @fc) */\n foregroundColor?: string;\n /** Italic */\n italic?: boolean;\n /** Underline */\n underline?: boolean;\n /** Strikethrough */\n strikethrough?: boolean;\n /** Bold */\n bold?: boolean;\n /** Member name string indexes (n children) */\n stringIndexes?: MetadataStringIndexOptions[];\n}\n\n/** MDX set (CT_MdxSet, the ms child of mdx). */\nexport interface MdxSetOptions {\n /** Namespace count (required) */\n namespaceCount: number;\n /** Tuple count */\n count?: number;\n /** Sort order: \"u\" | \"a\" | \"d\" | \"aa\" | \"ad\" | \"na\" | \"nd\" (default \"u\") */\n order?: string;\n /** Member name string indexes (n children) */\n stringIndexes?: MetadataStringIndexOptions[];\n}\n\n/** ST_MdxFunctionType — the MDX function discriminator on mdx @f. */\nexport type MdxFunctionType = \"m\" | \"v\" | \"s\" | \"c\" | \"r\" | \"p\" | \"k\";\n\n/** ST_MdxKPIProperty — the KPI property kind on k @p. */\nexport type MdxKpiProperty = \"v\" | \"g\" | \"s\" | \"t\" | \"w\" | \"m\";\n\n/** MDX member property (CT_MdxMemeberProp, the p child of mdx). */\nexport interface MdxMemberPropOptions {\n /** Index into metadataStrings for the member name (@n, required) */\n nameIndex: number;\n /** Name pair index (@np, required) */\n namePairIndex: number;\n}\n\n/** MDX KPI (CT_MdxKPI, the k child of mdx). */\nexport interface MdxKpiOptions {\n /** Index into metadataStrings for the member name (@n, required) */\n nameIndex: number;\n /** Name pair index (@np, required) */\n namePairIndex: number;\n /** KPI property kind (@p, required) */\n property: MdxKpiProperty;\n}\n\n/** MDX metadata entry (CT_Mdx). */\nexport interface MdxOptions {\n /** MDX function type (@f, required) */\n functionType: MdxFunctionType;\n /** Metadata string index (@n, required) */\n stringIndex: number;\n /** MDX tuple (t) */\n tuple?: MdxTupleOptions;\n /** MDX set (ms) */\n set?: MdxSetOptions;\n /** MDX member property (p) */\n memberProp?: MdxMemberPropOptions;\n /** MDX KPI (k) */\n kpi?: MdxKpiOptions;\n}\n\n/** Future metadata block (CT_FutureMetadataBlock). */\nexport interface FutureMetadataBlockOptions {\n /** Raw extension list preserved verbatim (extLst) */\n extLst?: string;\n}\n\n/** Future metadata (CT_FutureMetadata). */\nexport interface FutureMetadataOptions {\n /** Type name (required) */\n name: string;\n /** Blocks (bk) */\n blocks?: FutureMetadataBlockOptions[];\n}\n\n/** Metadata record (CT_MetadataRecord, the rc child of bk). */\nexport interface MetadataRecordOptions {\n /** Metadata type index (@t, required) */\n typeIndex: number;\n /** Metadata value index (@v, required) */\n valueIndex: number;\n}\n\n/** Metadata block (CT_MetadataBlock). */\nexport interface MetadataBlockOptions {\n /** Records (rc) */\n records?: MetadataRecordOptions[];\n}\n\n/** Options for xl/metadata.xml (CT_Metadata). */\nexport interface MetadataOptions {\n /** Metadata types */\n types?: MetadataTypeOptions[];\n /** Metadata strings */\n strings?: MetadataStringOptions[];\n /** MDX metadata */\n mdx?: MdxOptions[];\n /** Future metadata entries */\n futureMetadata?: FutureMetadataOptions[];\n /** Cell metadata blocks (cellMetadata) */\n cellMetadata?: MetadataBlockOptions[];\n /** Value metadata blocks (valueMetadata) */\n valueMetadata?: MetadataBlockOptions[];\n}\n\n// ── Descriptor ──\n\nconst METADATA_TYPE_BOOL_ATTRS = [\n \"ghostRow\",\n \"ghostCol\",\n \"edit\",\n \"delete\",\n \"copy\",\n \"pasteAll\",\n \"pasteFormulas\",\n \"pasteValues\",\n \"pasteFormats\",\n \"pasteComments\",\n \"pasteDataValidation\",\n \"pasteBorders\",\n \"pasteColWidths\",\n \"pasteNumberFormats\",\n \"merge\",\n \"splitFirst\",\n \"splitAll\",\n \"rowColShift\",\n \"clearAll\",\n \"clearFormats\",\n \"clearContents\",\n \"clearComments\",\n \"assign\",\n \"coerce\",\n \"adjust\",\n \"cellMeta\",\n] as const;\n\nexport const metadataDesc: CustomDescriptor<MetadataOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<metadata xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n\n if (opts.types && opts.types.length > 0) {\n p.push(`<metadataTypes count=\"${opts.types.length}\">`);\n for (const t of opts.types) {\n const attrs: string[] = [\n `name=\"${escapeXml(t.name)}\"`,\n `minSupportedVersion=\"${t.minSupportedVersion}\"`,\n ];\n for (const key of METADATA_TYPE_BOOL_ATTRS) {\n if (t[key]) attrs.push(`${key}=\"1\"`);\n }\n p.push(`<metadataType ${attrs.join(\" \")}/>`);\n }\n p.push(\"</metadataTypes>\");\n }\n\n if (opts.strings && opts.strings.length > 0) {\n p.push(`<metadataStrings count=\"${opts.strings.length}\">`);\n for (const s of opts.strings) p.push(`<s v=\"${escapeXml(s.value)}\"/>`);\n p.push(\"</metadataStrings>\");\n }\n\n if (opts.mdx && opts.mdx.length > 0) {\n p.push(`<mdxMetadata count=\"${opts.mdx.length}\">`);\n for (const m of opts.mdx) {\n const attrs: string[] = [`n=\"${m.stringIndex}\"`, `f=\"${m.functionType}\"`];\n let inner = \"\";\n if (m.tuple) {\n const t = m.tuple;\n const tAttrs: string[] = [];\n if (t.count !== undefined) tAttrs.push(`c=\"${t.count}\"`);\n if (t.culture !== undefined) tAttrs.push(`ct=\"${escapeXml(t.culture)}\"`);\n if (t.styleIndex !== undefined) tAttrs.push(`si=\"${t.styleIndex}\"`);\n if (t.formatIndex !== undefined) tAttrs.push(`fi=\"${t.formatIndex}\"`);\n if (t.backgroundColor !== undefined) tAttrs.push(`bc=\"${t.backgroundColor}\"`);\n if (t.foregroundColor !== undefined) tAttrs.push(`fc=\"${t.foregroundColor}\"`);\n if (t.italic) tAttrs.push('i=\"1\"');\n if (t.underline) tAttrs.push('u=\"1\"');\n if (t.strikethrough) tAttrs.push('st=\"1\"');\n if (t.bold) tAttrs.push('b=\"1\"');\n const idxXml = stringifyStringIndexes(t.stringIndexes);\n inner = idxXml ? `<t ${tAttrs.join(\" \")}>${idxXml}</t>` : `<t ${tAttrs.join(\" \")}/>`;\n } else if (m.set) {\n const s = m.set;\n const sAttrs: string[] = [`ns=\"${s.namespaceCount}\"`];\n if (s.count !== undefined) sAttrs.push(`c=\"${s.count}\"`);\n if (s.order !== undefined && s.order !== \"u\") sAttrs.push(`o=\"${escapeXml(s.order)}\"`);\n const idxXml = stringifyStringIndexes(s.stringIndexes);\n inner = idxXml ? `<ms ${sAttrs.join(\" \")}>${idxXml}</ms>` : `<ms ${sAttrs.join(\" \")}/>`;\n } else if (m.memberProp) {\n inner = `<p n=\"${m.memberProp.nameIndex}\" np=\"${m.memberProp.namePairIndex}\"/>`;\n } else if (m.kpi) {\n inner = `<k n=\"${m.kpi.nameIndex}\" np=\"${m.kpi.namePairIndex}\" p=\"${m.kpi.property}\"/>`;\n }\n p.push(`<mdx ${attrs.join(\" \")}>${inner}</mdx>`);\n }\n p.push(\"</mdxMetadata>\");\n }\n\n for (const fm of opts.futureMetadata ?? []) {\n const blocks = fm.blocks ?? [];\n if (blocks.length > 0) {\n p.push(`<futureMetadata name=\"${escapeXml(fm.name)}\" count=\"${blocks.length}\">`);\n for (const b of blocks) {\n if (b.extLst) p.push(`<bk>${b.extLst}</bk>`);\n else p.push(\"<bk/>\");\n }\n p.push(\"</futureMetadata>\");\n } else {\n p.push(`<futureMetadata name=\"${escapeXml(fm.name)}\"/>`);\n }\n }\n\n if (opts.cellMetadata && opts.cellMetadata.length > 0) {\n p.push(`<cellMetadata count=\"${opts.cellMetadata.length}\">`);\n for (const b of opts.cellMetadata) p.push(stringifyBlock(b));\n p.push(\"</cellMetadata>\");\n }\n\n if (opts.valueMetadata && opts.valueMetadata.length > 0) {\n p.push(`<valueMetadata count=\"${opts.valueMetadata.length}\">`);\n for (const b of opts.valueMetadata) p.push(stringifyBlock(b));\n p.push(\"</valueMetadata>\");\n }\n\n p.push(\"</metadata>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<MetadataOptions> = {};\n\n const typesEl = findChild(el, \"metadataTypes\");\n if (typesEl) {\n const types: MetadataTypeOptions[] = [];\n for (const tEl of typesEl.elements ?? []) {\n if (tEl.name !== \"metadataType\") continue;\n const t: Partial<MetadataTypeOptions> = { name: attr(tEl, \"name\") ?? \"\" };\n const msv = attrNum(tEl, \"minSupportedVersion\");\n if (msv !== undefined) t.minSupportedVersion = msv;\n for (const key of METADATA_TYPE_BOOL_ATTRS) {\n if (parseOnOff(attr(tEl, key))) t[key] = true;\n }\n types.push(t as MetadataTypeOptions);\n }\n result.types = types;\n }\n\n const stringsEl = findChild(el, \"metadataStrings\");\n if (stringsEl) {\n const strings: MetadataStringOptions[] = [];\n for (const sEl of stringsEl.elements ?? []) {\n if (sEl.name !== \"s\") continue;\n strings.push({ value: attr(sEl, \"v\") ?? \"\" });\n }\n result.strings = strings;\n }\n\n const mdxEl = findChild(el, \"mdxMetadata\");\n if (mdxEl) {\n const mdx: MdxOptions[] = [];\n for (const mEl of mdxEl.elements ?? []) {\n if (mEl.name !== \"mdx\") continue;\n const m: Partial<MdxOptions> = {\n stringIndex: attrNum(mEl, \"n\") ?? 0,\n functionType: (attr(mEl, \"f\") ?? \"m\") as MdxFunctionType,\n };\n const tEl = findChild(mEl, \"t\");\n if (tEl) {\n const t: Partial<MdxTupleOptions> = {};\n const c = attrNum(tEl, \"c\");\n if (c !== undefined) t.count = c;\n if (attr(tEl, \"ct\") !== undefined) t.culture = attr(tEl, \"ct\");\n const si = attrNum(tEl, \"si\");\n if (si !== undefined) t.styleIndex = si;\n const fi = attrNum(tEl, \"fi\");\n if (fi !== undefined) t.formatIndex = fi;\n if (attr(tEl, \"bc\") !== undefined) t.backgroundColor = attr(tEl, \"bc\");\n if (attr(tEl, \"fc\") !== undefined) t.foregroundColor = attr(tEl, \"fc\");\n if (parseOnOff(attr(tEl, \"i\"))) t.italic = true;\n if (parseOnOff(attr(tEl, \"u\"))) t.underline = true;\n if (parseOnOff(attr(tEl, \"st\"))) t.strikethrough = true;\n if (parseOnOff(attr(tEl, \"b\"))) t.bold = true;\n const idx = parseStringIndexes(tEl);\n if (idx) t.stringIndexes = idx;\n m.tuple = t as MdxTupleOptions;\n }\n const msEl = findChild(mEl, \"ms\");\n if (msEl) {\n const s: Partial<MdxSetOptions> = { namespaceCount: attrNum(msEl, \"ns\") ?? 0 };\n const c = attrNum(msEl, \"c\");\n if (c !== undefined) s.count = c;\n if (attr(msEl, \"o\") !== undefined) s.order = attr(msEl, \"o\");\n const idx = parseStringIndexes(msEl);\n if (idx) s.stringIndexes = idx;\n m.set = s as MdxSetOptions;\n }\n const pEl = findChild(mEl, \"p\");\n if (pEl) {\n m.memberProp = {\n nameIndex: attrNum(pEl, \"n\") ?? 0,\n namePairIndex: attrNum(pEl, \"np\") ?? 0,\n };\n }\n const kEl = findChild(mEl, \"k\");\n if (kEl) {\n m.kpi = {\n nameIndex: attrNum(kEl, \"n\") ?? 0,\n namePairIndex: attrNum(kEl, \"np\") ?? 0,\n property: (attr(kEl, \"p\") ?? \"v\") as MdxKpiProperty,\n };\n }\n mdx.push(m as MdxOptions);\n }\n result.mdx = mdx;\n }\n\n const future: FutureMetadataOptions[] = [];\n for (const fmEl of el.elements ?? []) {\n if (fmEl.name !== \"futureMetadata\") continue;\n const fm: FutureMetadataOptions = { name: attr(fmEl, \"name\") ?? \"\" };\n const blocks: FutureMetadataBlockOptions[] = [];\n for (const bEl of fmEl.elements ?? []) {\n if (bEl.name !== \"bk\") continue;\n const extEl = findChild(bEl, \"extLst\");\n blocks.push({ extLst: extEl ? stringifyElement(extEl) : undefined });\n }\n if (blocks.length > 0) fm.blocks = blocks;\n future.push(fm);\n }\n if (future.length > 0) result.futureMetadata = future;\n\n const cellEl = findChild(el, \"cellMetadata\");\n if (cellEl) result.cellMetadata = parseBlocks(cellEl);\n const valueEl = findChild(el, \"valueMetadata\");\n if (valueEl) result.valueMetadata = parseBlocks(valueEl);\n\n return result as MetadataOptions;\n },\n};\n\n// ── Helpers ──\n\nfunction stringifyStringIndexes(indexes: MetadataStringIndexOptions[] | undefined): string {\n if (!indexes || indexes.length === 0) return \"\";\n return indexes.map((i) => `<n x=\"${i.index}\"${i.show ? ' s=\"1\"' : \"\"}/>`).join(\"\");\n}\n\nfunction parseStringIndexes(parent: Element): MetadataStringIndexOptions[] | undefined {\n const out: MetadataStringIndexOptions[] = [];\n for (const nEl of parent.elements ?? []) {\n if (nEl.name !== \"n\") continue;\n const idx: MetadataStringIndexOptions = { index: attrNum(nEl, \"x\") ?? 0 };\n if (parseOnOff(attr(nEl, \"s\"))) idx.show = true;\n out.push(idx);\n }\n return out.length > 0 ? out : undefined;\n}\n\nfunction stringifyBlock(b: MetadataBlockOptions): string {\n const rc = (b.records ?? []).map((r) => `<rc t=\"${r.typeIndex}\" v=\"${r.valueIndex}\"/>`).join(\"\");\n return `<bk>${rc}</bk>`;\n}\n\nfunction parseBlocks(el: Element): MetadataBlockOptions[] {\n const blocks: MetadataBlockOptions[] = [];\n for (const bEl of el.elements ?? []) {\n if (bEl.name !== \"bk\") continue;\n const records: MetadataRecordOptions[] = [];\n for (const rcEl of bEl.elements ?? []) {\n if (rcEl.name !== \"rc\") continue;\n records.push({ typeIndex: attrNum(rcEl, \"t\") ?? 0, valueIndex: attrNum(rcEl, \"v\") ?? 0 });\n }\n blocks.push(records.length > 0 ? { records } : {});\n }\n return blocks;\n}\n","/**\n * PivotTable descriptor for XLSX — generates xl/pivotTables/pivotTable{N}.xml.\n *\n * Implements CT_pivotTableDefinition from sml.xsd.\n * Direct stringify/parse — no intermediate class.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, findChild, textOf } from \"@office-open/xml\";\n\nimport type { PivotAreaOptions } from \"../pivot/pivot-utils\";\nimport { parsePivotArea } from \"./parse\";\nimport { stringifyPivotTable } from \"./stringify\";\nimport type {\n CalculatedItemParseResult,\n CalculatedMemberParseResult,\n ChartFormatParseResult,\n ConditionalFormatParseResult,\n DataFieldParseResult,\n HierarchyUsageParseResult,\n PageFieldParseResult,\n PivotFieldParseResult,\n PivotFilterParseResult,\n PivotFormatParseResult,\n PivotHierarchyParseResult,\n PivotTableDescriptorOptions,\n PivotTableParseResult,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const pivotTableDesc: CustomDescriptor<\n PivotTableDescriptorOptions,\n WriteContext,\n PivotTableParseResult\n> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyPivotTable(opts.options, opts.sourceData, opts.cacheId);\n },\n\n parse(el, _ctx) {\n const result: Partial<PivotTableParseResult> = {};\n\n // Root element attributes\n if (attr(el, \"name\")) result.name = attr(el, \"name\");\n if (attr(el, \"cacheId\") !== undefined) result.cacheId = attrNum(el, \"cacheId\") ?? 0;\n if (parseOnOff(attr(el, \"dataOnRows\"))) result.dataOnRows = true;\n if (String(attr(el, \"showHeaders\")) === \"0\") result.showHeaders = false;\n if (parseOnOff(attr(el, \"showEmptyRow\"))) result.showEmptyRow = true;\n if (parseOnOff(attr(el, \"showEmptyCol\"))) result.showEmptyCol = true;\n if (attr(el, \"grandTotalCaption\")) result.grandTotalCaption = attr(el, \"grandTotalCaption\");\n if (attr(el, \"errorCaption\")) result.errorCaption = attr(el, \"errorCaption\");\n if (parseOnOff(attr(el, \"showError\"))) result.showError = true;\n if (attr(el, \"missingCaption\")) result.missingCaption = attr(el, \"missingCaption\");\n if (String(attr(el, \"showMissing\")) === \"0\") result.showMissing = false;\n if (attr(el, \"pageStyle\")) result.pageStyle = attr(el, \"pageStyle\");\n if (attr(el, \"pivotTableStyle\")) result.pivotTableStyle = attr(el, \"pivotTableStyle\");\n if (attr(el, \"tag\")) result.tag = attr(el, \"tag\");\n if (String(attr(el, \"showItems\")) === \"0\") result.showItems = false;\n if (parseOnOff(attr(el, \"editData\"))) result.editData = true;\n if (parseOnOff(attr(el, \"disableFieldList\"))) result.disableFieldList = true;\n if (String(attr(el, \"showCalcMbrs\")) === \"0\") result.showCalcMbrs = false;\n if (parseOnOff(attr(el, \"visualTotals\"))) result.visualTotals = true;\n if (String(attr(el, \"showMultipleLabel\")) === \"0\") result.showMultipleLabel = false;\n if (String(attr(el, \"showDataDropDown\")) === \"0\") result.showDataDropDown = false;\n if (String(attr(el, \"showDrill\")) === \"0\") result.showDrill = false;\n if (parseOnOff(attr(el, \"printDrill\"))) result.printDrill = true;\n if (parseOnOff(attr(el, \"showMemberPropertyTips\"))) result.showMemberPropertyTips = true;\n if (String(attr(el, \"showDataTips\")) === \"0\") result.showDataTips = false;\n if (String(attr(el, \"enableWizard\")) === \"0\") result.enableWizard = false;\n if (String(attr(el, \"enableDrill\")) === \"0\") result.enableDrill = false;\n if (String(attr(el, \"enableFieldProperties\")) === \"0\") result.enableFieldProperties = false;\n const pageWrap = attrNum(el, \"pageWrap\");\n if (pageWrap !== undefined) result.pageWrap = pageWrap;\n if (parseOnOff(attr(el, \"pageOverThenDown\"))) result.pageOverThenDown = true;\n if (parseOnOff(attr(el, \"subtotalHiddenItems\"))) result.subtotalHiddenItems = true;\n if (parseOnOff(attr(el, \"fieldPrintTitles\"))) result.fieldPrintTitles = true;\n if (parseOnOff(attr(el, \"mergeItem\"))) result.mergeItem = true;\n if (String(attr(el, \"showDropZones\")) === \"0\") result.showDropZones = false;\n if (parseOnOff(attr(el, \"published\"))) result.published = true;\n if (String(attr(el, \"gridDropZones\")) === \"0\") result.gridDropZones = false;\n if (String(attr(el, \"multipleFieldFilters\")) === \"0\") result.multipleFieldFilters = false;\n if (attr(el, \"rowHeaderCaption\")) result.rowHeaderCaption = attr(el, \"rowHeaderCaption\");\n if (attr(el, \"colHeaderCaption\")) result.colHeaderCaption = attr(el, \"colHeaderCaption\");\n if (parseOnOff(attr(el, \"fieldListSortAscending\"))) result.fieldListSortAscending = true;\n if (parseOnOff(attr(el, \"mdxSubqueries\"))) result.mdxSubqueries = true;\n if (String(attr(el, \"customListSort\")) === \"0\") result.customListSort = false;\n if (parseOnOff(attr(el, \"asteriskTotals\"))) result.asteriskTotals = true;\n const dataPosition = attrNum(el, \"dataPosition\");\n if (dataPosition !== undefined) result.dataPosition = dataPosition;\n if (parseOnOff(attr(el, \"immersive\"))) result.immersive = true;\n if (attr(el, \"vacatedStyle\")) result.vacatedStyle = attr(el, \"vacatedStyle\");\n if (parseOnOff(attr(el, \"chartFormat\"))) result.chartFormat = true;\n if (String(attr(el, \"preserveFormatting\")) === \"0\") result.preserveFormatting = false;\n else if (parseOnOff(attr(el, \"preserveFormatting\"))) result.preserveFormatting = true;\n if (attr(el, \"dataCaption\")) result.dataCaption = attr(el, \"dataCaption\");\n\n // Location — store ref as string, plus extended counts\n const locEl = findChild(el, \"location\");\n if (locEl) {\n if (attr(locEl, \"ref\")) result.location = attr(locEl, \"ref\");\n const rpc = attrNum(locEl, \"rowPageCount\");\n if (rpc !== undefined) result.locationRowPageCount = rpc;\n const cpc = attrNum(locEl, \"colPageCount\");\n if (cpc !== undefined) result.locationColPageCount = cpc;\n }\n\n // PivotFields\n const pfEl = findChild(el, \"pivotFields\");\n if (pfEl) {\n const fields: PivotFieldParseResult[] = [];\n for (const fEl of pfEl.elements ?? []) {\n if (fEl.name !== \"pivotField\") continue;\n const field: PivotFieldParseResult = {};\n const axis = attr(fEl, \"axis\");\n if (axis) field.axis = axis;\n if (String(attr(fEl, \"showAll\")) === \"0\") field.showAll = false;\n else if (parseOnOff(attr(fEl, \"showAll\"))) field.showAll = true;\n if (parseOnOff(attr(fEl, \"dataField\"))) field.dataField = true;\n if (attr(fEl, \"hierarchy\")) field.hierarchy = attr(fEl, \"hierarchy\");\n if (String(attr(fEl, \"dragToRow\")) === \"0\") field.dragToRow = false;\n if (String(attr(fEl, \"dragToCol\")) === \"0\") field.dragToCol = false;\n if (String(attr(fEl, \"dragToPage\")) === \"0\") field.dragToPage = false;\n if (parseOnOff(attr(fEl, \"dragToData\"))) field.dragToData = true;\n if (String(attr(fEl, \"dragOff\")) === \"0\") field.dragOff = false;\n if (String(attr(fEl, \"showDropDowns\")) === \"0\") field.showDropDowns = false;\n if (parseOnOff(attr(fEl, \"insertBlankRow\"))) field.insertBlankRow = true;\n if (parseOnOff(attr(fEl, \"showPropCell\"))) field.showPropCell = true;\n if (parseOnOff(attr(fEl, \"showPropTip\"))) field.showPropTip = true;\n if (parseOnOff(attr(fEl, \"showPropAsCaption\"))) field.showPropAsCaption = true;\n if (String(attr(fEl, \"compact\")) === \"0\") field.compact = false;\n if (parseOnOff(attr(fEl, \"outline\"))) field.outline = true;\n if (String(attr(fEl, \"subtotalTop\")) === \"0\") field.subtotalTop = false;\n if (parseOnOff(attr(fEl, \"includeNewItemsInFilter\"))) field.includeNewItemsInFilter = true;\n if (parseOnOff(attr(fEl, \"avgSubtotal\"))) field.avgSubtotal = true;\n if (parseOnOff(attr(fEl, \"countASubtotal\"))) field.countASubtotal = true;\n if (parseOnOff(attr(fEl, \"maxSubtotal\"))) field.maxSubtotal = true;\n if (parseOnOff(attr(fEl, \"minSubtotal\"))) field.minSubtotal = true;\n if (parseOnOff(attr(fEl, \"sumSubtotal\"))) field.sumSubtotal = true;\n fields.push(field);\n }\n result.pivotFields = fields;\n }\n\n // DataFields\n const dfEl = findChild(el, \"dataFields\");\n if (dfEl) {\n const dataFields: DataFieldParseResult[] = [];\n for (const dEl of dfEl.elements ?? []) {\n if (dEl.name !== \"dataField\") continue;\n const df: DataFieldParseResult = {};\n if (attr(dEl, \"name\")) df.name = attr(dEl, \"name\");\n const fld = attrNum(dEl, \"fld\");\n if (fld !== undefined) df.fld = fld;\n if (attr(dEl, \"subtotal\")) df.subtotal = attr(dEl, \"subtotal\");\n if (attr(dEl, \"showDataAs\")) df.showDataAs = attr(dEl, \"showDataAs\");\n const baseField = attrNum(dEl, \"baseField\");\n if (baseField !== undefined) df.baseField = baseField;\n const baseItem = attrNum(dEl, \"baseItem\");\n if (baseItem !== undefined) df.baseItem = baseItem;\n if (attr(dEl, \"numFmtId\")) df.numFmtId = attr(dEl, \"numFmtId\");\n dataFields.push(df);\n }\n result.dataFields = dataFields;\n }\n\n // Row fields\n const rowFieldsEl = findChild(el, \"rowFields\");\n if (rowFieldsEl) {\n const rowFields: number[] = [];\n for (const f of rowFieldsEl.elements ?? []) {\n if (f.name === \"field\") {\n const x = attrNum(f, \"x\");\n if (x !== undefined) rowFields.push(x);\n }\n }\n result.rowFields = rowFields;\n }\n\n // Col fields\n const colFieldsEl = findChild(el, \"colFields\");\n if (colFieldsEl) {\n const colFields: number[] = [];\n for (const f of colFieldsEl.elements ?? []) {\n if (f.name === \"field\") {\n const x = attrNum(f, \"x\");\n if (x !== undefined) colFields.push(x);\n }\n }\n result.colFields = colFields;\n }\n\n // Page fields\n const pageFieldsEl = findChild(el, \"pageFields\");\n if (pageFieldsEl) {\n const pageFields: PageFieldParseResult[] = [];\n for (const pf of pageFieldsEl.elements ?? []) {\n if (pf.name !== \"pageField\") continue;\n const pfResult: PageFieldParseResult = {};\n const fld = attrNum(pf, \"fld\");\n if (fld !== undefined) pfResult.fld = fld;\n const hier = attrNum(pf, \"hier\");\n if (hier !== undefined) pfResult.hier = hier;\n if (attr(pf, \"cap\")) pfResult.cap = attr(pf, \"cap\");\n const item = attrNum(pf, \"item\");\n if (item !== undefined) pfResult.item = item;\n pageFields.push(pfResult);\n }\n result.pageFields = pageFields;\n }\n\n // Formats\n const formatsEl = findChild(el, \"formats\");\n if (formatsEl) {\n const formats: PivotFormatParseResult[] = [];\n for (const fmtEl of formatsEl.elements ?? []) {\n if (fmtEl.name !== \"format\") continue;\n const fmt: PivotFormatParseResult = {};\n if (attr(fmtEl, \"action\")) fmt.action = attr(fmtEl, \"action\");\n const dxfId = attrNum(fmtEl, \"dxfId\");\n if (dxfId !== undefined) fmt.dxfId = dxfId;\n const paEl = findChild(fmtEl, \"pivotArea\");\n if (paEl) fmt.pivotArea = parsePivotArea(paEl);\n formats.push(fmt);\n }\n result.formats = formats;\n }\n\n // ConditionalFormats (pivot-specific CT_ConditionalFormats)\n const condFormatsEl = findChild(el, \"conditionalFormats\");\n if (condFormatsEl) {\n const condFormats: ConditionalFormatParseResult[] = [];\n for (const cfEl of condFormatsEl.elements ?? []) {\n if (cfEl.name !== \"conditionalFormat\") continue;\n const cf: ConditionalFormatParseResult = {};\n if (attr(cfEl, \"scope\")) cf.scope = attr(cfEl, \"scope\");\n if (attr(cfEl, \"type\")) cf.type = attr(cfEl, \"type\");\n const priority = attrNum(cfEl, \"priority\");\n if (priority !== undefined) cf.priority = priority;\n const areasEl = findChild(cfEl, \"pivotAreas\");\n if (areasEl) {\n const areas: Partial<PivotAreaOptions>[] = [];\n for (const aEl of areasEl.elements ?? []) {\n if (aEl.name !== \"pivotArea\") continue;\n areas.push(parsePivotArea(aEl));\n }\n cf.pivotAreas = areas;\n }\n condFormats.push(cf);\n }\n result.conditionalFormats = condFormats;\n }\n\n // ChartFormats\n const chartFormatsEl = findChild(el, \"chartFormats\");\n if (chartFormatsEl) {\n const chartFormats: ChartFormatParseResult[] = [];\n for (const cfEl of chartFormatsEl.elements ?? []) {\n if (cfEl.name !== \"chartFormat\") continue;\n const cf: ChartFormatParseResult = {};\n const chart = attrNum(cfEl, \"chart\");\n if (chart !== undefined) cf.chart = chart;\n const format = attrNum(cfEl, \"format\");\n if (format !== undefined) cf.format = format;\n if (parseOnOff(attr(cfEl, \"series\"))) cf.series = true;\n const paEl = findChild(cfEl, \"pivotArea\");\n if (paEl) cf.pivotArea = parsePivotArea(paEl);\n chartFormats.push(cf);\n }\n result.chartFormats = chartFormats;\n }\n\n // PivotHierarchies\n const hierarchiesEl = findChild(el, \"pivotHierarchies\");\n if (hierarchiesEl) {\n const hierarchies: PivotHierarchyParseResult[] = [];\n for (const hEl of hierarchiesEl.elements ?? []) {\n if (hEl.name !== \"pivotHierarchy\") continue;\n const h: PivotHierarchyParseResult = {};\n if (parseOnOff(attr(hEl, \"outline\"))) h.outline = true;\n if (parseOnOff(attr(hEl, \"multipleItemSelectionAllowed\")))\n h.multipleItemSelectionAllowed = true;\n if (parseOnOff(attr(hEl, \"subtotalTop\"))) h.subtotalTop = true;\n if (String(attr(hEl, \"showInFieldList\")) === \"0\") h.showInFieldList = false;\n if (String(attr(hEl, \"dragToRow\")) === \"0\") h.dragToRow = false;\n if (String(attr(hEl, \"dragToCol\")) === \"0\") h.dragToCol = false;\n if (String(attr(hEl, \"dragToPage\")) === \"0\") h.dragToPage = false;\n if (parseOnOff(attr(hEl, \"dragToData\"))) h.dragToData = true;\n if (String(attr(hEl, \"dragOff\")) === \"0\") h.dragOff = false;\n if (parseOnOff(attr(hEl, \"includeNewItemsInFilter\"))) h.includeNewItemsInFilter = true;\n if (attr(hEl, \"caption\")) h.caption = attr(hEl, \"caption\");\n hierarchies.push(h);\n }\n result.pivotHierarchies = hierarchies;\n }\n\n // Filters\n const filtersEl = findChild(el, \"filters\");\n if (filtersEl) {\n const filters: PivotFilterParseResult[] = [];\n for (const fEl of filtersEl.elements ?? []) {\n if (fEl.name !== \"filter\") continue;\n const f: PivotFilterParseResult = {};\n const fld = attrNum(fEl, \"fld\");\n if (fld !== undefined) f.fld = fld;\n if (attr(fEl, \"type\")) f.type = attr(fEl, \"type\");\n const id = attrNum(fEl, \"id\");\n if (id !== undefined) f.id = id;\n const mpFld = attrNum(fEl, \"mpFld\");\n if (mpFld !== undefined) f.mpFld = mpFld;\n const evalOrder = attrNum(fEl, \"evalOrder\");\n if (evalOrder !== undefined) f.evalOrder = evalOrder;\n const imh = attrNum(fEl, \"iMeasureHier\");\n if (imh !== undefined) f.iMeasureHier = imh;\n const imf = attrNum(fEl, \"iMeasureFld\");\n if (imf !== undefined) f.iMeasureFld = imf;\n if (attr(fEl, \"stringValue1\")) f.stringValue1 = attr(fEl, \"stringValue1\");\n if (attr(fEl, \"stringValue2\")) f.stringValue2 = attr(fEl, \"stringValue2\");\n filters.push(f);\n }\n result.filters = filters;\n }\n\n // RowHierarchiesUsage\n const rhuEl = findChild(el, \"rowHierarchiesUsage\");\n if (rhuEl) {\n const usage: HierarchyUsageParseResult[] = [];\n for (const u of rhuEl.elements ?? []) {\n if (u.name === \"rowHierarchyUsage\") {\n usage.push({ hierarchyUsage: attrNum(u, \"hierarchyUsage\") ?? 0 });\n }\n }\n result.rowHierarchiesUsage = usage;\n }\n\n // ColHierarchiesUsage\n const chuEl = findChild(el, \"colHierarchiesUsage\");\n if (chuEl) {\n const usage: HierarchyUsageParseResult[] = [];\n for (const u of chuEl.elements ?? []) {\n if (u.name === \"colHierarchyUsage\") {\n usage.push({ hierarchyUsage: attrNum(u, \"hierarchyUsage\") ?? 0 });\n }\n }\n result.colHierarchiesUsage = usage;\n }\n\n // CalculatedItems\n const ciEl = findChild(el, \"calculatedItems\");\n if (ciEl) {\n const items: CalculatedItemParseResult[] = [];\n for (const iEl of ciEl.elements ?? []) {\n if (iEl.name !== \"calculatedItem\") continue;\n const item: CalculatedItemParseResult = {};\n const field = attrNum(iEl, \"field\");\n if (field !== undefined) item.field = field;\n const formulaEl = findChild(iEl, \"formula\");\n if (formulaEl) item.formula = textOf(formulaEl);\n const paEl = findChild(iEl, \"pivotArea\");\n if (paEl) item.pivotArea = parsePivotArea(paEl);\n items.push(item);\n }\n result.calculatedItems = items;\n }\n\n // CalculatedMembers\n const cmEl = findChild(el, \"calculatedMembers\");\n if (cmEl) {\n const members: CalculatedMemberParseResult[] = [];\n for (const mEl of cmEl.elements ?? []) {\n if (mEl.name !== \"calculatedMember\") continue;\n const m: CalculatedMemberParseResult = {};\n if (attr(mEl, \"name\")) m.name = attr(mEl, \"name\");\n const mdxEl = findChild(mEl, \"mdx\");\n if (mdxEl) m.mdx = textOf(mdxEl) ?? \"\";\n if (attr(mEl, \"memberName\")) m.memberName = attr(mEl, \"memberName\");\n if (attr(mEl, \"hierarchy\")) m.hierarchy = attr(mEl, \"hierarchy\");\n if (attr(mEl, \"parent\")) m.parent = attr(mEl, \"parent\");\n const solveOrder = attrNum(mEl, \"solveOrder\");\n if (solveOrder !== undefined) m.solveOrder = solveOrder;\n if (parseOnOff(attr(mEl, \"set\"))) m.set = true;\n members.push(m);\n }\n result.calculatedMembers = members;\n }\n\n // Style from pivotTableStyleInfo/@name (the standard location)\n const styleInfoEl = findChild(el, \"pivotTableStyleInfo\");\n if (styleInfoEl) {\n const styleName = attr(styleInfoEl, \"name\");\n if (styleName) result.style = styleName;\n } else if (attr(el, \"styleName\")) {\n result.style = attr(el, \"styleName\");\n }\n\n return result as PivotTableParseResult;\n },\n};\n","/**\n * PivotCache descriptors for XLSX — generates xl/pivotCache/pivotCacheDefinition{N}.xml\n * and xl/pivotCache/pivotCacheRecords{N}.xml.\n *\n * Direct stringify/parse — no intermediate class.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { escapeXml, findChild, attr, attrNum } from \"@office-open/xml\";\n\nimport type { PivotCacheDefinitionOptions } from \"./pivot/pivot-utils\";\nimport type { PivotSourceData, TupleOptions } from \"./pivot/pivot-utils\";\nimport { collectUniqueValues, isNumericField } from \"./pivot/pivot-utils\";\n\n// ── Types ──\n\n/** One parsed cell from a pivotCacheRecords row (CT_Record). */\nexport type PivotCacheRecordEntry =\n | { type: \"string\"; v: number } // <x v=\"idx\"/> — shared-items index\n | { type: \"number\"; v: number } // <n v=\"num\"/>\n | { type: \"date\"; v: string } // <d v=\"date\"/>\n | { type: \"error\"; v: string } // <e v=\"#DIV/0!\"/> — cached error\n | { type: \"missing\" }; // <m/>\n\nexport interface PivotCacheRecordsDescriptorOptions {\n sourceData: PivotSourceData;\n /** Parsed records (from parse path) */\n records?: PivotCacheRecordEntry[][];\n}\n\nexport interface PivotCacheDefDescriptorOptions {\n sourceRef: string;\n sourceSheet: string;\n sourceData: PivotSourceData;\n recordsRid: string;\n cacheDefOpts?: PivotCacheDefinitionOptions;\n}\n\n/** Worksheet source (CT_WorksheetSource) parsed from a pivotCacheDefinition. */\nexport interface PivotCacheDefWorksheetSource {\n ref?: string;\n sheet?: string;\n}\n\n/** Cache field (CT_CacheField) parsed from a pivotCacheDefinition. */\nexport interface PivotCacheDefCacheField {\n name?: string;\n numFmtId?: number;\n sharedItems?: (string | number)[];\n}\n\n/** Structured output of {@link pivotCacheDefDesc}.parse — flat attributes + source + fields. */\nexport interface PivotCacheDefParseResult {\n invalid?: boolean;\n saveData?: boolean;\n optimizeMemory?: boolean;\n enableRefresh?: boolean;\n refreshedBy?: string;\n refreshedDate?: number;\n refreshedDateIso?: string;\n backgroundQuery?: boolean;\n missingItemsLimit?: number;\n upgradeOnRefresh?: boolean;\n supportSubquery?: boolean;\n supportAdvancedDrill?: boolean;\n refreshOnLoad?: boolean;\n tupleCache?: boolean;\n recordCount?: number;\n sourceType?: string;\n worksheetSource?: PivotCacheDefWorksheetSource;\n cacheFields?: PivotCacheDefCacheField[];\n}\n\n/** Structured output of {@link pivotCacheRecordsDesc}.parse. */\nexport interface PivotCacheRecordsParseResult {\n records: PivotCacheRecordEntry[][];\n}\n\n// ── Descriptors ──\n\nexport const pivotCacheDefDesc: CustomDescriptor<\n PivotCacheDefDescriptorOptions,\n WriteContext,\n PivotCacheDefParseResult\n> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyPivotCacheDef(\n opts.sourceRef,\n opts.sourceSheet,\n opts.sourceData,\n opts.recordsRid,\n opts.cacheDefOpts,\n );\n },\n\n parse(el, _ctx) {\n const result: Partial<PivotCacheDefParseResult> = {};\n\n // Root element attributes\n if (parseOnOff(attr(el, \"invalid\"))) result.invalid = true;\n if (String(attr(el, \"saveData\")) === \"0\") result.saveData = false;\n if (parseOnOff(attr(el, \"optimizeMemory\"))) result.optimizeMemory = true;\n if (String(attr(el, \"enableRefresh\")) === \"0\") result.enableRefresh = false;\n if (attr(el, \"refreshedBy\")) result.refreshedBy = attr(el, \"refreshedBy\");\n const rd = attrNum(el, \"refreshedDate\");\n if (rd !== undefined) result.refreshedDate = rd;\n if (attr(el, \"refreshedDateIso\")) result.refreshedDateIso = attr(el, \"refreshedDateIso\");\n if (parseOnOff(attr(el, \"backgroundQuery\"))) result.backgroundQuery = true;\n const mil = attrNum(el, \"missingItemsLimit\");\n if (mil !== undefined) result.missingItemsLimit = mil;\n if (parseOnOff(attr(el, \"upgradeOnRefresh\"))) result.upgradeOnRefresh = true;\n if (parseOnOff(attr(el, \"supportSubquery\"))) result.supportSubquery = true;\n if (parseOnOff(attr(el, \"supportAdvancedDrill\"))) result.supportAdvancedDrill = true;\n if (parseOnOff(attr(el, \"refreshOnLoad\"))) result.refreshOnLoad = true;\n if (parseOnOff(attr(el, \"tupleCache\"))) result.tupleCache = true;\n const recordCount = attrNum(el, \"recordCount\");\n if (recordCount !== undefined) result.recordCount = recordCount;\n\n const csEl = findChild(el, \"cacheSource\");\n if (csEl) {\n result.sourceType = attr(csEl, \"type\");\n const wssEl = findChild(csEl, \"worksheetSource\");\n if (wssEl) {\n const wss: PivotCacheDefWorksheetSource = {};\n if (attr(wssEl, \"ref\")) wss.ref = attr(wssEl, \"ref\");\n if (attr(wssEl, \"sheet\")) wss.sheet = attr(wssEl, \"sheet\");\n result.worksheetSource = wss;\n }\n }\n const cfEl = findChild(el, \"cacheFields\");\n if (cfEl) {\n const fields: PivotCacheDefCacheField[] = [];\n for (const fEl of cfEl.elements ?? []) {\n if (fEl.name !== \"cacheField\") continue;\n const field: PivotCacheDefCacheField = {};\n if (attr(fEl, \"name\")) field.name = attr(fEl, \"name\");\n if (attrNum(fEl, \"numFmtId\") !== undefined) field.numFmtId = attrNum(fEl, \"numFmtId\");\n const siEl = findChild(fEl, \"sharedItems\");\n if (siEl) {\n const items: (string | number)[] = [];\n for (const siChild of siEl.elements ?? []) {\n const v = attr(siChild, \"v\");\n if (v !== undefined) items.push(isNaN(Number(v)) ? v : Number(v));\n }\n field.sharedItems = items;\n }\n fields.push(field);\n }\n result.cacheFields = fields;\n }\n return result as PivotCacheDefParseResult;\n },\n};\n\nexport const pivotCacheRecordsDesc: CustomDescriptor<\n PivotCacheRecordsDescriptorOptions,\n WriteContext,\n PivotCacheRecordsParseResult\n> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyPivotCacheRecords(opts.sourceData);\n },\n\n parse(el, _ctx) {\n const records: PivotCacheRecordEntry[][] = [];\n for (const rEl of el.elements ?? []) {\n if (rEl.name !== \"r\") continue;\n const record: PivotCacheRecordEntry[] = [];\n for (const fEl of rEl.elements ?? []) {\n let entry: PivotCacheRecordEntry;\n if (fEl.name === \"x\") {\n entry = { type: \"string\", v: attrNum(fEl, \"v\") ?? 0 };\n } else if (fEl.name === \"n\") {\n const v = attr(fEl, \"v\");\n entry = { type: \"number\", v: v !== undefined ? Number(v) : 0 };\n } else if (fEl.name === \"d\") {\n entry = { type: \"date\", v: attr(fEl, \"v\") ?? \"\" };\n } else if (fEl.name === \"e\") {\n entry = { type: \"error\", v: attr(fEl, \"v\") ?? \"\" };\n } else if (fEl.name === \"m\") {\n entry = { type: \"missing\" };\n } else {\n continue; // skip unrecognized cell elements\n }\n record.push(entry);\n }\n records.push(record);\n }\n return { records };\n },\n};\n\n// ── Stringify: pivotCacheDefinition ──\n\nfunction stringifyPivotCacheDef(\n sourceRef: string,\n sourceSheet: string,\n sourceData: PivotSourceData,\n recordsRid: string,\n cacheDefOpts?: PivotCacheDefinitionOptions,\n): string {\n const p: string[] = [];\n const rootAttrs: string[] = [\n 'xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"',\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"',\n `r:id=\"${escapeXml(recordsRid)}\"`,\n `recordCount=\"${sourceData.records.length}\"`,\n 'createdVersion=\"6\"',\n 'refreshedVersion=\"6\"',\n 'minRefreshableVersion=\"3\"',\n ];\n\n if (cacheDefOpts) {\n const cd = cacheDefOpts;\n if (cd.invalid) rootAttrs.push('invalid=\"1\"');\n if (cd.saveData === false) rootAttrs.push('saveData=\"0\"');\n if (cd.optimizeMemory) rootAttrs.push('optimizeMemory=\"1\"');\n if (cd.enableRefresh === false) rootAttrs.push('enableRefresh=\"0\"');\n if (cd.refreshedBy) rootAttrs.push(`refreshedBy=\"${escapeXml(cd.refreshedBy)}\"`);\n if (cd.refreshedDate !== undefined) rootAttrs.push(`refreshedDate=\"${cd.refreshedDate}\"`);\n if (cd.refreshedDateIso) rootAttrs.push(`refreshedDateIso=\"${escapeXml(cd.refreshedDateIso)}\"`);\n if (cd.backgroundQuery) rootAttrs.push('backgroundQuery=\"1\"');\n if (cd.missingItemsLimit !== undefined)\n rootAttrs.push(`missingItemsLimit=\"${cd.missingItemsLimit}\"`);\n if (cd.upgradeOnRefresh) rootAttrs.push('upgradeOnRefresh=\"1\"');\n if (cd.supportSubquery) rootAttrs.push('supportSubquery=\"1\"');\n if (cd.supportAdvancedDrill) rootAttrs.push('supportAdvancedDrill=\"1\"');\n if (cd.refreshOnLoad) rootAttrs.push('refreshOnLoad=\"1\"');\n if (cd.tupleCache) rootAttrs.push('tupleCache=\"1\"');\n }\n\n p.push(`<pivotCacheDefinition ${rootAttrs.join(\" \")}>`);\n\n // cacheSource\n if (cacheDefOpts?.consolidation) {\n const con = cacheDefOpts.consolidation;\n const conParts: string[] = ['<cacheSource type=\"consolidation\"><consolidation'];\n if (con.autoPage === false) conParts.push(' autoPage=\"0\"');\n conParts.push(\">\");\n if (con.pages && con.pages.length > 0) {\n conParts.push(`<pages count=\"${con.pages.length}\">`);\n for (const pg of con.pages) {\n const pgItems = pg.items ?? [];\n conParts.push(`<page${pgItems.length ? ` count=\"${pgItems.length}\"` : \"\"}>`);\n for (const pi of pgItems) conParts.push(`<pageItem name=\"${escapeXml(pi.name)}\"/>`);\n conParts.push(\"</page>\");\n }\n conParts.push(\"</pages>\");\n }\n conParts.push(`<rangeSets count=\"${con.rangeSets.length}\">`);\n for (const rs of con.rangeSets) {\n const rsAttrs: string[] = [];\n if (rs.pageFieldIndex1 !== undefined) rsAttrs.push(`i1=\"${rs.pageFieldIndex1}\"`);\n if (rs.pageFieldIndex2 !== undefined) rsAttrs.push(`i2=\"${rs.pageFieldIndex2}\"`);\n if (rs.pageFieldIndex3 !== undefined) rsAttrs.push(`i3=\"${rs.pageFieldIndex3}\"`);\n if (rs.pageFieldIndex4 !== undefined) rsAttrs.push(`i4=\"${rs.pageFieldIndex4}\"`);\n if (rs.ref) rsAttrs.push(`ref=\"${escapeXml(rs.ref)}\"`);\n if (rs.name) rsAttrs.push(`name=\"${escapeXml(rs.name)}\"`);\n if (rs.sheet) rsAttrs.push(`sheet=\"${escapeXml(rs.sheet)}\"`);\n if (rs.rId) rsAttrs.push(`r:id=\"${escapeXml(rs.rId)}\"`);\n conParts.push(`<rangeSet ${rsAttrs.join(\" \")}/>`);\n }\n conParts.push(\"</rangeSets></consolidation></cacheSource>\");\n p.push(conParts.join(\"\"));\n } else {\n p.push(\n `<cacheSource type=\"worksheet\">` +\n `<worksheetSource ref=\"${escapeXml(sourceRef)}\" sheet=\"${escapeXml(sourceSheet)}\"/>` +\n `</cacheSource>`,\n );\n }\n\n // cacheFields\n const fieldNames = sourceData.fieldNames;\n p.push(`<cacheFields count=\"${fieldNames.length}\">`);\n\n for (let i = 0; i < fieldNames.length; i++) {\n const fieldName = fieldNames[i] ?? \"\";\n const numeric = isNumericField(sourceData.records, i);\n const uniqueVals = collectUniqueValues(sourceData.records, i);\n\n if (numeric) {\n let min = Infinity,\n max = -Infinity;\n for (const row of sourceData.records) {\n const v = row[i];\n if (typeof v === \"number\") {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n }\n if (!isFinite(min)) {\n min = 0;\n max = 0;\n }\n const allInteger = sourceData.records.every(\n (row) => typeof row[i] === \"number\" && Number.isInteger(row[i]),\n );\n\n const cfOverride = cacheDefOpts?.cacheFieldOverrides?.get(i);\n const cfExtraAttrs: string[] = [];\n const siExtraAttrs: string[] = [];\n if (cfOverride) {\n if (cfOverride.databaseField) cfExtraAttrs.push('databaseField=\"1\"');\n if (cfOverride.level !== undefined) cfExtraAttrs.push(`level=\"${cfOverride.level}\"`);\n if (cfOverride.mappingCount !== undefined)\n cfExtraAttrs.push(`mappingCount=\"${cfOverride.mappingCount}\"`);\n if (cfOverride.memberPropertyField !== undefined)\n cfExtraAttrs.push(`memberPropertyField=\"${cfOverride.memberPropertyField}\"`);\n if (cfOverride.propertyName)\n cfExtraAttrs.push(`propertyName=\"${escapeXml(cfOverride.propertyName)}\"`);\n if (cfOverride.serverField) cfExtraAttrs.push('serverField=\"1\"');\n if (cfOverride.uniqueList) cfExtraAttrs.push('uniqueList=\"1\"');\n if (cfOverride.sqlType !== undefined) cfExtraAttrs.push(`sqlType=\"${cfOverride.sqlType}\"`);\n if (cfOverride.containsMixedTypes) siExtraAttrs.push('containsMixedTypes=\"1\"');\n if (cfOverride.containsNonDate) siExtraAttrs.push('containsNonDate=\"1\"');\n if (cfOverride.longText) siExtraAttrs.push('longText=\"1\"');\n }\n\n p.push(\n `<cacheField name=\"${escapeXml(fieldName)}\" ${cfExtraAttrs.length ? cfExtraAttrs.join(\" \") + \" \" : \"\"}numFmtId=\"0\">` +\n `<sharedItems containsSemiMixedTypes=\"0\" containsString=\"0\"` +\n ` containsNumber=\"1\" containsInteger=\"${allInteger ? \"1\" : \"0\"}\"` +\n ` minValue=\"${min}\" maxValue=\"${max}\" count=\"${uniqueVals.length}\"${siExtraAttrs.length ? \" \" + siExtraAttrs.join(\" \") : \"\"}>`,\n );\n for (const v of uniqueVals) {\n if (v === null) p.push(\"<m/>\");\n else if (v instanceof Date) p.push(`<d v=\"${v.toISOString().replace(/\\.\\d{3}Z$/, \"Z\")}\"/>`);\n else p.push(`<n v=\"${v}\"/>`);\n }\n p.push(\"</sharedItems></cacheField>\");\n } else {\n let hasDate = false,\n hasMissing = false;\n for (const v of uniqueVals) {\n if (v instanceof Date) hasDate = true;\n if (v === null) hasMissing = true;\n }\n const siAttrs: string[] = [`count=\"${uniqueVals.length}\"`];\n if (hasDate) {\n siAttrs.push('containsDate=\"1\"');\n let minD: Date | undefined;\n let maxD: Date | undefined;\n for (const v of uniqueVals) {\n if (!(v instanceof Date)) continue;\n if (!minD || v < minD) minD = v;\n if (!maxD || v > maxD) maxD = v;\n }\n const iso = (d: Date) => d.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n if (minD) siAttrs.push(`minDate=\"${iso(minD)}\"`);\n if (maxD) siAttrs.push(`maxDate=\"${iso(maxD)}\"`);\n }\n if (hasMissing) siAttrs.push('containsBlank=\"1\"');\n\n const cfOverride = cacheDefOpts?.cacheFieldOverrides?.get(i);\n const cfExtraAttrs: string[] = [];\n if (cfOverride) {\n if (cfOverride.databaseField) cfExtraAttrs.push('databaseField=\"1\"');\n if (cfOverride.level !== undefined) cfExtraAttrs.push(`level=\"${cfOverride.level}\"`);\n if (cfOverride.mappingCount !== undefined)\n cfExtraAttrs.push(`mappingCount=\"${cfOverride.mappingCount}\"`);\n if (cfOverride.memberPropertyField !== undefined)\n cfExtraAttrs.push(`memberPropertyField=\"${cfOverride.memberPropertyField}\"`);\n if (cfOverride.propertyName)\n cfExtraAttrs.push(`propertyName=\"${escapeXml(cfOverride.propertyName)}\"`);\n if (cfOverride.serverField) cfExtraAttrs.push('serverField=\"1\"');\n if (cfOverride.uniqueList) cfExtraAttrs.push('uniqueList=\"1\"');\n if (cfOverride.sqlType !== undefined) cfExtraAttrs.push(`sqlType=\"${cfOverride.sqlType}\"`);\n if (cfOverride.containsMixedTypes) siAttrs.push('containsMixedTypes=\"1\"');\n if (cfOverride.containsNonDate) siAttrs.push('containsNonDate=\"1\"');\n if (cfOverride.longText) siAttrs.push('longText=\"1\"');\n }\n\n p.push(\n `<cacheField name=\"${escapeXml(fieldName)}\" ${cfExtraAttrs.length ? cfExtraAttrs.join(\" \") + \" \" : \"\"}numFmtId=\"0\"><sharedItems ${siAttrs.join(\" \")}>`,\n );\n\n for (const v of uniqueVals) {\n if (v === null) p.push(\"<m/>\");\n else if (v instanceof Date) p.push(`<d v=\"${v.toISOString().replace(/\\.\\d{3}Z$/, \"Z\")}\"/>`);\n else p.push(`<s v=\"${escapeXml(String(v))}\"/>`);\n }\n p.push(\"</sharedItems>\");\n\n // fieldGroup\n const fg = cacheDefOpts?.fieldGroups?.get(i);\n if (fg) {\n const fgParts: string[] = [\"<fieldGroup\"];\n if (fg.parent !== undefined) fgParts.push(` par=\"${fg.parent}\"`);\n if (fg.base !== undefined) fgParts.push(` base=\"${fg.base}\"`);\n fgParts.push(\">\");\n if (fg.rangePr) {\n const rp = fg.rangePr;\n const rpAttrs: string[] = [];\n if (rp.autoStart === false) rpAttrs.push('autoStart=\"0\"');\n if (rp.autoEnd === false) rpAttrs.push('autoEnd=\"0\"');\n if (rp.groupBy && rp.groupBy !== \"range\") rpAttrs.push(`groupBy=\"${rp.groupBy}\"`);\n if (rp.startNum !== undefined) rpAttrs.push(`startNum=\"${rp.startNum}\"`);\n if (rp.endNum !== undefined) rpAttrs.push(`endNum=\"${rp.endNum}\"`);\n if (rp.startDate) rpAttrs.push(`startDate=\"${escapeXml(rp.startDate)}\"`);\n if (rp.endDate) rpAttrs.push(`endDate=\"${escapeXml(rp.endDate)}\"`);\n if (rp.groupInterval !== undefined) rpAttrs.push(`groupInterval=\"${rp.groupInterval}\"`);\n fgParts.push(`<rangePr${rpAttrs.length ? \" \" + rpAttrs.join(\" \") : \"\"}/>`);\n }\n if (fg.discretePr && fg.discretePr.length > 0) {\n fgParts.push(`<discretePr count=\"${fg.discretePr.length}\">`);\n for (const idx of fg.discretePr) fgParts.push(`<x v=\"${idx}\"/>`);\n fgParts.push(\"</discretePr>\");\n }\n if (fg.groupItems && fg.groupItems.length > 0) {\n fgParts.push(`<groupItems count=\"${fg.groupItems.length}\">`);\n for (const gi of fg.groupItems) fgParts.push(`<s v=\"${escapeXml(gi)}\"/>`);\n fgParts.push(\"</groupItems>\");\n }\n fgParts.push(\"</fieldGroup>\");\n p.push(fgParts.join(\"\"));\n }\n\n p.push(\"</cacheField>\");\n }\n }\n p.push(\"</cacheFields>\");\n\n // mpMap\n if (cacheDefOpts?.mpMaps) {\n for (const mp of cacheDefOpts.mpMaps) p.push(`<mpMap x=\"${mp.x}\"/>`);\n }\n\n // olapPr\n if (cacheDefOpts?.olapPr) {\n const ol = cacheDefOpts.olapPr;\n const olAttrs: string[] = [];\n if (ol.local) olAttrs.push(` local=\"${escapeXml(ol.local)}\"`);\n if (ol.localConnection) olAttrs.push(` localConnection=\"${escapeXml(ol.localConnection)}\"`);\n if (ol.sendLocale) olAttrs.push(' sendLocale=\"1\"');\n if (ol.rowDrillCount !== undefined) olAttrs.push(` rowDrillCount=\"${ol.rowDrillCount}\"`);\n if (ol.colDrillCount !== undefined) olAttrs.push(` colDrillCount=\"${ol.colDrillCount}\"`);\n if (ol.localRefresh) olAttrs.push(' localRefresh=\"1\"');\n if (ol.serverFill === false) olAttrs.push(' serverFill=\"0\"');\n if (ol.serverNumberFormat === false) olAttrs.push(' serverNumberFormat=\"0\"');\n if (ol.serverFont === false) olAttrs.push(' serverFont=\"0\"');\n if (ol.serverFontColor === false) olAttrs.push(' serverFontColor=\"0\"');\n if (olAttrs.length > 0) p.push(`<olapPr${olAttrs.join(\"\")}/>`);\n }\n\n // cacheHierarchies\n if (cacheDefOpts?.cacheHierarchies && cacheDefOpts.cacheHierarchies.length > 0) {\n const chs = cacheDefOpts.cacheHierarchies;\n p.push(`<cacheHierarchies count=\"${chs.length}\">`);\n for (const ch of chs) {\n const chAttrs: string[] = [`uniqueName=\"${escapeXml(ch.uniqueName)}\"`, `count=\"${ch.count}\"`];\n if (ch.caption) chAttrs.push(`caption=\"${escapeXml(ch.caption)}\"`);\n if (ch.measure) chAttrs.push('measure=\"1\"');\n if (ch.set) chAttrs.push('set=\"1\"');\n if (ch.parentSet !== undefined) chAttrs.push(`parentSet=\"${ch.parentSet}\"`);\n if (ch.iconSet !== undefined && ch.iconSet !== 0) chAttrs.push(`iconSet=\"${ch.iconSet}\"`);\n if (ch.attribute) chAttrs.push('attribute=\"1\"');\n if (ch.time) chAttrs.push('time=\"1\"');\n if (ch.keyAttribute) chAttrs.push('keyAttribute=\"1\"');\n if (ch.defaultMemberUniqueName)\n chAttrs.push(`defaultMemberUniqueName=\"${escapeXml(ch.defaultMemberUniqueName)}\"`);\n if (ch.allUniqueName) chAttrs.push(`allUniqueName=\"${escapeXml(ch.allUniqueName)}\"`);\n if (ch.allCaption) chAttrs.push(`allCaption=\"${escapeXml(ch.allCaption)}\"`);\n if (ch.dimensionUniqueName)\n chAttrs.push(`dimensionUniqueName=\"${escapeXml(ch.dimensionUniqueName)}\"`);\n if (ch.displayFolder) chAttrs.push(`displayFolder=\"${escapeXml(ch.displayFolder)}\"`);\n if (ch.measureGroup) chAttrs.push(`measureGroup=\"${escapeXml(ch.measureGroup)}\"`);\n if (ch.measures) chAttrs.push('measures=\"1\"');\n if (ch.oneField) chAttrs.push('oneField=\"1\"');\n if (ch.hidden) chAttrs.push('hidden=\"1\"');\n if (ch.memberValueDatatype) chAttrs.push(`memberValueDatatype=\"${ch.memberValueDatatype}\"`);\n if (ch.unbalanced) chAttrs.push('unbalanced=\"1\"');\n if (ch.unbalancedGroup) chAttrs.push('unbalancedGroup=\"1\"');\n\n const hasGL = ch.groupLevels && ch.groupLevels.length > 0;\n const hasFU = ch.fieldsUsage && ch.fieldsUsage.length > 0;\n if (hasGL || hasFU) {\n p.push(`<cacheHierarchy ${chAttrs.join(\" \")}>`);\n if (hasFU) {\n const fuParts = [`<fieldsUsage count=\"${ch.fieldsUsage!.length}\">`];\n for (const fu of ch.fieldsUsage!) fuParts.push(`<fieldUsage v=\"${fu.value}\"/>`);\n fuParts.push(\"</fieldsUsage>\");\n p.push(fuParts.join(\"\"));\n }\n if (hasGL) {\n const glParts = [`<groupLevels count=\"${ch.groupLevels!.length}\">`];\n for (const gl of ch.groupLevels!) {\n const glAttrs = [\n `uniqueName=\"${escapeXml(gl.uniqueName)}\"`,\n `caption=\"${escapeXml(gl.caption)}\"`,\n ];\n if (gl.user) glAttrs.push('user=\"1\"');\n if (gl.customRollUp) glAttrs.push('customRollUp=\"1\"');\n if (gl.groups && gl.groups.length > 0) {\n glParts.push(`<groupLevel ${glAttrs.join(\" \")}><groups count=\"${gl.groups.length}\">`);\n for (const lg of gl.groups) {\n const lgAttrs = [\n `name=\"${escapeXml(lg.name)}\"`,\n `uniqueName=\"${escapeXml(lg.uniqueName)}\"`,\n `caption=\"${escapeXml(lg.caption)}\"`,\n ];\n if (lg.uniqueParent) lgAttrs.push(`uniqueParent=\"${escapeXml(lg.uniqueParent)}\"`);\n if (lg.id !== undefined) lgAttrs.push(`id=\"${lg.id}\"`);\n glParts.push(\n `<group ${lgAttrs.join(\" \")}><groupMembers count=\"${lg.members.length}\">`,\n );\n for (const gm of lg.members) {\n const gmAttrs = [`uniqueName=\"${escapeXml(gm.uniqueName)}\"`];\n if (gm.group) gmAttrs.push('group=\"1\"');\n glParts.push(`<groupMember ${gmAttrs.join(\" \")}/>`);\n }\n glParts.push(\"</groupMembers></group>\");\n }\n glParts.push(\"</groups></groupLevel>\");\n } else {\n glParts.push(`<groupLevel ${glAttrs.join(\" \")}/>`);\n }\n }\n glParts.push(\"</groupLevels>\");\n p.push(glParts.join(\"\"));\n }\n p.push(\"</cacheHierarchy>\");\n } else {\n p.push(`<cacheHierarchy ${chAttrs.join(\" \")}/>`);\n }\n }\n p.push(\"</cacheHierarchies>\");\n }\n\n // kpis\n if (cacheDefOpts?.kpis && cacheDefOpts.kpis.length > 0) {\n p.push(`<kpis count=\"${cacheDefOpts.kpis.length}\">`);\n for (const k of cacheDefOpts.kpis) {\n const kAttrs: string[] = [\n `uniqueName=\"${escapeXml(k.uniqueName)}\"`,\n `value=\"${escapeXml(k.value)}\"`,\n ];\n if (k.caption) kAttrs.push(`caption=\"${escapeXml(k.caption)}\"`);\n if (k.displayFolder) kAttrs.push(`displayFolder=\"${escapeXml(k.displayFolder)}\"`);\n if (k.measureGroup) kAttrs.push(`measureGroup=\"${escapeXml(k.measureGroup)}\"`);\n if (k.parent) kAttrs.push(`parent=\"${escapeXml(k.parent)}\"`);\n if (k.goal) kAttrs.push(`goal=\"${escapeXml(k.goal)}\"`);\n if (k.status) kAttrs.push(`status=\"${escapeXml(k.status)}\"`);\n if (k.trend) kAttrs.push(`trend=\"${escapeXml(k.trend)}\"`);\n if (k.weight) kAttrs.push(`weight=\"${escapeXml(k.weight)}\"`);\n if (k.time) kAttrs.push(`time=\"${escapeXml(k.time)}\"`);\n p.push(`<kpi ${kAttrs.join(\" \")}/>`);\n }\n p.push(\"</kpis>\");\n }\n\n // measureGroups\n if (cacheDefOpts?.measureGroups && cacheDefOpts.measureGroups.length > 0) {\n p.push(`<measureGroups count=\"${cacheDefOpts.measureGroups.length}\">`);\n for (const mg of cacheDefOpts.measureGroups) {\n p.push(`<measureGroup name=\"${escapeXml(mg.name)}\" caption=\"${escapeXml(mg.caption)}\"/>`);\n }\n p.push(\"</measureGroups>\");\n }\n\n // maps\n if (cacheDefOpts?.measureDimensionMaps && cacheDefOpts.measureDimensionMaps.length > 0) {\n p.push(`<maps count=\"${cacheDefOpts.measureDimensionMaps.length}\">`);\n for (const m of cacheDefOpts.measureDimensionMaps) {\n const mAttrs: string[] = [];\n if (m.measureGroup !== undefined) mAttrs.push(`measureGroup=\"${m.measureGroup}\"`);\n if (m.dimension !== undefined) mAttrs.push(`dimension=\"${m.dimension}\"`);\n p.push(`<map ${mAttrs.join(\" \")}/>`);\n }\n p.push(\"</maps>\");\n }\n\n // dimensions\n if (cacheDefOpts?.dimensions && cacheDefOpts.dimensions.length > 0) {\n p.push(`<dimensions count=\"${cacheDefOpts.dimensions.length}\">`);\n for (const d of cacheDefOpts.dimensions) {\n const dAttrs: string[] = [\n `name=\"${escapeXml(d.name)}\"`,\n `uniqueName=\"${escapeXml(d.uniqueName)}\"`,\n `caption=\"${escapeXml(d.caption)}\"`,\n ];\n if (d.measure) dAttrs.push('measure=\"1\"');\n p.push(`<dimension ${dAttrs.join(\" \")}/>`);\n }\n p.push(\"</dimensions>\");\n }\n\n // tupleCache\n const cd = cacheDefOpts;\n const hasEntries = cd?.entries && cd.entries.length > 0;\n const hasSets = cd?.sets && cd.sets.length > 0;\n const hasSF = cd?.serverFormats && cd.serverFormats.length > 0;\n const hasQC = cd?.queryCache && cd.queryCache.length > 0;\n if (hasEntries || hasSets || hasSF || hasQC) {\n p.push(\"<tupleCache>\");\n if (hasEntries) {\n const entParts: string[] = [`<entries count=\"${cd!.entries!.length}\">`];\n for (const ent of cd!.entries!) {\n const olapAttrs =\n (ent.captionIndex !== undefined ? ` cp=\"${ent.captionIndex}\"` : \"\") +\n (ent.propertyIndex !== undefined ? ` in=\"${ent.propertyIndex}\"` : \"\") +\n (ent.underline ? ' un=\"1\"' : \"\");\n if (ent.type === \"m\") entParts.push(`<m${olapAttrs}/>`);\n else if (ent.type === \"e\")\n entParts.push(`<e v=\"${escapeXml(String(ent.value ?? \"\"))}\"${olapAttrs}/>`);\n else if (ent.value !== undefined)\n entParts.push(`<${ent.type} v=\"${ent.value}\"${olapAttrs}/>`);\n }\n entParts.push(\"</entries>\");\n p.push(entParts.join(\"\"));\n }\n if (hasSets) {\n p.push(`<sets count=\"${cd!.sets!.length}\">`);\n for (const s of cd!.sets!) {\n const sAttrs: string[] = [\n `maxRank=\"${s.maxRank}\"`,\n `setDefinition=\"${escapeXml(s.setDefinition)}\"`,\n ];\n if (s.count !== undefined) sAttrs.push(`count=\"${s.count}\"`);\n if (s.sortType && s.sortType !== \"none\") sAttrs.push(`sortType=\"${s.sortType}\"`);\n if (s.queryFailed) sAttrs.push('queryFailed=\"1\"');\n const tplsXml = (tpls: TupleOptions[] | undefined) =>\n tpls && tpls.length > 0\n ? `<tpls count=\"${tpls.length}\">${tpls\n .map((tpl) =>\n tpl.items && tpl.items.length > 0\n ? `<tpl>${tpl.items.map((x) => `<x v=\"${x}\"/>`).join(\"\")}</tpl>`\n : \"<tpl/>\",\n )\n .join(\"\")}</tpls>`\n : \"\";\n const sortByXml =\n s.sortByTuple && s.sortByTuple.length > 0\n ? `<sortByTuple>${s.sortByTuple\n .map((tpl) =>\n tpl.items && tpl.items.length > 0\n ? `<tpl>${tpl.items.map((x) => `<x v=\"${x}\"/>`).join(\"\")}</tpl>`\n : \"<tpl/>\",\n )\n .join(\"\")}</sortByTuple>`\n : \"\";\n const inner = tplsXml(s.tpls) + sortByXml;\n if (inner) p.push(`<set ${sAttrs.join(\" \")}>${inner}</set>`);\n else p.push(`<set ${sAttrs.join(\" \")}/>`);\n }\n p.push(\"</sets>\");\n }\n if (hasSF) {\n p.push(`<serverFormats count=\"${cd!.serverFormats!.length}\">`);\n for (const sf of cd!.serverFormats!) {\n const sfAttrs: string[] = [];\n if (sf.culture) sfAttrs.push(`culture=\"${escapeXml(sf.culture)}\"`);\n if (sf.format) sfAttrs.push(`format=\"${escapeXml(sf.format)}\"`);\n p.push(`<serverFormat ${sfAttrs.join(\" \")}/>`);\n }\n p.push(\"</serverFormats>\");\n }\n if (hasQC) {\n p.push(`<queryCache count=\"${cd!.queryCache!.length}\">`);\n for (const q of cd!.queryCache!) {\n const qInner =\n q.tpls && q.tpls.length > 0\n ? `<tpls count=\"${q.tpls.length}\">${q.tpls.map((tpl: { items?: number[] }) => (tpl.items && tpl.items.length > 0 ? `<tpl>${tpl.items.map((x: number) => `<x v=\"${x}\"/>`).join(\"\")}</tpl>` : \"<tpl/>\")).join(\"\")}</tpls>`\n : \"\";\n if (qInner) p.push(`<query mdx=\"${escapeXml(q.mdx)}\">${qInner}</query>`);\n else p.push(`<query mdx=\"${escapeXml(q.mdx)}\"/>`);\n }\n p.push(\"</queryCache>\");\n }\n p.push(\"</tupleCache>\");\n }\n\n p.push(\"</pivotCacheDefinition>\");\n return p.join(\"\");\n}\n\n// ── Stringify: pivotCacheRecords ──\n\nfunction stringifyPivotCacheRecords(sourceData: PivotSourceData): string {\n const numericFields = sourceData.fieldNames.map((_, i) => isNumericField(sourceData.records, i));\n const fieldIndexMaps: Map<string, number>[] = sourceData.fieldNames.map((_, i) => {\n if (numericFields[i]) return new Map<string, number>();\n const unique = collectUniqueValues(sourceData.records, i);\n const map = new Map<string, number>();\n for (let j = 0; j < unique.length; j++) map.set(String(unique[j]), j);\n return map;\n });\n\n const p: string[] = [];\n p.push(\n `<pivotCacheRecords xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${sourceData.records.length}\">`,\n );\n\n for (const row of sourceData.records) {\n p.push(\"<r>\");\n for (let i = 0; i < row.length; i++) {\n const val = row[i];\n if (val === null) {\n p.push(\"<m/>\");\n } else if (val instanceof Date) {\n p.push(`<d v=\"${val.toISOString().replace(/\\.\\d{3}Z$/, \"Z\")}\"/>`);\n } else if (numericFields[i]) {\n p.push(`<n v=\"${val}\"/>`);\n } else {\n p.push(`<x v=\"${fieldIndexMaps[i]?.get(String(val)) ?? 0}\"/>`);\n }\n }\n p.push(\"</r>\");\n }\n\n p.push(\"</pivotCacheRecords>\");\n return p.join(\"\");\n}\n","/**\n * Table types and descriptor for SpreadsheetML documents.\n *\n * Implements CT_Table from sml.xsd (transitional schema).\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { findChild, attr, attrNum, textOf, escapeXml } from \"@office-open/xml\";\n\nimport { parseAutoFilter, stringifyAutoFilter } from \"./auto-filter\";\nimport type { AutoFilterOptions } from \"./worksheet\";\n\n// ── Totals row function (ST_TotalsRowFunction) ──\n\nexport const TotalsRowFunction = {\n NONE: \"none\",\n SUM: \"sum\",\n MIN: \"min\",\n MAX: \"max\",\n AVERAGE: \"average\",\n COUNT: \"count\",\n COUNT_NUMS: \"countNums\",\n STD_DEV: \"stdDev\",\n VAR: \"var\",\n CUSTOM: \"custom\",\n} as const;\n\nexport type TotalsRowFunction = (typeof TotalsRowFunction)[keyof typeof TotalsRowFunction];\n\n// ── Table type (ST_TableType) ──\n\nexport const TableType = {\n WORKSHEET: \"worksheet\",\n XML: \"xml\",\n QUERY_TABLE: \"queryTable\",\n} as const;\n\nexport type TableType = (typeof TableType)[keyof typeof TableType];\n\n// ── Options interfaces ──\n\nexport interface TableStyleInfoOptions {\n /** Table style name, e.g. \"TableStyleMedium9\" */\n name?: string;\n showFirstColumn?: boolean;\n showLastColumn?: boolean;\n showRowStripes?: boolean;\n showColumnStripes?: boolean;\n}\n\nexport interface TableColumnOptions {\n /** Column name (used in header row) */\n name: string;\n /** Totals row function */\n totalsRowFunction?: TotalsRowFunction;\n /** Totals row label (used when totalsRowFunction is \"none\" or \"custom\") */\n totalsRowLabel?: string;\n /** Calculated column formula */\n calculatedColumnFormula?: string;\n /** Totals row formula (CT_TableColumn/totalsRowFormula, used when totalsRowFunction is \"custom\") */\n totalsRowFormula?: string;\n /** Whether totals row formula is array (CT_TableFormula @array) */\n totalsRowFormulaArray?: boolean;\n /** Whether calculated column formula is array (CT_TableFormula @array) */\n calculatedColumnFormulaArray?: boolean;\n /** Unique column name for structured references (CT_TableColumn @uniqueName) */\n uniqueName?: string;\n /** Query table field ID (CT_TableColumn @queryTableFieldId) */\n queryTableFieldId?: number;\n /** Header row differential format index */\n headerRowDxfId?: number;\n /** Data differential format index */\n dataDxfId?: number;\n /** Totals row differential format index */\n totalsRowDxfId?: number;\n /** Header row cell style name */\n headerRowCellStyle?: string;\n /** Data cell style name */\n dataCellStyle?: string;\n /** Totals row cell style name */\n totalsRowCellStyle?: string;\n /** XML mapping (CT_XmlColumnPr) — binds the column to an XML map */\n xmlColumnPr?: XmlColumnPrOptions;\n}\n\n/** XML column properties (CT_XmlColumnPr — table column bound to an XML map). */\nexport interface XmlColumnPrOptions {\n /** XML map id (required, indexes xl/xmlMaps.xml Map entries) */\n mapId: number;\n /** XPath expression (required) */\n xpath: string;\n /** Denormalized (default false) */\n denormalized?: boolean;\n /** XML schema data type (required, ST_XmlDataType) */\n xmlDataType: string;\n}\n\nexport interface TableOptions {\n /** Unique table id (1-based, must be unique across the workbook) */\n id: number;\n /** Table name (used in structured references) */\n name?: string;\n /** Display name (required by XSD, defaults to name if not set) */\n displayName: string;\n /** Table comment (CT_Table @comment) */\n comment?: string;\n /** Data range, e.g. \"A1:D10\" */\n ref: string;\n /** Column definitions */\n columns: TableColumnOptions[];\n /** Number of header rows (default: 1) */\n headerRowCount?: number;\n /** Insert row allowed (CT_Table @insertRow) */\n insertRow?: boolean;\n /** Number of totals rows (default: 0) */\n totalsRowCount?: number;\n /** Whether to show totals row (default: true when totalsRowCount > 0) */\n totalsRowShown?: boolean;\n /** Table type (default: \"worksheet\") */\n tableType?: TableType;\n /** Table style */\n style?: TableStyleInfoOptions;\n /** Auto-filter (ref shorthand or structured filter columns/sort state) */\n autoFilter?: string | AutoFilterOptions;\n /** Insert row shifts existing rows (CT_Table @insertRowShift) */\n insertRowShift?: boolean;\n /** Published to server (CT_Table @published) */\n published?: boolean;\n /** Header row differential format index */\n headerRowDxfId?: number;\n /** Data differential format index */\n dataDxfId?: number;\n /** Totals row differential format index */\n totalsRowDxfId?: number;\n /** Header row border differential format index */\n headerRowBorderDxfId?: number;\n /** Table border differential format index */\n tableBorderDxfId?: number;\n /** Totals row border differential format index */\n totalsRowBorderDxfId?: number;\n /** Header row cell style name */\n headerRowCellStyle?: string;\n /** Data cell style name */\n dataCellStyle?: string;\n /** Totals row cell style name */\n totalsRowCellStyle?: string;\n /** Query table connection ID (CT_Table @connectionId) */\n connectionId?: number;\n}\n\n// ── Helper ──\n\nfunction buildAttrs(attrsMap: Record<string, string | number | boolean | undefined>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(attrsMap)) {\n if (v === undefined) continue;\n parts.push(` ${k}=\"${typeof v === \"string\" ? escapeXml(v) : String(v)}\"`);\n }\n return parts.join(\"\");\n}\n\n// ── Descriptor ──\n\nexport const tableDesc: CustomDescriptor<TableOptions> = {\n kind: \"custom\",\n\n stringify(o, _ctx) {\n const p: string[] = [];\n\n // Root element with attributes\n const rootAttrs: Record<string, string | number | boolean | undefined> = {\n id: o.id,\n name: o.name ?? o.displayName,\n displayName: o.displayName,\n ref: o.ref,\n };\n if (o.comment) rootAttrs.comment = o.comment;\n if (o.tableType && o.tableType !== \"worksheet\") {\n rootAttrs.tableType = o.tableType;\n }\n if (o.headerRowCount !== undefined && o.headerRowCount !== 1) {\n rootAttrs.headerRowCount = o.headerRowCount;\n }\n if (o.insertRow) rootAttrs.insertRow = 1;\n if (o.totalsRowCount !== undefined && o.totalsRowCount > 0) {\n rootAttrs.totalsRowCount = o.totalsRowCount;\n }\n if (o.totalsRowShown === false) {\n rootAttrs.totalsRowShown = 0;\n }\n if (o.insertRowShift) rootAttrs.insertRowShift = 1;\n if (o.published) rootAttrs.published = 1;\n if (o.connectionId !== undefined) rootAttrs.connectionId = o.connectionId;\n if (o.headerRowDxfId !== undefined) rootAttrs.headerRowDxfId = o.headerRowDxfId;\n if (o.dataDxfId !== undefined) rootAttrs.dataDxfId = o.dataDxfId;\n if (o.totalsRowDxfId !== undefined) rootAttrs.totalsRowDxfId = o.totalsRowDxfId;\n if (o.headerRowBorderDxfId !== undefined)\n rootAttrs.headerRowBorderDxfId = o.headerRowBorderDxfId;\n if (o.tableBorderDxfId !== undefined) rootAttrs.tableBorderDxfId = o.tableBorderDxfId;\n if (o.totalsRowBorderDxfId !== undefined)\n rootAttrs.totalsRowBorderDxfId = o.totalsRowBorderDxfId;\n if (o.headerRowCellStyle) rootAttrs.headerRowCellStyle = o.headerRowCellStyle;\n if (o.dataCellStyle) rootAttrs.dataCellStyle = o.dataCellStyle;\n if (o.totalsRowCellStyle) rootAttrs.totalsRowCellStyle = o.totalsRowCellStyle;\n\n p.push(\n `<table xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"` +\n ` xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"` +\n ` mc:Ignorable=\"xr xr2\"` +\n ` xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"` +\n ` xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"${buildAttrs(rootAttrs)}>`,\n );\n\n // autoFilter (optional, before tableColumns per XSD sequence)\n if (o.autoFilter !== undefined) {\n p.push(stringifyAutoFilter(o.autoFilter));\n }\n\n // tableColumns (required)\n p.push(`<tableColumns count=\"${o.columns.length}\">`);\n for (const [i, col] of o.columns.entries()) {\n const colAttrs: Record<string, string | number | boolean | undefined> = {\n id: i + 1,\n name: col.name,\n };\n\n const inner: string[] = [];\n\n // calculatedColumnFormula\n if (col.calculatedColumnFormula !== undefined) {\n const fAttrs = col.calculatedColumnFormulaArray ? ' array=\"1\"' : \"\";\n inner.push(\n `<calculatedColumnFormula${fAttrs}>${escapeXml(col.calculatedColumnFormula)}</calculatedColumnFormula>`,\n );\n }\n\n // totalsRowFormula (when totalsRowFunction is \"custom\")\n if (col.totalsRowFormula !== undefined) {\n const fAttrs = col.totalsRowFormulaArray ? ' array=\"1\"' : \"\";\n inner.push(\n `<totalsRowFormula${fAttrs}>${escapeXml(col.totalsRowFormula)}</totalsRowFormula>`,\n );\n }\n\n if (col.totalsRowFunction !== undefined && col.totalsRowFunction !== TotalsRowFunction.NONE) {\n colAttrs.totalsRowFunction = col.totalsRowFunction;\n }\n if (col.totalsRowLabel !== undefined) {\n colAttrs.totalsRowLabel = col.totalsRowLabel;\n }\n if (col.uniqueName) colAttrs.uniqueName = col.uniqueName;\n if (col.queryTableFieldId !== undefined) colAttrs.queryTableFieldId = col.queryTableFieldId;\n if (col.headerRowDxfId !== undefined) colAttrs.headerRowDxfId = col.headerRowDxfId;\n if (col.dataDxfId !== undefined) colAttrs.dataDxfId = col.dataDxfId;\n if (col.totalsRowDxfId !== undefined) colAttrs.totalsRowDxfId = col.totalsRowDxfId;\n if (col.headerRowCellStyle) colAttrs.headerRowCellStyle = col.headerRowCellStyle;\n if (col.dataCellStyle) colAttrs.dataCellStyle = col.dataCellStyle;\n if (col.totalsRowCellStyle) colAttrs.totalsRowCellStyle = col.totalsRowCellStyle;\n\n if (col.xmlColumnPr) {\n const xp = col.xmlColumnPr;\n const xpAttrs = [`mapId=\"${xp.mapId}\"`, `xpath=\"${escapeXml(xp.xpath)}\"`];\n if (xp.denormalized) xpAttrs.push('denormalized=\"1\"');\n xpAttrs.push(`xmlDataType=\"${escapeXml(xp.xmlDataType)}\"`);\n inner.push(`<xmlColumnPr ${xpAttrs.join(\" \")}/>`);\n }\n\n if (inner.length > 0) {\n p.push(`<tableColumn${buildAttrs(colAttrs)}>${inner.join(\"\")}</tableColumn>`);\n } else {\n p.push(`<tableColumn${buildAttrs(colAttrs)}/>`);\n }\n }\n p.push(\"</tableColumns>\");\n\n // tableStyleInfo (optional)\n if (o.style) {\n const s = o.style;\n const styleAttrs: Record<string, string | number | boolean | undefined> = {};\n if (s.name !== undefined) styleAttrs.name = s.name;\n if (s.showFirstColumn) styleAttrs.showFirstColumn = 1;\n if (s.showLastColumn) styleAttrs.showLastColumn = 1;\n if (s.showRowStripes !== false) styleAttrs.showRowStripes = 1;\n if (s.showColumnStripes) styleAttrs.showColumnStripes = 1;\n p.push(`<tableStyleInfo${buildAttrs(styleAttrs)}/>`);\n }\n\n p.push(\"</table>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<TableOptions> = {};\n\n // Root attributes. nativeTypeAttributes (xlsx parse path) coerces \"1\"/\"0\"\n // to numbers, so boolean attribute checks use String() coercion.\n const id = attrNum(el, \"id\");\n if (id !== undefined) result.id = id;\n if (attr(el, \"name\")) result.name = attr(el, \"name\");\n if (attr(el, \"displayName\")) result.displayName = attr(el, \"displayName\");\n if (attr(el, \"comment\")) result.comment = attr(el, \"comment\");\n if (attr(el, \"ref\")) result.ref = attr(el, \"ref\");\n const headerRowCount = attrNum(el, \"headerRowCount\");\n if (headerRowCount !== undefined) result.headerRowCount = headerRowCount;\n if (parseOnOff(attr(el, \"insertRow\"))) result.insertRow = true;\n const totalsRowCount = attrNum(el, \"totalsRowCount\");\n if (totalsRowCount !== undefined) result.totalsRowCount = totalsRowCount;\n if (String(attr(el, \"totalsRowShown\")) === \"0\") result.totalsRowShown = false;\n if (attr(el, \"tableType\")) result.tableType = attr(el, \"tableType\") as TableType;\n if (parseOnOff(attr(el, \"insertRowShift\"))) result.insertRowShift = true;\n if (parseOnOff(attr(el, \"published\"))) result.published = true;\n const connectionId = attrNum(el, \"connectionId\");\n if (connectionId !== undefined) result.connectionId = connectionId;\n\n // Auto filter\n const afEl = findChild(el, \"autoFilter\");\n if (afEl) result.autoFilter = parseAutoFilter(afEl);\n\n // Table columns\n const colsEl = findChild(el, \"tableColumns\");\n if (colsEl) {\n const columns: TableColumnOptions[] = [];\n for (const colEl of colsEl.elements ?? []) {\n if (colEl.name !== \"tableColumn\") continue;\n // Column id is derived from position at stringify (i+1); not stored.\n const col: Partial<TableColumnOptions> = {};\n col.name = attr(colEl, \"name\") ?? \"\";\n if (attr(colEl, \"totalsRowFunction\"))\n col.totalsRowFunction = attr(colEl, \"totalsRowFunction\") as TotalsRowFunction;\n if (attr(colEl, \"totalsRowLabel\")) col.totalsRowLabel = attr(colEl, \"totalsRowLabel\");\n const ccfEl = findChild(colEl, \"calculatedColumnFormula\");\n if (ccfEl) {\n col.calculatedColumnFormula = textOf(ccfEl);\n if (parseOnOff(attr(ccfEl, \"array\"))) col.calculatedColumnFormulaArray = true;\n }\n const trfEl = findChild(colEl, \"totalsRowFormula\");\n if (trfEl) {\n col.totalsRowFormula = textOf(trfEl);\n if (parseOnOff(attr(trfEl, \"array\"))) col.totalsRowFormulaArray = true;\n }\n if (attr(colEl, \"uniqueName\")) col.uniqueName = attr(colEl, \"uniqueName\");\n const qtfId = attrNum(colEl, \"queryTableFieldId\");\n if (qtfId !== undefined) col.queryTableFieldId = qtfId;\n const hrDxfId = attrNum(colEl, \"headerRowDxfId\");\n if (hrDxfId !== undefined) col.headerRowDxfId = hrDxfId;\n const dDxfId = attrNum(colEl, \"dataDxfId\");\n if (dDxfId !== undefined) col.dataDxfId = dDxfId;\n const trDxfId = attrNum(colEl, \"totalsRowDxfId\");\n if (trDxfId !== undefined) col.totalsRowDxfId = trDxfId;\n if (attr(colEl, \"headerRowCellStyle\"))\n col.headerRowCellStyle = attr(colEl, \"headerRowCellStyle\");\n if (attr(colEl, \"dataCellStyle\")) col.dataCellStyle = attr(colEl, \"dataCellStyle\");\n if (attr(colEl, \"totalsRowCellStyle\"))\n col.totalsRowCellStyle = attr(colEl, \"totalsRowCellStyle\");\n const xcpEl = findChild(colEl, \"xmlColumnPr\");\n if (xcpEl) {\n col.xmlColumnPr = {\n mapId: attrNum(xcpEl, \"mapId\") ?? 0,\n xpath: attr(xcpEl, \"xpath\") ?? \"\",\n xmlDataType: attr(xcpEl, \"xmlDataType\") ?? \"\",\n };\n if (parseOnOff(attr(xcpEl, \"denormalized\"))) col.xmlColumnPr.denormalized = true;\n }\n columns.push(col as TableColumnOptions);\n }\n result.columns = columns;\n }\n\n // Table style info\n const siEl = findChild(el, \"tableStyleInfo\");\n if (siEl) {\n const style: Partial<TableStyleInfoOptions> = {};\n if (attr(siEl, \"name\")) style.name = attr(siEl, \"name\");\n if (parseOnOff(attr(siEl, \"showFirstColumn\"))) style.showFirstColumn = true;\n if (parseOnOff(attr(siEl, \"showLastColumn\"))) style.showLastColumn = true;\n if (parseOnOff(attr(siEl, \"showRowStripes\"))) style.showRowStripes = true;\n if (parseOnOff(attr(siEl, \"showColumnStripes\"))) style.showColumnStripes = true;\n result.style = style;\n }\n\n // Differential format IDs\n const hrDxfId = attrNum(el, \"headerRowDxfId\");\n if (hrDxfId !== undefined) result.headerRowDxfId = hrDxfId;\n const dDxfId = attrNum(el, \"dataDxfId\");\n if (dDxfId !== undefined) result.dataDxfId = dDxfId;\n const trDxfId = attrNum(el, \"totalsRowDxfId\");\n if (trDxfId !== undefined) result.totalsRowDxfId = trDxfId;\n const hrbDxfId = attrNum(el, \"headerRowBorderDxfId\");\n if (hrbDxfId !== undefined) result.headerRowBorderDxfId = hrbDxfId;\n const tbDxfId = attrNum(el, \"tableBorderDxfId\");\n if (tbDxfId !== undefined) result.tableBorderDxfId = tbDxfId;\n const trbDxfId = attrNum(el, \"totalsRowBorderDxfId\");\n if (trbDxfId !== undefined) result.totalsRowBorderDxfId = trbDxfId;\n if (attr(el, \"headerRowCellStyle\")) result.headerRowCellStyle = attr(el, \"headerRowCellStyle\");\n if (attr(el, \"dataCellStyle\")) result.dataCellStyle = attr(el, \"dataCellStyle\");\n if (attr(el, \"totalsRowCellStyle\")) result.totalsRowCellStyle = attr(el, \"totalsRowCellStyle\");\n\n return result as TableOptions;\n },\n};\n","/**\n * Workbook — stringify implementation and exported XML helpers.\n *\n * @module\n */\n\nimport { derivePasswordHash } from \"@office-open/core\";\nimport { escapeXml } from \"@office-open/xml\";\nimport { hashPassword } from \"@util/index\";\n\nimport type { TablePartReference, WorkbookDescriptorOptions } from \"./types\";\n\n// ── Stringify helpers ──\n\nexport function stringifyWorkbook(opts: WorkbookDescriptorOptions): string {\n const confAttr = opts.conformance ? ` conformance=\"${opts.conformance}\"` : \"\";\n const parts: string[] = [\n '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"' +\n ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' +\n ' mc:Ignorable=\"x15 xr xr6 xr10 xr2\"' +\n ' xmlns:x15=\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\"' +\n ' xmlns:xr=\"http://schemas.microsoft.com/office/spreadsheetml/2014/revision\"' +\n ' xmlns:xr6=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision6\"' +\n ' xmlns:xr10=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision10\"' +\n ` xmlns:xr2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2\"${confAttr}>`,\n ];\n\n // File version (CT_Workbook first child). Fresh compiles emit Excel 2007\n // defaults; a round-tripped source carries its own version stamp through.\n const fv = opts.fileVersion;\n if (fv) {\n const fvAttrs: string[] = [];\n if (fv.appName) fvAttrs.push(`appName=\"${fv.appName}\"`);\n if (fv.lastEdited !== undefined) fvAttrs.push(`lastEdited=\"${fv.lastEdited}\"`);\n if (fv.lowestEdited !== undefined) fvAttrs.push(`lowestEdited=\"${fv.lowestEdited}\"`);\n if (fv.rupBuild !== undefined) fvAttrs.push(`rupBuild=\"${fv.rupBuild}\"`);\n parts.push(`<fileVersion ${fvAttrs.join(\" \")}/>`);\n } else {\n parts.push('<fileVersion appName=\"xl\" lastEdited=\"7\" lowestEdited=\"6\" rupBuild=\"29929\"/>');\n }\n\n // File sharing (after fileVersion, before workbookPr per XSD sequence)\n if (opts.fileSharing) {\n const fs = opts.fileSharing;\n const fsAttrs: string[] = [];\n if (fs.readOnlyRecommended) fsAttrs.push('readOnlyRecommended=\"1\"');\n if (fs.userName) fsAttrs.push(`userName=\"${escapeXml(fs.userName)}\"`);\n if (fs.reservationPassword) {\n fsAttrs.push(`reservationPassword=\"${escapeXml(fs.reservationPassword)}\"`);\n if (fs.hashValue === undefined) {\n const derived = derivePasswordHash(fs.reservationPassword);\n fsAttrs.push(`algorithmName=\"${escapeXml(derived.algorithmName)}\"`);\n fsAttrs.push(`hashValue=\"${escapeXml(derived.hashValue)}\"`);\n fsAttrs.push(`saltValue=\"${escapeXml(derived.saltValue)}\"`);\n fsAttrs.push(`spinCount=\"${derived.spinCount}\"`);\n }\n }\n if (fs.algorithmName) fsAttrs.push(`algorithmName=\"${escapeXml(fs.algorithmName)}\"`);\n if (fs.hashValue) fsAttrs.push(`hashValue=\"${escapeXml(fs.hashValue)}\"`);\n if (fs.saltValue) fsAttrs.push(`saltValue=\"${escapeXml(fs.saltValue)}\"`);\n if (fs.spinCount !== undefined) fsAttrs.push(`spinCount=\"${fs.spinCount}\"`);\n if (fsAttrs.length > 0) {\n parts.push(`<fileSharing ${fsAttrs.join(\" \")}/>`);\n }\n }\n\n // Workbook properties\n if (opts.workbookPr) {\n const wbPr = opts.workbookPr;\n const wbPrAttrs: string[] = [];\n if (wbPr.date1904) wbPrAttrs.push('date1904=\"1\"');\n if (wbPr.defaultThemeVersion !== undefined)\n wbPrAttrs.push(`defaultThemeVersion=\"${wbPr.defaultThemeVersion}\"`);\n if (wbPr.showObjects) wbPrAttrs.push(`showObjects=\"${escapeXml(wbPr.showObjects)}\"`);\n if (wbPr.hidePivotFieldList) wbPrAttrs.push('hidePivotFieldList=\"1\"');\n if (wbPr.allowRefreshQuery) wbPrAttrs.push('allowRefreshQuery=\"1\"');\n if (wbPr.filterPrivacy) wbPrAttrs.push('filterPrivacy=\"1\"');\n if (wbPr.backupFile) wbPrAttrs.push('backupFile=\"1\"');\n if (wbPr.codeName) wbPrAttrs.push(`codeName=\"${escapeXml(wbPr.codeName)}\"`);\n if (wbPr.showBorderUnselectedTables) wbPrAttrs.push('showBorderUnselectedTables=\"1\"');\n if (wbPr.promptedSolutions) wbPrAttrs.push('promptedSolutions=\"1\"');\n if (wbPr.showInkAnnotation === false) wbPrAttrs.push('showInkAnnotation=\"0\"');\n if (wbPr.saveExternalLinkValues === false) wbPrAttrs.push('saveExternalLinkValues=\"0\"');\n if (wbPr.updateLinks) wbPrAttrs.push(`updateLinks=\"${escapeXml(wbPr.updateLinks)}\"`);\n if (wbPr.showPivotChartFilter) wbPrAttrs.push('showPivotChartFilter=\"1\"');\n if (wbPr.publishItems) wbPrAttrs.push('publishItems=\"1\"');\n if (wbPr.checkCompatibility) wbPrAttrs.push('checkCompatibility=\"1\"');\n if (wbPr.autoCompressPictures === false) wbPrAttrs.push('autoCompressPictures=\"0\"');\n if (wbPr.refreshAllConnections) wbPrAttrs.push('refreshAllConnections=\"1\"');\n parts.push(`<workbookPr${wbPrAttrs.length > 0 ? ` ${wbPrAttrs.join(\" \")}` : \"\"}/>`);\n } else {\n parts.push(\"<workbookPr/>\");\n }\n\n // Workbook protection (after workbookPr, before bookViews per XSD sequence)\n if (opts.protection) {\n const prot = opts.protection;\n const protAttrs: string[] = [];\n if (prot.lockStructure) protAttrs.push('lockStructure=\"1\"');\n if (prot.lockWindows) protAttrs.push('lockWindows=\"1\"');\n if (prot.lockRevision) protAttrs.push('lockRevision=\"1\"');\n if (prot.workbookPassword) {\n protAttrs.push(`workbookPassword=\"${hashPassword(prot.workbookPassword)}\"`);\n if (prot.workbookHashValue === undefined) {\n const wbDerived = derivePasswordHash(prot.workbookPassword);\n protAttrs.push(`workbookAlgorithmName=\"${escapeXml(wbDerived.algorithmName)}\"`);\n protAttrs.push(`workbookHashValue=\"${escapeXml(wbDerived.hashValue)}\"`);\n protAttrs.push(`workbookSaltValue=\"${escapeXml(wbDerived.saltValue)}\"`);\n protAttrs.push(`workbookSpinCount=\"${wbDerived.spinCount}\"`);\n }\n }\n if (prot.workbookAlgorithmName)\n protAttrs.push(`workbookAlgorithmName=\"${escapeXml(prot.workbookAlgorithmName)}\"`);\n if (prot.workbookHashValue)\n protAttrs.push(`workbookHashValue=\"${escapeXml(prot.workbookHashValue)}\"`);\n if (prot.workbookSaltValue)\n protAttrs.push(`workbookSaltValue=\"${escapeXml(prot.workbookSaltValue)}\"`);\n if (prot.workbookSpinCount !== undefined)\n protAttrs.push(`workbookSpinCount=\"${prot.workbookSpinCount}\"`);\n if (prot.revisionsPassword) {\n protAttrs.push(`revisionsPassword=\"${hashPassword(prot.revisionsPassword)}\"`);\n if (prot.revisionsHashValue === undefined) {\n const revDerived = derivePasswordHash(prot.revisionsPassword);\n protAttrs.push(`revisionsAlgorithmName=\"${escapeXml(revDerived.algorithmName)}\"`);\n protAttrs.push(`revisionsHashValue=\"${escapeXml(revDerived.hashValue)}\"`);\n protAttrs.push(`revisionsSaltValue=\"${escapeXml(revDerived.saltValue)}\"`);\n protAttrs.push(`revisionsSpinCount=\"${revDerived.spinCount}\"`);\n }\n }\n if (prot.revisionsAlgorithmName)\n protAttrs.push(`revisionsAlgorithmName=\"${escapeXml(prot.revisionsAlgorithmName)}\"`);\n if (prot.revisionsHashValue)\n protAttrs.push(`revisionsHashValue=\"${escapeXml(prot.revisionsHashValue)}\"`);\n if (prot.revisionsSaltValue)\n protAttrs.push(`revisionsSaltValue=\"${escapeXml(prot.revisionsSaltValue)}\"`);\n if (prot.revisionsSpinCount !== undefined)\n protAttrs.push(`revisionsSpinCount=\"${prot.revisionsSpinCount}\"`);\n if (prot.workbookPasswordCharacterSet)\n protAttrs.push(\n `workbookPasswordCharacterSet=\"${escapeXml(prot.workbookPasswordCharacterSet)}\"`,\n );\n if (prot.revisionsPasswordCharacterSet)\n protAttrs.push(\n `revisionsPasswordCharacterSet=\"${escapeXml(prot.revisionsPasswordCharacterSet)}\"`,\n );\n if (protAttrs.length > 0) {\n parts.push(`<workbookProtection ${protAttrs.join(\" \")}/>`);\n }\n }\n\n // Book views\n if (opts.bookView) {\n const bv = opts.bookView;\n const bvAttrs: string[] = [];\n if (bv.xWindow !== undefined) bvAttrs.push(`xWindow=\"${bv.xWindow}\"`);\n else bvAttrs.push('xWindow=\"0\"');\n if (bv.yWindow !== undefined) bvAttrs.push(`yWindow=\"${bv.yWindow}\"`);\n else bvAttrs.push('yWindow=\"0\"');\n if (bv.windowWidth !== undefined) bvAttrs.push(`windowWidth=\"${bv.windowWidth}\"`);\n else bvAttrs.push('windowWidth=\"28800\"');\n if (bv.windowHeight !== undefined) bvAttrs.push(`windowHeight=\"${bv.windowHeight}\"`);\n else bvAttrs.push('windowHeight=\"12300\"');\n if (bv.activeTab !== undefined) bvAttrs.push(`activeTab=\"${bv.activeTab}\"`);\n if (bv.autoFilterDateGrouping === false) bvAttrs.push('autoFilterDateGrouping=\"0\"');\n if (bv.firstSheet !== undefined) bvAttrs.push(`firstSheet=\"${bv.firstSheet}\"`);\n if (bv.showHorizontalScroll === false) bvAttrs.push('showHorizontalScroll=\"0\"');\n if (bv.showSheetTabs === false) bvAttrs.push('showSheetTabs=\"0\"');\n if (bv.showVerticalScroll === false) bvAttrs.push('showVerticalScroll=\"0\"');\n if (bv.tabRatio !== undefined) bvAttrs.push(`tabRatio=\"${bv.tabRatio}\"`);\n if (bv.visibility && bv.visibility !== \"visible\") bvAttrs.push(`visibility=\"${bv.visibility}\"`);\n parts.push(`<bookViews><workbookView ${bvAttrs.join(\" \")}/></bookViews>`);\n } else {\n parts.push(\n '<bookViews><workbookView xWindow=\"0\" yWindow=\"0\" windowWidth=\"28800\" windowHeight=\"12300\"/></bookViews>',\n );\n }\n\n parts.push(\"<sheets>\");\n for (const s of opts.sheets) {\n const stateAttr = s.state && s.state !== \"visible\" ? ` state=\"${s.state}\"` : \"\";\n parts.push(\n `<sheet name=\"${escapeXml(s.name)}\" sheetId=\"${s.sheetId}\" r:id=\"${s.rId}\"${stateAttr}/>`,\n );\n }\n parts.push(\"</sheets>\");\n\n // Function groups (after sheets, before externalReferences per XSD)\n const functionGroups = opts.functionGroups ?? [];\n if (functionGroups.length > 0) {\n const fgParts: string[] = [`<functionGroups builtInGroupCount=\"16\">`];\n for (const name of functionGroups) {\n fgParts.push(`<functionGroup name=\"${escapeXml(name)}\"/>`);\n }\n fgParts.push(\"</functionGroups>\");\n parts.push(fgParts.join(\"\"));\n }\n\n // externalReferences placeholder — compiler injects the XML here if needed\n parts.push(\"<!--EXTERNAL_REFS-->\");\n\n // Defined names (after externalReferences, before calcPr per XSD sequence)\n if (opts.definedNames && opts.definedNames.length > 0) {\n const dnParts: string[] = [\"<definedNames>\"];\n for (const dn of opts.definedNames) {\n const dnAttrs: string[] = [`name=\"${escapeXml(dn.name)}\"`];\n if (dn.comment !== undefined) dnAttrs.push(`comment=\"${escapeXml(dn.comment)}\"`);\n if (dn.customMenu !== undefined) dnAttrs.push(`customMenu=\"${escapeXml(dn.customMenu)}\"`);\n if (dn.description !== undefined) dnAttrs.push(`description=\"${escapeXml(dn.description)}\"`);\n if (dn.help !== undefined) dnAttrs.push(`help=\"${escapeXml(dn.help)}\"`);\n if (dn.statusBar !== undefined) dnAttrs.push(`statusBar=\"${escapeXml(dn.statusBar)}\"`);\n if (dn.localSheetId !== undefined) dnAttrs.push(`localSheetId=\"${dn.localSheetId}\"`);\n if (dn.hidden) dnAttrs.push('hidden=\"1\"');\n if (dn.function) dnAttrs.push('function=\"1\"');\n if (dn.vbProcedure) dnAttrs.push('vbProcedure=\"1\"');\n if (dn.xlm) dnAttrs.push('xlm=\"1\"');\n if (dn.functionGroupId !== undefined) dnAttrs.push(`functionGroupId=\"${dn.functionGroupId}\"`);\n if (dn.shortcutKey !== undefined) dnAttrs.push(`shortcutKey=\"${escapeXml(dn.shortcutKey)}\"`);\n if (dn.publishToServer) dnAttrs.push('publishToServer=\"1\"');\n if (dn.workbookParameter) dnAttrs.push('workbookParameter=\"1\"');\n dnParts.push(`<definedName ${dnAttrs.join(\" \")}>${escapeXml(dn.value)}</definedName>`);\n }\n dnParts.push(\"</definedNames>\");\n parts.push(dnParts.join(\"\"));\n }\n\n // Calculation properties\n if (opts.calcPr) {\n const cp = opts.calcPr;\n const cpAttrs: string[] = [];\n cpAttrs.push(`calcId=\"${cp.calcId ?? 191029}\"`);\n if (cp.calcMode) cpAttrs.push(`calcMode=\"${escapeXml(cp.calcMode)}\"`);\n if (cp.fullCalcOnLoad) cpAttrs.push('fullCalcOnLoad=\"1\"');\n if (cp.calcOnSave === false) cpAttrs.push('calcOnSave=\"0\"');\n if (cp.forceFullCalc) cpAttrs.push('forceFullCalc=\"1\"');\n if (cp.concurrentCalc === false) cpAttrs.push('concurrentCalc=\"0\"');\n if (cp.concurrentManualCount !== undefined)\n cpAttrs.push(`concurrentManualCount=\"${cp.concurrentManualCount}\"`);\n if (cp.iterate) cpAttrs.push('iterate=\"1\"');\n if (cp.iterateCount !== undefined) cpAttrs.push(`iterateCount=\"${cp.iterateCount}\"`);\n if (cp.iterateDelta !== undefined) cpAttrs.push(`iterateDelta=\"${cp.iterateDelta}\"`);\n if (cp.refMode) cpAttrs.push(`refMode=\"${escapeXml(cp.refMode)}\"`);\n if (cp.fullPrecision === false) cpAttrs.push('fullPrecision=\"0\"');\n if (cp.calcCompleted) cpAttrs.push('calcCompleted=\"1\"');\n parts.push(`<calcPr ${cpAttrs.join(\" \")}/>`);\n } else {\n parts.push('<calcPr calcId=\"191029\" fullCalcOnLoad=\"1\"/>');\n }\n\n // Custom workbook views (after calcPr, before pivotCaches per XSD)\n if (opts.customViews && opts.customViews.length > 0) {\n parts.push(\"<customWorkbookViews>\");\n for (const v of opts.customViews) {\n const vAttrs: string[] = [\n `name=\"${escapeXml(v.name)}\"`,\n `guid=\"${escapeXml(v.guid)}\"`,\n `windowWidth=\"${v.windowWidth}\"`,\n `windowHeight=\"${v.windowHeight}\"`,\n `activeSheetId=\"${v.activeSheetId}\"`,\n ];\n if (v.xWindow !== undefined) vAttrs.push(`xWindow=\"${v.xWindow}\"`);\n if (v.yWindow !== undefined) vAttrs.push(`yWindow=\"${v.yWindow}\"`);\n if (v.showFormulaBar === false) vAttrs.push('showFormulaBar=\"0\"');\n if (v.showStatusbar === false) vAttrs.push('showStatusbar=\"0\"');\n if (v.showHorizontalScroll === false) vAttrs.push('showHorizontalScroll=\"0\"');\n if (v.showVerticalScroll === false) vAttrs.push('showVerticalScroll=\"0\"');\n if (v.showSheetTabs === false) vAttrs.push('showSheetTabs=\"0\"');\n if (v.tabRatio !== undefined) vAttrs.push(`tabRatio=\"${v.tabRatio}\"`);\n if (v.includeHiddenRowCol === false) vAttrs.push('includeHiddenRowCol=\"0\"');\n if (v.includePrintSettings === false) vAttrs.push('includePrintSettings=\"0\"');\n if (v.personalView) vAttrs.push('personalView=\"1\"');\n if (v.maximized) vAttrs.push('maximized=\"1\"');\n if (v.minimized) vAttrs.push('minimized=\"1\"');\n if (v.autoUpdate) vAttrs.push('autoUpdate=\"1\"');\n if (v.mergeInterval !== undefined) vAttrs.push(`mergeInterval=\"${v.mergeInterval}\"`);\n if (v.changesSavedWin) vAttrs.push('changesSavedWin=\"1\"');\n if (v.onlySync) vAttrs.push('onlySync=\"1\"');\n if (v.showComments) vAttrs.push(`showComments=\"${escapeXml(v.showComments)}\"`);\n parts.push(`<customWorkbookView ${vAttrs.join(\" \")}/>`);\n }\n parts.push(\"</customWorkbookViews>\");\n }\n\n const pivotCaches = opts.pivotCaches ?? [];\n if (pivotCaches.length > 0) {\n parts.push(\"<pivotCaches>\");\n for (const pc of pivotCaches) {\n parts.push(`<pivotCache cacheId=\"${pc.cacheId}\" r:id=\"${pc.rId}\"/>`);\n }\n parts.push(\"</pivotCaches>\");\n }\n\n // Smart tag properties (after pivotCaches, before smartTagTypes per XSD sequence)\n if (opts.smartTagPr) {\n const stp = opts.smartTagPr;\n const stpAttrs: string[] = [];\n if (stp.embed) stpAttrs.push('embed=\"1\"');\n if (stp.show && stp.show !== \"all\") stpAttrs.push(`show=\"${stp.show}\"`);\n if (stpAttrs.length > 0) {\n parts.push(`<smartTagPr ${stpAttrs.join(\" \")}/>`);\n }\n }\n\n // Smart tag types (after smartTagPr, before webPublishing per XSD sequence)\n if (opts.smartTagTypes && opts.smartTagTypes.length > 0) {\n const sttParts: string[] = [\"<smartTagTypes>\"];\n for (const stt of opts.smartTagTypes) {\n const sttAttrs: string[] = [];\n if (stt.namespaceUri) sttAttrs.push(`namespaceUri=\"${escapeXml(stt.namespaceUri)}\"`);\n if (stt.name) sttAttrs.push(`name=\"${escapeXml(stt.name)}\"`);\n if (stt.url) sttAttrs.push(`url=\"${escapeXml(stt.url)}\"`);\n sttParts.push(`<smartTagType ${sttAttrs.join(\" \")}/>`);\n }\n sttParts.push(\"</smartTagTypes>\");\n parts.push(sttParts.join(\"\"));\n }\n\n // Web publishing (after smartTagTypes, before fileRecoveryPr per XSD sequence)\n if (opts.webPublishing) {\n const wp = opts.webPublishing;\n const wpAttrs: string[] = [];\n if (wp.css === false) wpAttrs.push('css=\"0\"');\n if (wp.thicket === false) wpAttrs.push('thicket=\"0\"');\n if (wp.longFileNames === false) wpAttrs.push('longFileNames=\"0\"');\n if (wp.vml) wpAttrs.push('vml=\"1\"');\n if (wp.allowPng) wpAttrs.push('allowPng=\"1\"');\n if (wp.targetScreenSize && wp.targetScreenSize !== \"800x600\")\n wpAttrs.push(`targetScreenSize=\"${wp.targetScreenSize}\"`);\n if (wp.dpi !== undefined && wp.dpi !== 96) wpAttrs.push(`dpi=\"${wp.dpi}\"`);\n if (wp.codePage !== undefined) wpAttrs.push(`codePage=\"${wp.codePage}\"`);\n if (wp.characterSet) wpAttrs.push(`characterSet=\"${escapeXml(wp.characterSet)}\"`);\n parts.push(`<webPublishing ${wpAttrs.join(\" \")}/>`);\n }\n\n // File recovery properties (after webPublishing per XSD sequence)\n if (opts.fileRecoveryPr) {\n const frp = opts.fileRecoveryPr;\n const frpAttrs: string[] = [];\n if (frp.autoRecover === false) frpAttrs.push('autoRecover=\"0\"');\n if (frp.crashSave) frpAttrs.push('crashSave=\"1\"');\n if (frp.dataExtractLoad) frpAttrs.push('dataExtractLoad=\"1\"');\n if (frp.repairLoad) frpAttrs.push('repairLoad=\"1\"');\n if (frpAttrs.length > 0) {\n parts.push(`<fileRecoveryPr ${frpAttrs.join(\" \")}/>`);\n }\n }\n\n // Web publish objects (after fileRecoveryPr per XSD sequence)\n if (opts.webPublishObjects && opts.webPublishObjects.length > 0) {\n const wpoParts: string[] = [`<webPublishObjects count=\"${opts.webPublishObjects.length}\">`];\n for (const wpo of opts.webPublishObjects) {\n const wpoAttrs: string[] = [`r:id=\"${escapeXml(wpo.rId)}\"`];\n if (wpo.destinationFile) wpoAttrs.push(`destinationFile=\"${escapeXml(wpo.destinationFile)}\"`);\n if (wpo.autoRepublish) wpoAttrs.push('autoRepublish=\"1\"');\n if (wpo.title) wpoAttrs.push(`title=\"${escapeXml(wpo.title)}\"`);\n if (wpo.sourceObject) wpoAttrs.push(`sourceObject=\"${escapeXml(wpo.sourceObject)}\"`);\n wpoParts.push(`<webPublishObject ${wpoAttrs.join(\" \")}/>`);\n }\n wpoParts.push(\"</webPublishObjects>\");\n parts.push(wpoParts.join(\"\"));\n }\n\n // Volatile dependencies (volTypes)\n if (opts.volTypes && opts.volTypes.length > 0) {\n const vtParts: string[] = [`<volTypes count=\"${opts.volTypes.length}\">`];\n for (const vt of opts.volTypes) {\n const vtType = vt.type ?? \"realTimeData\";\n const mains = vt.mains ?? [];\n if (mains.length > 0) {\n const mainParts: string[] = [];\n for (const m of mains) {\n const tpParts: string[] = [];\n for (const topic of m.topics ?? []) {\n const tpInner: string[] = [`<v>${escapeXml(topic.value)}</v>`];\n for (const stp of topic.stringTopics ?? []) {\n tpInner.push(`<stp>${escapeXml(stp)}</stp>`);\n }\n for (const tr of topic.refs ?? []) {\n tpInner.push(`<tr r=\"${escapeXml(tr.reference)}\" s=\"${tr.sheetIndex}\"/>`);\n }\n const tpAttr =\n topic.valueType && topic.valueType !== \"n\"\n ? ` t=\"${escapeXml(topic.valueType)}\"`\n : \"\";\n tpParts.push(`<tp${tpAttr}>${tpInner.join(\"\")}</tp>`);\n }\n mainParts.push(`<main first=\"${escapeXml(m.first)}\">${tpParts.join(\"\")}</main>`);\n }\n vtParts.push(`<volType type=\"${vtType}\">${mainParts.join(\"\")}</volType>`);\n } else {\n vtParts.push(`<volType type=\"${vtType}\"/>`);\n }\n }\n vtParts.push(\"</volTypes>\");\n parts.push(vtParts.join(\"\"));\n }\n\n parts.push(\"</workbook>\");\n return parts.join(\"\");\n}\n\n// ── Exported helper functions ──\n\n/** Generate tableParts XML fragment for embedding in a worksheet. */\nexport function buildTablePartsXml(tableParts: TablePartReference[]): string {\n if (tableParts.length === 0) return \"\";\n const p: string[] = [`<tableParts count=\"${tableParts.length}\">`];\n for (const tp of tableParts) {\n p.push(`<tablePart r:id=\"${tp.rId}\"/>`);\n }\n p.push(\"</tableParts>\");\n return p.join(\"\");\n}\n\n/** Generate externalReferences XML fragment for embedding in the workbook. */\nexport function buildExternalReferencesXml(refs: { rId: string }[]): string {\n if (refs.length === 0) return \"\";\n const p: string[] = [\"<externalReferences>\"];\n for (const ref of refs) {\n p.push(`<externalReference r:id=\"${ref.rId}\"/>`);\n }\n p.push(\"</externalReferences>\");\n return p.join(\"\");\n}\n","/**\n * Workbook types and descriptor for SpreadsheetML documents.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, attrNum, findChild } from \"@office-open/xml\";\n\nimport { stringifyWorkbook } from \"./stringify\";\nimport type {\n CalculationPropertiesOptions,\n CustomWorkbookViewOptions,\n DefinedNameOptions,\n FileRecoveryPropertiesOptions,\n FileSharingOptions,\n FileVersionOptions,\n PivotCacheReference,\n SheetDefinition,\n SmartTagPropertiesOptions,\n SmartTagShow,\n SmartTagTypeOptions,\n VolMainOptions,\n VolTopicOptions,\n VolTopicRefOptions,\n VolTypeOptions,\n WebPublishObjectOptions,\n WebPublishingOptions,\n WorkbookConformance,\n WorkbookDescriptorOptions,\n WorkbookProtectionOptions,\n WorkbookPropertiesOptions,\n WorkbookViewOptions,\n} from \"./types\";\n\n// ── Descriptor ──\n\nexport const workbookDesc: CustomDescriptor<WorkbookDescriptorOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n return stringifyWorkbook(opts);\n },\n\n parse(el, _ctx) {\n const result: Partial<WorkbookDescriptorOptions> = {};\n\n // File version (CT_Workbook first child) — Excel version stamp\n const fileVersionEl = findChild(el, \"fileVersion\");\n if (fileVersionEl) {\n const fv: FileVersionOptions = {};\n const appName = attr(fileVersionEl, \"appName\");\n if (appName) fv.appName = appName;\n const lastEdited = attrNum(fileVersionEl, \"lastEdited\");\n if (lastEdited !== undefined) fv.lastEdited = lastEdited;\n const lowestEdited = attrNum(fileVersionEl, \"lowestEdited\");\n if (lowestEdited !== undefined) fv.lowestEdited = lowestEdited;\n const rupBuild = attrNum(fileVersionEl, \"rupBuild\");\n if (rupBuild !== undefined) fv.rupBuild = rupBuild;\n result.fileVersion = fv;\n }\n\n // Sheets\n const sheetsEl = findChild(el, \"sheets\");\n if (sheetsEl) {\n const sheets: SheetDefinition[] = [];\n for (const s of sheetsEl.elements ?? []) {\n if (s.name !== \"sheet\") continue;\n const name = attr(s, \"name\") ?? \"\";\n const sheetId = attrNum(s, \"sheetId\") ?? 0;\n const rId = (s.attributes?.[\"r:id\"] as string | undefined) ?? \"\";\n const state = attr(s, \"state\") as SheetDefinition[\"state\"];\n sheets.push({ name, sheetId, rId, state });\n }\n result.sheets = sheets;\n }\n\n // Pivot caches\n const pivotCachesEl = findChild(el, \"pivotCaches\");\n if (pivotCachesEl) {\n const caches: PivotCacheReference[] = [];\n for (const pc of pivotCachesEl.elements ?? []) {\n if (pc.name !== \"pivotCache\") continue;\n caches.push({\n cacheId: attrNum(pc, \"cacheId\") ?? 0,\n rId: (pc.attributes?.[\"r:id\"] as string) ?? \"\",\n });\n }\n result.pivotCaches = caches;\n }\n\n // Workbook protection\n const protEl = findChild(el, \"workbookProtection\");\n if (protEl?.attributes) {\n const prot: WorkbookProtectionOptions = {};\n if (parseOnOff(attr(protEl, \"lockStructure\"))) prot.lockStructure = true;\n if (parseOnOff(attr(protEl, \"lockWindows\"))) prot.lockWindows = true;\n if (parseOnOff(attr(protEl, \"lockRevision\"))) prot.lockRevision = true;\n if (attr(protEl, \"workbookPassword\"))\n prot.workbookPassword = attr(protEl, \"workbookPassword\");\n if (attr(protEl, \"workbookAlgorithmName\"))\n prot.workbookAlgorithmName = attr(protEl, \"workbookAlgorithmName\");\n if (attr(protEl, \"workbookHashValue\"))\n prot.workbookHashValue = attr(protEl, \"workbookHashValue\");\n if (attr(protEl, \"workbookSaltValue\"))\n prot.workbookSaltValue = attr(protEl, \"workbookSaltValue\");\n if (attr(protEl, \"workbookSpinCount\"))\n prot.workbookSpinCount = attrNum(protEl, \"workbookSpinCount\");\n result.protection = prot;\n }\n\n // Book views\n const bookViewsEl = findChild(el, \"bookViews\");\n if (bookViewsEl) {\n const bvEl = findChild(bookViewsEl, \"workbookView\");\n if (bvEl?.attributes) {\n const bv: WorkbookViewOptions = {};\n const xw = attrNum(bvEl, \"xWindow\");\n if (xw !== undefined) bv.xWindow = xw;\n const yw = attrNum(bvEl, \"yWindow\");\n if (yw !== undefined) bv.yWindow = yw;\n const ww = attrNum(bvEl, \"windowWidth\");\n if (ww !== undefined) bv.windowWidth = ww;\n const wh = attrNum(bvEl, \"windowHeight\");\n if (wh !== undefined) bv.windowHeight = wh;\n const at = attrNum(bvEl, \"activeTab\");\n if (at !== undefined) bv.activeTab = at;\n if (String(attr(bvEl, \"autoFilterDateGrouping\")) === \"0\") bv.autoFilterDateGrouping = false;\n const fs = attrNum(bvEl, \"firstSheet\");\n if (fs !== undefined) bv.firstSheet = fs;\n if (String(attr(bvEl, \"showHorizontalScroll\")) === \"0\") bv.showHorizontalScroll = false;\n if (String(attr(bvEl, \"showVerticalScroll\")) === \"0\") bv.showVerticalScroll = false;\n if (String(attr(bvEl, \"showSheetTabs\")) === \"0\") bv.showSheetTabs = false;\n const tr = attrNum(bvEl, \"tabRatio\");\n if (tr !== undefined) bv.tabRatio = tr;\n const vis = attr(bvEl, \"visibility\");\n if (vis !== undefined) bv.visibility = vis as WorkbookViewOptions[\"visibility\"];\n result.bookView = bv;\n }\n }\n\n // Calc properties\n const calcPrEl = findChild(el, \"calcPr\");\n if (calcPrEl?.attributes) {\n const calc: CalculationPropertiesOptions = {};\n const calcId = attrNum(calcPrEl, \"calcId\");\n if (calcId !== undefined) calc.calcId = calcId;\n if (attr(calcPrEl, \"calcMode\")) calc.calcMode = attr(calcPrEl, \"calcMode\");\n if (parseOnOff(attr(calcPrEl, \"fullCalcOnLoad\"))) calc.fullCalcOnLoad = true;\n if (String(attr(calcPrEl, \"concurrentCalc\")) === \"0\") calc.concurrentCalc = false;\n if (attr(calcPrEl, \"refMode\")) calc.refMode = attr(calcPrEl, \"refMode\");\n if (String(attr(calcPrEl, \"calcOnSave\")) === \"0\") calc.calcOnSave = false;\n if (parseOnOff(attr(calcPrEl, \"forceFullCalc\"))) calc.forceFullCalc = true;\n const cmc = attrNum(calcPrEl, \"concurrentManualCount\");\n if (cmc !== undefined) calc.concurrentManualCount = cmc;\n if (parseOnOff(attr(calcPrEl, \"iterate\"))) calc.iterate = true;\n const ic = attrNum(calcPrEl, \"iterateCount\");\n if (ic !== undefined) calc.iterateCount = ic;\n const id = attrNum(calcPrEl, \"iterateDelta\");\n if (id !== undefined) calc.iterateDelta = id;\n if (String(attr(calcPrEl, \"fullPrecision\")) === \"0\") calc.fullPrecision = false;\n if (parseOnOff(attr(calcPrEl, \"calcCompleted\"))) calc.calcCompleted = true;\n result.calcPr = calc;\n }\n\n // Custom workbook views\n const customViewsEl = findChild(el, \"customWorkbookViews\");\n if (customViewsEl) {\n const views: CustomWorkbookViewOptions[] = [];\n for (const v of customViewsEl.elements ?? []) {\n if (v.name !== \"customWorkbookView\") continue;\n const view: CustomWorkbookViewOptions = {\n name: attr(v, \"name\") ?? \"\",\n guid: attr(v, \"guid\") ?? \"\",\n windowWidth: attrNum(v, \"windowWidth\") ?? 0,\n windowHeight: attrNum(v, \"windowHeight\") ?? 0,\n activeSheetId: attrNum(v, \"activeSheetId\") ?? 1,\n };\n const xw = attrNum(v, \"xWindow\");\n if (xw !== undefined) view.xWindow = xw;\n const yw = attrNum(v, \"yWindow\");\n if (yw !== undefined) view.yWindow = yw;\n if (String(attr(v, \"showFormulaBar\")) === \"0\") view.showFormulaBar = false;\n if (String(attr(v, \"showStatusbar\")) === \"0\") view.showStatusbar = false;\n if (String(attr(v, \"showHorizontalScroll\")) === \"0\") view.showHorizontalScroll = false;\n if (String(attr(v, \"showVerticalScroll\")) === \"0\") view.showVerticalScroll = false;\n if (String(attr(v, \"showSheetTabs\")) === \"0\") view.showSheetTabs = false;\n const tabRatio = attrNum(v, \"tabRatio\");\n if (tabRatio !== undefined) view.tabRatio = tabRatio;\n if (String(attr(v, \"includeHiddenRowCol\")) === \"0\") view.includeHiddenRowCol = false;\n if (String(attr(v, \"includePrintSettings\")) === \"0\") view.includePrintSettings = false;\n if (parseOnOff(attr(v, \"personalView\"))) view.personalView = true;\n if (parseOnOff(attr(v, \"maximized\"))) view.maximized = true;\n if (parseOnOff(attr(v, \"minimized\"))) view.minimized = true;\n if (parseOnOff(attr(v, \"autoUpdate\"))) view.autoUpdate = true;\n const mi = attrNum(v, \"mergeInterval\");\n if (mi !== undefined) view.mergeInterval = mi;\n if (parseOnOff(attr(v, \"changesSavedWin\"))) view.changesSavedWin = true;\n if (parseOnOff(attr(v, \"onlySync\"))) view.onlySync = true;\n if (attr(v, \"showComments\")) view.showComments = attr(v, \"showComments\");\n views.push(view);\n }\n if (views.length > 0) result.customViews = views;\n }\n\n // File sharing\n const fileSharingEl = findChild(el, \"fileSharing\");\n if (fileSharingEl?.attributes) {\n const fs: FileSharingOptions = {};\n if (parseOnOff(attr(fileSharingEl, \"readOnlyRecommended\"))) fs.readOnlyRecommended = true;\n if (attr(fileSharingEl, \"userName\")) fs.userName = attr(fileSharingEl, \"userName\");\n if (attr(fileSharingEl, \"reservationPassword\"))\n fs.reservationPassword = attr(fileSharingEl, \"reservationPassword\");\n if (attr(fileSharingEl, \"algorithmName\"))\n fs.algorithmName = attr(fileSharingEl, \"algorithmName\");\n if (attr(fileSharingEl, \"hashValue\")) fs.hashValue = attr(fileSharingEl, \"hashValue\");\n if (attr(fileSharingEl, \"saltValue\")) fs.saltValue = attr(fileSharingEl, \"saltValue\");\n const sc = attrNum(fileSharingEl, \"spinCount\");\n if (sc !== undefined) fs.spinCount = sc;\n result.fileSharing = fs;\n }\n\n // Web publishing\n const webPublishingEl = findChild(el, \"webPublishing\");\n if (webPublishingEl?.attributes) {\n const wp: WebPublishingOptions = {};\n if (String(attr(webPublishingEl, \"css\")) === \"0\") wp.css = false;\n if (String(attr(webPublishingEl, \"thicket\")) === \"0\") wp.thicket = false;\n if (String(attr(webPublishingEl, \"longFileNames\")) === \"0\") wp.longFileNames = false;\n if (parseOnOff(attr(webPublishingEl, \"vml\"))) wp.vml = true;\n if (parseOnOff(attr(webPublishingEl, \"allowPng\"))) wp.allowPng = true;\n if (attr(webPublishingEl, \"targetScreenSize\"))\n wp.targetScreenSize = attr(webPublishingEl, \"targetScreenSize\");\n const dpi = attrNum(webPublishingEl, \"dpi\");\n if (dpi !== undefined) wp.dpi = dpi;\n const codePage = attrNum(webPublishingEl, \"codePage\");\n if (codePage !== undefined) wp.codePage = codePage;\n if (attr(webPublishingEl, \"characterSet\"))\n wp.characterSet = attr(webPublishingEl, \"characterSet\");\n result.webPublishing = wp;\n }\n\n // File recovery\n const fileRecoveryEl = findChild(el, \"fileRecoveryPr\");\n if (fileRecoveryEl?.attributes) {\n const frp: FileRecoveryPropertiesOptions = {};\n if (String(attr(fileRecoveryEl, \"autoRecover\")) === \"0\") frp.autoRecover = false;\n if (parseOnOff(attr(fileRecoveryEl, \"crashSave\"))) frp.crashSave = true;\n if (parseOnOff(attr(fileRecoveryEl, \"dataExtractLoad\"))) frp.dataExtractLoad = true;\n if (parseOnOff(attr(fileRecoveryEl, \"repairLoad\"))) frp.repairLoad = true;\n result.fileRecoveryPr = frp;\n }\n\n // Workbook properties\n const wbPrEl = findChild(el, \"workbookPr\");\n if (wbPrEl?.attributes) {\n const wbPr: WorkbookPropertiesOptions = {};\n if (parseOnOff(attr(wbPrEl, \"date1904\"))) wbPr.date1904 = true;\n const dtv = attrNum(wbPrEl, \"defaultThemeVersion\");\n if (dtv !== undefined) wbPr.defaultThemeVersion = dtv;\n if (attr(wbPrEl, \"showObjects\")) wbPr.showObjects = attr(wbPrEl, \"showObjects\");\n if (parseOnOff(attr(wbPrEl, \"hidePivotFieldList\"))) wbPr.hidePivotFieldList = true;\n if (parseOnOff(attr(wbPrEl, \"allowRefreshQuery\"))) wbPr.allowRefreshQuery = true;\n if (parseOnOff(attr(wbPrEl, \"filterPrivacy\"))) wbPr.filterPrivacy = true;\n if (parseOnOff(attr(wbPrEl, \"backupFile\"))) wbPr.backupFile = true;\n if (attr(wbPrEl, \"codeName\")) wbPr.codeName = attr(wbPrEl, \"codeName\");\n if (parseOnOff(attr(wbPrEl, \"showBorderUnselectedTables\")))\n wbPr.showBorderUnselectedTables = true;\n if (parseOnOff(attr(wbPrEl, \"promptedSolutions\"))) wbPr.promptedSolutions = true;\n if (String(attr(wbPrEl, \"showInkAnnotation\")) === \"0\") wbPr.showInkAnnotation = false;\n if (String(attr(wbPrEl, \"saveExternalLinkValues\")) === \"0\")\n wbPr.saveExternalLinkValues = false;\n if (attr(wbPrEl, \"updateLinks\")) wbPr.updateLinks = attr(wbPrEl, \"updateLinks\");\n if (parseOnOff(attr(wbPrEl, \"showPivotChartFilter\"))) wbPr.showPivotChartFilter = true;\n if (parseOnOff(attr(wbPrEl, \"publishItems\"))) wbPr.publishItems = true;\n if (parseOnOff(attr(wbPrEl, \"checkCompatibility\"))) wbPr.checkCompatibility = true;\n if (String(attr(wbPrEl, \"autoCompressPictures\")) === \"0\") wbPr.autoCompressPictures = false;\n if (parseOnOff(attr(wbPrEl, \"refreshAllConnections\"))) wbPr.refreshAllConnections = true;\n result.workbookPr = wbPr;\n }\n\n // Function groups\n const fgEl = findChild(el, \"functionGroups\");\n if (fgEl) {\n const names: string[] = [];\n for (const fg of fgEl.elements ?? []) {\n if (fg.name === \"functionGroup\" && attr(fg, \"name\")) {\n names.push(attr(fg, \"name\")!);\n }\n }\n if (names.length > 0) result.functionGroups = names;\n }\n\n // Web publish objects\n const wpoEl = findChild(el, \"webPublishObjects\");\n if (wpoEl) {\n const objs: WebPublishObjectOptions[] = [];\n for (const wo of wpoEl.elements ?? []) {\n if (wo.name !== \"webPublishObject\") continue;\n const obj: WebPublishObjectOptions = {\n rId: (wo.attributes?.[\"r:id\"] as string) ?? \"\",\n };\n if (attr(wo, \"destinationFile\")) obj.destinationFile = attr(wo, \"destinationFile\");\n if (parseOnOff(attr(wo, \"autoRepublish\"))) obj.autoRepublish = true;\n if (attr(wo, \"title\")) obj.title = attr(wo, \"title\");\n if (attr(wo, \"sourceObject\")) obj.sourceObject = attr(wo, \"sourceObject\");\n objs.push(obj);\n }\n if (objs.length > 0) result.webPublishObjects = objs;\n }\n\n // Volatile types (volTypes)\n const vtEl = findChild(el, \"volTypes\");\n if (vtEl) {\n const volTypes: VolTypeOptions[] = [];\n for (const vt of vtEl.elements ?? []) {\n if (vt.name !== \"volType\") continue;\n const volType: VolTypeOptions = {};\n const typeVal = attr(vt, \"type\");\n if (typeVal) volType.type = typeVal as VolTypeOptions[\"type\"];\n const mains: VolMainOptions[] = [];\n for (const m of vt.elements ?? []) {\n if (m.name !== \"main\") continue;\n const main: VolMainOptions = { first: attr(m, \"first\") ?? \"\" };\n const topics: VolTopicOptions[] = [];\n for (const tp of m.elements ?? []) {\n if (tp.name !== \"tp\") continue;\n const vEl = findChild(tp, \"v\");\n const topic: VolTopicOptions = { value: String(vEl?.elements?.[0]?.text ?? \"\") };\n const tVal = attr(tp, \"t\");\n if (tVal) topic.valueType = tVal;\n const stps: string[] = [];\n const refs: VolTopicRefOptions[] = [];\n for (const inner of tp.elements ?? []) {\n if (inner.name === \"stp\") stps.push(String(inner.elements?.[0]?.text ?? \"\"));\n if (inner.name === \"tr\") {\n const ref: VolTopicRefOptions = {\n reference: attr(inner, \"r\") ?? \"\",\n sheetIndex: attrNum(inner, \"s\") ?? 0,\n };\n refs.push(ref);\n }\n }\n if (stps.length > 0) topic.stringTopics = stps;\n if (refs.length > 0) topic.refs = refs;\n topics.push(topic);\n }\n if (topics.length > 0) main.topics = topics;\n mains.push(main);\n }\n if (mains.length > 0) volType.mains = mains;\n volTypes.push(volType);\n }\n if (volTypes.length > 0) result.volTypes = volTypes;\n }\n\n // Defined names (CT_DefinedNames — simpleContent ST_Formula + 14 attrs)\n const definedNamesEl = findChild(el, \"definedNames\");\n if (definedNamesEl) {\n const names: DefinedNameOptions[] = [];\n for (const d of definedNamesEl.elements ?? []) {\n if (d.name !== \"definedName\") continue;\n const value = (d.elements ?? []).map((e) => e.text ?? \"\").join(\"\");\n const dn: DefinedNameOptions = { name: attr(d, \"name\") ?? \"\", value };\n if (attr(d, \"comment\") !== undefined) dn.comment = attr(d, \"comment\");\n if (attr(d, \"customMenu\") !== undefined) dn.customMenu = attr(d, \"customMenu\");\n if (attr(d, \"description\") !== undefined) dn.description = attr(d, \"description\");\n if (attr(d, \"help\") !== undefined) dn.help = attr(d, \"help\");\n if (attr(d, \"statusBar\") !== undefined) dn.statusBar = attr(d, \"statusBar\");\n const localSheetId = attrNum(d, \"localSheetId\");\n if (localSheetId !== undefined) dn.localSheetId = localSheetId;\n if (parseOnOff(attr(d, \"hidden\"))) dn.hidden = true;\n if (parseOnOff(attr(d, \"function\"))) dn.function = true;\n if (parseOnOff(attr(d, \"vbProcedure\"))) dn.vbProcedure = true;\n if (parseOnOff(attr(d, \"xlm\"))) dn.xlm = true;\n const functionGroupId = attrNum(d, \"functionGroupId\");\n if (functionGroupId !== undefined) dn.functionGroupId = functionGroupId;\n if (attr(d, \"shortcutKey\") !== undefined) dn.shortcutKey = attr(d, \"shortcutKey\");\n if (parseOnOff(attr(d, \"publishToServer\"))) dn.publishToServer = true;\n if (parseOnOff(attr(d, \"workbookParameter\"))) dn.workbookParameter = true;\n names.push(dn);\n }\n if (names.length > 0) result.definedNames = names;\n }\n\n // Smart tag properties (CT_SmartTagPr)\n const smartTagPrEl = findChild(el, \"smartTagPr\");\n if (smartTagPrEl?.attributes) {\n const stp: SmartTagPropertiesOptions = {};\n if (parseOnOff(attr(smartTagPrEl, \"embed\"))) stp.embed = true;\n const show = attr(smartTagPrEl, \"show\");\n if (show && show !== \"all\") stp.show = show as SmartTagShow;\n result.smartTagPr = stp;\n }\n\n // Smart tag types (CT_SmartTagTypes → smartTagType[])\n const smartTagTypesEl = findChild(el, \"smartTagTypes\");\n if (smartTagTypesEl) {\n const types: SmartTagTypeOptions[] = [];\n for (const t of smartTagTypesEl.elements ?? []) {\n if (t.name !== \"smartTagType\") continue;\n const type: SmartTagTypeOptions = {};\n const ns = attr(t, \"namespaceUri\");\n if (ns) type.namespaceUri = ns;\n const n = attr(t, \"name\");\n if (n) type.name = n;\n const u = attr(t, \"url\");\n if (u) type.url = u;\n types.push(type);\n }\n if (types.length > 0) result.smartTagTypes = types;\n }\n\n // Conformance\n if (el.attributes?.[\"conformance\"]) {\n result.conformance = attr(el, \"conformance\") as WorkbookConformance;\n }\n\n return result as WorkbookDescriptorOptions;\n },\n};\n","/**\n * Dialogsheet types and descriptor for SpreadsheetML documents.\n *\n * A dialogsheet is a legacy Excel 5.0 dialog sheet (no cell data).\n *\n * Reference: OOXML transitional, sml.xsd, CT_Dialogsheet\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport { convertToInch } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, attr, attrNum, escapeXml, findChild, stringifyElement } from \"@office-open/xml\";\n\n// ── Types ──\n\nexport interface DialogsheetPageMargins {\n left?: number | UniversalMeasure;\n right?: number | UniversalMeasure;\n top?: number | UniversalMeasure;\n bottom?: number | UniversalMeasure;\n header?: number | UniversalMeasure;\n footer?: number | UniversalMeasure;\n}\n\nexport interface DialogsheetPageSetup {\n /** Paper size (1=Letter, 9=A4, etc.) */\n paperSize?: number;\n /** Orientation (\"default\" | \"portrait\" | \"landscape\") */\n orientation?: string;\n /** Horizontal DPI */\n horizontalDpi?: number;\n /** Vertical DPI */\n verticalDpi?: number;\n /** Copies to print */\n copies?: number;\n}\n\nexport interface DialogsheetProtectionOptions {\n /** Content is protected */\n content?: boolean;\n /** Objects are protected */\n objects?: boolean;\n /** Scenarios are protected */\n scenarios?: boolean;\n}\n\nexport interface DialogsheetOptions {\n /** Sheet name */\n name?: string;\n /** Tab color (hex ARGB) */\n tabColor?: string;\n /** Published to a server (CT_SheetPr @published) */\n published?: boolean;\n /** VBA code name (CT_SheetPr @codeName) */\n codeName?: string;\n /** Page margins */\n pageMargins?: DialogsheetPageMargins;\n /** Page setup */\n pageSetup?: DialogsheetPageSetup;\n /** Sheet protection */\n sheetProtection?: DialogsheetProtectionOptions;\n /** Raw extension list preserved verbatim (extLst) */\n extLst?: string;\n}\n\n// ── Descriptor ──\n\nexport const dialogsheetDesc: CustomDescriptor<DialogsheetOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<dialogsheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ];\n\n // sheetPr (optional)\n if (opts.tabColor || opts.published || opts.codeName) {\n const prChildren: string[] = [];\n if (opts.tabColor) prChildren.push(`<tabColor${attrs({ rgb: opts.tabColor })}/>`);\n const prAttrs: string[] = [];\n if (opts.published) prAttrs.push(' published=\"1\"');\n if (opts.codeName) prAttrs.push(` codeName=\"${escapeXml(opts.codeName)}\"`);\n p.push(`<sheetPr${prAttrs.join(\"\")}>${prChildren.join(\"\")}</sheetPr>`);\n }\n\n // sheetProtection (optional)\n if (opts.sheetProtection) {\n const sp = opts.sheetProtection;\n const spAttrs: string[] = [];\n if (sp.content) spAttrs.push(` content=\"1\"`);\n if (sp.objects) spAttrs.push(` objects=\"1\"`);\n if (sp.scenarios) spAttrs.push(` scenarios=\"1\"`);\n if (spAttrs.length > 0) {\n p.push(`<sheetProtection${spAttrs.join(\"\")}/>`);\n }\n }\n\n // pageMargins (optional)\n if (opts.pageMargins) {\n const pm = opts.pageMargins;\n p.push(\n `<pageMargins${attrs({\n left: convertToInch(pm.left ?? 0.7),\n right: convertToInch(pm.right ?? 0.7),\n top: convertToInch(pm.top ?? 0.75),\n bottom: convertToInch(pm.bottom ?? 0.75),\n header: convertToInch(pm.header ?? 0.3),\n footer: convertToInch(pm.footer ?? 0.3),\n })}/>`,\n );\n }\n\n // pageSetup (optional)\n if (opts.pageSetup) {\n const ps = opts.pageSetup;\n p.push(\n `<pageSetup${attrs({\n paperSize: ps.paperSize,\n orientation: ps.orientation,\n horizontalDpi: ps.horizontalDpi,\n verticalDpi: ps.verticalDpi,\n copies: ps.copies,\n })}/>`,\n );\n }\n\n if (opts.extLst) p.push(opts.extLst);\n\n p.push(\"</dialogsheet>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const result: Partial<DialogsheetOptions> = {};\n\n // sheetPr\n const sheetPrEl = findChild(el, \"sheetPr\");\n if (sheetPrEl) {\n if (parseOnOff(attr(sheetPrEl, \"published\"))) result.published = true;\n if (attr(sheetPrEl, \"codeName\")) result.codeName = attr(sheetPrEl, \"codeName\");\n const tcEl = findChild(sheetPrEl, \"tabColor\");\n if (tcEl && attr(tcEl, \"rgb\")) result.tabColor = attr(tcEl, \"rgb\");\n }\n\n // sheetProtection\n const spEl = findChild(el, \"sheetProtection\");\n if (spEl) {\n const sp: Partial<DialogsheetProtectionOptions> = {};\n if (parseOnOff(attr(spEl, \"content\"))) sp.content = true;\n if (parseOnOff(attr(spEl, \"objects\"))) sp.objects = true;\n if (parseOnOff(attr(spEl, \"scenarios\"))) sp.scenarios = true;\n result.sheetProtection = sp;\n }\n\n // pageMargins\n const pmEl = findChild(el, \"pageMargins\");\n if (pmEl) {\n const pm: Partial<DialogsheetPageMargins> = {};\n const ml = attrNum(pmEl, \"left\");\n if (ml !== undefined) pm.left = ml;\n const mr = attrNum(pmEl, \"right\");\n if (mr !== undefined) pm.right = mr;\n const mt = attrNum(pmEl, \"top\");\n if (mt !== undefined) pm.top = mt;\n const mb = attrNum(pmEl, \"bottom\");\n if (mb !== undefined) pm.bottom = mb;\n const mh = attrNum(pmEl, \"header\");\n if (mh !== undefined) pm.header = mh;\n const mf = attrNum(pmEl, \"footer\");\n if (mf !== undefined) pm.footer = mf;\n result.pageMargins = pm;\n }\n\n // pageSetup\n const psEl = findChild(el, \"pageSetup\");\n if (psEl) {\n const ps: Partial<DialogsheetPageSetup> = {};\n const pz = attrNum(psEl, \"paperSize\");\n if (pz !== undefined) ps.paperSize = pz;\n const orient = attr(psEl, \"orientation\");\n if (orient) ps.orientation = orient;\n const hdpi = attrNum(psEl, \"horizontalDpi\");\n if (hdpi !== undefined) ps.horizontalDpi = hdpi;\n const vdpi = attrNum(psEl, \"verticalDpi\");\n if (vdpi !== undefined) ps.verticalDpi = vdpi;\n const copies = attrNum(psEl, \"copies\");\n if (copies !== undefined) ps.copies = copies;\n result.pageSetup = ps;\n }\n\n // extLst — preserved verbatim\n const extEl = findChild(el, \"extLst\");\n if (extEl) result.extLst = stringifyElement(extEl);\n\n return result as DialogsheetOptions;\n },\n};\n","/**\n * XML Mapping types and descriptors for SpreadsheetML documents.\n *\n * Reference: OOXML transitional, sml.xsd\n * CT_MapInfo, CT_Schema, CT_Map, CT_DataBinding,\n * CT_SingleXmlCells, CT_SingleXmlCell, CT_XmlCellPr, CT_XmlPr\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr, attrNum, escapeXml, findChild, stringifyElement } from \"@office-open/xml\";\n\n// ── Options ──\n\n/** XML schema definition (CT_Schema). Content is arbitrary (xsd:any, mixed). */\nexport interface SchemaOptions {\n /** Unique schema ID (required) */\n id: string;\n /** Schema reference (CT_Schema @SchemaRef) */\n schemaRef?: string;\n /** Namespace URI (CT_Schema @Namespace) */\n namespace?: string;\n /** Schema language (CT_Schema @SchemaLanguage) */\n schemaLanguage?: string;\n /** Raw schema content preserved verbatim (xsd:any inner XML) */\n content?: string;\n}\n\n/** Data binding (CT_DataBinding). */\nexport interface DataBindingOptions {\n /** Data binding name (CT_DataBinding@DataBindingName) */\n dataBindingName?: string;\n /** Whether this is a file binding (CT_DataBinding @FileBinding) */\n fileBinding?: boolean;\n /** Connection ID (CT_DataBinding @ConnectionID) */\n connectionId?: number;\n /** File binding name (CT_DataBinding @FileBindingName) */\n fileBindingName?: string;\n /** Load mode (CT_DataBinding@DataBindingLoadMode, required by XSD) */\n dataBindingLoadMode: number;\n}\n\n/** XML map (CT_Map). */\nexport interface MapOptions {\n /** Unique map ID (required) */\n id: number;\n /** Map name (required) */\n name: string;\n /** Root element name (required) */\n rootElement: string;\n /** Owning schema ID (required) */\n schemaId: string;\n /** Show import/export validation errors (required by XSD) */\n showImportExportValidationErrors?: boolean;\n /** Auto-fit columns (CT_Map @AutoFit, required by XSD) */\n autoFit?: boolean;\n /** Append new data (CT_Map @Append, required by XSD) */\n append?: boolean;\n /** Preserve sort/autofilter layout (CT_Map @PreserveSortAFLayout, required by XSD) */\n preserveSortAFLayout?: boolean;\n /** Preserve formatting (CT_Map @PreserveFormat, required by XSD) */\n preserveFormat?: boolean;\n /** Data binding (DataBinding child) */\n dataBinding?: DataBindingOptions;\n}\n\n/** Options for xl/xmlMaps.xml (CT_MapInfo). */\nexport interface MapInfoOptions {\n /** Selection namespaces declaration (required) */\n selectionNamespaces: string;\n /** Schema definitions */\n schemas: SchemaOptions[];\n /** XML maps */\n maps: MapOptions[];\n}\n\n/** XML cell properties (CT_XmlPr). */\nexport interface XmlPropertiesOptions {\n /** Owning map ID (required) */\n mapId: number;\n /** XPath expression (required) */\n xpath: string;\n /** XML data type (required) */\n xmlDataType: string;\n}\n\n/** Cell properties of a single-cell XML table (CT_XmlCellPr). */\nexport interface XmlCellPropertiesOptions {\n /** Table ID (required) */\n id: number;\n /** Unique name (CT_XmlCellPr @uniqueName) */\n uniqueName?: string;\n /** XML properties (required) */\n xmlPr: XmlPropertiesOptions;\n}\n\n/** Single-cell XML table entry (CT_SingleXmlCell). */\nexport interface SingleXmlCellOptions {\n /** Table ID (required) */\n id: number;\n /** Cell reference, e.g. \"A1\" (CT_SingleXmlCell @r, required) */\n reference: string;\n /** Connection ID (required) */\n connectionId: number;\n /** Cell properties (required) */\n xmlCellPr: XmlCellPropertiesOptions;\n}\n\n/** Options for xl/tables/tableSingleCells{n}.xml (CT_SingleXmlCells). */\nexport interface SingleXmlCellsOptions {\n /** Single-cell XML tables */\n cells: SingleXmlCellOptions[];\n}\n\n/** Table column XML mapping (CT_XmlColumnPr) — lives on table columns, not this part. */\nexport interface XmlColumnPropertiesOptions {\n /** XPath expression (required) */\n xpath: string;\n /** XML data type (required) */\n xmlDataType: string;\n /** Owning map ID (required) */\n mapId: number;\n /** Denormalized (CT_XmlColumnPr @denormalized) */\n denormalized?: boolean;\n}\n\n// ── Descriptors ──\n\nexport const mapInfoDesc: CustomDescriptor<MapInfoOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n `<MapInfo xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" SelectionNamespaces=\"${escapeXml(opts.selectionNamespaces)}\">`,\n ];\n for (const s of opts.schemas) {\n const attrs: string[] = [`ID=\"${escapeXml(s.id)}\"`];\n if (s.schemaRef !== undefined) attrs.push(`SchemaRef=\"${escapeXml(s.schemaRef)}\"`);\n if (s.namespace !== undefined) attrs.push(`Namespace=\"${escapeXml(s.namespace)}\"`);\n if (s.schemaLanguage !== undefined)\n attrs.push(`SchemaLanguage=\"${escapeXml(s.schemaLanguage)}\"`);\n if (s.content) p.push(`<Schema ${attrs.join(\" \")}>${s.content}</Schema>`);\n else p.push(`<Schema ${attrs.join(\" \")}/>`);\n }\n for (const m of opts.maps) {\n const attrs: string[] = [\n `ID=\"${m.id}\"`,\n `Name=\"${escapeXml(m.name)}\"`,\n `RootElement=\"${escapeXml(m.rootElement)}\"`,\n `SchemaID=\"${escapeXml(m.schemaId)}\"`,\n `ShowImportExportValidationErrors=\"${m.showImportExportValidationErrors ? 1 : 0}\"`,\n `AutoFit=\"${m.autoFit ? 1 : 0}\"`,\n `Append=\"${m.append ? 1 : 0}\"`,\n `PreserveSortAFLayout=\"${m.preserveSortAFLayout ? 1 : 0}\"`,\n `PreserveFormat=\"${m.preserveFormat ? 1 : 0}\"`,\n ];\n if (m.dataBinding) {\n const d = m.dataBinding;\n const dAttrs: string[] = [];\n if (d.dataBindingName !== undefined)\n dAttrs.push(`DataBindingName=\"${escapeXml(d.dataBindingName)}\"`);\n if (d.fileBinding) dAttrs.push('FileBinding=\"1\"');\n if (d.connectionId !== undefined) dAttrs.push(`ConnectionID=\"${d.connectionId}\"`);\n if (d.fileBindingName !== undefined)\n dAttrs.push(`FileBindingName=\"${escapeXml(d.fileBindingName)}\"`);\n dAttrs.push(`DataBindingLoadMode=\"${d.dataBindingLoadMode}\"`);\n p.push(`<Map ${attrs.join(\" \")}><DataBinding ${dAttrs.join(\" \")}/></Map>`);\n } else {\n p.push(`<Map ${attrs.join(\" \")}/>`);\n }\n }\n p.push(\"</MapInfo>\");\n return p.join(\"\");\n },\n\n parse(el, _ctx) {\n const schemas: SchemaOptions[] = [];\n const maps: MapOptions[] = [];\n for (const child of el.elements ?? []) {\n if (child.name === \"Schema\") {\n const s: Partial<SchemaOptions> = { id: attr(child, \"ID\") ?? \"\" };\n if (attr(child, \"SchemaRef\") !== undefined) s.schemaRef = attr(child, \"SchemaRef\");\n if (attr(child, \"Namespace\") !== undefined) s.namespace = attr(child, \"Namespace\");\n if (attr(child, \"SchemaLanguage\") !== undefined)\n s.schemaLanguage = attr(child, \"SchemaLanguage\");\n const inner = (child.elements ?? []).map((c) => stringifyElement(c)).join(\"\");\n if (inner) s.content = inner;\n schemas.push(s as SchemaOptions);\n } else if (child.name === \"Map\") {\n const m: Partial<MapOptions> = {\n id: attrNum(child, \"ID\") ?? 0,\n name: attr(child, \"Name\") ?? \"\",\n rootElement: attr(child, \"RootElement\") ?? \"\",\n schemaId: attr(child, \"SchemaID\") ?? \"\",\n };\n if (parseOnOff(attr(child, \"ShowImportExportValidationErrors\")))\n m.showImportExportValidationErrors = true;\n if (parseOnOff(attr(child, \"AutoFit\"))) m.autoFit = true;\n if (parseOnOff(attr(child, \"Append\"))) m.append = true;\n if (parseOnOff(attr(child, \"PreserveSortAFLayout\"))) m.preserveSortAFLayout = true;\n if (parseOnOff(attr(child, \"PreserveFormat\"))) m.preserveFormat = true;\n const dEl = findChild(child, \"DataBinding\");\n if (dEl) {\n const d: DataBindingOptions = { dataBindingLoadMode: 0 };\n if (attr(dEl, \"DataBindingName\") !== undefined)\n d.dataBindingName = attr(dEl, \"DataBindingName\");\n if (parseOnOff(attr(dEl, \"FileBinding\"))) d.fileBinding = true;\n const cid = attrNum(dEl, \"ConnectionID\");\n if (cid !== undefined) d.connectionId = cid;\n if (attr(dEl, \"FileBindingName\") !== undefined)\n d.fileBindingName = attr(dEl, \"FileBindingName\");\n const mode = attrNum(dEl, \"DataBindingLoadMode\");\n if (mode !== undefined) d.dataBindingLoadMode = mode;\n m.dataBinding = d;\n }\n maps.push(m as MapOptions);\n }\n }\n return {\n selectionNamespaces: attr(el, \"SelectionNamespaces\") ?? \"\",\n schemas,\n maps,\n };\n },\n};\n\nexport const singleXmlCellsDesc: CustomDescriptor<SingleXmlCellsOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n const p: string[] = [\n '<singleXmlCells xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">',\n ];\n for (const c of opts.cells) {\n const pr = c.xmlCellPr;\n const prAttrs: string[] = [`id=\"${pr.id}\"`];\n if (pr.uniqueName !== undefined) prAttrs.push(`uniqueName=\"${escapeXml(pr.uniqueName)}\"`);\n p.push(\n `<singleXmlCell id=\"${c.id}\" r=\"${escapeXml(c.reference)}\" connectionId=\"${c.connectionId}\">` +\n `<xmlCellPr ${prAttrs.join(\" \")}>` +\n `<xmlPr mapId=\"${pr.xmlPr.mapId}\" xpath=\"${escapeXml(pr.xmlPr.xpath)}\" xmlDataType=\"${escapeXml(pr.xmlPr.xmlDataType)}\"/>` +\n `</xmlCellPr></singleXmlCell>`,\n );\n }\n p.push(\"</singleXmlCells>\");\n return p.join(\"\");\n },\n\n parse(el: Element, _ctx) {\n const cells: SingleXmlCellOptions[] = [];\n for (const cEl of el.elements ?? []) {\n if (cEl.name !== \"singleXmlCell\") continue;\n const prEl = findChild(cEl, \"xmlCellPr\");\n if (!prEl) continue;\n const xmlPrEl = findChild(prEl, \"xmlPr\");\n if (!xmlPrEl) continue;\n const pr: Partial<XmlCellPropertiesOptions> = { id: attrNum(prEl, \"id\") ?? 0 };\n if (attr(prEl, \"uniqueName\") !== undefined) pr.uniqueName = attr(prEl, \"uniqueName\");\n pr.xmlPr = {\n mapId: attrNum(xmlPrEl, \"mapId\") ?? 0,\n xpath: attr(xmlPrEl, \"xpath\") ?? \"\",\n xmlDataType: attr(xmlPrEl, \"xmlDataType\") ?? \"\",\n };\n cells.push({\n id: attrNum(cEl, \"id\") ?? 0,\n reference: attr(cEl, \"r\") ?? \"\",\n connectionId: attrNum(cEl, \"connectionId\") ?? 0,\n xmlCellPr: pr as XmlCellPropertiesOptions,\n });\n }\n return { cells };\n },\n};\n","/**\n * Revision log — per-revision parse helpers and shared attribute readers.\n *\n * @module\n */\n\nimport { parseOnOff } from \"@office-open/core\";\nimport { attr, escapeXml, findChild, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport type {\n RevisionAction,\n RevisionAutoFormattingOptions,\n RevisionCellChangeOptions,\n RevisionCommentOptions,\n RevisionConflictOptions,\n RevisionDefinedNameOptions,\n RevisionEntry,\n RevisionFormattingOptions,\n RevisionInsertSheetOptions,\n RevisionMoveOptions,\n RevisionNestedChild,\n RevisionRowColumnOptions,\n RevisionSheetRenameOptions,\n RevisionUndoOptions,\n RowColumnAction,\n} from \"./types\";\n\n// ── Per-revision parse ──\n\n/** Parses the shared undo/rcc/rfmt nested choice group on rrc/rm. */\nfunction parseNestedChildren(el: XmlElement): RevisionNestedChild[] {\n const children: RevisionNestedChild[] = [];\n for (const child of el.elements ?? []) {\n if (child.type !== \"element\") continue;\n if (child.name === \"undo\") {\n const undo: Partial<RevisionUndoOptions> = {\n index: Number(attr(child, \"index\") ?? \"0\"),\n expression: (attr(child, \"exp\") ?? \"ref\") as RevisionUndoOptions[\"expression\"],\n undoRange: attr(child, \"dr\") ?? \"\",\n };\n readBool(child, \"ref3D\", (v) => (undo.ref3D = v));\n readBool(child, \"array\", (v) => (undo.array = v));\n readBool(child, \"v\", (v) => (undo.value = v));\n readBool(child, \"nf\", (v) => (undo.numberFormat = v));\n readBool(child, \"cs\", (v) => (undo.conditionalStyle = v));\n readStr(child, \"dn\", (v) => (undo.definedName = v));\n readStr(child, \"r\", (v) => (undo.reference = v));\n readNum(child, \"sId\", (v) => (undo.sId = v));\n children.push({ kind: \"undo\", data: undo as RevisionUndoOptions });\n } else if (child.name === \"rcc\") {\n const nested = parseEntry(child);\n if (nested?.type === \"cellChange\") children.push({ kind: \"cellChange\", data: nested.data });\n } else if (child.name === \"rfmt\") {\n const nested = parseEntry(child);\n if (nested?.type === \"formatting\") children.push({ kind: \"formatting\", data: nested.data });\n }\n }\n return children;\n}\n\nfunction elementToXml(el: XmlElement): string {\n const attrStr = Object.entries(el.attributes ?? {})\n .map(([k, v]) => ` ${k}=\"${escapeXml(String(v))}\"`)\n .join(\"\");\n const inner = el.elements\n ? el.elements\n .map((c) => {\n if (c.type === \"text\") return escapeXml(textOf({ elements: [c] } as XmlElement) ?? \"\");\n if (c.type === \"element\") return elementToXml(c as XmlElement);\n return \"\";\n })\n .join(\"\")\n : \"\";\n return `<${el.name}${attrStr}>${inner}</${el.name}>`;\n}\n\n/** Returns the first element child of a node as raw XML string. */\nfunction firstChildXml(el: XmlElement | null, name: string): string | undefined {\n const child = findChild(el ?? undefined, name);\n return child ? elementToXml(child) : undefined;\n}\n\nfunction parseBool(el: XmlElement, name: string): boolean | undefined {\n const v = attr(el, name);\n if (v === undefined) return undefined;\n // nativeTypeAttributes (xlsx parse path) coerces \"1\" to number 1.\n return parseOnOff(v) ?? false;\n}\n\nexport function parseEntry(el: XmlElement): RevisionEntry | undefined {\n switch (el.name) {\n case \"rrc\": {\n const d: Partial<RevisionRowColumnOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sId\") ?? \"0\"),\n ref: attr(el, \"ref\") ?? \"\",\n action: (attr(el, \"action\") ?? \"insertRow\") as RowColumnAction,\n };\n const endOfList = parseBool(el, \"eol\");\n if (endOfList) d.endOfList = endOfList;\n const edge = parseBool(el, \"edge\");\n if (edge) d.edge = edge;\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const children = parseNestedChildren(el);\n if (children.length > 0) d.children = children;\n return { type: \"rowColumn\", data: d as RevisionRowColumnOptions };\n }\n case \"rm\": {\n const d: Partial<RevisionMoveOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n source: attr(el, \"source\") ?? \"\",\n destination: attr(el, \"destination\") ?? \"\",\n };\n const sourceSheetId = attr(el, \"sourceSheetId\");\n if (sourceSheetId !== undefined) d.sourceSheetId = Number(sourceSheetId);\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const children = parseNestedChildren(el);\n if (children.length > 0) d.children = children;\n return { type: \"move\", data: d as RevisionMoveOptions };\n }\n case \"rcv\":\n return {\n type: \"customView\",\n data: {\n guid: attr(el, \"guid\") ?? \"\",\n action: (attr(el, \"action\") ?? \"add\") as RevisionAction,\n },\n };\n case \"rsnm\": {\n const d: Partial<RevisionSheetRenameOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n oldName: attr(el, \"oldName\") ?? \"\",\n newName: attr(el, \"newName\") ?? \"\",\n };\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n return { type: \"sheetRename\", data: d as RevisionSheetRenameOptions };\n }\n case \"ris\": {\n const d: Partial<RevisionInsertSheetOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n name: attr(el, \"name\") ?? \"\",\n sheetPosition: Number(attr(el, \"sheetPosition\") ?? \"0\"),\n };\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n return { type: \"insertSheet\", data: d as RevisionInsertSheetOptions };\n }\n case \"rcc\": {\n const d: Partial<RevisionCellChangeOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n sheetId: Number(attr(el, \"sId\") ?? \"0\"),\n newCellXml: firstChildXml(el, \"nc\") ?? \"\",\n };\n const hasOldDxf = parseBool(el, \"odxf\");\n if (hasOldDxf) d.hasOldDxf = hasOldDxf;\n const xfDxf = parseBool(el, \"xfDxf\");\n if (xfDxf) d.xfDxf = xfDxf;\n const style = parseBool(el, \"s\");\n if (style) d.style = style;\n const hasDxf = parseBool(el, \"dxf\");\n if (hasDxf) d.hasDxf = hasDxf;\n const numFmtId = attr(el, \"numFmtId\");\n if (numFmtId !== undefined) d.numFmtId = Number(numFmtId);\n const quotePrefix = parseBool(el, \"quotePrefix\");\n if (quotePrefix) d.quotePrefix = quotePrefix;\n const oldQuotePrefix = parseBool(el, \"oldQuotePrefix\");\n if (oldQuotePrefix) d.oldQuotePrefix = oldQuotePrefix;\n const phonetic = parseBool(el, \"ph\");\n if (phonetic) d.phonetic = phonetic;\n const oldPhonetic = parseBool(el, \"oldPh\");\n if (oldPhonetic) d.oldPhonetic = oldPhonetic;\n const endOfList = parseBool(el, \"endOfListFormulaUpdate\");\n if (endOfList) d.endOfListFormulaUpdate = endOfList;\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const oc = firstChildXml(el, \"oc\");\n if (oc) d.oldCellXml = oc;\n const odxf = firstChildXml(el, \"odxf\");\n if (odxf) d.oldDxfXml = odxf;\n const ndxf = firstChildXml(el, \"ndxf\");\n if (ndxf) d.newDxfXml = ndxf;\n return { type: \"cellChange\", data: d as RevisionCellChangeOptions };\n }\n case \"rfmt\": {\n const d: Partial<RevisionFormattingOptions> = {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n sqref: attr(el, \"sqref\") ?? \"\",\n };\n const xfDxf = parseBool(el, \"xfDxf\");\n if (xfDxf) d.xfDxf = xfDxf;\n const style = parseBool(el, \"s\");\n if (style) d.style = style;\n const start = attr(el, \"start\");\n if (start !== undefined) d.start = Number(start);\n const length = attr(el, \"length\");\n if (length !== undefined) d.length = Number(length);\n const dxfXml = firstChildXml(el, \"dxf\");\n if (dxfXml) d.dxfXml = dxfXml;\n return { type: \"formatting\", data: d as RevisionFormattingOptions };\n }\n case \"raf\": {\n const d: Partial<RevisionAutoFormattingOptions> = {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n ref: attr(el, \"ref\") ?? \"\",\n };\n // AG_AutoFormat is a fixed set of optional attributes; capture verbatim.\n const autoAttrs = Object.entries(el.attributes ?? {})\n .filter(([k]) => k !== \"sheetId\" && k !== \"ref\")\n .map(([k, v]) => ` ${k}=\"${escapeXml(String(v))}\"`)\n .join(\"\");\n if (autoAttrs) d.autoFormatXml = autoAttrs;\n return { type: \"autoFormatting\", data: d as RevisionAutoFormattingOptions };\n }\n case \"rdn\": {\n const d: Partial<RevisionDefinedNameOptions> = {\n rId: Number(attr(el, \"rId\") ?? \"0\"),\n name: attr(el, \"name\") ?? \"\",\n };\n const localSheetId = attr(el, \"localSheetId\");\n if (localSheetId !== undefined) d.localSheetId = Number(localSheetId);\n readBool(el, \"customView\", (v) => (d.customView = v));\n readBool(el, \"function\", (v) => (d.function = v));\n readBool(el, \"oldFunction\", (v) => (d.oldFunction = v));\n readNum(el, \"functionGroupId\", (v) => (d.functionGroupId = v));\n readNum(el, \"oldFunctionGroupId\", (v) => (d.oldFunctionGroupId = v));\n readNum(el, \"shortcutKey\", (v) => (d.shortcutKey = v));\n readNum(el, \"oldShortcutKey\", (v) => (d.oldShortcutKey = v));\n readBool(el, \"hidden\", (v) => (d.hidden = v));\n readBool(el, \"oldHidden\", (v) => (d.oldHidden = v));\n readStr(el, \"customMenu\", (v) => (d.customMenu = v));\n readStr(el, \"oldCustomMenu\", (v) => (d.oldCustomMenu = v));\n readStr(el, \"description\", (v) => (d.description = v));\n readStr(el, \"oldDescription\", (v) => (d.oldDescription = v));\n readStr(el, \"help\", (v) => (d.help = v));\n readStr(el, \"oldHelp\", (v) => (d.oldHelp = v));\n readStr(el, \"statusBar\", (v) => (d.statusBar = v));\n readStr(el, \"oldStatusBar\", (v) => (d.oldStatusBar = v));\n readStr(el, \"comment\", (v) => (d.comment = v));\n readStr(el, \"oldComment\", (v) => (d.oldComment = v));\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const formula = findChild(el, \"formula\");\n if (formula) d.formula = textOf(formula) ?? \"\";\n const oldFormula = findChild(el, \"oldFormula\");\n if (oldFormula) d.oldFormula = textOf(oldFormula) ?? \"\";\n return { type: \"definedName\", data: d as RevisionDefinedNameOptions };\n }\n case \"rcmt\": {\n const d: Partial<RevisionCommentOptions> = {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n cell: attr(el, \"cell\") ?? \"\",\n guid: attr(el, \"guid\") ?? \"\",\n author: attr(el, \"author\") ?? \"\",\n };\n const action = attr(el, \"action\");\n if (action) d.action = action as RevisionAction;\n readBool(el, \"alwaysShow\", (v) => (d.alwaysShow = v));\n readBool(el, \"old\", (v) => (d.old = v));\n readBool(el, \"hiddenRow\", (v) => (d.hiddenRow = v));\n readBool(el, \"hiddenColumn\", (v) => (d.hiddenColumn = v));\n readNum(el, \"oldLength\", (v) => (d.oldLength = v));\n readNum(el, \"newLength\", (v) => (d.newLength = v));\n return { type: \"comment\", data: d as RevisionCommentOptions };\n }\n case \"rqt\":\n return {\n type: \"queryTableField\",\n data: {\n sheetId: Number(attr(el, \"sheetId\") ?? \"0\"),\n ref: attr(el, \"ref\") ?? \"\",\n fieldId: Number(attr(el, \"fieldId\") ?? \"0\"),\n },\n };\n case \"rcft\": {\n const d: Partial<RevisionConflictOptions> = { rId: Number(attr(el, \"rId\") ?? \"0\") };\n const undo = parseBool(el, \"ua\");\n if (undo) d.undo = undo;\n const rejected = parseBool(el, \"ra\");\n if (rejected) d.rejected = rejected;\n const sheetId = attr(el, \"sheetId\");\n if (sheetId !== undefined) d.sheetId = Number(sheetId);\n return { type: \"conflict\", data: d as RevisionConflictOptions };\n }\n default:\n return undefined;\n }\n}\n\n// ── Attribute readers (set-callback style keeps parse paths on concrete types) ──\n\nexport function readBool(el: XmlElement, name: string, set: (v: boolean) => void): void {\n const raw = attr(el, name);\n // nativeTypeAttributes (xlsx parse path) coerces \"1\" to number 1.\n if (parseOnOff(raw)) set(true);\n}\n\nexport function readNum(el: XmlElement, name: string, set: (v: number) => void): void {\n const raw = attr(el, name);\n if (raw !== undefined) set(Number(raw));\n}\n\nexport function readStr(el: XmlElement, name: string, set: (v: string) => void): void {\n const raw = attr(el, name);\n if (raw !== undefined) set(raw);\n}\n","/**\n * Revision log — per-revision stringify helpers and namespace constants.\n *\n * @module\n */\n\nimport { escapeXml } from \"@office-open/xml\";\n\nimport type { RevisionEntry, RevisionNestedChild, RevisionUndoOptions } from \"./types\";\n\n// Namespace constants shared across the headers/users/log descriptors.\nconst S_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n\n// ── Per-revision stringify ──\n\nfunction agRevData(data: { rId: number; undo?: boolean; rejected?: boolean }): string {\n let s = ` rId=\"${data.rId}\"`;\n if (data.undo) s += ` ua=\"1\"`;\n if (data.rejected) s += ` ra=\"1\"`;\n return s;\n}\n\nfunction stringifyUndo(d: RevisionUndoOptions): string {\n let a = ` index=\"${d.index}\" exp=\"${d.expression}\" dr=\"${escapeXml(d.undoRange)}\"`;\n if (d.ref3D) a += ` ref3D=\"1\"`;\n if (d.array) a += ` array=\"1\"`;\n if (d.value) a += ` v=\"1\"`;\n if (d.numberFormat) a += ` nf=\"1\"`;\n if (d.conditionalStyle) a += ` cs=\"1\"`;\n if (d.definedName !== undefined) a += ` dn=\"${escapeXml(d.definedName)}\"`;\n if (d.reference !== undefined) a += ` r=\"${escapeXml(d.reference)}\"`;\n if (d.sId !== undefined) a += ` sId=\"${d.sId}\"`;\n return `<undo${a}/>`;\n}\n\nfunction stringifyNestedChildren(children: RevisionNestedChild[] | undefined): string {\n if (!children) return \"\";\n return children\n .map((child) => {\n switch (child.kind) {\n case \"undo\":\n return stringifyUndo(child.data);\n case \"cellChange\":\n return stringifyEntry({ type: \"cellChange\", data: child.data });\n case \"formatting\":\n return stringifyEntry({ type: \"formatting\", data: child.data });\n }\n })\n .join(\"\");\n}\n\nexport function stringifyEntry(entry: RevisionEntry): string {\n switch (entry.type) {\n case \"rowColumn\": {\n const d = entry.data;\n let a = agRevData(d) + ` sId=\"${d.sheetId}\" ref=\"${escapeXml(d.ref)}\" action=\"${d.action}\"`;\n if (d.endOfList) a += ` eol=\"1\"`;\n if (d.edge) a += ` edge=\"1\"`;\n return `<rrc${a}>${stringifyNestedChildren(d.children)}</rrc>`;\n }\n case \"move\": {\n const d = entry.data;\n let a =\n agRevData(d) +\n ` sheetId=\"${d.sheetId}\" source=\"${escapeXml(d.source)}\" destination=\"${escapeXml(d.destination)}\"`;\n if (d.sourceSheetId !== undefined) a += ` sourceSheetId=\"${d.sourceSheetId}\"`;\n return `<rm${a}>${stringifyNestedChildren(d.children)}</rm>`;\n }\n case \"customView\": {\n const d = entry.data;\n return `<rcv guid=\"${escapeXml(d.guid)}\" action=\"${d.action}\"/>`;\n }\n case \"sheetRename\": {\n const d = entry.data;\n return `<rsnm${agRevData(d)} sheetId=\"${d.sheetId}\" oldName=\"${escapeXml(\n d.oldName,\n )}\" newName=\"${escapeXml(d.newName)}\"/>`;\n }\n case \"insertSheet\": {\n const d = entry.data;\n return `<ris${agRevData(d)} sheetId=\"${d.sheetId}\" name=\"${escapeXml(\n d.name,\n )}\" sheetPosition=\"${d.sheetPosition}\"/>`;\n }\n case \"cellChange\": {\n const d = entry.data;\n let a = agRevData(d) + ` sId=\"${d.sheetId}\"`;\n if (d.hasOldDxf) a += ` odxf=\"1\"`;\n if (d.xfDxf) a += ` xfDxf=\"1\"`;\n if (d.style) a += ` s=\"1\"`;\n if (d.hasDxf) a += ` dxf=\"1\"`;\n if (d.numFmtId !== undefined) a += ` numFmtId=\"${d.numFmtId}\"`;\n if (d.quotePrefix) a += ` quotePrefix=\"1\"`;\n if (d.oldQuotePrefix) a += ` oldQuotePrefix=\"1\"`;\n if (d.phonetic) a += ` ph=\"1\"`;\n if (d.oldPhonetic) a += ` oldPh=\"1\"`;\n if (d.endOfListFormulaUpdate) a += ` endOfListFormulaUpdate=\"1\"`;\n const children = [d.oldCellXml ?? \"\", d.newCellXml, d.oldDxfXml ?? \"\", d.newDxfXml ?? \"\"]\n .filter(Boolean)\n .join(\"\");\n return `<rcc${a}>${children}</rcc>`;\n }\n case \"formatting\": {\n const d = entry.data;\n let a = ` sheetId=\"${d.sheetId}\" sqref=\"${escapeXml(d.sqref)}\"`;\n if (d.xfDxf) a += ` xfDxf=\"1\"`;\n if (d.style) a += ` s=\"1\"`;\n if (d.start !== undefined) a += ` start=\"${d.start}\"`;\n if (d.length !== undefined) a += ` length=\"${d.length}\"`;\n return `<rfmt${a}>${d.dxfXml ?? \"\"}</rfmt>`;\n }\n case \"autoFormatting\": {\n const d = entry.data;\n return `<raf sheetId=\"${d.sheetId}\" ref=\"${escapeXml(d.ref)}\"${d.autoFormatXml ?? \"\"}/>`;\n }\n case \"definedName\": {\n const d = entry.data;\n let a = agRevData(d) + ` name=\"${escapeXml(d.name)}\"`;\n if (d.localSheetId !== undefined) a += ` localSheetId=\"${d.localSheetId}\"`;\n if (d.customView) a += ` customView=\"1\"`;\n if (d.function) a += ` function=\"1\"`;\n if (d.oldFunction) a += ` oldFunction=\"1\"`;\n if (d.functionGroupId !== undefined) a += ` functionGroupId=\"${d.functionGroupId}\"`;\n if (d.oldFunctionGroupId !== undefined) a += ` oldFunctionGroupId=\"${d.oldFunctionGroupId}\"`;\n if (d.shortcutKey !== undefined) a += ` shortcutKey=\"${d.shortcutKey}\"`;\n if (d.oldShortcutKey !== undefined) a += ` oldShortcutKey=\"${d.oldShortcutKey}\"`;\n if (d.hidden) a += ` hidden=\"1\"`;\n if (d.oldHidden) a += ` oldHidden=\"1\"`;\n const xstring = (v: string | undefined, attr: string) =>\n v !== undefined ? ` ${attr}=\"${escapeXml(v)}\"` : \"\";\n a += xstring(d.customMenu, \"customMenu\") + xstring(d.oldCustomMenu, \"oldCustomMenu\");\n a += xstring(d.description, \"description\") + xstring(d.oldDescription, \"oldDescription\");\n a += xstring(d.help, \"help\") + xstring(d.oldHelp, \"oldHelp\");\n a += xstring(d.statusBar, \"statusBar\") + xstring(d.oldStatusBar, \"oldStatusBar\");\n a += xstring(d.comment, \"comment\") + xstring(d.oldComment, \"oldComment\");\n const children = [\n d.formula !== undefined ? `<formula>${escapeXml(d.formula)}</formula>` : \"\",\n d.oldFormula !== undefined ? `<oldFormula>${escapeXml(d.oldFormula)}</oldFormula>` : \"\",\n ]\n .filter(Boolean)\n .join(\"\");\n return `<rdn${a}>${children}</rdn>`;\n }\n case \"comment\": {\n const d = entry.data;\n let a = ` sheetId=\"${d.sheetId}\" cell=\"${escapeXml(d.cell)}\" guid=\"${escapeXml(\n d.guid,\n )}\" action=\"${d.action ?? \"add\"}\" author=\"${escapeXml(d.author)}\"`;\n if (d.alwaysShow) a += ` alwaysShow=\"1\"`;\n if (d.old) a += ` old=\"1\"`;\n if (d.hiddenRow) a += ` hiddenRow=\"1\"`;\n if (d.hiddenColumn) a += ` hiddenColumn=\"1\"`;\n if (d.oldLength !== undefined) a += ` oldLength=\"${d.oldLength}\"`;\n if (d.newLength !== undefined) a += ` newLength=\"${d.newLength}\"`;\n return `<rcmt${a}/>`;\n }\n case \"queryTableField\": {\n const d = entry.data;\n return `<rqt sheetId=\"${d.sheetId}\" ref=\"${escapeXml(d.ref)}\" fieldId=\"${d.fieldId}\"/>`;\n }\n case \"conflict\": {\n const d = entry.data;\n let a = agRevData(d);\n if (d.sheetId !== undefined) a += ` sheetId=\"${d.sheetId}\"`;\n return `<rcft${a}/>`;\n }\n }\n}\n\nexport { R_NS, S_NS };\n","/**\n * Revision headers — xl/revisionHeaders.xml (CT_RevisionHeaders) descriptor.\n *\n * Index of revision logs in a shared workbook.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, children, escapeXml, findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { readBool, readNum } from \"./parse\";\nimport { R_NS, S_NS } from \"./stringify\";\nimport type { RevisionHeaderEntry, RevisionHeadersOptions } from \"./types\";\n\nfunction stringifyHeader(h: RevisionHeaderEntry): string {\n const sheetIds = h.sheetIds.map((id) => `<sheetId val=\"${id}\"/>`).join(\"\");\n const reviewedXml =\n h.reviewed && h.reviewed.length > 0\n ? `<reviewedList count=\"${h.reviewed.length}\">${h.reviewed\n .map((r) => `<reviewed rId=\"${r}\"/>`)\n .join(\"\")}</reviewedList>`\n : \"\";\n let attrs =\n ` guid=\"${escapeXml(h.guid)}\" dateTime=\"${escapeXml(h.dateTime)}\"` +\n ` maxSheetId=\"${h.maxSheetId}\" userName=\"${escapeXml(h.userName)}\"` +\n ` r:id=\"${escapeXml(h.rId)}\"`;\n if (h.minRId !== undefined) attrs += ` minRId=\"${h.minRId}\"`;\n if (h.maxRId !== undefined) attrs += ` maxRId=\"${h.maxRId}\"`;\n return `<header${attrs}><sheetIdMap count=\"${h.sheetIds.length}\">${sheetIds}</sheetIdMap>${reviewedXml}</header>`;\n}\n\nfunction parseHeader(el: XmlElement): RevisionHeaderEntry {\n const guid = attr(el, \"guid\") ?? \"\";\n const dateTime = attr(el, \"dateTime\") ?? \"\";\n const userName = attr(el, \"userName\") ?? \"\";\n // r:id lives in the relationships namespace\n const rId = String(el.attributes?.[\"r:id\"] ?? el.attributes?.[\"id\"] ?? \"\");\n const maxSheetId = Number(attr(el, \"maxSheetId\") ?? \"0\");\n const sheetIdMap = findChild(el, \"sheetIdMap\");\n const sheetIds = children(sheetIdMap, \"sheetId\").map((s) => Number(attr(s, \"val\") ?? \"0\"));\n const result: RevisionHeaderEntry = { guid, dateTime, userName, rId, maxSheetId, sheetIds };\n const reviewedList = findChild(el, \"reviewedList\");\n if (reviewedList) {\n const reviewed = children(reviewedList, \"reviewed\").map((r) => Number(attr(r, \"rId\") ?? \"0\"));\n if (reviewed.length > 0) result.reviewed = reviewed;\n }\n const minRId = attr(el, \"minRId\");\n if (minRId !== undefined) result.minRId = Number(minRId);\n const maxRId = attr(el, \"maxRId\");\n if (maxRId !== undefined) result.maxRId = Number(maxRId);\n return result;\n}\n\nexport const revisionHeadersDesc: CustomDescriptor<RevisionHeadersOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.headers.length === 0) return undefined;\n let attrs = ` xmlns=\"${S_NS}\" xmlns:r=\"${R_NS}\" guid=\"${escapeXml(opts.guid)}\"`;\n if (opts.lastGuid) attrs += ` lastGuid=\"${escapeXml(opts.lastGuid)}\"`;\n if (opts.shared !== undefined) attrs += ` shared=\"${opts.shared ? 1 : 0}\"`;\n if (opts.diskRevisions !== undefined) attrs += ` diskRevisions=\"${opts.diskRevisions ? 1 : 0}\"`;\n if (opts.history !== undefined) attrs += ` history=\"${opts.history ? 1 : 0}\"`;\n if (opts.trackRevisions !== undefined)\n attrs += ` trackRevisions=\"${opts.trackRevisions ? 1 : 0}\"`;\n if (opts.exclusive !== undefined) attrs += ` exclusive=\"${opts.exclusive ? 1 : 0}\"`;\n if (opts.revisionId !== undefined) attrs += ` revisionId=\"${opts.revisionId}\"`;\n if (opts.version !== undefined) attrs += ` version=\"${opts.version}\"`;\n if (opts.keepChangeHistory !== undefined)\n attrs += ` keepChangeHistory=\"${opts.keepChangeHistory ? 1 : 0}\"`;\n if (opts.protected !== undefined) attrs += ` protected=\"${opts.protected ? 1 : 0}\"`;\n if (opts.preserveHistory !== undefined) attrs += ` preserveHistory=\"${opts.preserveHistory}\"`;\n return `<headers${attrs}>${opts.headers.map(stringifyHeader).join(\"\")}</headers>`;\n },\n\n parse(el, _ctx) {\n const guid = attr(el, \"guid\") ?? \"\";\n const headers = children(el, \"header\").map(parseHeader);\n const result: Partial<RevisionHeadersOptions> = { guid, headers };\n const lastGuid = attr(el, \"lastGuid\");\n if (lastGuid !== undefined) result.lastGuid = lastGuid;\n readBool(el, \"shared\", (v) => (result.shared = v));\n readBool(el, \"diskRevisions\", (v) => (result.diskRevisions = v));\n readBool(el, \"history\", (v) => (result.history = v));\n readBool(el, \"trackRevisions\", (v) => (result.trackRevisions = v));\n readBool(el, \"exclusive\", (v) => (result.exclusive = v));\n readNum(el, \"revisionId\", (v) => (result.revisionId = v));\n readNum(el, \"version\", (v) => (result.version = v));\n readBool(el, \"keepChangeHistory\", (v) => (result.keepChangeHistory = v));\n readBool(el, \"protected\", (v) => (result.protected = v));\n readNum(el, \"preserveHistory\", (v) => (result.preserveHistory = v));\n return result as RevisionHeadersOptions;\n },\n};\n","/**\n * Users — xl/users.xml (CT_Users, sml.xsd:2100) descriptor.\n *\n * Shared-workbook user list.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attr, children, escapeXml } from \"@office-open/xml\";\n\nimport { S_NS } from \"./stringify\";\nimport type { UsersOptions } from \"./types\";\n\nexport const usersDesc: CustomDescriptor<UsersOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (!opts.users || opts.users.length === 0) return undefined;\n const users = opts.users\n .map(\n (u) =>\n `<userInfo guid=\"${escapeXml(u.guid)}\" name=\"${escapeXml(u.name)}\" id=\"${u.id}\"` +\n ` dateTime=\"${escapeXml(u.dateTime)}\"/>`,\n )\n .join(\"\");\n return `<users xmlns=\"${S_NS}\" count=\"${opts.users.length}\">${users}</users>`;\n },\n\n parse(el, _ctx) {\n const users = children(el, \"userInfo\").map((u) => ({\n guid: attr(u, \"guid\") ?? \"\",\n name: attr(u, \"name\") ?? \"\",\n id: Number(attr(u, \"id\") ?? \"0\"),\n dateTime: attr(u, \"dateTime\") ?? \"\",\n }));\n const result: Partial<UsersOptions> = {};\n if (users.length > 0) result.users = users;\n return result as UsersOptions;\n },\n};\n","/**\n * Revision log descriptors for shared-workbook change tracking.\n *\n * Three parts:\n * - xl/revisionHeaders.xml (CT_RevisionHeaders) — index of revision logs\n * - xl/revisions/revisionN.xml (CT_Revisions) — one log per header entry\n * - xl/users.xml (CT_Users) — shared-workbook users\n *\n * Reference: OOXML transitional, sml.xsd — CT_RevisionHeaders (:1860),\n * CT_RevisionHeader (:1898), CT_Revisions (:1877, 12 revision elements),\n * CT_Users (:2100), AG_RevData (:1893).\n *\n * Nested CT_Cell (oc/nc) and CT_Dxf (odxf/ndxf/dxf) carry through verbatim as\n * `*Xml` strings — their full content model is large and revision round-trip only\n * needs lossless preservation, not a re-authored abstraction.\n *\n * @module\n */\n\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nimport { parseEntry } from \"./parse\";\nimport { S_NS, stringifyEntry } from \"./stringify\";\nimport type { RevisionLogOptions } from \"./types\";\n\nexport const revisionLogDesc: CustomDescriptor<RevisionLogOptions> = {\n kind: \"custom\",\n\n stringify(opts, _ctx) {\n if (opts.revisions.length === 0) return undefined;\n return `<revisions xmlns=\"${S_NS}\">${opts.revisions.map(stringifyEntry).join(\"\")}</revisions>`;\n },\n\n parse(el, _ctx) {\n const revisions: RevisionLogOptions[\"revisions\"] = [];\n for (const child of el.elements ?? []) {\n if (child.type !== \"element\") continue;\n const entry = parseEntry(child as XmlElement);\n if (entry) revisions.push(entry);\n }\n return { revisions } as RevisionLogOptions;\n },\n};\n","/**\n * XLSX compile context — write and read contexts for the descriptor pipeline.\n *\n * @module\n */\n\nimport {\n ChartCollection,\n partPathToRelsPath,\n Relationships,\n resolveRelationshipTarget,\n type RelationshipType,\n} from \"@office-open/core\";\nimport type { HyperlinkTarget, ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { SharedStrings } from \"@parts/shared-strings\";\nimport { Styles } from \"@parts/styles\";\nimport type { DxfOptions, StyleOptions, StylesParseResult } from \"@parts/styles\";\nimport type { PivotCacheReference } from \"@parts/workbook\";\nimport { Media, type MediaData } from \"@shared/media\";\n\nimport type { XlsxDocument } from \"./parse\";\n\n// ── Write Context ──\n\n/**\n * XLSX-specific write context.\n *\n * Holds mutable state that accumulates during the compile phase:\n * shared strings, styles, media, charts, content types, and relationships.\n */\nexport interface HyperlinkEntry {\n key: string;\n url: string;\n tooltip?: string;\n}\n\nexport class XlsxWriteContext implements WriteContext {\n sharedStrings = new SharedStrings();\n styles = new Styles();\n media = new Media<MediaData>();\n charts = new ChartCollection();\n workbookRels = new Relationships();\n pivotCacheRefs: PivotCacheReference[] = [];\n private _hyperlinks = new Map<string, HyperlinkEntry>();\n\n // ── WriteContext interface (core descriptor pipeline) ──\n\n public addRelationship(type: RelationshipType, target: string, _mode?: string): string {\n return `rId${this.workbookRels.add(type, target)}`;\n }\n\n public addMedia(data: Uint8Array, type: string): string {\n // Reached by DrawingML blip fills (drawing shape picture fill) via fillDesc.\n // Image anchors still register through ctx.media directly in the compiler\n // because they carry pixel dimensions; both land in the same collection.\n const entry = this.media.addMedia(data, type, (fileName) => ({\n fileName,\n type,\n data,\n width: 0,\n height: 0,\n }));\n return `{${entry.fileName}}`;\n }\n\n public addHyperlink(key: string, target: HyperlinkTarget): void {\n // XLSX has no slide concept; stringify is strict, so reject the slide leg\n // instead of silently dropping it.\n if (target.slide !== undefined) {\n throw new Error(\"xlsx text hyperlinks cannot target slides — use url instead\");\n }\n this._hyperlinks.set(key, { key, url: target.url ?? \"\", tooltip: target.tooltip });\n }\n\n /**\n * Register a differential format and return its dxfId.\n */\n public registerDxf(opts: DxfOptions): number {\n return this.styles.registerDxf(opts);\n }\n\n /** DrawingML text hyperlinks registered by drawing shape runs (placeholder key → entry). */\n public get hyperlinks(): HyperlinkEntry[] {\n return [...this._hyperlinks.values()];\n }\n}\n\n// ── Read Context ──\n\n/**\n * XLSX-specific read context.\n *\n * Wraps an {@link XlsxDocument} to implement the core {@link ReadContext}\n * interface used by the descriptor parse pipeline.\n */\nexport class XlsxReadContext implements ReadContext {\n /** Parsed shared strings for resolving cell values. */\n public readonly sharedStrings: string[];\n /** Parsed styles (fonts, fills, borders, cellXfs). Set by parseWorkbook(). */\n public parsedStyles?: StylesParseResult;\n\n constructor(\n private xlsx: XlsxDocument,\n sharedStrings?: string[],\n ) {\n this.sharedStrings = sharedStrings ?? [];\n }\n\n public resolveRelationship(rId: string): string | undefined {\n const wbRels = this.xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n if (!wbRels?.elements) return undefined;\n for (const child of wbRels.elements) {\n if (child.name !== \"Relationship\") continue;\n if (child.attributes?.[\"Id\"] === rId) {\n const target = child.attributes[\"Target\"] as string | undefined;\n if (!target) return undefined;\n return target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`;\n }\n }\n return undefined;\n }\n\n /**\n * Resolve a relationship rId from a worksheet-level rels file.\n * Worksheet rels paths: `xl/worksheets/sheet1.xml` → `xl/worksheets/_rels/sheet1.xml.rels`\n */\n public resolveWorksheetRel(wsPath: string, rId: string): string | undefined {\n const relsPath = partPathToRelsPath(wsPath);\n const rels = this.xlsx.doc.get(relsPath);\n if (!rels?.elements) return undefined;\n for (const child of rels.elements) {\n if (child.name !== \"Relationship\") continue;\n if (child.attributes?.[\"Id\"] === rId) {\n const target = child.attributes[\"Target\"] as string | undefined;\n if (!target) return undefined;\n return resolveRelationshipTarget(wsPath, target);\n }\n }\n return undefined;\n }\n\n /**\n * Get all relationships from a worksheet rels file matching a type fragment.\n * e.g. `getWorksheetRelsByType(path, \"/comments\")` returns all comment relationships.\n */\n public getWorksheetRelsByType(\n wsPath: string,\n typeFragment: string,\n ): Array<{ rId: string; target: string }> {\n const relsPath = partPathToRelsPath(wsPath);\n const rels = this.xlsx.doc.get(relsPath);\n if (!rels?.elements) return [];\n const result: Array<{ rId: string; target: string }> = [];\n for (const child of rels.elements) {\n if (child.name !== \"Relationship\") continue;\n const type = child.attributes?.[\"Type\"] as string | undefined;\n if (!type || !type.includes(typeFragment)) continue;\n const rId = child.attributes?.[\"Id\"] as string | undefined;\n const target = child.attributes?.[\"Target\"] as string | undefined;\n if (rId && target) {\n result.push({ rId, target: resolveRelationshipTarget(wsPath, target) });\n }\n }\n return result;\n }\n\n public getPart(path: string): Element | undefined {\n return this.xlsx.doc.get(path);\n }\n\n public getRaw(path: string): Uint8Array | undefined {\n return this.xlsx.doc.getRaw(path);\n }\n\n /**\n * Resolve a cell style index to a StyleOptions object by looking up\n * the parsed cellXfs table and substituting font/fill/border/numFmt indices\n * with their resolved values.\n */\n public resolveStyle(styleIndex: number): StyleOptions | undefined {\n const ps = this.parsedStyles;\n if (!ps) return undefined;\n const { cellXfs, fonts, fills, borders, customNumFmtById } = ps;\n if (!cellXfs || styleIndex >= cellXfs.length) return undefined;\n const xf = cellXfs[styleIndex];\n if (!xf) return undefined;\n const result: StyleOptions = {};\n\n const fontId = xf.fontId;\n if (fontId !== undefined && fonts && fontId < fonts.length) result.font = fonts[fontId];\n const fillId = xf.fillId;\n if (fillId !== undefined && fills && fillId < fills.length) result.fill = fills[fillId];\n const borderId = xf.borderId;\n if (borderId !== undefined && borders && borderId < borders.length)\n result.border = borders[borderId];\n const numFmtId = xf.numFmtId;\n if (numFmtId !== undefined && customNumFmtById) {\n const code = customNumFmtById.get(numFmtId);\n if (code !== undefined) result.numFmt = code;\n }\n if (xf.alignment) result.alignment = xf.alignment;\n if (xf.protection) result.protection = xf.protection;\n if (xf.quotePrefix) result.quotePrefix = xf.quotePrefix;\n if (xf.pivotButton) result.pivotButton = xf.pivotButton;\n\n return result as StyleOptions;\n }\n}\n","/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport {\n appPropertiesDesc,\n customPropertiesDesc,\n parseArchive,\n parseCorePropsElement,\n} from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport { partPathToRelsPath, toUint8Array } from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport { chartSpaceDesc } from \"@office-open/core/chart\";\nimport type { ChartSeriesData } from \"@office-open/core/chart\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport { themeDesc } from \"@office-open/core/theme\";\nimport type { Element } from \"@office-open/xml\";\nimport type { ParseOptions } from \"@office-open/xml\";\nimport { attr, findChild } from \"@office-open/xml\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport type { ChartsheetOptions } from \"@parts/chartsheet\";\nimport { commentsDesc, mergeNoteAnchors, vmlNotesDesc } from \"@parts/comments\";\nimport { connectionsDesc } from \"@parts/connection\";\nimport { dialogsheetDesc } from \"@parts/dialogsheet\";\nimport type { DialogsheetOptions } from \"@parts/dialogsheet\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { ExternalLinkOptions } from \"@parts/external-link\";\nimport type { SharedWorkbookOptions, WorkbookOptions } from \"@parts/file\";\nimport { metadataDesc } from \"@parts/metadata\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport type { PivotCacheDefParseResult, PivotCacheRecordsParseResult } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport type { ConsolidateFunction, PivotTableOptions } from \"@parts/pivot/pivot-utils\";\nimport { queryTableDesc } from \"@parts/query-table\";\nimport type { QueryTableOptions } from \"@parts/query-table\";\nimport {\n revisionHeadersDesc,\n revisionLogDesc,\n usersDesc,\n type RevisionLogOptions,\n} from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport type { SharedStringsDocOptions } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport type { TableOptions } from \"@parts/table\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport { worksheetDesc } from \"@parts/worksheet\";\nimport type { WorksheetChartOptions, PictureOptions, WorksheetOptions } from \"@parts/worksheet\";\nimport { mapInfoDesc, singleXmlCellsDesc } from \"@parts/xml-mapping\";\nimport type { SingleXmlCellOptions } from \"@parts/xml-mapping\";\n\nimport { XlsxReadContext } from \"./context\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n worksheets: string[];\n charts: string[];\n media: string[];\n drawings: string[];\n}\n\nexport interface XlsxDocument {\n doc: ParsedArchive;\n /** xl/workbook.xml root element */\n workbook?: Element;\n /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n worksheets: string[];\n /** xl/styles.xml root element */\n styles?: Element;\n /** xl/sharedStrings.xml root element */\n sharedStrings?: Element;\n /** xl/theme/theme{n}.xml path (resolved from workbook rels) */\n theme?: string;\n partRefs: XlsxPartRefs;\n /** docProps/core.xml path */\n coreProps?: string;\n /** docProps/app.xml path */\n appProps?: string;\n /** docProps/custom.xml path */\n customProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n return paths.sort((a, b) => {\n const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n return numA - numB;\n });\n}\n\n/**\n * Worksheet parts read with sheetData deferred — the XML parser captures the\n * container's inner XML verbatim and `parseSheetDataRows` walks it directly.\n */\nconst WORKSHEET_PARSE_OPTIONS: ParseOptions = { deferElements: [\"sheetData\"] };\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n const uint8 = toUint8Array(data);\n const doc = parseArchive(uint8);\n\n const workbook = doc.get(\"xl/workbook.xml\");\n const styles = doc.get(\"xl/styles.xml\");\n const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n // Resolve worksheet paths from workbook rels\n const worksheets: string[] = [];\n const charts: string[] = [];\n const drawings: string[] = [];\n const media: string[] = [];\n let theme: string | undefined;\n\n const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n if (wbRels) {\n for (const child of wbRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (!target) continue;\n\n if (type.includes(\"/worksheet\")) {\n worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n } else if (type.includes(\"/theme\")) {\n theme = target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`;\n }\n }\n }\n sortByNumber(worksheets);\n\n // Scan for drawings, charts, media\n drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n media.push(...doc.keys(\"xl/media/\"));\n sortByNumber(drawings);\n sortByNumber(charts);\n\n // Root rels → core/app props\n let coreProps: string | undefined;\n let appProps: string | undefined;\n let customProps: string | undefined;\n const rootRels = doc.get(\"_rels/.rels\");\n if (rootRels) {\n for (const child of rootRels.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/core-properties\")) coreProps = target;\n else if (type.includes(\"/extended-properties\")) appProps = target;\n else if (type.includes(\"/custom-properties\")) customProps = target;\n }\n }\n\n return {\n doc,\n workbook,\n worksheets,\n styles,\n sharedStrings,\n theme,\n partRefs: { worksheets, charts, media, drawings },\n coreProps,\n appProps,\n customProps,\n };\n}\n\n// ── Shared strings helper ──\n\n/** Extract plain string array from sharedStringsDesc.parse() result. */\nfunction extractStringsFromEntries(parsed: SharedStringsDocOptions): string[] {\n const strings: string[] = [];\n for (const entry of parsed.entries) {\n if (typeof entry === \"string\") {\n strings.push(entry);\n } else if (entry.runs && entry.runs.length > 0) {\n // Rich text: concatenate run texts\n strings.push(entry.runs.map((r) => r.text).join(\"\"));\n }\n }\n return strings;\n}\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n const xlsx = parseXlsx(data);\n\n const opts: Partial<WorkbookOptions> = {};\n\n // Core properties\n if (xlsx.coreProps) {\n const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n if (corePropsEl) {\n const cp = parseCorePropsElement(corePropsEl);\n if (cp.title) opts.title = cp.title;\n if (cp.subject) opts.subject = cp.subject;\n if (cp.creator) opts.creator = cp.creator;\n if (cp.keywords) opts.keywords = cp.keywords;\n if (cp.description) opts.description = cp.description;\n if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n if (cp.revision !== undefined) opts.revision = cp.revision;\n if (cp.lastPrinted) opts.lastPrinted = cp.lastPrinted;\n if (cp.created) opts.created = cp.created;\n if (cp.modified) opts.modified = cp.modified;\n }\n }\n\n // Extended (app) properties\n if (xlsx.appProps) {\n const appPropsEl = xlsx.doc.get(xlsx.appProps);\n if (appPropsEl) {\n const ap = appPropertiesDesc.parse(appPropsEl, {} as ReadContext);\n if (ap && Object.keys(ap).length > 0) opts.appProperties = ap;\n }\n }\n\n // Custom properties\n if (xlsx.customProps) {\n const customPropsEl = xlsx.doc.get(xlsx.customProps);\n if (customPropsEl) {\n const cp = customPropertiesDesc.parse(customPropsEl, {} as ReadContext);\n if (cp.properties?.length) opts.customProperties = cp.properties;\n }\n }\n\n // Shared strings — use descriptor.parse() for richer data, then extract strings for lookup\n let strings: string[] = [];\n if (xlsx.sharedStrings) {\n const parsed = sharedStringsDesc.parse(xlsx.sharedStrings, {} as never);\n strings = extractStringsFromEntries(parsed);\n }\n\n // Create read context for descriptor pipeline\n const readContext = new XlsxReadContext(xlsx, strings);\n\n // Pivot cache definitions, keyed by part path — worksheet parsing resolves\n // each pivot table's cacheId against this map when rebuilding the\n // user-layer PivotTableOptions (field indices → cache field names, data\n // range → worksheetSource).\n const pivotCacheByPath = new Map<string, PivotCacheDefParseResult>();\n for (const key of xlsx.doc.keys(\"xl/pivotCache/\")) {\n if (!key.includes(\"pivotCacheDefinition\")) continue;\n const pcdEl = xlsx.doc.get(key);\n if (!pcdEl) continue;\n pivotCacheByPath.set(key, pivotCacheDefDesc.parse(pcdEl, readContext));\n }\n // workbook.xml pivotCaches: cacheId → definition part path.\n const pivotCachePathById = new Map<number, string>();\n const wbPivotCaches = xlsx.workbook ? findChild(xlsx.workbook, \"pivotCaches\") : undefined;\n for (const pc of wbPivotCaches?.elements ?? []) {\n if (pc.name !== \"pivotCache\") continue;\n const cacheId = attr(pc, \"cacheId\");\n const rId = attr(pc, \"r:id\");\n if (cacheId === undefined || rId === undefined) continue;\n const target = readContext.resolveRelationship(rId);\n if (target) pivotCachePathById.set(Number(cacheId), target);\n }\n\n // Parse styles (fonts, fills, borders, cellXfs)\n if (xlsx.styles) {\n const parsedStyles = stylesDesc.parse(xlsx.styles, readContext);\n readContext.parsedStyles = parsedStyles;\n\n // Expose styles sections onto the returned opts for round-trip. compiler.ts\n // re-emits dxfs from options; colors/tableStyles/cellStyles/styleExtensions\n // are surfaced here even though the compiler currently only consumes dxfs,\n // so callers retain the parsed data and the fields stay documented.\n if (parsedStyles.dxfs) opts.dxfs = parsedStyles.dxfs;\n if (parsedStyles.colors) opts.colors = parsedStyles.colors;\n if (parsedStyles.customCellStyles) opts.cellStyles = parsedStyles.customCellStyles;\n if (parsedStyles.cellStyleXfs) opts.cellStyleXfs = parsedStyles.cellStyleXfs;\n if (parsedStyles.styleExtensions) opts.styleExtensions = parsedStyles.styleExtensions;\n if (parsedStyles.tableStylesInfo?.tableStyles)\n opts.tableStyles = parsedStyles.tableStylesInfo.tableStyles;\n }\n\n // Theme — structured round-trip so a custom source theme survives instead of\n // being replaced by the compiler's fresh default.\n if (xlsx.theme) {\n const themeEl = xlsx.doc.get(xlsx.theme);\n if (themeEl) {\n const themeOptions = themeDesc.parse(themeEl, readContext);\n if (themeOptions) opts.theme = themeOptions;\n }\n }\n\n // Parse workbook via descriptor for richer data\n let sheetNames: string[] = [];\n if (xlsx.workbook) {\n const wbData = workbookDesc.parse(xlsx.workbook, readContext);\n if (wbData.sheets) sheetNames = wbData.sheets.map((s) => s.name);\n\n // Workbook-level properties\n if (wbData.protection) opts.workbookProtection = wbData.protection;\n if (wbData.bookView) opts.bookView = wbData.bookView;\n if (wbData.calcPr) opts.calcPr = wbData.calcPr;\n if (wbData.customViews) opts.customWorkbookViews = wbData.customViews;\n if (wbData.fileRecoveryPr) opts.fileRecoveryPr = wbData.fileRecoveryPr;\n if (wbData.functionGroups) opts.functionGroups = wbData.functionGroups;\n if (wbData.webPublishing) opts.webPublishing = wbData.webPublishing;\n if (wbData.fileSharing) opts.fileSharing = wbData.fileSharing;\n if (wbData.workbookPr) opts.workbookPr = wbData.workbookPr;\n if (wbData.volTypes) opts.volTypes = wbData.volTypes;\n if (wbData.webPublishObjects) opts.webPublishObjects = wbData.webPublishObjects;\n if (wbData.definedNames) opts.definedNames = wbData.definedNames;\n }\n\n // Parse worksheets using descriptor pipeline. Worksheet parts defer\n // sheetData — the row scanner walks the captured inner XML, skipping the\n // per-cell Element tree (the dominant allocation cost on large sheets).\n const worksheets: WorksheetOptions[] = [];\n for (const [i, wsPath] of xlsx.worksheets.entries()) {\n const wsEl = xlsx.doc.get(wsPath, WORKSHEET_PARSE_OPTIONS);\n if (!wsEl) continue;\n\n const wsOpts = worksheetDesc.parse(wsEl, readContext);\n if (sheetNames[i]) wsOpts.name = sheetNames[i];\n\n // ── Resolve sub-parts via worksheet relationships ──\n\n // Comments\n const commentRels = readContext.getWorksheetRelsByType(wsPath, \"/comments\");\n for (const cr of commentRels) {\n const commentEl = xlsx.doc.get(cr.target);\n if (!commentEl) continue;\n const commentData = commentsDesc.parse(commentEl, readContext);\n if (commentData.comments) {\n wsOpts.comments = commentData.comments;\n break; // one comments file per worksheet\n }\n }\n\n // Note anchors (vmlDrawing) — merge per-note placement into the comments\n // so custom position/size/visibility survive the round-trip.\n const vmlRels = readContext.getWorksheetRelsByType(wsPath, \"/vmlDrawing\");\n for (const vr of vmlRels) {\n const vmlEl = xlsx.doc.get(vr.target);\n if (!vmlEl) continue;\n mergeNoteAnchors(wsOpts.comments, vmlNotesDesc.parse(vmlEl, readContext));\n break; // one vmlDrawing per worksheet\n }\n\n // Drawings (images + charts)\n const drawingRels = readContext.getWorksheetRelsByType(wsPath, \"/drawing\");\n for (const dr of drawingRels) {\n const drawingEl = xlsx.doc.get(dr.target);\n if (!drawingEl) continue;\n const drawingData = drawingDesc.parse(drawingEl, readContext);\n // drawingDesc.parse yields CT-layer anchors (rId-anchored DrawingImage/\n // DrawingChart); bridge them to the user-layer shapes the compiler\n // consumes: image bytes are read back through the drawing's image\n // relationships, chart parts through the core chartSpace descriptor.\n if (drawingData.images) {\n const images: PictureOptions[] = [];\n for (const image of drawingData.images) {\n const mediaPath = readContext.resolveWorksheetRel(dr.target, image.rId);\n const raw = mediaPath ? xlsx.doc.getRaw(mediaPath) : undefined;\n const ext = mediaPath?.split(\".\").pop();\n if (!raw || (ext !== \"png\" && ext !== \"jpeg\" && ext !== \"jpg\")) continue;\n images.push({\n data: raw,\n type: ext === \"png\" ? \"png\" : \"jpg\",\n col: image.col,\n row: image.row,\n name: image.name,\n description: image.description,\n title: image.title,\n hidden: image.hidden,\n });\n }\n if (images.length > 0) wsOpts.images = images;\n }\n if (drawingData.charts) {\n const charts: WorksheetChartOptions[] = [];\n for (const anchor of drawingData.charts) {\n const chartPath = readContext.resolveWorksheetRel(dr.target, anchor.rId);\n const chartEl = chartPath ? xlsx.doc.get(chartPath) : undefined;\n if (!chartEl) continue;\n const chartSpace = chartSpaceDesc.parse(chartEl, readContext);\n charts.push({ ...chartSpace, col: anchor.col, row: anchor.row });\n }\n if (charts.length > 0) wsOpts.charts = charts;\n }\n // Shapes/connectors/groups pass through unchanged (no media bridge).\n if (drawingData.shapes) wsOpts.shapes = drawingData.shapes;\n if (drawingData.connectors) wsOpts.connectors = drawingData.connectors;\n if (drawingData.groups) wsOpts.groups = drawingData.groups;\n break;\n }\n\n // Tables\n const tableRels = readContext.getWorksheetRelsByType(wsPath, \"/table\");\n if (tableRels.length > 0) {\n const tables: TableOptions[] = [];\n for (const tr of tableRels) {\n const tableEl = xlsx.doc.get(tr.target);\n if (!tableEl) continue;\n const tableData = tableDesc.parse(tableEl, readContext);\n tables.push(tableData);\n }\n if (tables.length > 0) wsOpts.tables = tables;\n }\n\n // Query tables\n const queryTableRels = readContext.getWorksheetRelsByType(wsPath, \"/queryTable\");\n if (queryTableRels.length > 0) {\n const queryTables: QueryTableOptions[] = [];\n for (const qtr of queryTableRels) {\n const qtEl = xlsx.doc.get(qtr.target);\n if (!qtEl) continue;\n queryTables.push(queryTableDesc.parse(qtEl, readContext));\n }\n if (queryTables.length > 0) wsOpts.queryTables = queryTables;\n }\n\n // Single-cell XML tables\n const singleXmlCellRels = readContext.getWorksheetRelsByType(wsPath, \"/tableSingleCells\");\n if (singleXmlCellRels.length > 0) {\n const singleXmlCells: SingleXmlCellOptions[] = [];\n for (const sxr of singleXmlCellRels) {\n const sxEl = xlsx.doc.get(sxr.target);\n if (!sxEl) continue;\n singleXmlCells.push(...singleXmlCellsDesc.parse(sxEl, readContext).cells);\n }\n if (singleXmlCells.length > 0) wsOpts.singleXmlCells = singleXmlCells;\n }\n\n // Pivot tables — rebuild the user-layer shape from the CT-layer parse\n // result: field indices resolve against the cache definition's field\n // names, the data range against its worksheetSource.\n const pivotRels = readContext.getWorksheetRelsByType(wsPath, \"/pivotTable\");\n if (pivotRels.length > 0) {\n const pivotTables: PivotTableOptions[] = [];\n for (const pr of pivotRels) {\n const pivotEl = xlsx.doc.get(pr.target);\n if (!pivotEl) continue;\n const pivotData = pivotTableDesc.parse(pivotEl, readContext);\n const cache = pivotCacheByPath.get(pivotCachePathById.get(pivotData.cacheId ?? -1) ?? \"\");\n const ref = cache?.worksheetSource?.ref;\n if (!cache || !ref) continue;\n const fieldNames = (cache.cacheFields ?? []).map((f) => f.name ?? \"\");\n const rows = (pivotData.rowFields ?? [])\n .map((i) => fieldNames[i])\n .filter((name): name is string => name !== \"\");\n const data = (pivotData.dataFields ?? [])\n .filter((d) => d.fld !== undefined)\n .map((d) => ({\n field: fieldNames[d.fld!] ?? \"\",\n ...(d.subtotal ? { summarize: d.subtotal as ConsolidateFunction } : {}),\n ...(d.name ? { name: d.name } : {}),\n }));\n if (rows.length === 0 || data.length === 0) continue;\n const pt: PivotTableOptions = { source: ref, rows, data };\n if (pivotData.name) pt.name = pivotData.name;\n if (cache.worksheetSource?.sheet) pt.sourceSheet = cache.worksheetSource.sheet;\n if (pivotData.location) pt.location = pivotData.location;\n const columns = (pivotData.colFields ?? [])\n .map((i) => fieldNames[i])\n .filter((name): name is string => name !== \"\");\n if (columns.length > 0) pt.columns = columns;\n if (pivotData.pivotTableStyle) pt.style = pivotData.pivotTableStyle;\n if (pivotData.dataOnRows) pt.dataOnRows = true;\n if (pivotData.grandTotalCaption) pt.grandTotalCaption = pivotData.grandTotalCaption;\n if (pivotData.errorCaption) pt.errorCaption = pivotData.errorCaption;\n if (pivotData.showError) pt.showError = true;\n if (pivotData.missingCaption) pt.missingCaption = pivotData.missingCaption;\n if (pivotData.showMissing === false) pt.showMissing = false;\n if (pivotData.pageStyle) pt.pageStyle = pivotData.pageStyle;\n if (pivotData.tag) pt.tag = pivotData.tag;\n if (pivotData.showItems === false) pt.showItems = false;\n if (pivotData.editData) pt.editData = true;\n pivotTables.push(pt);\n }\n if (pivotTables.length > 0) wsOpts.pivotTables = pivotTables;\n }\n\n // Resolve external hyperlink URLs\n const hyperlinks = wsOpts.hyperlinks;\n if (hyperlinks) {\n for (const hl of hyperlinks) {\n if (hl.target.type === \"external\") {\n const resolved = readContext.resolveWorksheetRel(wsPath, hl.target.url);\n if (resolved) hl.target.url = resolved;\n }\n }\n }\n\n worksheets.push(wsOpts as WorksheetOptions);\n }\n\n opts.worksheets = worksheets;\n\n // Chartsheets — parse chartsheet parts\n const chartsheetPaths = xlsx.doc.keys(\"xl/chartsheets/\").filter((k) => k.endsWith(\".xml\"));\n if (chartsheetPaths.length > 0) {\n const chartsheets: ChartsheetOptions[] = [];\n for (const [i, csPath] of chartsheetPaths.entries()) {\n const csEl = xlsx.doc.get(csPath);\n if (!csEl) continue;\n const csData = chartsheetDesc.parse(csEl, readContext);\n if (sheetNames[worksheets.length + i]) csData.name = sheetNames[worksheets.length + i];\n // The chart itself lives in a drawing part — bridge it back through the\n // core chartSpace descriptor into the simplified chartsheet chart shape.\n const csDrawingRels = readContext.getWorksheetRelsByType(csPath, \"/drawing\");\n outer: for (const dr of csDrawingRels) {\n const drawingEl = xlsx.doc.get(dr.target);\n if (!drawingEl) continue;\n const drawingData = drawingDesc.parse(drawingEl, readContext);\n for (const anchor of drawingData.charts ?? []) {\n const chartPath = readContext.resolveWorksheetRel(dr.target, anchor.rId);\n const chartEl = chartPath ? xlsx.doc.get(chartPath) : undefined;\n if (!chartEl) continue;\n const cs = chartSpaceDesc.parse(chartEl, readContext);\n csData.chart = {\n type: cs.type,\n ...(cs.title !== undefined ? { title: cs.title } : {}),\n ...(cs.categories ? { categories: [...cs.categories] } : {}),\n series: (cs.series as ChartSeriesData[]).map((s) => ({\n name: s.name,\n values: [...s.values],\n })),\n };\n break outer;\n }\n }\n chartsheets.push(csData);\n }\n if (chartsheets.length > 0) opts.chartsheets = chartsheets;\n }\n\n // Dialogsheets — parse legacy dialog sheet parts\n const dialogsheetPaths = xlsx.doc.keys(\"xl/dialogSheets/\").filter((k) => k.endsWith(\".xml\"));\n if (dialogsheetPaths.length > 0) {\n const dialogsheets: DialogsheetOptions[] = [];\n for (const dsPath of dialogsheetPaths) {\n const dsEl = xlsx.doc.get(dsPath);\n if (!dsEl) continue;\n const dsData = dialogsheetDesc.parse(dsEl, readContext);\n dialogsheets.push(dsData);\n }\n if (dialogsheets.length > 0) opts.dialogsheets = dialogsheets;\n }\n\n // Pivot cache definitions (parsed into pivotCacheByPath above) and records\n if (pivotCacheByPath.size > 0) {\n opts.pivotCaches = [...pivotCacheByPath.values()];\n }\n\n const pivotCacheRecPaths = xlsx.doc\n .keys(\"xl/pivotCache/\")\n .filter((k) => k.includes(\"pivotCacheRecords\"));\n if (pivotCacheRecPaths.length > 0) {\n const pivotCacheRecords: PivotCacheRecordsParseResult[] = [];\n for (const pcrPath of pivotCacheRecPaths) {\n const pcrEl = xlsx.doc.get(pcrPath);\n if (!pcrEl) continue;\n const pcrData = pivotCacheRecordsDesc.parse(pcrEl, readContext);\n pivotCacheRecords.push(pcrData);\n }\n if (pivotCacheRecords.length > 0) opts.pivotCacheRecords = pivotCacheRecords;\n }\n\n // Calculation chain\n const calcChainEl = xlsx.doc.get(\"xl/calcChain.xml\");\n if (calcChainEl) {\n const calcData = calcChainDesc.parse(calcChainEl, readContext);\n if (calcData.cells) opts.calcChain = calcData.cells;\n }\n\n // Connections (xl/connections.xml)\n const connectionsEl = xlsx.doc.get(\"xl/connections.xml\");\n if (connectionsEl) {\n const connData = connectionsDesc.parse(connectionsEl, readContext);\n if (connData.connections.length > 0) opts.connections = connData.connections;\n }\n\n // Rich metadata (xl/metadata.xml)\n const metadataEl = xlsx.doc.get(\"xl/metadata.xml\");\n if (metadataEl) {\n const metadataData = metadataDesc.parse(metadataEl, readContext);\n opts.metadata = metadataData;\n }\n\n // XML mappings (xl/xmlMaps.xml)\n const xmlMapsEl = xlsx.doc.get(\"xl/xmlMaps.xml\");\n if (xmlMapsEl) {\n opts.xmlMaps = mapInfoDesc.parse(xmlMapsEl, readContext);\n }\n\n // External links\n const extLinkPaths = xlsx.doc.keys(\"xl/externalLinks/\").filter((k) => k.endsWith(\".xml\"));\n if (extLinkPaths.length > 0) {\n const externalLinks: ExternalLinkOptions[] = [];\n for (const elPath of extLinkPaths) {\n const elEl = xlsx.doc.get(elPath);\n if (!elEl) continue;\n const elData = externalLinkDesc.parse(elEl, readContext);\n\n // Resolve the external book target from the sibling rels file\n // (xl/externalLinks/_rels/externalLinkN.xml.rels), which compiler.ts writes.\n if (elData.externalBook) {\n const relsPath = partPathToRelsPath(elPath);\n const relsEl = xlsx.doc.get(relsPath);\n if (relsEl) {\n for (const child of relsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n if (!type.includes(\"/externalLinkPath\")) continue;\n const target = attr(child, \"Target\");\n if (target) {\n elData.externalBook.target = target;\n break;\n }\n }\n }\n }\n\n externalLinks.push(elData);\n }\n if (externalLinks.length > 0) opts.externalLinks = externalLinks;\n }\n\n // Shared-workbook revisions: workbook.xml.rels → revisionHeaders/users;\n // revisionHeaders.xml.rels → per-header revision logs.\n const wbRelsEl2 = xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n let revHeadersTarget: string | undefined;\n let usersTarget: string | undefined;\n if (wbRelsEl2) {\n for (const child of wbRelsEl2.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n const type = attr(child, \"Type\") ?? \"\";\n const target = attr(child, \"Target\") ?? \"\";\n if (type.includes(\"/revisionHeaders\")) revHeadersTarget = target;\n else if (type.includes(\"/users\")) usersTarget = target;\n }\n }\n if (revHeadersTarget) {\n const headersPath = revHeadersTarget.startsWith(\"/\")\n ? revHeadersTarget.slice(1)\n : `xl/${revHeadersTarget}`;\n const headersEl = xlsx.doc.get(headersPath);\n if (headersEl) {\n const headers = revisionHeadersDesc.parse(headersEl, readContext);\n const logs: RevisionLogOptions[] = [];\n const revHeadersRelsEl = xlsx.doc.get(partPathToRelsPath(headersPath));\n if (revHeadersRelsEl) {\n for (const child of revHeadersRelsEl.elements ?? []) {\n if (child.name !== \"Relationship\") continue;\n if (!(attr(child, \"Type\") ?? \"\").includes(\"/revisionLog\")) continue;\n const t = attr(child, \"Target\");\n if (!t) continue;\n const logEl = xlsx.doc.get(t.startsWith(\"/\") ? t.slice(1) : `xl/${t}`);\n if (logEl) logs.push(revisionLogDesc.parse(logEl, readContext));\n }\n }\n const revisionLog: SharedWorkbookOptions = { headers, logs };\n if (usersTarget) {\n const usersEl = xlsx.doc.get(\n usersTarget.startsWith(\"/\") ? usersTarget.slice(1) : `xl/${usersTarget}`,\n );\n if (usersEl) {\n const users = usersDesc.parse(usersEl, readContext);\n if (users.users) revisionLog.users = users;\n }\n }\n opts.revisionLog = revisionLog;\n }\n }\n\n return opts as WorkbookOptions;\n}\n","/**\n * XLSX patching — replace placeholders in existing .xlsx files.\n *\n * Unlike DOCX/PPTX (paragraph-based), XLSX patching targets cell values:\n * - String-valued patches substitute the placeholder text in place (shared\n * strings table or inline strings).\n * - Non-string-valued patches (number / boolean / Date) whose placeholder is\n * the entire cell content rewrite the cell to a typed value with the correct\n * cell type (`t`), so the result is a real number/boolean/date cell — not a\n * stringified copy.\n *\n * @module\n */\nimport {\n OoxmlMimeType,\n appendContentType,\n appendOverride,\n appendRelationship,\n applyCorePropertiesOverride,\n getNextRelationshipIndex,\n nextNumericId,\n strFromU8,\n toJson,\n unzipSync,\n zipAndConvert,\n} from \"@office-open/core\";\nimport type {\n BasePatchOptions,\n CorePropertiesOptions,\n OutputByType,\n OutputType,\n} from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport { OOXML_XML_DECLARATION } from \"@office-open/xml\";\nimport { stringify } from \"@office-open/xml\";\nimport type { Element } from \"@office-open/xml\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport { SharedStrings, sharedStringsDesc } from \"@parts/shared-strings\";\nimport { buildWorksheetXml } from \"@parts/worksheet\";\nimport type { CommentOptions, WorksheetOptions } from \"@parts/worksheet\";\nimport { dateToSerialNumber } from \"@util/index\";\n\n/** Reusable TextEncoder (stateless, safe to share). */\nconst encoder = new TextEncoder();\n\n/** Scalar cell value accepted by {@link patchWorkbook}. */\nexport type ScalarValue = string | number | boolean | Date;\n\n/** A patch value is just a scalar. */\nexport type Patch = ScalarValue;\n\nexport interface PatchWorkbookOptions<\n T extends OutputType = OutputType,\n> extends BasePatchOptions<T> {\n /** Placeholder substitutions: `{{key}}` (per delimiters) → value. */\n placeholders?: Readonly<Record<string, ScalarValue>>;\n /** Literal find/replace: the find string → value (no delimiters added). */\n findReplace?: Readonly<Record<string, ScalarValue>>;\n /** Core-properties metadata override (merged over the existing docProps/core.xml). */\n coreProperties?: Partial<CorePropertiesOptions>;\n /**\n * Worksheet collection edits. The shared-strings table is rebuilt from the\n * template first, so appended/replaced worksheets continue indexing strings\n * at the correct offset. Cell styles are not supported on appended rows —\n * reference only styles already present in the template.\n */\n worksheets?: {\n /** Replace worksheets keyed by sheet name (as declared in workbook.xml). */\n replace?: Readonly<Record<string, WorksheetOptions>>;\n /** Append worksheets after the last existing sheet. */\n append?: Readonly<WorksheetOptions[]>;\n };\n /**\n * Cell comments (notes) to append per worksheet. Existing comments on the\n * target worksheet are merged — parsed, extended with the new entries, and\n * re-serialized. Keyed by worksheet name (as declared in workbook.xml).\n */\n comments?: Readonly<Record<string, CommentOptions[]>>;\n}\n\nconst WORKSHEET_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst WORKSHEET_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\";\nconst COMMENTS_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst VML_REL_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\";\nconst VML_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.vmlDrawing\";\n\n/**\n * sharedStringsDesc.parse ignores its context, but its signature requires a\n * {@link ReadContext}. This stub satisfies the type without pulling in parse\n * machinery the patch path does not need.\n */\nconst STUB_READ_CTX: ReadContext = {\n resolveRelationship: () => undefined,\n getPart: () => undefined,\n getRaw: () => undefined,\n};\n\n/** Human-readable form for string-substitution (mixed-text) fallback. */\nconst toDisplayString = (value: Exclude<ScalarValue, string>): string => {\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (value instanceof Date) return value.toISOString().split(\"T\")[0] ?? \"\";\n return String(value);\n};\n\n/**\n * Patch an existing .xlsx workbook by replacing placeholder text in cells.\n *\n * @publicApi\n */\nexport const patchWorkbook = async <T extends OutputType = OutputType>({\n outputType,\n data,\n placeholders,\n findReplace,\n coreProperties,\n worksheets,\n comments,\n placeholderDelimiters = { start: \"{{\", end: \"}}\" } as const,\n}: PatchWorkbookOptions<T>): Promise<OutputByType[T]> => {\n const { start, end } = placeholderDelimiters;\n if (!start.trim() || !end.trim()) {\n throw new Error(\"Both start and end delimiters must be non-empty strings.\");\n }\n\n const zipContent = unzipSync(toUint8Array(data));\n\n const xmlMap = new Map<string, Element>();\n const binaryMap = new Map<string, Uint8Array>();\n // VML parts are text XML under a .vml extension — kept out of xmlMap (which\n // only holds .xml/.rels) and serialized as raw text at the end.\n const vmlFiles = new Map<string, string>();\n\n // Separate XML files from binary files\n for (const [key, value] of Object.entries(zipContent)) {\n if (key.endsWith(\".xml\") || key.endsWith(\".rels\")) {\n xmlMap.set(key, toJson(strFromU8(value)));\n } else {\n binaryMap.set(key, value);\n }\n }\n\n // Unified patch map: placeholders are delimiter-wrapped, findReplace keys are\n // literal strings. Both feed the same Pass A (typed cells) / Pass B (text) engine.\n const patchMap = new Map<string, ScalarValue>();\n if (placeholders) {\n for (const [key, value] of Object.entries(placeholders)) {\n patchMap.set(`${start}${key}${end}`, value);\n }\n }\n if (findReplace) {\n for (const [key, value] of Object.entries(findReplace)) {\n patchMap.set(key, value);\n }\n }\n\n const sharedStrings = xmlMap.get(\"xl/sharedStrings.xml\");\n const sharedTextByIndex = buildSharedTextIndex(sharedStrings);\n\n const worksheetKeys = Object.keys(zipContent).filter(\n (k) => k.startsWith(\"xl/worksheets/sheet\") && k.endsWith(\".xml\"),\n );\n\n // Pass A: rewrite pure placeholder cells to typed values (number / boolean / Date)\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (ws) rewriteTypedCells(ws, patchMap, sharedTextByIndex);\n }\n\n // Pass B: text substitution in shared strings + inline strings\n // (string-valued patches, plus non-string patches embedded in mixed text)\n if (sharedStrings) patchSharedStrings(sharedStrings, patchMap);\n for (const wsKey of worksheetKeys) {\n const ws = xmlMap.get(wsKey);\n if (!ws) continue;\n patchWorksheetInlineStrings(ws, patchMap);\n // Pass C: print headers/footers (oddHeader/oddFooter/… literal text)\n patchHeaderFooter(ws, patchMap);\n }\n\n // Worksheet collection edits — rebuild shared strings first so appended/\n // replaced worksheets continue indexing at the right offset, then serialize.\n if (worksheets) {\n const sharedStrings = rebuildSharedStrings(xmlMap);\n if (worksheets.replace) {\n for (const [name, wsOpts] of Object.entries(worksheets.replace)) {\n replaceWorksheetInMap(xmlMap, name, wsOpts, sharedStrings);\n }\n }\n if (worksheets.append) {\n for (const wsOpts of worksheets.append) {\n appendWorksheetToMap(xmlMap, wsOpts, sharedStrings);\n }\n }\n rewriteSharedStrings(xmlMap, sharedStrings);\n }\n\n // Cell comments — append per worksheet, merging with any existing comments.\n if (comments) {\n for (const [sheetName, commentOpts] of Object.entries(comments)) {\n appendCommentsToMap(xmlMap, vmlFiles, sheetName, commentOpts);\n }\n }\n\n // Rebuild ZIP\n const files: Record<string, Uint8Array> = {};\n for (const [key, value] of xmlMap) {\n files[key] =\n key === \"docProps/core.xml\" && coreProperties\n ? encoder.encode(OOXML_XML_DECLARATION + applyCorePropertiesOverride(value, coreProperties))\n : encoder.encode(stringify(value));\n }\n for (const [key, value] of binaryMap) {\n files[key] = value;\n }\n for (const [key, value] of vmlFiles) {\n files[key] = encoder.encode(value);\n }\n\n return await zipAndConvert(files, outputType, OoxmlMimeType.XLSX);\n};\n\n/** Map each `<si>` shared-string index to its flattened text. */\nfunction buildSharedTextIndex(sst: Element | undefined): Map<number, string> {\n const map = new Map<number, string>();\n if (!sst) return map;\n const root = sst.name ? sst : sst.elements?.[0];\n let idx = 0;\n for (const si of root?.elements ?? []) {\n if (si.name !== \"si\") continue;\n map.set(idx, flattenText(si));\n idx++;\n }\n return map;\n}\n\n/**\n * Pass A — for each cell whose entire text is a non-string placeholder, rewrite\n * the cell to a typed value cell (`<v>` with the correct `t`).\n */\nfunction rewriteTypedCells(\n ws: Element,\n patchMap: Map<string, ScalarValue>,\n sharedTextByIndex: Map<number, string>,\n): void {\n const root = ws.name ? ws : ws.elements?.[0];\n const sheetData = root && findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n const text = effectiveCellText(cell, sharedTextByIndex);\n if (text === undefined) continue;\n\n for (const [placeholder, value] of patchMap) {\n if (typeof value === \"string\") continue; // Pass B handles string values\n if (text === placeholder) {\n rewriteCellToValue(cell, value);\n break; // a pure cell holds a single placeholder\n }\n }\n }\n }\n}\n\n/** Resolve the displayed text of a string/inline-string cell, else undefined. */\nfunction effectiveCellText(\n cell: Element,\n sharedTextByIndex: Map<number, string>,\n): string | undefined {\n const t = cell.attributes?.[\"t\"];\n if (t === \"inlineStr\") {\n const isEl = findLocalChild(cell, \"is\");\n return isEl ? flattenText(isEl) : undefined;\n }\n if (t === \"s\") {\n const v = findLocalChild(cell, \"v\");\n const raw = v?.elements?.[0]?.text;\n const idx = Number(raw);\n return Number.isNaN(idx) ? undefined : sharedTextByIndex.get(idx);\n }\n return undefined;\n}\n\n/** Rewrite a cell element to a typed value (`<v>` with the correct `t`). */\nfunction rewriteCellToValue(cell: Element, value: Exclude<ScalarValue, string>): void {\n const attrs = cell.attributes ?? (cell.attributes = {});\n let vText: string;\n if (typeof value === \"boolean\") {\n attrs[\"t\"] = \"b\";\n vText = value ? \"1\" : \"0\";\n } else if (value instanceof Date) {\n delete attrs[\"t\"]; // serial date is numeric\n vText = String(dateToSerialNumber(value));\n } else {\n delete attrs[\"t\"]; // plain numeric\n vText = String(value);\n }\n cell.elements = [{ type: \"element\", name: \"v\", elements: [{ type: \"text\", text: vText }] }];\n}\n\n/** Pass B — substitute placeholders in shared-string `<si>` text. */\nfunction patchSharedStrings(sst: Element, patchMap: Map<string, ScalarValue>): void {\n const root = sst.name ? sst : sst.elements?.[0];\n if (!root) return;\n\n for (const si of root.elements ?? []) {\n if (si.name !== \"si\") continue;\n\n // Simple: <si><t>text</t></si>\n const t = findLocalChild(si, \"t\");\n if (t) {\n patchTextElement(t, patchMap);\n } else {\n // Rich text: <si><r><t>text</t></r>...</si>\n for (const r of si.elements ?? []) {\n if (r.name !== \"r\") continue;\n const rt = findLocalChild(r, \"t\");\n if (rt) patchTextElement(rt, patchMap);\n }\n }\n }\n}\n\n/** Pass B — substitute placeholders in worksheet inline strings. */\nfunction patchWorksheetInlineStrings(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n\n const sheetData = findLocalChild(root, \"sheetData\");\n if (!sheetData) return;\n\n for (const row of sheetData.elements ?? []) {\n if (localName(row) !== \"row\") continue;\n for (const cell of row.elements ?? []) {\n if (localName(cell) !== \"c\") continue;\n\n // Inline strings: <c t=\"inlineStr\"><is><t>text</t></is></c>\n const isEl = findLocalChild(cell, \"is\");\n if (isEl) {\n const t = findLocalChild(isEl, \"t\");\n if (t) patchTextElement(t, patchMap);\n }\n }\n }\n}\n\nconst HEADER_FOOTER_NAMES = new Set([\n \"oddHeader\",\n \"oddFooter\",\n \"evenHeader\",\n \"evenFooter\",\n \"firstHeader\",\n \"firstFooter\",\n]);\n\n/**\n * Pass C — substitute placeholders in worksheet print header/footer text.\n * Header/footer children (oddHeader/oddFooter/…) carry their text directly\n * (not wrapped in `<t>`), so this is a substring substitution on the element's\n * own text node.\n */\nfunction patchHeaderFooter(ws: Element, patchMap: Map<string, ScalarValue>): void {\n const root = ws.name ? ws : ws.elements?.[0];\n if (!root) return;\n const headerFooter = findLocalChild(root, \"headerFooter\");\n if (!headerFooter) return;\n\n for (const part of headerFooter.elements ?? []) {\n if (part.type !== \"element\" || !HEADER_FOOTER_NAMES.has(localName(part))) continue;\n const textNode = part.elements?.[0];\n if (!textNode || typeof textNode.text !== \"string\") continue;\n\n let replaced = textNode.text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== textNode.text) {\n part.elements![0] = { ...textNode, text: replaced };\n }\n }\n}\n\n/** Substitute any placeholder substring in a `<t>` element's text. */\nfunction patchTextElement(tEl: Element, patchMap: Map<string, ScalarValue>): void {\n const textNode = tEl.elements?.[0];\n const text = textNode?.text;\n if (typeof text !== \"string\") return;\n\n let replaced = text;\n for (const [placeholder, value] of patchMap) {\n if (!replaced.includes(placeholder)) continue;\n const display = typeof value === \"string\" ? value : toDisplayString(value);\n replaced = replaced.split(placeholder).join(display);\n }\n if (replaced !== text && tEl.elements) {\n tEl.elements[0] = { ...textNode, text: replaced };\n }\n}\n\n/** Flatten all descendant text of an element into a single string. */\nfunction flattenText(el: Element): string {\n let out = \"\";\n for (const child of el.elements ?? []) {\n if (child.type === \"text\") {\n out += child.text ?? \"\";\n } else if (child.type === \"element\") {\n out += flattenText(child);\n }\n }\n return out;\n}\n\nfunction localName(el: Element): string {\n const name = el.name ?? \"\";\n const colonIdx = name.indexOf(\":\");\n return colonIdx >= 0 ? name.slice(colonIdx + 1) : name;\n}\n\nfunction findLocalChild(parent: Element, name: string): Element | undefined {\n return (parent.elements ?? []).find((el) => localName(el) === name);\n}\n\n// ── Worksheet collection edits (append / replace) ──\n\n/** Unwrap the document element: a parsed part is `{ declaration, elements: [<root>] }`. */\nfunction rootOf(doc: Element | undefined): Element | undefined {\n return doc && (doc.name ? doc : doc.elements?.[0]);\n}\n\n/** Build a bare element node with the given attributes. */\nfunction makeElement(name: string, attributes: Record<string, string> = {}): Element {\n return { type: \"element\", name, attributes, elements: [] };\n}\n\n/** Empty `<Relationships>` part (wrapped for stringify serialization). */\nfunction createRelationshipFile(): Element {\n return {\n declaration: { attributes: { encoding: \"UTF-8\", standalone: \"yes\", version: \"1.0\" } },\n elements: [\n {\n attributes: { xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\" },\n elements: [],\n name: \"Relationships\",\n type: \"element\",\n },\n ],\n };\n}\n\n/** Next 1-based worksheet file number given existing worksheet parts. */\nfunction nextWorksheetNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/worksheets\\/sheet(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/** Next `sheetId` for an appended `<sheet>` entry. */\nfunction nextSheetId(sheetsEl: Element | undefined): number {\n return nextNumericId(sheetsEl, \"sheet\", \"sheetId\", 0);\n}\n\n/** Resolve a relationship `rId` to its Target via a rels part root. */\nfunction resolveRelTarget(relsRoot: Element | undefined, rId: string): string | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Id\"]) === rId) {\n const target = child.attributes?.[\"Target\"];\n return target !== undefined ? String(target) : undefined;\n }\n }\n return undefined;\n}\n\n/** Rebuild the shared-strings table from the template so new sheets extend it. */\nfunction rebuildSharedStrings(xmlMap: Map<string, Element>): SharedStrings {\n const ss = new SharedStrings();\n const sstRoot = rootOf(xmlMap.get(\"xl/sharedStrings.xml\"));\n if (sstRoot) {\n ss.loadEntries(sharedStringsDesc.parse(sstRoot, STUB_READ_CTX).entries);\n }\n return ss;\n}\n\n/** Re-serialize the shared-strings part (called after worksheets are built). */\nfunction rewriteSharedStrings(xmlMap: Map<string, Element>, ss: SharedStrings): void {\n if (ss.count === 0) return;\n xmlMap.set(\n \"xl/sharedStrings.xml\",\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ss.serialize()}`),\n );\n}\n\n/**\n * Append a worksheet: serialize it (registering strings into the shared-strings\n * table), then wire workbook `<sheets>` + workbook rels + content types.\n */\nfunction appendWorksheetToMap(\n xmlMap: Map<string, Element>,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const newN = nextWorksheetNumber(xmlMap);\n const sheetPath = `xl/worksheets/sheet${newN}.xml`;\n const sheetName = wsOpts.name ?? `Sheet${newN}`;\n\n // Worksheet part (no XML declaration — matches generated worksheet parts)\n xmlMap.set(sheetPath, toJson(buildWorksheetXml(wsOpts, { sharedStrings })));\n\n // workbook.xml <sheets> + workbook.xml.rels (the new rId ties them)\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const wbRels = xmlMap.get(\"xl/_rels/workbook.xml.rels\") ?? createRelationshipFile();\n xmlMap.set(\"xl/_rels/workbook.xml.rels\", wbRels);\n const newRId = getNextRelationshipIndex(wbRels);\n\n if (wbSheets) {\n const els = wbSheets.elements ?? (wbSheets.elements = []);\n els.push(\n makeElement(\"sheet\", {\n name: sheetName,\n sheetId: String(nextSheetId(wbSheets)),\n \"r:id\": `rId${newRId}`,\n }),\n );\n }\n appendRelationship(wbRels, newRId, WORKSHEET_REL_TYPE, `worksheets/sheet${newN}.xml`);\n\n // [Content_Types].xml Override\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) {\n appendOverride(contentTypes, `/${sheetPath}`, WORKSHEET_CONTENT_TYPE);\n }\n}\n\n/** Normalize a worksheet name to its full part path via workbook.xml + rels. */\nfunction resolveSheetPath(xmlMap: Map<string, Element>, name: string): string {\n const wbRoot = rootOf(xmlMap.get(\"xl/workbook.xml\"));\n const wbSheets = wbRoot && findLocalChild(wbRoot, \"sheets\");\n const sheetEls = (wbSheets?.elements ?? []).filter((e) => localName(e) === \"sheet\");\n const target = sheetEls.find((e) => String(e.attributes?.[\"name\"]) === name);\n if (!target?.attributes?.[\"r:id\"]) {\n throw new Error(`patchWorkbook: no worksheet named \"${name}\"`);\n }\n const relTarget = resolveRelTarget(\n rootOf(xmlMap.get(\"xl/_rels/workbook.xml.rels\")),\n String(target.attributes[\"r:id\"]),\n );\n if (!relTarget) {\n throw new Error(`patchWorkbook: worksheet \"${name}\" relationship target not found`);\n }\n if (relTarget.startsWith(\"/\")) return relTarget.slice(1);\n return relTarget.startsWith(\"xl/\") ? relTarget : `xl/${relTarget}`;\n}\n\n/**\n * Replace a worksheet by name: resolve the name to its part via workbook rels,\n * then rewrite only that part's content. Sheet identity, rId, and content types\n * are unchanged.\n */\nfunction replaceWorksheetInMap(\n xmlMap: Map<string, Element>,\n name: string,\n wsOpts: WorksheetOptions,\n sharedStrings: SharedStrings,\n): void {\n const sheetPath = resolveSheetPath(xmlMap, name);\n xmlMap.set(sheetPath, toJson(buildWorksheetXml(wsOpts, { sharedStrings })));\n}\n\n/** Build the rels part path for a given part path (…/_rels/<file>.rels). */\nfunction relsKeyFor(partPath: string): string {\n const slash = partPath.lastIndexOf(\"/\");\n return `${partPath.substring(0, slash)}/_rels/${partPath.substring(slash + 1)}.rels`;\n}\n\n/** Find an existing relationship of a type in a rels root: { id, target }. */\nfunction findRelByType(\n relsRoot: Element | undefined,\n type: string,\n): { id: string; target: string } | undefined {\n for (const child of relsRoot?.elements ?? []) {\n if (localName(child) === \"Relationship\" && String(child.attributes?.[\"Type\"]) === type) {\n const target = child.attributes?.[\"Target\"];\n if (target !== undefined) {\n return { id: String(child.attributes?.[\"Id\"]), target: String(target) };\n }\n }\n }\n return undefined;\n}\n\n/** Largest existing comments file number (xl/comments{n}.xml), for append offset. */\nfunction nextCommentsNumber(xmlMap: Map<string, Element>): number {\n let maxN = 0;\n for (const key of xmlMap.keys()) {\n const m = key.match(/^xl\\/comments(\\d+)\\.xml$/);\n if (m) maxN = Math.max(maxN, Number(m[1]));\n }\n return maxN + 1;\n}\n\n/**\n * Insert `<legacyDrawing>` into a worksheet, after `<drawing>` and before the\n * trailing collection elements (CT_Worksheet sequence order). Skipped when one\n * already exists.\n */\nfunction insertLegacyDrawing(wsRoot: Element, rId: string): void {\n const els = wsRoot.elements ?? (wsRoot.elements = []);\n if (els.some((e) => localName(e) === \"legacyDrawing\")) return;\n const legacy = makeElement(\"legacyDrawing\", { \"r:id\": rId });\n const afterLegacy = new Set([\n \"tableParts\",\n \"extLst\",\n \"oleObjects\",\n \"controls\",\n \"picture\",\n \"webPublishItems\",\n ]);\n let insertAt = els.length;\n for (const [i, el] of els.entries()) {\n if (afterLegacy.has(localName(el))) {\n insertAt = i;\n break;\n }\n }\n els.splice(insertAt, 0, legacy);\n}\n\n/** commentsDesc.stringify ignores its context; this satisfies the WriteContext type. */\nconst STUB_WRITE_CTX = {} as unknown as WriteContext;\n\n/**\n * Append cell comments to a worksheet, merging with any existing comments part.\n * Wires commentsN.xml + vmlDrawingN.vml (reusing the existing pair when present),\n * the worksheet relationships, the `<legacyDrawing>` anchor, and content types.\n * VML text is written to {@link vmlFiles} (not xmlMap) because of its extension.\n */\nfunction appendCommentsToMap(\n xmlMap: Map<string, Element>,\n vmlFiles: Map<string, string>,\n sheetName: string,\n commentOpts: CommentOptions[],\n): void {\n const sheetPath = resolveSheetPath(xmlMap, sheetName);\n const wsRelsKey = relsKeyFor(sheetPath);\n const wsRels = xmlMap.get(wsRelsKey) ?? createRelationshipFile();\n xmlMap.set(wsRelsKey, wsRels);\n\n // Reuse the worksheet's existing comments/vmlDrawing relationships when present.\n const existingComments = findRelByType(rootOf(wsRels), COMMENTS_REL_TYPE);\n const existingVml = findRelByType(rootOf(wsRels), VML_REL_TYPE);\n\n const commentsN = existingComments\n ? Number((existingComments.target.match(/comments(\\d+)\\.xml$/) ?? [])[1]) ||\n nextCommentsNumber(xmlMap)\n : nextCommentsNumber(xmlMap);\n const commentsPath = `xl/comments${commentsN}.xml`;\n // Reuse the existing vmlDrawing path when present — its index can differ from\n // the comments index in third-party files.\n const vmlPath = existingVml\n ? `xl/drawings/${existingVml.target.slice(existingVml.target.lastIndexOf(\"/\") + 1)}`\n : `xl/drawings/vmlDrawing${commentsN}.vml`;\n\n // Merge with the existing comments part if it was already in the package.\n const existingPart = rootOf(xmlMap.get(commentsPath));\n let merged = commentOpts;\n if (existingPart) {\n merged = [...commentsDesc.parse(existingPart, STUB_READ_CTX).comments, ...commentOpts];\n }\n\n const commentsXml = commentsDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (commentsXml) {\n xmlMap.set(\n commentsPath,\n toJson(`<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`),\n );\n }\n const vmlXml = vmlNotesDesc.stringify({ comments: merged }, STUB_WRITE_CTX);\n if (vmlXml) {\n vmlFiles.set(vmlPath, `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`);\n }\n\n // Worksheet relationships — added only when the part is newly introduced.\n if (!existingComments) {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, COMMENTS_REL_TYPE, `../comments${commentsN}.xml`);\n }\n let vmlRidRef: string;\n if (existingVml) {\n vmlRidRef = existingVml.id;\n } else {\n const n = getNextRelationshipIndex(wsRels);\n appendRelationship(wsRels, n, VML_REL_TYPE, `../drawings/vmlDrawing${commentsN}.vml`);\n vmlRidRef = `rId${n}`;\n }\n\n // `<legacyDrawing>` anchor on the worksheet (deduped).\n const wsRoot = rootOf(xmlMap.get(sheetPath));\n if (wsRoot) insertLegacyDrawing(wsRoot, vmlRidRef);\n\n // Content types — comments Override (new part only) + vml Default (deduped).\n const contentTypes = xmlMap.get(\"[Content_Types].xml\");\n if (contentTypes) {\n if (!existingPart) {\n appendOverride(contentTypes, `/${commentsPath}`, COMMENTS_CONTENT_TYPE);\n }\n appendContentType(contentTypes, VML_CONTENT_TYPE, \"vml\");\n }\n}\n","/**\n * XLSX Compiler — compiles WorkbookOptions into a Zippable structure.\n *\n * Accepts pure JSON WorkbookOptions — no intermediate File class needed.\n * Uses XlsxWriteContext for shared state (strings, styles, media, charts).\n *\n * @module\n */\n\nimport {\n Relationships,\n TargetModeType,\n appPropertiesDesc,\n buildCorePropertiesXmlString,\n buildRootRelationships,\n compileMapping,\n contentTypesDesc,\n deriveContentTypes,\n pickNonVisualDrawingProperties,\n resolverFromRegistry,\n XLSX_PARTS,\n customPropertiesDesc,\n toUint8Array,\n IMAGE_MEDIA_CONTENT_TYPES,\n type XmlifyedFile,\n type Zippable,\n} from \"@office-open/core\";\nimport { chartSpaceDesc } from \"@office-open/core/chart\";\nimport { buildThemeXml } from \"@office-open/core/theme\";\nimport { OOXML_XML_DECLARATION } from \"@office-open/xml\";\nimport type { CalcCell } from \"@parts/calc-chain\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport { commentsDesc, vmlNotesDesc } from \"@parts/comments\";\nimport { connectionsDesc } from \"@parts/connection\";\nimport { dialogsheetDesc } from \"@parts/dialogsheet\";\nimport type { DrawingPictureOptions, ChartAnchorOptions } from \"@parts/drawing\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { A_NS, R_NS, XDR_NS, graphicFrameXml, wrapAnchor } from \"@parts/drawing/stringify\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { WorkbookOptions } from \"@parts/file\";\nimport { metadataDesc } from \"@parts/metadata\";\nimport type { MetadataOptions } from \"@parts/metadata\";\nimport { aggregate, collectUniqueValues } from \"@parts/pivot\";\nimport type { PivotSourceData, PivotTableOptions } from \"@parts/pivot\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport { queryTableDesc } from \"@parts/query-table\";\nimport { revisionHeadersDesc, revisionLogDesc, usersDesc } from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport type { SharedStrings } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport { createThemeXml } from \"@parts/theme\";\nimport type { TablePartReference, SheetDefinition } from \"@parts/workbook\";\nimport { workbookDesc, buildTablePartsXml, buildExternalReferencesXml } from \"@parts/workbook\";\nimport { buildWorksheetXml, type WorksheetContext } from \"@parts/worksheet\";\nimport type { RowOptions, WorksheetOptions } from \"@parts/worksheet\";\nimport { mapInfoDesc, singleXmlCellsDesc } from \"@parts/xml-mapping\";\nimport { columnToLetter } from \"@util/index\";\n\nimport { XlsxWriteContext } from \"./context\";\n\nconst XML_DECL = OOXML_XML_DECLARATION;\n\n/** XLSX part path → content type, derived from the part registry. Matches\n * actual file paths, so the dense/sequential xlsx part naming is handled. */\nconst XLSX_CONTENT_TYPE_RESOLVER = resolverFromRegistry(XLSX_PARTS);\n\n/** Extension → MIME for image and VML Default entries. Declared only for\n * extensions actually present in the package. VML backs legacy comment\n * anchors (xl/drawings/vmlDrawing${i}.vml). */\nconst XLSX_MEDIA_CONTENT_TYPES: Record<string, string> = {\n ...IMAGE_MEDIA_CONTENT_TYPES,\n vml: \"application/vnd.openxmlformats-officedocument.vmlDrawing\",\n};\n\n/** UTF-8 encoder for serializing the derived [Content_Types].xml into the package. */\nconst encoder = new TextEncoder();\n\n/**\n * Compile workbook options into a Zippable structure.\n */\nexport function compileWorkbook(\n options: WorkbookOptions,\n overrides: XmlifyedFile[] = [],\n mediaLevel: number = 0,\n): Zippable {\n const ctx = new XlsxWriteContext();\n const mapping: Record<string, { data: string; path: string }> = {};\n\n const worksheetConfigs = options.worksheets ?? [];\n const chartsheetConfigs = options.chartsheets ?? [];\n const dialogsheetConfigs = options.dialogsheets ?? [];\n const hasCustomProperties = !!options.customProperties && options.customProperties.length > 0;\n\n // Core properties\n mapping[\"Properties\"] = {\n data: XML_DECL + buildCorePropertiesXmlString(options),\n path: \"docProps/core.xml\",\n };\n\n // App properties\n mapping[\"AppProperties\"] = {\n data: XML_DECL + (appPropertiesDesc.stringify(options.appProperties ?? {}, ctx) ?? \"\"),\n path: \"docProps/app.xml\",\n };\n\n // Custom properties (optional part; only emitted when present)\n if (hasCustomProperties) {\n mapping[\"CustomProperties\"] = {\n data:\n XML_DECL +\n (customPropertiesDesc.stringify({ properties: options.customProperties ?? [] }, ctx) ?? \"\"),\n path: \"docProps/custom.xml\",\n };\n }\n\n // File-level relationships (_rels/.rels)\n const fileRels = buildRootRelationships(\"xl/workbook.xml\", hasCustomProperties);\n mapping[\"FileRelationships\"] = {\n data: XML_DECL + fileRels.serialize(),\n path: \"_rels/.rels\",\n };\n\n // Register predefined DXFs before worksheets use styles\n for (const dxf of options.dxfs ?? []) {\n ctx.registerDxf(dxf);\n }\n\n // Re-apply parsed style sections so a declarative round-trip preserves\n // them (colors, table/cell styles, extensions) alongside DXFs.\n if (options.colors) ctx.styles.setColors(options.colors);\n if (options.tableStyles) ctx.styles.setTableStyles(options.tableStyles);\n if (options.cellStyles) ctx.styles.setCustomCellStyles(options.cellStyles);\n if (options.cellStyleXfs) ctx.styles.setCellStyleXfs(options.cellStyleXfs);\n if (options.styleExtensions) ctx.styles.setExtensions(options.styleExtensions);\n\n // Build workbook relationships\n buildWorkbookRelationships(\n ctx.workbookRels,\n worksheetConfigs.length,\n chartsheetConfigs.length,\n dialogsheetConfigs.length,\n );\n\n // Build sheet definitions for workbook XML\n const sheets: SheetDefinition[] = [];\n let sheetId = 1;\n let rId = 1;\n for (const ws of worksheetConfigs) {\n sheets.push({\n name: ws.name ?? `Sheet${sheetId}`,\n sheetId: sheetId++,\n rId: `rId${rId++}`,\n });\n }\n for (const cs of chartsheetConfigs) {\n sheets.push({\n name: cs.name ?? `Chart${sheetId}`,\n sheetId: sheetId++,\n rId: `rId${rId++}`,\n });\n }\n for (const ds of dialogsheetConfigs) {\n sheets.push({\n name: ds.name ?? `Dialog${sheetId}`,\n sheetId: sheetId++,\n rId: `rId${rId++}`,\n });\n }\n\n // Worksheets — formatted BEFORE SharedStrings so strings are registered\n let globalMediaIdx = 0;\n let globalChartIdx = 0;\n let globalPivotIdx = 0;\n let globalPivotCacheIdx = 0;\n let globalTableIdx = 0;\n let globalQueryTableIdx = 0;\n let globalSingleXmlCellsIdx = 0;\n const pivotCacheDataMap = new Map<string, { cacheId: number; cacheIdx: number }>();\n const calcCells: CalcCell[] = [];\n const allTableParts: TablePartReference[] = [];\n\n const wsContext: WorksheetContext = { sharedStrings: ctx.sharedStrings, styles: ctx.styles };\n\n for (const [i, wsOpts] of worksheetConfigs.entries()) {\n const imgOpts = wsOpts.images ?? [];\n const chartOpts = wsOpts.charts ?? [];\n const shapeOpts = wsOpts.shapes ?? [];\n const connectorOpts = wsOpts.connectors ?? [];\n const groupOpts = wsOpts.groups ?? [];\n const hlOpts = wsOpts.hyperlinks ?? [];\n const sheetName = wsOpts.name ?? `Sheet${i + 1}`;\n\n // Worksheet uses buildWorksheetXml fast path (zero-allocation string concat)\n let sheetXml = buildWorksheetXml(wsOpts, wsContext);\n\n // Collect formula cells for calcChain\n const sheetIdx = i + 1;\n const wsRows = wsOpts.rows ?? [];\n for (const [ri, rowOpts] of wsRows.entries()) {\n const rowNumber = rowOpts.rowNumber ?? ri + 1;\n if (!rowOpts.cells) continue;\n for (const [ci, cell] of rowOpts.cells.entries()) {\n if (!cell.formula) continue;\n const ref = cell.reference ?? columnToLetter(ci + 1) + rowNumber;\n calcCells.push({\n reference: ref,\n sheetIndex: sheetIdx,\n array: typeof cell.formula === \"object\" && cell.formula.type === \"array\",\n });\n }\n }\n\n const hasMedia =\n imgOpts.length > 0 ||\n chartOpts.length > 0 ||\n shapeOpts.length > 0 ||\n connectorOpts.length > 0 ||\n groupOpts.length > 0;\n const hasExternalHyperlinks = hlOpts.some((h) => h.target.type === \"external\");\n const commentOpts = wsOpts.comments ?? [];\n const hasComments = commentOpts.length > 0;\n const pivotOpts = wsOpts.pivotTables ?? [];\n const hasPivots = pivotOpts.length > 0;\n const tableOpts = wsOpts.tables ?? [];\n const hasTables = tableOpts.length > 0;\n const queryTableOpts = wsOpts.queryTables ?? [];\n const hasQueryTables = queryTableOpts.length > 0;\n const singleXmlCellOpts = wsOpts.singleXmlCells ?? [];\n const bgImg = wsOpts.backgroundImage;\n\n // Worksheet-level relationships\n let wsRels: Relationships | undefined;\n let nextRid = 0;\n\n if (\n hasMedia ||\n hasExternalHyperlinks ||\n hasComments ||\n hasPivots ||\n hasTables ||\n hasQueryTables ||\n singleXmlCellOpts.length > 0 ||\n bgImg\n ) {\n wsRels = new Relationships();\n }\n\n if (hasExternalHyperlinks) {\n for (const hl of hlOpts) {\n if (hl.target.type !== \"external\") continue;\n const rid = ++nextRid;\n wsRels!.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n hl.target.url,\n \"External\",\n );\n }\n }\n\n if (hasMedia) {\n const drawingImages: DrawingPictureOptions[] = [];\n const drawingCharts: ChartAnchorOptions[] = [];\n const drawingRels = new Relationships();\n let rid = 1;\n\n // Process images\n for (const img of imgOpts) {\n const ext = img.type === \"jpg\" ? \"jpeg\" : \"png\";\n const rawBytes = toUint8Array(img.data, { encoding: \"base64\" });\n const entry = ctx.media.addMedia(rawBytes, ext, (fileName) => ({\n fileName,\n type: ext,\n data: rawBytes,\n width: 0,\n height: 0,\n }));\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `../media/${entry.fileName}`,\n );\n\n drawingImages.push({\n col: img.col,\n row: img.row,\n rId: `rId${rid}`,\n ...pickNonVisualDrawingProperties(img),\n });\n rid++;\n globalMediaIdx++;\n }\n\n // Process charts\n for (const chart of chartOpts) {\n const chartKey = `chart_${globalChartIdx}`;\n ctx.charts.addChart(chartKey, {\n key: chartKey,\n chartSpaceXml: chartSpaceDesc.stringify(chart, ctx) ?? \"\",\n });\n\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `../charts/chart${globalChartIdx + 1}.xml`,\n );\n\n drawingCharts.push({\n col: chart.col,\n row: chart.row,\n rId: `rId${rid}`,\n });\n rid++;\n globalChartIdx++;\n }\n\n // Generate drawing XML (via descriptor). Snapshot the hyperlink registry\n // first so only runs stringified for this sheet's drawing resolve here.\n const hyperlinkBase = ctx.hyperlinks.length;\n const drawingXml = drawingDesc.stringify(\n {\n images: drawingImages,\n charts: drawingCharts,\n shapes: shapeOpts,\n connectors: connectorOpts,\n groups: groupOpts,\n },\n ctx,\n );\n // Resolve drawing shape text-hyperlink placeholders ({hlink:key} → real\n // rId) and register each as an External hyperlink relationship.\n let resolvedDrawingXml = drawingXml!;\n for (const h of ctx.hyperlinks.slice(hyperlinkBase)) {\n drawingRels.addRelationship(\n rid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n h.url,\n \"External\",\n );\n resolvedDrawingXml = resolvedDrawingXml\n .split(`r:id=\"{hlink:${h.key}}\"`)\n .join(`r:id=\"rId${rid}\"`);\n rid++;\n }\n const drawingIdx = i + 1;\n mapping[`Drawing${i}`] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${resolvedDrawingXml}`,\n path: `xl/drawings/drawing${drawingIdx}.xml`,\n };\n\n // Drawing relationships\n mapping[`DrawingRels${i}`] = {\n data: XML_DECL + drawingRels.serialize(),\n path: `xl/drawings/_rels/drawing${drawingIdx}.xml.rels`,\n };\n\n // Insert drawing reference before the closing </worksheet> tag.\n const drawingRid = ++nextRid;\n const closingTag = \"</worksheet>\";\n sheetXml =\n sheetXml.slice(0, -closingTag.length) + `<drawing r:id=\"rId${drawingRid}\"/>` + closingTag;\n\n // Add drawing relationship to worksheet rels\n wsRels!.addRelationship(\n drawingRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n `../drawings/drawing${drawingIdx}.xml`,\n );\n }\n\n // Comments\n if (hasComments) {\n const commentsIdx = i + 1;\n\n // Comments XML (via descriptor)\n const commentsXml = commentsDesc.stringify({ comments: commentOpts }, ctx);\n mapping[`Comments${i}`] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${commentsXml}`,\n path: `xl/comments${commentsIdx}.xml`,\n };\n\n // VML drawing (via descriptor)\n const vmlXml = vmlNotesDesc.stringify({ comments: commentOpts }, ctx);\n mapping[`VmlDrawing${i}`] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${vmlXml}`,\n path: `xl/drawings/vmlDrawing${commentsIdx}.vml`,\n };\n\n // Worksheet rels: comments → comments XML, legacyDrawing → VML file\n const commentsRid = ++nextRid;\n wsRels!.addRelationship(\n commentsRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n `../comments${commentsIdx}.xml`,\n );\n\n const vmlRid = ++nextRid;\n wsRels!.addRelationship(\n vmlRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n `../drawings/vmlDrawing${commentsIdx}.vml`,\n );\n\n // Insert legacyDrawing reference before closing </worksheet>\n const closingTag = \"</worksheet>\";\n sheetXml =\n sheetXml.slice(0, -closingTag.length) + `<legacyDrawing r:id=\"rId${vmlRid}\"/>` + closingTag;\n }\n\n // Background picture\n if (bgImg) {\n const ext = bgImg.type === \"jpg\" ? \"jpeg\" : bgImg.type;\n const rawBytes = toUint8Array(bgImg.data, { encoding: \"base64\" });\n const entry = ctx.media.addMedia(rawBytes, ext, (fileName) => ({\n fileName,\n type: ext,\n data: rawBytes,\n width: 0,\n height: 0,\n }));\n globalMediaIdx++;\n const bgRid = ++nextRid;\n wsRels!.addRelationship(\n bgRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n `../media/${entry.fileName}`,\n );\n sheetXml = sheetXml.replace(\"<!--BACKGROUND_PICTURE-->\", `<picture r:id=\"rId${bgRid}\"/>`);\n }\n\n // Pivot tables\n if (hasPivots) {\n for (const pt of pivotOpts) {\n globalPivotIdx++;\n const pivotIdx = globalPivotIdx;\n\n // Extract source data from source sheet\n const sourceSheet = pt.sourceSheet ?? sheetName;\n const sourceWsIdx = worksheetConfigs.findIndex(\n (ws) => (ws.name ?? `Sheet${worksheetConfigs.indexOf(ws) + 1}`) === sourceSheet,\n );\n if (sourceWsIdx === -1) continue;\n const sourceWs = worksheetConfigs[sourceWsIdx];\n if (!sourceWs) continue;\n\n const sourceRows = sourceWs.rows ?? [];\n const sourceData = extractPivotSourceData(sourceRows, pt.source);\n\n // Deduplicate pivot caches by source reference\n const cacheKey = `${sourceSheet}:${pt.source}`;\n let cacheId: number;\n let cacheIdx: number;\n const existing = pivotCacheDataMap.get(cacheKey);\n if (existing) {\n cacheId = existing.cacheId;\n cacheIdx = existing.cacheIdx;\n } else {\n globalPivotCacheIdx++;\n cacheIdx = globalPivotCacheIdx;\n cacheId = cacheIdx;\n pivotCacheDataMap.set(cacheKey, { cacheId, cacheIdx });\n\n // Generate pivotCacheDefinition\n const cacheDefRels = new Relationships();\n cacheDefRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheRecords\",\n \"pivotCacheRecords1.xml\",\n );\n\n const cacheDefXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n pivotCacheDefDesc.stringify(\n {\n sourceRef: pt.source.split(\":\")[0] ? pt.source : \"A1\",\n sourceSheet,\n sourceData,\n recordsRid: \"rId1\",\n },\n ctx,\n );\n\n mapping[`PivotCacheDef${cacheIdx}`] = {\n data: cacheDefXml,\n path: `xl/pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n };\n mapping[`PivotCacheDefRels${cacheIdx}`] = {\n data: XML_DECL + cacheDefRels.serialize(),\n path: `xl/pivotCache/_rels/pivotCacheDefinition${cacheIdx}.xml.rels`,\n };\n\n // Generate pivotCacheRecords\n const cacheRecordsXml =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n pivotCacheRecordsDesc.stringify({ sourceData }, ctx);\n mapping[`PivotCacheRecords${cacheIdx}`] = {\n data: cacheRecordsXml,\n path: `xl/pivotCache/pivotCacheRecords${cacheIdx}.xml`,\n };\n\n // Register in workbook\n const wbPivotRid = ctx.workbookRels.relationshipCount + 1;\n ctx.workbookRels.addRelationship(\n wbPivotRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n `pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n );\n ctx.pivotCacheRefs.push({ cacheId, rId: `rId${wbPivotRid}` });\n }\n\n // Generate pivotTable\n const pivotTableXml =\n XML_DECL + pivotTableDesc.stringify({ options: pt, sourceData, cacheId }, ctx);\n mapping[`PivotTable${pivotIdx}`] = {\n data: pivotTableXml,\n path: `xl/pivotTables/pivotTable${pivotIdx}.xml`,\n };\n\n // pivotTable rels → cacheDefinition\n const ptRels = new Relationships();\n ptRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotCacheDefinition\",\n `../pivotCache/pivotCacheDefinition${cacheIdx}.xml`,\n );\n mapping[`PivotTableRels${pivotIdx}`] = {\n data: XML_DECL + ptRels.serialize(),\n path: `xl/pivotTables/_rels/pivotTable${pivotIdx}.xml.rels`,\n };\n\n // Worksheet rels → pivotTable\n const ptRid = ++nextRid;\n wsRels!.addRelationship(\n ptRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/pivotTable\",\n `../pivotTables/pivotTable${pivotIdx}.xml`,\n );\n }\n }\n\n // Tables (list objects)\n const wsTableParts: TablePartReference[] = [];\n if (hasTables) {\n for (const tbl of tableOpts) {\n globalTableIdx++;\n const tableIdx = globalTableIdx;\n\n // Generate table XML\n const tableXmlStr =\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n tableDesc.stringify({ ...tbl, id: tbl.id ?? tableIdx }, ctx);\n mapping[`Table${tableIdx}`] = {\n data: tableXmlStr,\n path: `xl/tables/table${tableIdx}.xml`,\n };\n\n // Worksheet rels → table\n const tblRid = ++nextRid;\n wsRels!.addRelationship(\n tblRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/table\",\n `../tables/table${tableIdx}.xml`,\n );\n\n wsTableParts.push({ rId: `rId${tblRid}` });\n allTableParts.push({ rId: `rId${tblRid}` });\n }\n }\n\n // Query tables\n if (hasQueryTables) {\n for (const qt of queryTableOpts) {\n globalQueryTableIdx++;\n mapping[`QueryTable${globalQueryTableIdx}`] = {\n data: XML_DECL + queryTableDesc.stringify(qt, ctx),\n path: `xl/queryTables/queryTable${globalQueryTableIdx}.xml`,\n };\n const qtRid = ++nextRid;\n wsRels!.addRelationship(\n qtRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/queryTable\",\n `../queryTables/queryTable${globalQueryTableIdx}.xml`,\n );\n }\n }\n\n // Single-cell XML tables\n if (singleXmlCellOpts.length > 0) {\n globalSingleXmlCellsIdx++;\n mapping[`TableSingleCells${globalSingleXmlCellsIdx}`] = {\n data: XML_DECL + singleXmlCellsDesc.stringify({ cells: singleXmlCellOpts }, ctx),\n path: `xl/tables/tableSingleCells${globalSingleXmlCellsIdx}.xml`,\n };\n const sxcRid = ++nextRid;\n wsRels!.addRelationship(\n sxcRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/tableSingleCells\",\n `../tables/tableSingleCells${globalSingleXmlCellsIdx}.xml`,\n );\n }\n\n // Pre-render pivot table data into sheetData\n if (hasPivots) {\n const rendered = renderPivotSheetData(\n pivotOpts,\n worksheetConfigs,\n ctx.sharedStrings,\n sheetName,\n );\n if (rendered.sheetData.length > 0) {\n // Replace empty <sheetData/> or <sheetData></sheetData> with rendered data\n sheetXml = sheetXml.replace(/<sheetData\\/>|<sheetData><\\/sheetData>/, rendered.sheetData);\n // Inject <dimension> before <sheetViews> (XSD sequence order: dimension before sheetViews)\n if (!sheetXml.includes(\"<dimension\")) {\n sheetXml = sheetXml.replace(\n \"<sheetViews\",\n `<dimension ref=\"${rendered.dimensionRef}\"/><sheetViews`,\n );\n }\n }\n }\n\n // Insert tableParts before closing </worksheet> tag\n if (wsTableParts.length > 0) {\n const tablePartsXml = buildTablePartsXml(wsTableParts);\n const closingTag = \"</worksheet>\";\n sheetXml = sheetXml.slice(0, -closingTag.length) + tablePartsXml + closingTag;\n }\n\n // Write worksheet rels if needed\n if (wsRels) {\n mapping[`WorksheetRels${i}`] = {\n data: XML_DECL + wsRels.serialize(),\n path: `xl/worksheets/_rels/sheet${i + 1}.xml.rels`,\n };\n }\n\n mapping[`Worksheet${i}`] = {\n data: sheetXml,\n path: `xl/worksheets/sheet${i + 1}.xml`,\n };\n }\n\n // Chartsheets — chart-only sheets\n for (const [i, csOpts] of chartsheetConfigs.entries()) {\n // Register chart in the charts collection\n const chartDef = csOpts.chart;\n const csChartGlobalIdx = ctx.charts.array.length;\n const csChartKey = `cs_chart_${csChartGlobalIdx}`;\n ctx.charts.addChart(csChartKey, {\n key: csChartKey,\n chartSpaceXml:\n chartSpaceDesc.stringify(\n {\n type: chartDef.type as\n | \"column\"\n | \"bar\"\n | \"line\"\n | \"pie\"\n | \"doughnut\"\n | \"area\"\n | \"scatter\"\n | \"bubble\",\n title: chartDef.title,\n categories: chartDef.categories,\n series: chartDef.series,\n },\n ctx,\n ) ?? \"\",\n });\n\n // Chartsheet relationships: drawing (required)\n const csRels = new Relationships();\n const csDrawingIdx = i + 1;\n csRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n `../drawings/drawing${csDrawingIdx}.xml`,\n );\n\n // Drawing rels: chart reference\n const csDrawingRels = new Relationships();\n csDrawingRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n `../charts/chart${csChartGlobalIdx + 1}.xml`,\n );\n\n // Minimal drawing XML with chart anchor — reuses the parts/drawing anchor\n // and graphicFrame builders (no hand-rolled xdr emitter). A chartsheet\n // chart fills the sheet: absolute anchor at origin with the full-page frame.\n const frame = graphicFrameXml(1, undefined, `Chart ${i + 1}`, \"rId1\", 9308969, 6096000);\n const anchor = wrapAnchor(\n {\n anchorType: \"absolute\",\n col: 1,\n row: 1,\n absoluteX: 0,\n absoluteY: 0,\n extentCx: 9308969,\n extentCy: 6096000,\n },\n `${frame}<clientData/>`,\n );\n const csDrawingXml = `<wsDr xmlns=\"${XDR_NS}\" xmlns:a=\"${A_NS}\" xmlns:r=\"${R_NS}\">${anchor}</wsDr>`;\n\n mapping[`ChartsheetDrawing${i}`] = {\n data: csDrawingXml,\n path: `xl/drawings/drawing${csDrawingIdx}.xml`,\n };\n mapping[`ChartsheetDrawingRels${i}`] = {\n data: XML_DECL + csDrawingRels.serialize(),\n path: `xl/drawings/_rels/drawing${csDrawingIdx}.xml.rels`,\n };\n\n mapping[`ChartsheetRels${i}`] = {\n data: XML_DECL + csRels.serialize(),\n path: `xl/chartsheets/_rels/sheet${i + 1}.xml.rels`,\n };\n mapping[`Chartsheet${i}`] = {\n data: XML_DECL + chartsheetDesc.stringify({ ...csOpts, drawingRId: \"rId1\" }, ctx),\n path: `xl/chartsheets/sheet${i + 1}.xml`,\n };\n }\n\n // Dialogsheets — legacy Excel 5.0 dialog sheets\n for (const [i, dsOpts] of dialogsheetConfigs.entries()) {\n mapping[`Dialogsheet${i}`] = {\n data: XML_DECL + dialogsheetDesc.stringify(dsOpts, ctx),\n path: `xl/dialogSheets/sheet${i + 1}.xml`,\n };\n }\n\n // Workbook XML (via descriptor)\n let wbXml =\n workbookDesc.stringify(\n {\n sheets,\n pivotCaches: ctx.pivotCacheRefs,\n protection: options.workbookProtection,\n customViews: options.customWorkbookViews,\n fileRecoveryPr: options.fileRecoveryPr,\n functionGroups: options.functionGroups,\n webPublishing: options.webPublishing,\n fileSharing: options.fileSharing,\n volTypes: options.volTypes,\n webPublishObjects: options.webPublishObjects,\n definedNames: options.definedNames,\n workbookPr: options.workbookPr,\n calcPr: options.calcPr,\n bookView: options.bookView,\n },\n ctx,\n ) ?? \"\";\n\n // Connections — xl/connections.xml (single part, workbook-level relationship)\n if (options.connections && options.connections.length > 0) {\n const cRid = ctx.workbookRels.relationshipCount + 1;\n ctx.workbookRels.addRelationship(\n cRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/connections\",\n \"connections.xml\",\n );\n mapping[\"Connections\"] = {\n data: XML_DECL + connectionsDesc.stringify({ connections: options.connections }, ctx),\n path: \"xl/connections.xml\",\n };\n }\n\n // Metadata — xl/metadata.xml (single part, workbook-level relationship)\n if (options.metadata && hasMetadataContent(options.metadata)) {\n const mRid = ctx.workbookRels.relationshipCount + 1;\n ctx.workbookRels.addRelationship(\n mRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/metadata\",\n \"metadata.xml\",\n );\n mapping[\"Metadata\"] = {\n data: XML_DECL + metadataDesc.stringify(options.metadata, ctx),\n path: \"xl/metadata.xml\",\n };\n }\n\n // XML mappings — xl/xmlMaps.xml (single part, workbook-level relationship)\n if (options.xmlMaps) {\n const xRid = ctx.workbookRels.relationshipCount + 1;\n ctx.workbookRels.addRelationship(\n xRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps\",\n \"xmlMaps.xml\",\n );\n mapping[\"XmlMaps\"] = {\n data: XML_DECL + mapInfoDesc.stringify(options.xmlMaps, ctx),\n path: \"xl/xmlMaps.xml\",\n };\n }\n\n // External links — generate XML files and inject externalReferences into workbook\n const extLinks = options.externalLinks ?? [];\n if (extLinks.length > 0) {\n const extRefs: { rId: string }[] = [];\n for (let ei = 0; ei < extLinks.length; ei++) {\n const elIdx = ei + 1;\n const elRid = ctx.workbookRels.relationshipCount + 1;\n ctx.workbookRels.addRelationship(\n elRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n `externalLinks/externalLink${elIdx}.xml`,\n );\n\n // Create the rels file for this external link\n const elOpts = extLinks[ei];\n if (!elOpts) continue;\n let bookRId: string | undefined;\n if (elOpts.externalBook?.target) {\n const elRels = new Relationships();\n elRels.addRelationship(\n 1,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath\",\n elOpts.externalBook.target,\n TargetModeType.EXTERNAL,\n );\n bookRId = \"rId1\";\n mapping[`ExternalLinkRels${elIdx}`] = {\n data: XML_DECL + elRels.serialize(),\n path: `xl/externalLinks/_rels/externalLink${elIdx}.xml.rels`,\n };\n }\n\n // Generate the external link XML\n mapping[`ExternalLink${elIdx}`] = {\n data: XML_DECL + externalLinkDesc.stringify({ ...elOpts, bookRId }, ctx),\n path: `xl/externalLinks/externalLink${elIdx}.xml`,\n };\n\n extRefs.push({ rId: `rId${elRid}` });\n }\n\n // Inject externalReferences into workbook XML\n const extRefsXml = buildExternalReferencesXml(extRefs);\n wbXml = wbXml.replace(\"<!--EXTERNAL_REFS-->\", extRefsXml);\n } else {\n wbXml = wbXml.replace(\"<!--EXTERNAL_REFS-->\", \"\");\n }\n\n mapping[\"Workbook\"] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${wbXml}`,\n path: \"xl/workbook.xml\",\n };\n\n // Shared Strings — AFTER worksheets so all strings are collected\n if (ctx.sharedStrings.count > 0) {\n const ssXml = sharedStringsDesc.stringify(ctx.sharedStrings.toDescriptorOptions(), ctx);\n mapping[\"SharedStrings\"] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${ssXml}`,\n path: \"xl/sharedStrings.xml\",\n };\n }\n\n // Styles (via descriptor — delegates to Styles.toXml internally)\n const stylesXml = stylesDesc.stringify({ styles: ctx.styles }, ctx);\n mapping[\"Styles\"] = {\n data: `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>${stylesXml}`,\n path: \"xl/styles.xml\",\n };\n\n // Theme — a parsed source theme round-trips structurally; fresh output\n // keeps the Office default.\n mapping[\"Theme\"] = {\n data: XML_DECL + (options.theme ? buildThemeXml(options.theme, ctx) : createThemeXml()),\n path: \"xl/theme/theme1.xml\",\n };\n\n // Charts — AFTER worksheets so charts are registered\n for (const [i, chartData] of ctx.charts.array.entries()) {\n mapping[`Chart${i}`] = {\n data: XML_DECL + chartData.chartSpaceXml,\n path: `xl/charts/chart${i + 1}.xml`,\n };\n }\n\n // Calculation chain — auto-generated from formula cells\n if (calcCells.length > 0) {\n mapping[\"CalcChain\"] = {\n data: calcChainDesc.stringify({ cells: calcCells }, ctx) ?? \"\",\n path: \"xl/calcChain.xml\",\n };\n const calcChainRid = ctx.workbookRels.relationshipCount + 1;\n ctx.workbookRels.addRelationship(\n calcChainRid,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",\n \"calcChain.xml\",\n );\n }\n\n // Shared-workbook revisions (xl/revisionHeaders.xml + xl/revisions/revisionN.xml + xl/users.xml).\n // CT_Workbook has no revision element — parts are discovered via workbook.xml.rels + [Content_Types].\n if (options.revisionLog) {\n const rl = options.revisionLog;\n const REV_HEADERS_REL =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionHeaders\";\n const REV_LOG_REL =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog\";\n const USERS_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/users\";\n\n // xl/revisionHeaders.xml — target of an implicit relationship from the workbook.\n mapping[\"RevisionHeaders\"] = {\n data: XML_DECL + (revisionHeadersDesc.stringify(rl.headers, ctx) ?? \"\"),\n path: \"xl/revisionHeaders.xml\",\n };\n ctx.workbookRels.addRelationship(\n ctx.workbookRels.relationshipCount + 1,\n REV_HEADERS_REL,\n \"revisionHeaders.xml\",\n );\n\n // One revision log per header entry, plus revisionHeaders.xml.rels pointing to each.\n const revHeadersRels = new Relationships();\n for (const [i, log] of rl.logs.entries()) {\n mapping[`RevisionLog${i}`] = {\n data: XML_DECL + (revisionLogDesc.stringify(log, ctx) ?? \"\"),\n path: `xl/revisions/revision${i + 1}.xml`,\n };\n revHeadersRels.addRelationship(i + 1, REV_LOG_REL, `revisions/revision${i + 1}.xml`);\n }\n mapping[\"RevisionHeadersRels\"] = {\n data: XML_DECL + revHeadersRels.serialize(),\n path: \"xl/_rels/revisionHeaders.xml.rels\",\n };\n\n // xl/users.xml (optional)\n if (rl.users) {\n const usersXml = usersDesc.stringify(rl.users, ctx);\n if (usersXml) {\n mapping[\"Users\"] = { data: XML_DECL + usersXml, path: \"xl/users.xml\" };\n ctx.workbookRels.addRelationship(\n ctx.workbookRels.relationshipCount + 1,\n USERS_REL,\n \"users.xml\",\n );\n }\n }\n }\n\n // Workbook relationships — serialized after calcChain/revision register their\n // targets, so every workbook-level relationship lands in workbook.xml.rels.\n mapping[\"WorkbookRelationships\"] = {\n data: XML_DECL + ctx.workbookRels.serialize(),\n path: \"xl/_rels/workbook.xml.rels\",\n };\n\n // Convert mapping to Zippable\n const mediaFiles: Array<{ data: Uint8Array; path: string }> = [];\n for (const img of ctx.media.array) {\n mediaFiles.push({ data: img.data, path: `xl/media/${img.fileName}` });\n }\n\n const files = compileMapping(mapping, overrides, mediaFiles, mediaLevel);\n // Derive [Content_Types].xml from the actual parts written — the file set is\n // the single source of truth, so content-type declarations cannot drift from\n // what is written. Sparse/index-based naming is handled naturally.\n const contentTypesInput = deriveContentTypes(Object.keys(files), {\n resolve: XLSX_CONTENT_TYPE_RESOLVER,\n mediaContentTypes: XLSX_MEDIA_CONTENT_TYPES,\n });\n files[\"[Content_Types].xml\"] = encoder.encode(\n XML_DECL + (contentTypesDesc.stringify(contentTypesInput, ctx) ?? \"\"),\n );\n return files;\n}\n\n// ── Pure helper functions ──\n\nfunction buildWorkbookRelationships(\n rels: Relationships,\n wsCount: number,\n csCount: number,\n dsCount: number = 0,\n): void {\n let rid = 1;\n for (let i = 0; i < wsCount; i++) {\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n `worksheets/sheet${i + 1}.xml`,\n );\n }\n for (let i = 0; i < csCount; i++) {\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\",\n `chartsheets/sheet${i + 1}.xml`,\n );\n }\n for (let i = 0; i < dsCount; i++) {\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet\",\n `dialogSheets/sheet${i + 1}.xml`,\n );\n }\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n \"styles.xml\",\n );\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n \"theme/theme1.xml\",\n );\n rels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n \"sharedStrings.xml\",\n );\n}\n\nfunction hasMetadataContent(metadata: MetadataOptions): boolean {\n return (\n (metadata.types?.length ?? 0) > 0 ||\n (metadata.strings?.length ?? 0) > 0 ||\n (metadata.mdx?.length ?? 0) > 0 ||\n (metadata.futureMetadata?.length ?? 0) > 0 ||\n (metadata.cellMetadata?.length ?? 0) > 0 ||\n (metadata.valueMetadata?.length ?? 0) > 0\n );\n}\n\nfunction extractPivotSourceData(rows: RowOptions[], sourceRef: string): PivotSourceData {\n const parts = sourceRef.split(\":\");\n const startMatch = parts[0]?.match(/^([A-Z]+)(\\d+)$/);\n const endMatch = parts[1]?.match(/^([A-Z]+)(\\d+)$/);\n if (!startMatch) {\n return { fieldNames: [], records: [] };\n }\n\n const startRow = parseInt(startMatch[2] ?? \"1\", 10) - 1;\n const endRow = endMatch ? parseInt(endMatch[2] ?? \"1\", 10) - 1 : startRow;\n const startCol = colLetterToIndex(startMatch[1] ?? \"A\");\n const endCol = endMatch ? colLetterToIndex(endMatch[1] ?? \"A\") : startCol;\n const colCount = endCol - startCol + 1;\n\n // First row is headers\n const headerRow = rows[startRow];\n const fieldNames: string[] = [];\n if (headerRow?.cells) {\n for (let c = startCol; c <= endCol && c < headerRow.cells.length; c++) {\n const hv = headerRow.cells[c]?.value;\n fieldNames.push(\n typeof hv === \"string\"\n ? hv\n : typeof hv === \"number\" || typeof hv === \"boolean\"\n ? String(hv)\n : `Col${c}`,\n );\n }\n }\n\n // Remaining rows are data\n const records: (string | number)[][] = [];\n for (let r = startRow + 1; r <= endRow; r++) {\n const row = rows[r];\n if (!row?.cells) continue;\n const record: (string | number)[] = [];\n for (let c = startCol; c <= endCol; c++) {\n const val = row.cells[c]?.value;\n if (typeof val === \"number\") {\n record.push(val);\n } else if (val instanceof Date) {\n record.push(val.getTime());\n } else {\n record.push(typeof val === \"string\" ? val : typeof val === \"boolean\" ? String(val) : \"\");\n }\n }\n if (record.length === colCount) {\n records.push(record);\n }\n }\n\n return { fieldNames, records };\n}\n\nfunction colLetterToIndex(letters: string): number {\n let col = 0;\n for (let i = 0; i < letters.length; i++) {\n col = col * 26 + (letters.charCodeAt(i) - 64);\n }\n return col - 1;\n}\n\nfunction renderPivotSheetData(\n pivotOpts: PivotTableOptions[],\n worksheetConfigs: WorksheetOptions[],\n sharedStrings: SharedStrings,\n currentSheetName: string,\n): { sheetData: string; dimensionRef: string } {\n const rowCells = new Map<number, string[]>();\n let maxRow = 0;\n let maxCol = 0;\n let minRow = Infinity;\n let minCol = Infinity;\n\n for (const pt of pivotOpts) {\n const location = pt.location ?? \"A3\";\n const locMatch = location.match(/^([A-Z]+)(\\d+)$/);\n if (!locMatch) continue;\n\n const startCol = colLetterToIndex(locMatch[1] ?? \"A\");\n const startRow = parseInt(locMatch[2] ?? \"1\", 10);\n const rowFieldNames = pt.rows;\n const dataFields = pt.data;\n\n const sourceSheetName = pt.sourceSheet ?? currentSheetName;\n const sourceWsIdx = worksheetConfigs.findIndex(\n (ws) => (ws.name ?? `Sheet${worksheetConfigs.indexOf(ws) + 1}`) === sourceSheetName,\n );\n if (sourceWsIdx === -1) continue;\n\n const sourceRows = worksheetConfigs[sourceWsIdx]?.rows ?? [];\n const sourceData = extractPivotSourceData(sourceRows, pt.source);\n if (sourceData.fieldNames.length === 0) continue;\n\n const fields = sourceData.fieldNames;\n const rowFieldIndices = rowFieldNames.map((n) => fields.indexOf(n));\n const dataFieldIndices = dataFields.map((df) => fields.indexOf(df.field));\n\n if (rowFieldIndices.some((idx) => idx === -1)) continue;\n if (dataFieldIndices.some((idx) => idx === -1)) continue;\n\n // Group records by row field values\n const groupMap = new Map<string, { keys: (string | number)[]; values: number[][] }>();\n for (const record of sourceData.records) {\n const groupKey = rowFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n let group = groupMap.get(groupKey);\n if (!group) {\n group = {\n keys: rowFieldIndices.map((fi) => {\n const v = record[fi];\n return typeof v === \"string\" || typeof v === \"number\" ? v : String(v ?? \"\");\n }),\n values: dataFieldIndices.map(() => []),\n };\n groupMap.set(groupKey, group);\n }\n for (const [di, fi] of dataFieldIndices.entries()) {\n const val = record[fi];\n if (typeof val === \"number\") {\n group.values[di]?.push(val);\n }\n }\n }\n\n // Column field info for cross-tab layout\n const colFieldNames = pt.columns ?? [];\n const colFieldIndices = colFieldNames.map((n) => fields.indexOf(n));\n\n const addCells = (rowIdx: number, cells: string[]) => {\n let arr = rowCells.get(rowIdx);\n if (!arr) {\n arr = [];\n rowCells.set(rowIdx, arr);\n }\n for (const c of cells) arr.push(c);\n minRow = Math.min(minRow, rowIdx);\n maxRow = Math.max(maxRow, rowIdx);\n };\n\n if (colFieldIndices.length > 0 && !colFieldIndices.some((idx) => idx === -1)) {\n // --- Cross-tab layout (with column fields) ---\n // Unique column values for the first column field\n const colUniqueVals = collectUniqueValues(sourceData.records, colFieldIndices[0] ?? 0).map(\n (v) => (typeof v === \"string\" || typeof v === \"number\" ? String(v) : String(v ?? \"\")),\n );\n\n // Build cross-tab map: rowKey → colKey → aggregated values per data field\n const crossTabMap = new Map<\n string,\n { rowKeys: (string | number)[]; colData: Map<string, number[][]>; rowTotals: number[][] }\n >();\n for (const record of sourceData.records) {\n const rowKey = rowFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n const colKey = colFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n let entry = crossTabMap.get(rowKey);\n if (!entry) {\n entry = {\n rowKeys: rowFieldIndices.map((fi) => {\n const v = record[fi];\n return typeof v === \"string\" || typeof v === \"number\" ? v : String(v ?? \"\");\n }),\n colData: new Map(),\n rowTotals: dataFieldIndices.map(() => []),\n };\n crossTabMap.set(rowKey, entry);\n }\n let colValues = entry.colData.get(colKey);\n if (!colValues) {\n colValues = dataFieldIndices.map(() => []);\n entry.colData.set(colKey, colValues);\n }\n for (const [di, fi] of dataFieldIndices.entries()) {\n const val = record[fi];\n if (typeof val === \"number\") {\n colValues[di]?.push(val);\n entry.rowTotals[di]?.push(val);\n }\n }\n }\n\n // Column count: row fields + column unique values + 1 (grand total column)\n const numColVals = colUniqueVals.length;\n const totalCols = rowFieldNames.length + numColVals + 1;\n const endCol = startCol + totalCols - 1;\n minCol = Math.min(minCol, startCol);\n maxCol = Math.max(maxCol, endCol);\n\n // Header row: [rowFieldName(s), ...colUniqueVals, dataFieldName or \"Grand Total\"]\n const headerCells: string[] = [];\n for (const rfName of rowFieldNames) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const strIdx = sharedStrings.register(rfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n for (const cv of colUniqueVals) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const strIdx = sharedStrings.register(cv);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n // Last header cell: data field name (e.g., \"Total Revenue\")\n {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n // Pivot layout requires at least one data field, so index 0 always exists.\n const df0 = dataFields[0]!;\n const subtotal = df0.summarize ?? \"sum\";\n const dfName = df0.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df0.field}`;\n const strIdx = sharedStrings.register(dfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n addCells(startRow, headerCells);\n\n // Data rows\n let currentRow = startRow + 1;\n for (const [, entry] of crossTabMap) {\n const cells: string[] = [];\n // Row label\n for (const [ri, rowKey] of entry.rowKeys.entries()) {\n const cellRef = colIndexToLetter(startCol + ri) + currentRow;\n const strIdx = sharedStrings.register(String(rowKey));\n cells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n // Column values for each unique column value\n for (const [ci, colKey] of colUniqueVals.entries()) {\n const colValues = entry.colData.get(colKey);\n const colOffset = rowFieldNames.length + ci;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const result = colValues ? aggregate(colValues[0] ?? [], subtotal) : 0;\n cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n // Row total (last column)\n {\n const colOffset = rowFieldNames.length + numColVals;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const result = aggregate(entry.rowTotals[0] ?? [], subtotal);\n cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, cells);\n currentRow++;\n }\n\n // Grand total row\n const gtCells: string[] = [];\n const gtStrIdx = sharedStrings.register(\"Grand Total\");\n gtCells.push(\n `<c r=\"${colIndexToLetter(startCol)}${currentRow}\" t=\"s\"><v>${gtStrIdx}</v></c>`,\n );\n for (const [ci, colKey] of colUniqueVals.entries()) {\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const colAllValues: number[] = [];\n const dfIdx0 = dataFieldIndices[0];\n for (const record of sourceData.records) {\n const recColKey = colFieldIndices.map((fi) => String(record[fi])).join(\"|\");\n if (recColKey === colKey && dfIdx0 !== undefined) {\n const val = record[dfIdx0];\n if (typeof val === \"number\") colAllValues.push(val);\n }\n }\n const colOffset = rowFieldNames.length + ci;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const result = aggregate(colAllValues, subtotal);\n gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n // Grand total (bottom-right)\n {\n const subtotal = dataFields[0]!.summarize ?? \"sum\";\n const dfIdx0 = dataFieldIndices[0];\n const allValues = sourceData.records\n .map((r) => (dfIdx0 !== undefined ? r[dfIdx0] : undefined))\n .filter((v): v is number => typeof v === \"number\");\n const colOffset = rowFieldNames.length + numColVals;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const result = aggregate(allValues, subtotal);\n gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, gtCells);\n } else {\n // --- Simple layout (no column fields) ---\n const endCol = startCol + rowFieldNames.length + dataFields.length - 1;\n minCol = Math.min(minCol, startCol);\n maxCol = Math.max(maxCol, endCol);\n\n // Header row\n const headerCells: string[] = [];\n for (const rfName of rowFieldNames) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const strIdx = sharedStrings.register(rfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n for (const df of dataFields) {\n const cellRef = colIndexToLetter(startCol + headerCells.length) + startRow;\n const subtotal = df.summarize ?? \"sum\";\n const dfName = df.name ?? `${subtotal === \"sum\" ? \"Sum\" : subtotal} of ${df.field}`;\n const strIdx = sharedStrings.register(dfName);\n headerCells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n addCells(startRow, headerCells);\n\n // Data rows\n let currentRow = startRow + 1;\n for (const [, group] of groupMap) {\n const cells: string[] = [];\n for (const [ri, key] of group.keys.entries()) {\n const cellRef = colIndexToLetter(startCol + ri) + currentRow;\n const strIdx = sharedStrings.register(String(key));\n cells.push(`<c r=\"${cellRef}\" t=\"s\"><v>${strIdx}</v></c>`);\n }\n for (const [di, df] of dataFields.entries()) {\n const colOffset = rowFieldNames.length + di;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = df.summarize ?? \"sum\";\n const result = aggregate(group.values[di] ?? [], subtotal);\n cells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, cells);\n currentRow++;\n }\n\n // Grand total row\n const gtCells: string[] = [];\n const gtStrIdx = sharedStrings.register(\"Grand Total\");\n gtCells.push(\n `<c r=\"${colIndexToLetter(startCol)}${currentRow}\" t=\"s\"><v>${gtStrIdx}</v></c>`,\n );\n for (const [di, df] of dataFields.entries()) {\n const colOffset = rowFieldNames.length + di;\n const cellRef = colIndexToLetter(startCol + colOffset) + currentRow;\n const subtotal = df.summarize ?? \"sum\";\n const dfIdx = dataFieldIndices[di];\n const allValues = sourceData.records\n .map((r) => (dfIdx !== undefined ? r[dfIdx] : undefined))\n .filter((v): v is number => typeof v === \"number\");\n const result = aggregate(allValues, subtotal);\n gtCells.push(`<c r=\"${cellRef}\"><v>${result}</v></c>`);\n }\n addCells(currentRow, gtCells);\n }\n }\n\n if (rowCells.size === 0) return { sheetData: \"\", dimensionRef: \"\" };\n\n // Build sheetData\n const parts: string[] = [\"<sheetData>\"];\n const sortedRows = [...rowCells.entries()].sort((a, b) => a[0] - b[0]);\n for (const [rowIdx, cells] of sortedRows) {\n parts.push(`<row r=\"${rowIdx}\" x14ac:dyDescent=\"0.25\">`);\n for (const c of cells) parts.push(c);\n parts.push(\"</row>\");\n }\n parts.push(\"</sheetData>\");\n\n const dimStartCol = colIndexToLetter(minCol === Infinity ? 0 : minCol);\n const dimStartRow = minRow === Infinity ? 1 : minRow;\n const dimensionRef = `${dimStartCol}${dimStartRow}:${colIndexToLetter(maxCol)}${maxRow}`;\n return { sheetData: parts.join(\"\"), dimensionRef };\n}\n\n/** 0-based column index → Excel letter(s); delegates to the 1-based util helper. */\nfunction colIndexToLetter(col: number): string {\n return columnToLetter(col + 1);\n}\n","/**\n * Streaming XLSX compilation — writes parts into a {@link ZipStreamWriter} as\n * they are produced instead of building the complete Zippable map first.\n *\n * The worksheet part (the only one that grows without bound) is serialized\n * row-chunk-wise through the shared `appendSheetDataRows`, so the full\n * worksheet XML string, its encoded bytes, and the archive buffer never\n * coexist. String cells use `t=\"inlineStr\"` (sharedStrings omitted) — the\n * documented Excel feature every constant-memory writer uses — because SST\n * indices would have to be known before the first row is written.\n *\n * Non-worksheet parts are small and come from the same descriptors as the\n * regular compile path, so their XML cannot drift.\n *\n * {@link generateWorkbookStream} routes plain-data workbooks here via\n * {@link canStreamWorkbook} and falls back to the full-memory stream for\n * anything richer — the fallback loses constant memory, not content.\n *\n * @module\n */\n\nimport {\n Relationships,\n ZipStreamWriter,\n appPropertiesDesc,\n buildCorePropertiesXmlString,\n buildRootRelationships,\n contentTypesDesc,\n customPropertiesDesc,\n deriveContentTypes,\n resolverFromRegistry,\n XLSX_PARTS,\n ZIP_DEFLATE_LEVEL,\n type CompressionOptions,\n} from \"@office-open/core\";\nimport { OOXML_XML_DECLARATION } from \"@office-open/xml\";\nimport type { WorkbookOptions } from \"@parts/file\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { createThemeXml } from \"@parts/theme\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport type { SheetDefinition } from \"@parts/workbook\";\nimport type { RowOptions } from \"@parts/worksheet\";\nimport { appendSheetDataRows } from \"@parts/worksheet/stringify\";\nimport { columnToLetter } from \"@util/index\";\n\nimport { XlsxWriteContext } from \"./context\";\n\n/** Rows per serialization flush — bounds the intermediate chunk size. */\nconst ROWS_PER_CHUNK = 5_000;\n\nconst XLSX_CONTENT_TYPE_RESOLVER = resolverFromRegistry(XLSX_PARTS);\n\n/** Workbook keys this path serializes. Anything else falls back to full compile. */\nconst WORKBOOK_KEYS: ReadonlySet<string> = new Set([\n // core properties (CorePropertiesOptions)\n \"title\",\n \"subject\",\n \"creator\",\n \"keywords\",\n \"description\",\n \"lastModifiedBy\",\n \"revision\",\n \"lastPrinted\",\n \"created\",\n \"modified\",\n // workbook content this path emits\n \"worksheets\",\n \"appProperties\",\n \"customProperties\",\n \"workbookProtection\",\n \"definedNames\",\n \"fileRecoveryPr\",\n \"functionGroups\",\n \"webPublishing\",\n \"fileSharing\",\n \"volTypes\",\n]);\n\n/** Worksheet keys this path serializes. Anything else falls back to full compile. */\nconst WORKSHEET_KEYS: ReadonlySet<string> = new Set([\"name\", \"rows\", \"dimension\"]);\n\n/**\n * Whether {@link streamWorkbook} covers every feature this options tree uses.\n * Unknown keys (including fields added after this list was written) answer\n * `false`, so the caller falls back to the full compile path — the failure\n * mode is losing constant memory, never losing content.\n */\nexport function canStreamWorkbook(options: WorkbookOptions): boolean {\n for (const key of Object.keys(options)) {\n if (!WORKBOOK_KEYS.has(key)) return false;\n }\n for (const ws of options.worksheets ?? []) {\n for (const key of Object.keys(ws)) {\n if (!WORKSHEET_KEYS.has(key)) return false;\n }\n }\n return true;\n}\n\n/**\n * Compile a plain-data workbook into streaming ZIP output. Callers must gate\n * on {@link canStreamWorkbook} — this path silently omits parts for features\n * outside its subset.\n */\nexport function streamWorkbook(\n options: WorkbookOptions,\n ondata: (err: Error | null, chunk: Uint8Array, final: boolean) => void,\n compression: CompressionOptions = {},\n): void {\n const xmlLevel = compression.xml ?? ZIP_DEFLATE_LEVEL;\n const ctx = new XlsxWriteContext();\n const encoder = new TextEncoder();\n const writer = new ZipStreamWriter(ondata, xmlLevel);\n\n const worksheets = options.worksheets ?? [];\n const sheetPaths = worksheets.map((_, i) => `xl/worksheets/sheet${i + 1}.xml`);\n const hasCustomProperties = !!options.customProperties?.length;\n\n // [Content_Types].xml leads per OPC; its part list is deterministic from\n // the options (this path emits a fixed part set).\n const partPaths = [\n \"[Content_Types].xml\",\n \"_rels/.rels\",\n \"docProps/core.xml\",\n \"docProps/app.xml\",\n \"xl/workbook.xml\",\n \"xl/_rels/workbook.xml.rels\",\n \"xl/styles.xml\",\n \"xl/theme/theme1.xml\",\n ...sheetPaths,\n ];\n if (hasCustomProperties) partPaths.push(\"docProps/custom.xml\");\n\n const writeString = (path: string, xml: string): void => {\n const sink = writer.addPart(path, xmlLevel);\n sink.push(encoder.encode(xml));\n sink.end();\n };\n\n writeString(\n \"[Content_Types].xml\",\n OOXML_XML_DECLARATION +\n (contentTypesDesc.stringify(\n deriveContentTypes(partPaths, {\n resolve: XLSX_CONTENT_TYPE_RESOLVER,\n // This path emits no media parts, so there is nothing to resolve.\n mediaContentTypes: {},\n }),\n ctx,\n ) ?? \"\"),\n );\n writeString(\n \"_rels/.rels\",\n OOXML_XML_DECLARATION +\n buildRootRelationships(\"xl/workbook.xml\", hasCustomProperties).serialize(),\n );\n writeString(\"docProps/core.xml\", OOXML_XML_DECLARATION + buildCorePropertiesXmlString(options));\n writeString(\n \"docProps/app.xml\",\n OOXML_XML_DECLARATION + (appPropertiesDesc.stringify(options.appProperties ?? {}, ctx) ?? \"\"),\n );\n if (hasCustomProperties) {\n writeString(\n \"docProps/custom.xml\",\n OOXML_XML_DECLARATION +\n (customPropertiesDesc.stringify({ properties: options.customProperties ?? [] }, ctx) ?? \"\"),\n );\n }\n\n // Workbook + its rels — the sheet list is known up front.\n const sheets: SheetDefinition[] = worksheets.map((ws, i) => ({\n name: ws.name ?? `Sheet${i + 1}`,\n sheetId: i + 1,\n rId: `rId${i + 1}`,\n }));\n writeString(\n \"xl/workbook.xml\",\n OOXML_XML_DECLARATION +\n (workbookDesc.stringify(\n {\n sheets,\n protection: options.workbookProtection,\n definedNames: options.definedNames,\n fileRecoveryPr: options.fileRecoveryPr,\n functionGroups: options.functionGroups,\n webPublishing: options.webPublishing,\n fileSharing: options.fileSharing,\n volTypes: options.volTypes,\n },\n ctx,\n ) ?? \"\"),\n );\n const wbRels = new Relationships();\n let rid = 1;\n for (let i = 0; i < sheets.length; i++) {\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n `worksheets/sheet${i + 1}.xml`,\n );\n }\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n \"styles.xml\",\n );\n wbRels.addRelationship(\n rid++,\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n \"theme/theme1.xml\",\n );\n writeString(\"xl/_rels/workbook.xml.rels\", OOXML_XML_DECLARATION + wbRels.serialize());\n\n // Worksheets — the streaming core. Cells serialize with sharedStrings\n // undefined, so string cells emit t=\"inlineStr\" and no SST part is written.\n for (const [i, ws] of worksheets.entries()) {\n const rows = ws.rows ?? [];\n const sink = writer.addPart(sheetPaths[i]!, xmlLevel);\n sink.push(\n encoder.encode(\n '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' +\n ' xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">',\n ),\n );\n const dimRef = ws.dimension ?? sheetDimension(rows);\n if (dimRef) sink.push(encoder.encode(`<dimension ref=\"${dimRef}\"/>`));\n sink.push(encoder.encode(\"<sheetData>\"));\n\n const buf: string[] = [];\n for (let start = 0; start < rows.length; start += ROWS_PER_CHUNK) {\n appendSheetDataRows(\n rows.slice(start, start + ROWS_PER_CHUNK),\n buf,\n undefined,\n ctx.styles,\n start + 1,\n );\n sink.push(encoder.encode(buf.join(\"\")));\n buf.length = 0;\n }\n sink.push(encoder.encode(\"</sheetData></worksheet>\"));\n sink.end();\n }\n\n // Styles last per sheet order — cell.style registrations are complete.\n writeString(\n \"xl/styles.xml\",\n OOXML_XML_DECLARATION + (stylesDesc.stringify({ styles: ctx.styles }, ctx) ?? \"\"),\n );\n writeString(\"xl/theme/theme1.xml\", OOXML_XML_DECLARATION + createThemeXml());\n\n writer.end();\n}\n\n/** Used-range ref (`A1:xxN`) from the row list; empty when there are no cells. */\nfunction sheetDimension(rows: RowOptions[]): string | undefined {\n const maxRow = rows.length;\n let maxCol = 0;\n for (const row of rows) {\n if (row.cells && row.cells.length > maxCol) maxCol = row.cells.length;\n }\n return maxRow > 0 && maxCol > 0 ? `A1:${columnToLetter(maxCol)}${maxRow}` : undefined;\n}\n","/**\n * Pure function API for generating XLSX files.\n *\n * @module\n */\n\nimport { createPacker, OoxmlMimeType } from \"@office-open/core\";\nimport type { OutputByType, OutputType, PackerOptions } from \"@office-open/core\";\nimport type { WorkbookOptions } from \"@parts/file\";\n\nimport { compileWorkbook } from \"./compiler\";\nimport { canStreamWorkbook, streamWorkbook } from \"./stream\";\n\n/** @internal Packer instance for XLSX generation. */\nconst Packer = createPacker<WorkbookOptions>({\n compile: (options, overrides, mediaLevel) => compileWorkbook(options, overrides, mediaLevel),\n mimeType: OoxmlMimeType.XLSX,\n});\n\n/**\n * Generate an XLSX file from pure JSON options.\n *\n * The output format is controlled by `packerOptions.type` (default: `\"nodebuffer\"` → Buffer).\n * For synchronous generation, use {@link generateWorkbookSync}. For streaming, use {@link generateWorkbookStream}.\n *\n * @param options - Workbook options (worksheets, styles, etc.)\n * @param packerOptions - Optional packer configuration (type, compression, overrides, etc.)\n *\n * @example\n * ```typescript\n * import { generateWorkbook } from \"@office-open/xlsx\";\n *\n * const buffer = await generateWorkbook({ worksheets: [...] });\n * const bytes = await generateWorkbook({ worksheets: [...] }, { type: \"uint8array\" });\n * const blob = await generateWorkbook({ worksheets: [...] }, { type: \"blob\" });\n * ```\n */\nexport function generateWorkbook<T extends OutputType = \"nodebuffer\">(\n options: WorkbookOptions,\n packerOptions?: PackerOptions<T>,\n): Promise<OutputByType[T]> {\n return Packer.pack(options, packerOptions) as Promise<OutputByType[T]>;\n}\n\n/**\n * Synchronously generate an XLSX file from pure JSON options.\n */\nexport function generateWorkbookSync<T extends OutputType = \"nodebuffer\">(\n options: WorkbookOptions,\n packerOptions?: PackerOptions<T>,\n): OutputByType[T] {\n return Packer.packSync(options, packerOptions) as OutputByType[T];\n}\n\n/**\n * Generate an XLSX file as a `ReadableStream<Uint8Array>`.\n *\n * Plain-data workbooks (worksheets with rows/cells, metadata) stream through\n * a constant-memory path: worksheet XML is written row-chunk-wise with inline\n * strings, so the full part and the archive never coexist in memory.\n * Workbooks using richer features (images, charts, tables, …) fall back to\n * the full-memory stream — same output contract, linear memory.\n */\nexport function generateWorkbookStream(\n options: WorkbookOptions,\n packerOptions?: PackerOptions,\n): ReadableStream<Uint8Array> {\n if (!canStreamWorkbook(options)) {\n return Packer.toStream(options, packerOptions);\n }\n return new ReadableStream<Uint8Array>({\n start(controller) {\n try {\n streamWorkbook(\n options,\n (err, chunk, final) => {\n if (err) {\n controller.error(err);\n return;\n }\n controller.enqueue(chunk);\n if (final) controller.close();\n },\n packerOptions?.compression,\n );\n } catch (err) {\n controller.error(err instanceof Error ? err : new Error(String(err)));\n }\n },\n });\n}\n"],"mappings":";;;;;;;;;;;AAmBA,SAAgB,UAAU,IAA6B;CACrD,MAAM,SAA+B,CAAC;CACtC,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAClC,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,OAAO,OAAO;GACd;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK;GACH,OAAO,YAAY;GACnB;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK;GACH,OAAO,UAAU;GACjB;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK;GACH,OAAO,WAAW;GAClB;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK;GACH,OAAO,OAAO,QAAQ,OAAO,KAAK;GAClC;EACF,KAAK;GACH,OAAO,QAAQ,cAAc,KAAK;GAClC,IAAI,WAAW,KAAK,OAAO,MAAM,CAAC,GAAG,OAAO,YAAY;GACxD;EACF,KAAK;GACH,OAAO,OAAO,KAAK,OAAO,KAAK,KAAK,KAAA;GACpC;EACF,KAAK;GACH,OAAO,UAAU,QAAQ,OAAO,KAAK;GACrC;EACF,KAAK;GACH,OAAO,SAAS,QAAQ,OAAO,KAAK;GACpC;EACF,KAAK;GACH,OAAO,YAAa,KAAK,OAAO,KAAK,KAAkC,KAAA;GACvE;EACF,KAAK;GACH,OAAO,SAAU,KAAK,OAAO,KAAK,KAA+B,KAAA;GACjE;CACJ;CAEF,OAAO;AACT;AAEA,SAAgB,UAAU,IAAiC;CACzD,MAAM,cAAc,UAAU,IAAI,aAAa;CAC/C,IAAI,aAAa;EACf,MAAM,SAA0B,CAAC;EACjC,MAAM,cAAc,KAAK,aAAa,aAAa;EACnD,IAAI,aAAa,OAAO,cAAc;EACtC,MAAM,KAAK,UAAU,aAAa,SAAS;EAC3C,IAAI,IAAI,OAAO,QAAQ,cAAc,EAAE;EACvC,MAAM,KAAK,UAAU,aAAa,SAAS;EAC3C,IAAI,IAAI,OAAO,UAAU,cAAc,EAAE;EACzC,MAAM,UAAU,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAA;EAC9C,IAAI,YAAY,KAAA,GAAW,OAAO,eAAe;EACjD,OAAO;CACT;CAEA,MAAM,eAAe,UAAU,IAAI,cAAc;CACjD,IAAI,cAAc;EAChB,MAAM,SAA0B,EAAE,MAAM,WAAW;EACnD,MAAM,QAAQ,KAAK,cAAc,MAAM;EACvC,IAAI,OAAO,OAAO,eAAe;EACjC,MAAM,SAAS,QAAQ,cAAc,QAAQ;EAC7C,IAAI,WAAW,KAAA,GAAW,OAAO,iBAAiB;EAClD,MAAM,OAAO,QAAQ,cAAc,MAAM;EACzC,IAAI,SAAS,KAAA,GAAW,OAAO,eAAe;EAC9C,MAAM,QAAQ,QAAQ,cAAc,OAAO;EAC3C,IAAI,UAAU,KAAA,GAAW,OAAO,gBAAgB;EAChD,MAAM,MAAM,QAAQ,cAAc,KAAK;EACvC,IAAI,QAAQ,KAAA,GAAW,OAAO,cAAc;EAC5C,MAAM,SAAS,QAAQ,cAAc,QAAQ;EAC7C,IAAI,WAAW,KAAA,GAAW,OAAO,iBAAiB;EAClD,MAAM,QAAmC,CAAC;EAC1C,KAAK,MAAM,KAAK,aAAa,YAAY,CAAC,GAAG;GAC3C,IAAI,EAAE,SAAS,QAAQ;GACvB,MAAM,MAAM,QAAQ,GAAG,UAAU;GACjC,MAAM,QAAQ,UAAU,GAAG,OAAO;GAClC,IAAI,QAAQ,KAAA,KAAa,OACvB,MAAM,KAAK;IAAE,UAAU;IAAK,OAAO,cAAc,KAAK,KAAK;GAAG,CAAC;EAEnE;EACA,IAAI,MAAM,SAAS,GAAG,OAAO,QAAQ;EACrC,OAAO;CACT;CAEA,OAAO,CAAC;AACV;AAEA,SAAgB,YAAY,IAAmC;CAC7D,MAAM,SAA4B,CAAC;CACnC,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;CAC5D,IAAI,WAAW,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,eAAe;CAEhE,KAAK,MAAM,QAAQ;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,GAAY;EACV,MAAM,SAAS,UAAU,IAAI,IAAI;EACjC,IAAI,QAAQ;GACV,MAAM,OAAsB,CAAC;GAC7B,MAAM,QAAQ,KAAK,QAAQ,OAAO;GAClC,IAAI,OAAO,KAAK,QAAQ;GACxB,MAAM,QAAQ,UAAU,QAAQ,OAAO;GACvC,IAAI,OAAO,KAAK,QAAQ,cAAc,KAAK;GAC3C,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,OAAO,QAAQ;EACnD;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,eAAe,IAAkC;CAC/D,MAAM,SAA2B,CAAC;CAClC,MAAM,IAAI,KAAK,IAAI,YAAY;CAC/B,IAAI,GAAG,OAAO,aAAa;CAC3B,MAAM,IAAI,KAAK,IAAI,UAAU;CAC7B,IAAI,GAAG,OAAO,WAAW;CACzB,IAAI,WAAW,KAAK,IAAI,UAAU,CAAC,GAAG,OAAO,WAAW;CACxD,MAAM,WAAW,QAAQ,IAAI,cAAc;CAC3C,IAAI,aAAa,KAAA,GAAW,OAAO,eAAe;CAClD,MAAM,SAAS,QAAQ,IAAI,QAAQ;CACnC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS;CAC1C,MAAM,iBAAiB,QAAQ,IAAI,gBAAgB;CACnD,IAAI,mBAAmB,KAAA,GAAW,OAAO,iBAAiB;CAC1D,IAAI,WAAW,KAAK,IAAI,iBAAiB,CAAC,GAAG,OAAO,kBAAkB;CACtE,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,OAAO,cAAc;CAC9D,MAAM,eAAe,QAAQ,IAAI,cAAc;CAC/C,IAAI,iBAAiB,KAAA,GAAW,OAAO,eAAe;CACtD,OAAO;AACT;AAEA,SAAgB,gBAAgB,IAAuC;CACrE,MAAM,SAAyC,CAAC;CAChD,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS,WAAW,MAAM,KAAK;CAChE,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS,WAAW,MAAM,KAAK;CAChE,OAAO;AACT;;;;;AAMA,SAAgB,cAAc,IAAoC;CAChE,MAAM,MAAM,KAAK,IAAI,KAAK;CAC1B,IAAI,KAEF,OAAO,IAAI,WAAW,IAAI,IAAI,MAAM,CAAC,IAAI;AAG7C;;;;;;;;;;;;;;;ACnKA,SAAgB,YACd,IACQ;CACR,IAAI,CAAC,IAAI,OAAO;CAChB,MAAM,QAAkB,CAAC;CACzB,IAAI,GAAG,MAAM,MAAM,KAAK,eAAe,UAAU,GAAG,IAAI,EAAE,IAAI;CAC9D,IAAI,GAAG,YAAY,KAAA,GAAW,MAAM,KAAK,iBAAiB,GAAG,QAAQ,IAAI;CACzE,IAAI,GAAG,WAAW,KAAA,GAAW,MAAM,KAAK,gBAAgB,GAAG,OAAO,IAAI;CACtE,IAAI,GAAG,MAAM,MAAM,KAAK,MAAM;CAC9B,IAAI,GAAG,QAAQ,MAAM,KAAK,MAAM;CAChC,IAAI,GAAG,QAAQ,MAAM,KAAK,WAAW;CACrC,IAAI,GAAG,SAAS,MAAM,KAAK,YAAY;CACvC,IAAI,GAAG,QAAQ,MAAM,KAAK,WAAW;CACrC,IAAI,GAAG,UAAU,MAAM,KAAK,aAAa;CACzC,IAAI,GAAG,QAAQ,MAAM,KAAK,WAAW;CACrC,IAAI,GAAG,OAAO;EAGZ,MAAM,MAAM,GAAG,MAAM,WAAW,IAAI,KAAK,GAAG,UAAU,GAAG;EACzD,MAAM,KAAK,eAAe,UAAU,GAAG,EAAE,IAAI;CAC/C;CACA,IAAI,GAAG,SAAS,KAAA,GAAW,MAAM,KAAK,YAAY,GAAG,KAAK,IAAI;CAC9D,IAAI,GAAG,WACL,IAAI,GAAG,cAAc,QACnB,MAAM,KAAK,MAAM;MAEjB,MAAM,KAAK,WAAW,GAAG,UAAU,IAAI;CAG3C,IAAI,GAAG,WAAW,MAAM,KAAK,mBAAmB,GAAG,UAAU,IAAI;CACjE,IAAI,GAAG,QAAQ,MAAM,KAAK,gBAAgB,GAAG,OAAO,IAAI;CACxD,OAAO,MAAM,SAAS,IAAI,QAAQ,MAAM,KAAK,EAAE,EAAE,UAAU;AAC7D;;AAGA,SAAgBA,cAAY,KAA8B;CACxD,MAAM,QAAkB,CAAC;CACzB,IAAI,IAAI,QAAQ,IAAI,KAAK,SAAS,GAChC,KAAK,MAAM,OAAO,IAAI,MAAM;EAC1B,MAAM,MAAM,YAAY,IAAI,UAAU;EACtC,MAAM,KAAK,MAAM,IAAI,KAAK,UAAU,IAAI,IAAI,EAAE,SAAS;CACzD;MACK,IAAI,IAAI,SAAS,KAAA,GACtB,MAAM,KAAK,MAAM,UAAU,IAAI,IAAI,EAAE,KAAK;CAG5C,IAAI,IAAI,WACN,KAAK,MAAM,MAAM,IAAI,WACnB,MAAM,KAAK,YAAY,GAAG,UAAU,QAAQ,GAAG,QAAQ,OAAO,UAAU,GAAG,IAAI,EAAE,WAAW;CAGhG,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,IAAa,gBAAb,MAA2B;CACzB,UAA8B,CAAC;;CAE/B,2BAAmB,IAAI,IAAoB;;;;;CAM3C,SAAgB,GAAmB;EACjC,MAAM,WAAW,KAAK,SAAS,IAAI,CAAC;EACpC,IAAI,aAAa,KAAA,GAAW,OAAO;EAEnC,MAAM,MAAM,KAAK,QAAQ;EACzB,KAAK,QAAQ,KAAK,CAAC;EACnB,KAAK,SAAS,IAAI,GAAG,GAAG;EACxB,OAAO;CACT;;;;;CAMA,aAAoB,KAA8B;EAChD,MAAM,MAAM,KAAK,QAAQ;EACzB,KAAK,QAAQ,KAAK,GAAG;EACrB,OAAO;CACT;;;;;;;;;CAUA,YAAmB,SAAmD;EACpE,KAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,MAAM,KAAK,QAAQ;GACzB,KAAK,QAAQ,KAAK,KAAK;GACvB,IAAI,OAAO,UAAU,YAAY,CAAC,KAAK,SAAS,IAAI,KAAK,GACvD,KAAK,SAAS,IAAI,OAAO,GAAG;EAEhC;CACF;CAEA,IAAW,QAAgB;EACzB,OAAO,KAAK,QAAQ;CACtB;;CAGA,sBAAsD;EACpD,OAAO,EAAE,SAAS,KAAK,QAAQ;CACjC;;CAGA,YAA2B;EACzB,MAAM,IAAc,CAClB,4EACA,WAAW,KAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,OAAO,GACtE;EACA,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,OAAO,UAAU,UACnB,EAAE,KAAK,UAAU,UAAU,KAAK,EAAE,UAAU;OAG5C,EAAE,KAAK,OAAOA,cAAY,KAAK,EAAE,MAAM;EAG3C,EAAE,KAAK,QAAQ;EACf,OAAO,EAAE,KAAK,EAAE;CAClB;AACF;AAaA,MAAa,oBAA+D;CAC1E,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,IAAI,KAAK,QAAQ,WAAW,GAAG,OAAO,KAAA;EAEtC,MAAM,IAAc,CAClB,4EACA,WAAW,KAAK,QAAQ,OAAO,iBAAiB,KAAK,QAAQ,OAAO,GACtE;EAEA,KAAK,MAAM,SAAS,KAAK,SACvB,IAAI,OAAO,UAAU,UACnB,EAAE,KAAK,UAAU,UAAU,KAAK,EAAE,UAAU;OAE5C,EAAE,KAAK,OAAOA,cAAY,KAAK,EAAE,MAAM;EAI3C,EAAE,KAAK,QAAQ;EACf,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,UAAwC,CAAC;EAE/C,KAAK,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG;GAClC,IAAI,GAAG,SAAS,MAAM;GAGtB,MAAM,IAAI,UAAU,IAAI,GAAG;GAC3B,IAAI,GAAG;IACL,QAAQ,KAAK,OAAO,CAAC,KAAK,EAAE;IAC5B;GACF;GAGA,MAAM,OAA6B,CAAC;GACpC,KAAK,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG;IACjC,IAAI,EAAE,SAAS,KAAK;IACpB,MAAM,KAAK,UAAU,GAAG,GAAG;IAC3B,IAAI,IAAI;KACN,MAAM,QAAQ,UAAU,GAAG,KAAK;KAChC,MAAM,MAA0B,EAAE,MAAM,OAAO,EAAE,KAAK,GAAG;KACzD,IAAI,OAAO,IAAI,aAAa,SAAS,KAAK;KAC1C,KAAK,KAAK,GAAG;IACf;GACF;GAGA,MAAM,YAAoE,CAAC;GAC3E,KAAK,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG;IACnC,IAAI,IAAI,SAAS,OAAO;IACxB,MAAM,KAAK,QAAQ,KAAK,IAAI,KAAK;IACjC,MAAM,KAAK,QAAQ,KAAK,IAAI,KAAK;IACjC,MAAM,OAAO,UAAU,KAAK,GAAG;IAC/B,UAAU,KAAK;KAAE,WAAW;KAAI,SAAS;KAAI,MAAM,OAAQ,OAAO,IAAI,KAAK,KAAM;IAAG,CAAC;GACvF;GAEA,IAAI,KAAK,SAAS,GAAG;IACnB,MAAM,QAAyB,EAAE,KAAK;IACtC,IAAI,UAAU,SAAS,GAAG,MAAM,YAAY;IAC5C,QAAQ,KAAK,KAAK;GACpB;EACF;EAEA,OAAO,EAAE,QAAQ;CACnB;AACF;;AAGA,SAAS,SAAS,IAA8C;CAC9D,MAAM,SAAuC,CAAC;CAC9C,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAClC,QAAQ,MAAM,MAAd;EACE,KAAK;GACH,OAAO,OAAO,KAAK,OAAO,KAAK,KAAK,KAAA;GACpC;EACF,KAAK;GACH,OAAO,UAAU,QAAQ,OAAO,KAAK;GACrC;EACF,KAAK;GACH,OAAO,SAAS,QAAQ,OAAO,KAAK;GACpC;EACF,KAAK;GACH,OAAO,OAAO,WAAW,KAAK,OAAO,KAAK,CAAC,KAAK;GAChD;EACF,KAAK;GACH,OAAO,SAAS,WAAW,KAAK,OAAO,KAAK,CAAC,KAAK;GAClD;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK;GACH,OAAO,UAAU;GACjB;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK;GACH,OAAO,WAAW;GAClB;EACF,KAAK;GACH,OAAO,SAAS;GAChB;EACF,KAAK,SAAS;GACZ,MAAM,MAAM,cAAc,KAAK;GAC/B,IAAI,KACF,OAAO,QAAQ;QACV;IACL,MAAM,UAAU,QAAQ,OAAO,SAAS;IACxC,IAAI,YAAY,KAAA,GAAW,OAAO,QAAQ,OAAO,OAAO;SACnD;KACH,MAAM,QAAQ,KAAK,OAAO,OAAO;KACjC,IAAI,UAAU,KAAA,GAAW,OAAO,QAAQ,SAAS;IACnD;GACF;GACA;EACF;EACA,KAAK;GACH,OAAO,OAAO,QAAQ,OAAO,KAAK;GAClC;EACF,KAAK;GAEH,OAAO,YADM,KAAK,OAAO,KAEnB,KAA+D;GACrE;EAEF,KAAK;GACH,OAAO,YAAY,KAAK,OAAO,KAAK;GAGpC;EACF,KAAK;GACH,OAAO,SAAS,KAAK,OAAO,KAAK;GACjC;CACJ;CAEF,OAAO;AACT;;;;;;;;;;;;;ACnRA,SAAS,QAAQ,GAAwB;CACvC,OAAO,IAAI,EAAE,OAAO,IAAI,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,YAAY,IAAI,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,QAAQ,GAAG,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,WAAW,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,SAAS,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI;AAChT;AAEA,SAAS,QAAQ,GAA4B;CAC3C,OAAO,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG,EAAE,eAAe,GAAG,IAAI,EAAE,WAAW,GAAG,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK;AACtJ;AAEA,SAAS,UAAU,GAA8B;CAC/C,MAAM,MAAM,MAAsB,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS;CACnE,OAAO,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,IAAI,EAAE,IAAI,EAAE,eAAe,IAAI,EAAE,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,UAAU;AAC5M;AAIA,MAAM,kBAA0C;CAC9C,SAAS;CACT,KAAK;CACL,QAAQ;CACR,SAAS;CACT,YAAY;CACZ,MAAM;CACN,SAAS;CACT,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,UAAU;CACV,cAAc;CACd,iBAAiB;CACjB,QAAQ;CACR,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,uBAAuB;CACvB,uBAAuB;CACvB,4BAA4B;CAC5B,SAAS;CACT,aAAa;CACb,UAAU;CACV,YAAY;CACZ,KAAK;AACP;AAuBA,IAAa,SAAb,MAAoB;CAClB,QAA+B,CAC7B;EAAE,MAAM;EAAI,MAAM;CAAU,CAC9B;CACA,2BAAmB,IAAI,IAAoB;CAE3C,QAAmC,CACjC,EAAE,aAAa,OAAO,GACtB,EAAE,aAAa,UAAU,CAC3B;CACA,2BAAmB,IAAI,IAAoB;CAE3C,UAAuC,CACrC,CAAC,CACH;CACA,6BAAqB,IAAI,IAAoB;CAE7C,gCAAwB,IAAI,IAAoB;CAChD,qBAA6B;CAE7B,UAUK,CACH;EAAE,QAAQ;EAAG,QAAQ;EAAG,UAAU;EAAG,UAAU;CAAE,CACnD;CACA,6BAAqB,IAAI,IAAoB;;CAG7C,eAA2C,CACzC;EAAE,QAAQ;EAAG,QAAQ;EAAG,UAAU;EAAG,UAAU;CAAE,CACnD;CAEA,OAA6B,CAAC;CAE9B;CACA;;CAEA;;CAEA;CAEA,cAAqB;EAGnB,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAG,GAAG,CAAC;EAC5C,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAG,GAAG,CAAC;EAC5C,KAAK,SAAS,IAAI,QAAQ,KAAK,MAAM,EAAG,GAAG,CAAC;EAC5C,KAAK,WAAW,IAAI,UAAU,KAAK,QAAQ,EAAG,GAAG,CAAC;EAClD,KAAK,WAAW,IAAI,KAAK,UAAU,KAAK,QAAQ,EAAG,GAAG,CAAC;CACzD;;;;;CAMA,SAAgB,MAA4B;EAM1C,MAAM,KAAK;GACT,QANa,KAAK,aAAa,KAAK,IAM/B;GACL,QANa,KAAK,aAAa,KAAK,IAM/B;GACL,UANe,KAAK,eAAe,KAAK,MAMjC;GACP,UANe,KAAK,eAAe,KAAK,MAMjC;GACP,WAAW,KAAK;GAChB,aAAa,KAAK;GAClB,aAAa,KAAK;GAClB,iBAAiB,KAAK;GACtB,YAAY,KAAK;EACnB;EAEA,MAAM,MAAM,KAAK,UAAU,EAAE;EAC7B,MAAM,WAAW,KAAK,WAAW,IAAI,GAAG;EACxC,IAAI,aAAa,KAAA,GAAW,OAAO;EAEnC,MAAM,MAAM,KAAK,QAAQ;EACzB,KAAK,QAAQ,KAAK,EAAE;EACpB,KAAK,WAAW,IAAI,KAAK,GAAG;EAC5B,OAAO;CACT;;;;;CAMA,YAAmB,MAA0B;EAC3C,MAAM,MAAM,KAAK,KAAK;EACtB,KAAK,KAAK,KAAK,IAAI;EACnB,OAAO;CACT;;;;CAKA,UAAiB,MAA2B;EAC1C,KAAK,SAAS;CAChB;CAEA,eAAsB,QAAyC;EAC7D,KAAK,cAAc;CACrB;CAEA,cAAqB,YAA2C;EAC9D,KAAK,kBAAkB;CACzB;CAEA,oBAA2B,QAAwC;EACjE,KAAK,mBAAmB;CAC1B;;;;;;;;CASA,gBAAuB,SAAqC;EAC1D,KAAK,eAAe,QAAQ,KAAK,WAAW;GAC1C,QAAQ,KAAK,aAAa,MAAM,IAAI;GACpC,QAAQ,KAAK,aAAa,MAAM,IAAI;GACpC,UAAU,KAAK,eAAe,MAAM,MAAM;GAC1C,UAAU,KAAK,eAAe,MAAM,MAAM;GAC1C,WAAW,MAAM;GACjB,YAAY,MAAM;GAClB,aAAa,MAAM;GACnB,aAAa,MAAM;GACnB,mBAAmB,MAAM;GACzB,WAAW,MAAM;GACjB,WAAW,MAAM;GACjB,aAAa,MAAM;GACnB,gBAAgB,MAAM;GACtB,iBAAiB,MAAM;EACzB,EAAE;CACJ;;;;;CAMA,sBAA0C;EACxC,OAAO;GACL,eAAe,IAAI,IAAI,KAAK,aAAa;GACzC,OAAO,CAAC,GAAG,KAAK,KAAK;GACrB,OAAO,CAAC,GAAG,KAAK,KAAK;GACrB,SAAS,CAAC,GAAG,KAAK,OAAO;GACzB,SAAS,CAAC,GAAG,KAAK,OAAO;GACzB,MAAM,CAAC,GAAG,KAAK,IAAI;GACnB,QAAQ,KAAK;GACb,aAAa,KAAK;GAClB,kBAAkB,KAAK;GACvB,iBAAiB,KAAK;EACxB;CACF;CAEA,aAAqB,MAA4B;EAC/C,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,MAAM,QAAQ,IAAI;EACxB,MAAM,WAAW,KAAK,SAAS,IAAI,GAAG;EACtC,IAAI,aAAa,KAAA,GAAW,OAAO;EAEnC,MAAM,MAAM,KAAK,MAAM;EACvB,KAAK,MAAM,KAAK,IAAI;EACpB,KAAK,SAAS,IAAI,KAAK,GAAG;EAC1B,OAAO;CACT;CAEA,aAAqB,MAAgC;EACnD,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,MAAM,QAAQ,IAAI;EACxB,MAAM,WAAW,KAAK,SAAS,IAAI,GAAG;EACtC,IAAI,aAAa,KAAA,GAAW,OAAO;EAEnC,MAAM,MAAM,KAAK,MAAM;EACvB,KAAK,MAAM,KAAK,IAAI;EACpB,KAAK,SAAS,IAAI,KAAK,GAAG;EAC1B,OAAO;CACT;CAEA,eAAuB,MAAkC;EACvD,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,MAAM,UAAU,IAAI;EAC1B,MAAM,WAAW,KAAK,WAAW,IAAI,GAAG;EACxC,IAAI,aAAa,KAAA,GAAW,OAAO;EAEnC,MAAM,MAAM,KAAK,QAAQ;EACzB,KAAK,QAAQ,KAAK,IAAI;EACtB,KAAK,WAAW,IAAI,KAAK,GAAG;EAC5B,OAAO;CACT;CAEA,eAAuB,KAAsB;EAC3C,IAAI,CAAC,KAAK,OAAO;EACjB,MAAM,UAAU,gBAAgB;EAChC,IAAI,YAAY,KAAA,GAAW,OAAO;EAElC,MAAM,WAAW,KAAK,cAAc,IAAI,GAAG;EAC3C,IAAI,aAAa,KAAA,GAAW,OAAO;EAEnC,MAAM,KAAK,KAAK;EAChB,KAAK,cAAc,IAAI,KAAK,EAAE;EAC9B,OAAO;CACT;CAEA,UAAkB,IAUP;EACT,MAAM,IAAI,GAAG;EACb,MAAM,KAAK,IACP,IAAI,EAAE,cAAc,GAAG,GAAG,EAAE,YAAY,GAAG,GAAG,EAAE,WAAW,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,GAAG,EAAE,UAAU,GAAG,IAAI,EAAE,kBAAkB,GAAG,IAAI,EAAE,kBAAkB,IAAI,EAAE,IAAI,EAAE,cAAc,IAAI,EAAE,IAAI,EAAE,gBAAgB,OACpN;EACJ,MAAM,KAAK,GAAG;EACd,MAAM,KAAK,KAAK,IAAI,GAAG,UAAU,GAAG,GAAG,GAAG,UAAU,OAAO;EAC3D,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,SAAS,GAAG,GAAG,SAAS,GAAG,GAAG,KAAK,GAAG,cAAc,IAAI,EAAE,KAAK,GAAG,cAAc,IAAI,EAAE,GAAG;CAClI;;;;;;CASA,YAA2B;EACzB,MAAM,IAAc,CAClB,kFACF;EAGA,IAAI,KAAK,cAAc,OAAO,GAAG;GAC/B,EAAE,KAAK,mBAAmB,KAAK,cAAc,KAAK,GAAG;GACrD,KAAK,MAAM,CAAC,KAAK,OAAO,KAAK,eAC3B,EAAE,KAAK,qBAAqB,GAAG,gBAAgB,UAAU,GAAG,EAAE,IAAI;GAEpE,EAAE,KAAK,YAAY;EACrB;EAGA,EAAE,KAAK,iBAAiB,KAAK,MAAM,OAAO,GAAG;EAC7C,KAAK,MAAM,KAAK,KAAK,OACnB,EAAE,KAAK,SAAS,KAAK,WAAW,CAAC,EAAE,QAAQ;EAE7C,EAAE,KAAK,UAAU;EAGjB,EAAE,KAAK,iBAAiB,KAAK,MAAM,OAAO,GAAG;EAC7C,KAAK,MAAM,KAAK,KAAK,OACnB,IAAI,EAAE,SAAS,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,GAAG;GAC1D,MAAM,UAAiE,CAAC;GACxE,IAAI,EAAE,gBAAgB,EAAE,iBAAiB,UAAU,QAAQ,OAAO,EAAE;GACpE,IAAI,EAAE,mBAAmB,KAAA,GAAW,QAAQ,SAAS,EAAE;GACvD,IAAI,EAAE,iBAAiB,KAAA,GAAW,QAAQ,OAAO,EAAE;GACnD,IAAI,EAAE,kBAAkB,KAAA,GAAW,QAAQ,QAAQ,EAAE;GACrD,IAAI,EAAE,gBAAgB,KAAA,GAAW,QAAQ,MAAM,EAAE;GACjD,IAAI,EAAE,mBAAmB,KAAA,GAAW,QAAQ,SAAS,EAAE;GACvD,MAAM,YAAY,EAAE,MACjB,KAAK,MAAM,mBAAmB,EAAE,SAAS,kBAAkB,EAAE,MAAM,WAAW,CAAC,CAC/E,KAAK,EAAE;GACV,EAAE,KAAK,sBAAsB,MAAM,OAAO,EAAE,GAAG,UAAU,uBAAuB;EAClF,OAAO;GACL,MAAM,eAAe,MAAM,EAAE,aAAa,EAAE,eAAe,QAAQ,CAAC;GAOpE,MAAM,gBANU,EAAE,QACd,mBAAmB,EAAE,MAAM,OAC3B,EAAE,iBAAiB,KAAA,IACjB,qBAAqB,EAAE,aAAa,OACpC,OACU,EAAE,UAAU,mBAAmB,EAAE,QAAQ,OAAO;GAEhE,EAAE,KACA,eACI,qBAAqB,aAAa,GAAG,aAAa,yBAClD,qBAAqB,aAAa,UACxC;EACF;EAEF,EAAE,KAAK,UAAU;EAGjB,EAAE,KAAK,mBAAmB,KAAK,QAAQ,OAAO,GAAG;EACjD,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,MAAM,SAAmB,CAAC;GAC1B,IAAI,EAAE,YAAY,OAAO,KAAK,kBAAgB;GAC9C,IAAI,EAAE,cAAc,OAAO,KAAK,oBAAkB;GAClD,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,KAAK,GAAG,MAAM;GACvD,EAAE,KAAK,UAAU,MAAM,GAAG,KAAK,aAAa,CAAC,EAAE,UAAU;EAC3D;EACA,EAAE,KAAK,YAAY;EAGnB,EAAE,KAAK,wBAAwB,KAAK,aAAa,OAAO,GAAG;EAC3D,KAAK,MAAM,MAAM,KAAK,cAAc;GAClC,MAAM,SAAgE;IACpE,UAAU,GAAG;IACb,QAAQ,GAAG;IACX,QAAQ,GAAG;IACX,UAAU,GAAG;GACf;GACA,IAAI,GAAG,mBAAmB,OAAO,oBAAoB;GACrD,IAAI,GAAG,WAAW,OAAO,YAAY;GACrC,IAAI,GAAG,WAAW,OAAO,YAAY;GACrC,IAAI,GAAG,aAAa,OAAO,cAAc;GACzC,IAAI,GAAG,gBAAgB,OAAO,iBAAiB;GAC/C,IAAI,GAAG,iBAAiB,OAAO,kBAAkB;GACjD,IAAI,GAAG,aAAa,OAAO,cAAc;GACzC,IAAI,GAAG,aAAa,OAAO,cAAc;GAGzC,MAAM,SAFW,GAAG,YAAY,KAAK,gBAAgB,GAAG,SAAS,IAAI,OACrD,GAAG,aAAa,KAAK,iBAAiB,GAAG,UAAU,IAAI;GAEvE,EAAE,KAAK,QAAQ,MAAM,MAAM,MAAM,EAAE,GAAG,MAAM,SAAS,MAAM,MAAM,MAAM,EAAE,GAAG;EAC9E;EACA,EAAE,KAAK,iBAAiB;EAGxB,EAAE,KAAK,mBAAmB,KAAK,QAAQ,OAAO,GAAG;EACjD,KAAK,MAAM,MAAM,KAAK,SAAS;GAC7B,MAAM,SAAgE;IACpE,UAAU,GAAG;IACb,QAAQ,GAAG;IACX,QAAQ,GAAG;IACX,UAAU,GAAG;IACb,MAAM;GACR;GACA,IAAI,GAAG,WAAW,OAAO,iBAAiB;GAC1C,IAAI,GAAG,SAAS,GAAG,OAAO,YAAY;GACtC,IAAI,GAAG,SAAS,GAAG,OAAO,YAAY;GACtC,IAAI,GAAG,WAAW,GAAG,OAAO,cAAc;GAC1C,IAAI,GAAG,WAAW,GAAG,OAAO,oBAAoB;GAChD,IAAI,GAAG,aAAa,OAAO,cAAc;GACzC,IAAI,GAAG,aAAa,OAAO,cAAc;GACzC,IAAI,GAAG,iBAAiB,OAAO,kBAAkB;GACjD,IAAI,GAAG,YAAY,OAAO,kBAAkB,OAAO,mBAAmB;GAItE,MAAM,SAFW,GAAG,YAAY,KAAK,gBAAgB,GAAG,SAAS,IAAI,OACrD,GAAG,aAAa,KAAK,iBAAiB,GAAG,UAAU,IAAI;GAEvE,EAAE,KAAK,QAAQ,MAAM,MAAM,MAAM,EAAE,GAAG,MAAM,SAAS,MAAM,MAAM,MAAM,EAAE,GAAG;EAC9E;EACA,EAAE,KAAK,YAAY;EAGnB,IAAI,KAAK,oBAAoB,KAAK,iBAAiB,SAAS,GAAG;GAI7D,MAAM,YAAY,KAAK,iBAAiB,MACrC,OAAO,GAAG,cAAc,KAAK,GAAG,SAAS,QAC5C;GAEA,MAAM,UAAoB,CAAC,eAAe,CADf,UAAU,KAAK,iBAAiB,UAAU,YAAY,IAAI,GAAG,EACxC,CAAC,CAAC,KAAK,GAAG,EAAE,EAAE;GAC9D,IAAI,CAAC,WAAW,QAAQ,KAAK,yDAAmD;GAChF,KAAK,MAAM,MAAM,KAAK,kBAAkB;IACtC,MAAM,QAAkB,CAAC,SAAS,UAAU,GAAG,IAAI,EAAE,IAAI,SAAS,GAAG,KAAK,EAAE;IAC5E,IAAI,GAAG,cAAc,KAAA,GAAW,MAAM,KAAK,cAAc,GAAG,UAAU,EAAE;IACxE,IAAI,GAAG,eAAe,MAAM,KAAK,qBAAmB;IACpD,IAAI,GAAG,WAAW,KAAA,GAAW,MAAM,KAAK,WAAW,GAAG,OAAO,EAAE;IAC/D,IAAI,GAAG,QAAQ,MAAM,KAAK,cAAY;IACtC,QAAQ,KAAK,cAAc,MAAM,KAAK,GAAG,EAAE,GAAG;GAChD;GACA,QAAQ,KAAK,eAAe;GAC5B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;EACzB,OACE,EAAE,KACA,8FACF;EAIF,IAAI,KAAK,KAAK,SAAS,GAAG;GACxB,EAAE,KAAK,gBAAgB,KAAK,KAAK,OAAO,GAAG;GAC3C,KAAK,MAAM,OAAO,KAAK,MAAM;IAC3B,MAAM,SAAmB,CAAC;IAC1B,IAAI,IAAI,MAAM,OAAO,KAAK,SAAS,KAAK,WAAW,IAAI,IAAI,EAAE,QAAQ;IACrE,IAAI,IAAI,MAAM;KACZ,MAAM,UAAU,IAAI,KAAK,QAAQ,mBAAmB,IAAI,KAAK,MAAM,OAAO;KAC1E,MAAM,WAAW,MAAM,EAAE,aAAa,IAAI,KAAK,eAAe,QAAQ,CAAC;KACvE,OAAO,KAAK,qBAAqB,SAAS,GAAG,QAAQ,sBAAsB;IAC7E;IACA,IAAI,IAAI,QAAQ,OAAO,KAAK,uBAAuB,UAAU,IAAI,MAAM,EAAE,IAAI;IAC7E,IAAI,IAAI,QAAQ,OAAO,KAAK,WAAW,KAAK,aAAa,IAAI,MAAM,EAAE,UAAU;IAC/E,IAAI,OAAO,SAAS,GAClB,EAAE,KAAK,QAAQ,OAAO,KAAK,EAAE,EAAE,OAAO;SAEtC,EAAE,KAAK,QAAQ;GAEnB;GACA,EAAE,KAAK,SAAS;EAClB,OACE,EAAE,KAAK,qBAAmB;EAG5B,IAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;GACnD,MAAM,UAAoB,CACxB,uBAAuB,KAAK,YAAY,OAAO,+EACjD;GACA,KAAK,MAAM,MAAM,KAAK,aAAa;IACjC,MAAM,UAAoB,CAAC,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;IACzD,IAAI,GAAG,OAAO,QAAQ,KAAK,aAAW;IACtC,IAAI,GAAG,UAAU,OAAO,QAAQ,KAAK,aAAW;IAChD,IAAI,GAAG,YAAY,GAAG,SAAS,SAAS,GAAG;KACzC,QAAQ,KAAK,eAAe,QAAQ,KAAK,GAAG,EAAE,EAAE;KAChD,KAAK,MAAM,MAAM,GAAG,UAAU;MAC5B,MAAM,UAAoB,CAAC,SAAS,GAAG,KAAK,EAAE;MAC9C,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,KAAK,UAAU,GAAG,MAAM,EAAE;MAC9D,IAAI,GAAG,QAAQ,QAAQ,KAAK,cAAY;MACxC,QAAQ,KAAK,sBAAsB,QAAQ,KAAK,GAAG,EAAE,GAAG;KAC1D;KACA,QAAQ,KAAK,eAAe;IAC9B,OACE,QAAQ,KAAK,eAAe,QAAQ,KAAK,GAAG,EAAE,GAAG;GAErD;GACA,QAAQ,KAAK,gBAAgB;GAC7B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;EACzB,OACE,EAAE,KACA,4GACF;EAIF,IAAI,KAAK,QAAQ;GACf,MAAM,IAAI,KAAK;GACf,MAAM,aAAuB,CAAC,UAAU;GACxC,IAAI,EAAE,iBAAiB,EAAE,cAAc,SAAS,GAAG;IACjD,WAAW,KAAK,iBAAiB;IACjC,KAAK,MAAM,MAAM,EAAE,eACjB,WAAW,KAAK,kBAAkB,GAAG,IAAI,IAAI;IAE/C,WAAW,KAAK,kBAAkB;GACpC;GACA,IAAI,EAAE,aAAa,EAAE,UAAU,SAAS,GAAG;IACzC,WAAW,KAAK,aAAa;IAC7B,KAAK,MAAM,MAAM,EAAE,WACjB,WAAW,KAAK,iBAAiB,GAAG,IAAI;IAE1C,WAAW,KAAK,cAAc;GAChC;GACA,WAAW,KAAK,WAAW;GAC3B,EAAE,KAAK,WAAW,KAAK,EAAE,CAAC;EAC5B;EAGA,IAAI,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,GAAG;GAC3D,MAAM,WAAqB,CAAC,UAAU;GACtC,KAAK,MAAM,OAAO,KAAK,iBACrB,IAAI,IAAI,SACN,SAAS,KAAK,aAAa,IAAI,IAAI,IAAI,IAAI,QAAQ,OAAO;QAE1D,SAAS,KAAK,aAAa,IAAI,IAAI,IAAI;GAG3C,SAAS,KAAK,WAAW;GACzB,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;EAC1B,OACE,EAAE,KAAK,WAAW;EAGpB,EAAE,KAAK,eAAe;EACtB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,WAAmB,GAAwB;EACzC,MAAM,QAAkB,CAAC;EACzB,IAAI,EAAE,MAAM,MAAM,KAAK,MAAM;EAC7B,IAAI,EAAE,QAAQ,MAAM,KAAK,MAAM;EAC/B,IAAI,EAAE,WAAW,MAAM,KAAK,MAAM;EAClC,IAAI,EAAE,QAAQ,MAAM,KAAK,WAAW;EACpC,IAAI,EAAE,SAAS,MAAM,KAAK,YAAY;EACtC,IAAI,EAAE,QAAQ,MAAM,KAAK,WAAW;EACpC,IAAI,EAAE,UAAU,MAAM,KAAK,aAAa;EACxC,IAAI,EAAE,QAAQ,MAAM,KAAK,WAAW;EACpC,IAAI,EAAE,MAAM,MAAM,KAAK,YAAY,EAAE,KAAK,IAAI;EAC9C,IAAI,EAAE,WAAW,MAAM,KAAK,qBAAmB;OAC1C,IAAI,EAAE,OAAO,MAAM,KAAK,iBAAiB,EAAE,MAAM,IAAI;EAC1D,IAAI,EAAE,MAAM,MAAM,KAAK,cAAc,UAAU,EAAE,IAAI,EAAE,IAAI;EAC3D,IAAI,EAAE,YAAY,KAAA,GAAW,MAAM,KAAK,iBAAiB,EAAE,QAAQ,IAAI;EACvE,IAAI,EAAE,WAAW,KAAA,GAAW,MAAM,KAAK,gBAAgB,EAAE,OAAO,IAAI;EACpE,IAAI,EAAE,WAAW,MAAM,KAAK,mBAAmB,EAAE,UAAU,IAAI;EAC/D,IAAI,EAAE,QAAQ,MAAM,KAAK,gBAAgB,EAAE,OAAO,IAAI;EACtD,OAAO,MAAM,KAAK,EAAE;CACtB;CAEA,aAAqB,GAA8B;EACjD,MAAM,QAAkB,CAAC;EACzB,MAAM,cAAc,MAAc,MAAiC,WAAW,SAAS;GACrF,IAAI,QAAQ,KAAK,SAAS,KAAK,UAAU,QAAQ;IAC/C,MAAM,WAAW,KAAK,QAAQ,iBAAiB,KAAK,MAAM,OAAO;IACjE,MAAM,KAAK,IAAI,KAAK,UAAU,KAAK,MAAM,IAAI,SAAS,IAAI,KAAK,EAAE;GACnE,OAAO,IAAI,UACT,MAAM,KAAK,IAAI,KAAK,GAAG;EAE3B;EACA,KAAK,MAAM,QAAQ;GACjB;GACA;GACA;GACA;GACA;GACA;GACA;EACF,GACE,WAAW,MAAM,EAAE,KAAkC;EAGvD,WAAW,SAAS,EAAE,OAAO,KAAK;EAClC,WAAW,OAAO,EAAE,KAAK,KAAK;EAC9B,OAAO,MAAM,KAAK,EAAE;CACtB;CAEA,gBAAwB,GAA6B;EACnD,MAAM,SAAgE,CAAC;EACvE,IAAI,EAAE,YAAY,OAAO,aAAa,EAAE;EACxC,IAAI,EAAE,UAAU,OAAO,WAAW,EAAE;EACpC,IAAI,EAAE,UAAU,OAAO,WAAW;EAClC,IAAI,EAAE,iBAAiB,KAAA,GAAW,OAAO,eAAe,EAAE;EAC1D,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO,SAAS,EAAE;EAC9C,IAAI,EAAE,mBAAmB,KAAA,GAAW,OAAO,iBAAiB,EAAE;EAC9D,IAAI,EAAE,iBAAiB,OAAO,kBAAkB;EAChD,IAAI,EAAE,aAAa,OAAO,cAAc;EACxC,IAAI,EAAE,iBAAiB,KAAA,GAAW,OAAO,eAAe,EAAE;EAC1D,OAAO,aAAa,MAAM,MAAM,EAAE;CACpC;CAEA,iBAAyB,IAAmC;EAC1D,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG,SAAS,IAAI;EAC9D,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG,SAAS,IAAI;EAC9D,OAAO,cAAc,MAAM,OAAO,EAAE;CACtC;AACF;;;;;;;;;AC5lBA,MAAa,aAAkF;CAC7F,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,KAAK,OAAO,UAAU;CAC/B;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAA4B,CAAC;EAInC,MAAM,6BAAa,IAAI,IAAoB;EAC3C,MAAM,QAAuB,CAAC;EAC9B,MAAM,QAA2B,CAAC;EAClC,MAAM,UAA+B,CAAC;EAGtC,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,KAAK,MAAM,MAAM,UAAU,YAAY,CAAC,GAAG;IACzC,IAAI,GAAG,SAAS,UAAU;IAC1B,MAAM,KAAK,QAAQ,IAAI,UAAU;IACjC,MAAM,OAAO,KAAK,IAAI,YAAY;IAClC,IAAI,OAAO,KAAA,KAAa,MAAM,WAAW,IAAI,IAAI,IAAI;GACvD;GACA,OAAO,mBAAmB;EAC5B;EAGA,MAAM,UAAU,UAAU,IAAI,OAAO;EACrC,IAAI,SAAS;GACX,KAAK,MAAM,KAAK,QAAQ,YAAY,CAAC,GAAG;IACtC,IAAI,EAAE,SAAS,QAAQ;IACvB,MAAM,KAAK,UAAU,CAAC,CAAC;GACzB;GACA,OAAO,QAAQ;EACjB;EAGA,MAAM,UAAU,UAAU,IAAI,OAAO;EACrC,IAAI,SAAS;GACX,KAAK,MAAM,KAAK,QAAQ,YAAY,CAAC,GAAG;IACtC,IAAI,EAAE,SAAS,QAAQ;IACvB,MAAM,KAAK,UAAU,CAAC,CAAC;GACzB;GACA,OAAO,QAAQ;EACjB;EAGA,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,KAAK,MAAM,KAAK,UAAU,YAAY,CAAC,GAAG;IACxC,IAAI,EAAE,SAAS,UAAU;IACzB,QAAQ,KAAK,YAAY,CAAC,CAAC;GAC7B;GACA,OAAO,UAAU;EACnB;EAKA,MAAM,iBAAiB,UAAU,IAAI,cAAc;EACnD,IAAI,gBAAgB;GAClB,MAAM,MAA4B,CAAC;GACnC,KAAK,MAAM,MAAM,eAAe,YAAY,CAAC,GAAG;IAC9C,IAAI,GAAG,SAAS,MAAM;IACtB,MAAM,QAA4B,CAAC;IACnC,MAAM,SAAS,QAAQ,IAAI,QAAQ;IACnC,MAAM,SAAS,QAAQ,IAAI,QAAQ;IACnC,MAAM,WAAW,QAAQ,IAAI,UAAU;IACvC,MAAM,WAAW,QAAQ,IAAI,UAAU;IACvC,IAAI,WAAW,KAAA,KAAa,SAAS,MAAM,QAAQ,MAAM,OAAO,MAAM;IACtE,IAAI,WAAW,KAAA,KAAa,SAAS,MAAM,QAAQ,MAAM,OAAO,MAAM;IACtE,IAAI,aAAa,KAAA,KAAa,WAAW,QAAQ,QAAQ,MAAM,SAAS,QAAQ;IAChF,IAAI,aAAa,KAAA,GAAW;KAC1B,MAAM,OAAO,WAAW,IAAI,QAAQ;KACpC,IAAI,SAAS,KAAA,GAAW,MAAM,SAAS;IACzC;IACA,MAAM,cAAc,UAAU,IAAI,WAAW;IAC7C,IAAI,aAAa,MAAM,YAAY,eAAe,WAAW;IAC7D,MAAM,eAAe,UAAU,IAAI,YAAY;IAC/C,IAAI,cAAc,MAAM,aAAa,gBAAgB,YAAY;IACjE,IAAI,WAAW,KAAK,IAAI,mBAAmB,CAAC,GAAG,MAAM,oBAAoB;IACzE,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,MAAM,YAAY;IACzD,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,MAAM,YAAY;IACzD,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,MAAM,cAAc;IAC7D,IAAI,WAAW,KAAK,IAAI,gBAAgB,CAAC,GAAG,MAAM,iBAAiB;IACnE,IAAI,WAAW,KAAK,IAAI,iBAAiB,CAAC,GAAG,MAAM,kBAAkB;IACrE,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,MAAM,cAAc;IAC7D,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,MAAM,cAAc;IAC7D,IAAI,KAAK,KAAK;GAChB;GACA,OAAO,eAAe;EACxB;EAGA,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,MAAM,MAAwB,CAAC;GAC/B,KAAK,MAAM,MAAM,UAAU,YAAY,CAAC,GAAG;IACzC,IAAI,GAAG,SAAS,MAAM;IACtB,MAAM,SAAS,QAAQ,IAAI,QAAQ,KAAK;IACxC,MAAM,SAAS,QAAQ,IAAI,QAAQ,KAAK;IACxC,MAAM,WAAW,QAAQ,IAAI,UAAU,KAAK;IAC5C,MAAM,WAAW,QAAQ,IAAI,UAAU,KAAK;IAE5C,MAAM,cAAc,UAAU,IAAI,WAAW;IAC7C,MAAM,YAAY,cAAc,eAAe,WAAW,IAAI,KAAA;IAE9D,MAAM,eAAe,UAAU,IAAI,YAAY;IAC/C,MAAM,aAAa,eAAe,gBAAgB,YAAY,IAAI,KAAA;IAElE,MAAM,QAAwB,CAAC;IAC/B,IAAI,SAAS,GAAG,MAAM,SAAS;IAC/B,IAAI,SAAS,GAAG,MAAM,SAAS;IAC/B,IAAI,WAAW,GAAG,MAAM,WAAW;IACnC,IAAI,WAAW,GAAG,MAAM,WAAW;IACnC,IAAI,WAAW,MAAM,YAAY;IACjC,IAAI,YAAY,MAAM,aAAa;IAEnC,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,MAAM,cAAc;IAC7D,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,MAAM,cAAc;IAE7D,IAAI,KAAK,KAAK;GAChB;GACA,OAAO,UAAU;EACnB;EAGA,MAAM,eAAe,UAAU,IAAI,YAAY;EAC/C,IAAI,cAAc;GAChB,MAAM,SAAmC,CAAC;GAC1C,KAAK,MAAM,MAAM,aAAa,YAAY,CAAC,GAAG;IAC5C,IAAI,GAAG,SAAS,aAAa;IAC7B,MAAM,QAAyC,CAAC;IAChD,IAAI,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO,KAAK,IAAI,MAAM;IAClD,MAAM,OAAO,QAAQ,IAAI,MAAM;IAC/B,IAAI,SAAS,KAAA,GAAW,MAAM,OAAO;IACrC,MAAM,YAAY,QAAQ,IAAI,WAAW;IACzC,IAAI,cAAc,KAAA,GAAW,MAAM,YAAY;IAC/C,IAAI,WAAW,KAAK,IAAI,eAAe,CAAC,GAAG,MAAM,gBAAgB;IACjE,IAAI,WAAW,KAAK,IAAI,QAAQ,CAAC,GAAG,MAAM,SAAS;IACnD,MAAM,SAAS,QAAQ,IAAI,QAAQ;IACnC,IAAI,WAAW,KAAA,GAAW,MAAM,SAAS;IACzC,OAAO,KAAK,KAA+B;GAC7C;GACA,OAAO,mBAAmB;EAC5B;EAGA,MAAM,SAAS,UAAU,IAAI,MAAM;EACnC,IAAI,QAAQ;GACV,MAAM,OAAqB,CAAC;GAC5B,KAAK,MAAM,OAAO,OAAO,YAAY,CAAC,GAAG;IACvC,IAAI,IAAI,SAAS,OAAO;IACxB,MAAM,IAAgB,CAAC;IACvB,MAAM,SAAS,UAAU,KAAK,MAAM;IACpC,IAAI,QAAQ,EAAE,OAAO,UAAU,MAAM;IACrC,MAAM,SAAS,UAAU,KAAK,MAAM;IACpC,IAAI,QAAQ,EAAE,OAAO,UAAU,MAAM;IACrC,MAAM,WAAW,UAAU,KAAK,QAAQ;IACxC,IAAI,UAAU,EAAE,SAAS,YAAY,QAAQ;IAC7C,MAAM,WAAW,UAAU,KAAK,QAAQ;IACxC,IAAI,YAAY,KAAK,UAAU,YAAY,GAAG,EAAE,SAAS,KAAK,UAAU,YAAY;IACpF,KAAK,KAAK,CAAC;GACb;GACA,OAAO,OAAO;EAChB;EAGA,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe,YAAY;GAC7B,MAAM,KAAsB,CAAC;GAC7B,IAAI,KAAK,eAAe,OAAO,MAAM,KAAA,GACnC,GAAG,QAAQ,QAAQ,eAAe,OAAO,KAAK;GAChD,IAAI,KAAK,eAAe,mBAAmB,GACzC,GAAG,oBAAoB,KAAK,eAAe,mBAAmB;GAChE,IAAI,KAAK,eAAe,mBAAmB,GACzC,GAAG,oBAAoB,KAAK,eAAe,mBAAmB;GAChE,MAAM,eAA0C,CAAC;GACjD,KAAK,MAAM,OAAO,cAAc,YAAY,CAAC,GAAG;IAC9C,IAAI,IAAI,SAAS,cAAc;IAC/B,MAAM,QAA0C,CAAC;IACjD,IAAI,KAAK,KAAK,MAAM,GAAG,MAAM,OAAO,KAAK,KAAK,MAAM;IACpD,IAAI,WAAW,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,QAAQ;IAClD,MAAM,WAAuC,CAAC;IAC9C,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,GAAG;KACrC,IAAI,KAAK,SAAS,qBAAqB;KACvC,MAAM,SAA4C,CAAC;KACnD,IAAI,KAAK,MAAM,MAAM,GAAG,OAAO,OAAO,KAAK,MAAM,MAAM;KACvD,MAAM,QAAQ,QAAQ,MAAM,OAAO;KACnC,IAAI,UAAU,KAAA,GAAW,OAAO,QAAQ;KACxC,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,GAAG,OAAO,SAAS;KACtD,SAAS,KAAK,MAAkC;IAClD;IACA,IAAI,SAAS,SAAS,GAAG,MAAM,WAAW;IAC1C,aAAa,KAAK,KAAgC;GACpD;GACA,IAAI,aAAa,SAAS,GAAG,GAAG,cAAc;GAC9C,OAAO,kBAAkB;EAC3B;EAGA,MAAM,WAAW,UAAU,IAAI,QAAQ;EACvC,IAAI,UAAU;GACZ,MAAM,SAAwB,CAAC;GAC/B,MAAM,OAAO,UAAU,UAAU,eAAe;GAChD,IAAI,MAAM;IACR,MAAM,UAAiC,CAAC;IACxC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAClC,IAAI,IAAI,SAAS,cAAc,KAAK,KAAK,KAAK,GAC5C,QAAQ,KAAK,EAAE,KAAK,KAAK,KAAK,KAAK,EAAG,CAAC;IAG3C,OAAO,gBAAgB;GACzB;GACA,MAAM,QAAQ,UAAU,UAAU,WAAW;GAC7C,IAAI,OAAO;IACT,MAAM,MAAgB,CAAC;IACvB,KAAK,MAAM,KAAK,MAAM,YAAY,CAAC,GACjC,IAAI,EAAE,SAAS,SAAS;KACtB,MAAM,MAAM,cAAc,CAAC;KAC3B,IAAI,KAAK,IAAI,KAAK,GAAG;IACvB;IAEF,OAAO,YAAY;GACrB;GACA,OAAO,SAAS;EAClB;EAGA,MAAM,WAAW,UAAU,IAAI,QAAQ;EACvC,IAAI,UAAU;GACZ,MAAM,OAAgC,CAAC;GACvC,KAAK,MAAM,OAAO,SAAS,YAAY,CAAC,GAAG;IACzC,IAAI,IAAI,SAAS,OAAO;IACxB,MAAM,MAAM,KAAK,KAAK,KAAK;IAC3B,IAAI,KAAK;KAEP,MAAM,WAAW,IAAI,YAAY,CAAC,EAAA,CAAG,KAAK,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;KACrE,KAAK,KAAK;MAAE;MAAK,SAAS,WAAW,KAAA;KAAU,CAAC;IAClD;GACF;GACA,OAAO,kBAAkB;EAC3B;EAEA,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;;AC7PA,SAAgB,oBAAoB,IAAoD;CACtF,IAAI,OAAO,KAAA,GAAW,OAAO;CAC7B,IAAI,OAAO,OAAO,UAChB,OAAO,iBAAiB,cAAc,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC;CAE1D,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG;EAChC,MAAM,UAAiE,EACrE,OAAO,IAAI,MACb;EACA,IAAI,IAAI,cAAc,QAAQ,eAAe;EAC7C,IAAI,IAAI,eAAe,OAAO,QAAQ,aAAa;EACnD,MAAM,WAAkE,EAAE,KAAK,IAAI,IAAI;EACvF,IAAI,IAAI,QAAQ,OAAO,SAAS,MAAM;EACtC,IAAI,IAAI,SAAS,SAAS,UAAU;EACpC,IAAI,IAAI,cAAc,KAAA,GAAW,SAAS,YAAY,IAAI;EAC1D,MAAM,KAAK,gBAAgB,MAAM,OAAO,EAAE,SAAS,MAAM,QAAQ,EAAE,kBAAkB;CACvF;CACA,KAAK,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG;EACvC,MAAM,UAAiE,EACrE,OAAO,GAAG,MACZ;EACA,IAAI,GAAG,cAAc,QAAQ,eAAe;EAC5C,IAAI,GAAG,eAAe,OAAO,QAAQ,aAAa;EAClD,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,KAAK,QAAQ,MAAM;EAC1B,MAAM,UAAoB,CAAC;EAC3B,IAAI,GAAG,QAAQ,KAAA,GAAW;GACxB,MAAM,SAAgE,EAAE,KAAK,GAAG,IAAI;GACpF,IAAI,GAAG,UAAU,OAAO,WAAW,GAAG;GACtC,QAAQ,KAAK,iBAAiB,gBAAgB,MAAM,MAAM,CAAC,CAAC;EAC9D;EACA,IAAI,GAAG,SAAS,KAAA,GACd,QAAQ,KAAK,iBAAiB,gBAAgB,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;EAExE,IAAI,QAAQ,SAAS,GACnB,MAAM,KACJ,gBAAgB,MAAM,OAAO,EAAE,iBAAiB,MAAM,OAAO,EAAE,GAAG,QAAQ,KAAK,EAAE,EAAE,gCACrF;CAEJ;CAEA,KAAK,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG;EACjC,MAAM,UAAiE,EACrE,OAAO,GAAG,MACZ;EACA,MAAM,eAAsE,CAAC;EAC7E,IAAI,GAAG,OAAO,aAAa,QAAQ;EACnC,IAAI,GAAG,cAAc,aAAa,eAAe,GAAG;EACpD,MAAM,YAAY,GAAG,UAAU,CAAC,EAAA,CAAG,KAAK,MAAM,gBAAgB,UAAU,CAAC,EAAE,IAAI;EAC/E,MAAM,KACJ,gBAAgB,MAAM,OAAO,EAAE,WAAW,MAAM,YAAY,EAAE,GAAG,SAAS,KAAK,EAAE,EAAE,0BACrF;CACF;CACA,IAAI,GAAG,QAAQ,GAAG,KAAK,SAAS,GAAG;EACjC,MAAM,YAAsB,CAAC;EAC7B,KAAK,MAAM,MAAM,GAAG,MAAM;GACxB,MAAM,UAAiE,EAAE,KAAK,GAAG,IAAI;GACrF,IAAI,GAAG,YAAY,QAAQ,aAAa;GACxC,IAAI,GAAG,QAAQ,QAAQ,SAAS,GAAG;GACnC,IAAI,GAAG,YAAY,QAAQ,aAAa,GAAG;GAC3C,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG;GACjD,UAAU,KAAK,iBAAiB,iBAAiB,MAAM,OAAO,CAAC,CAAC;EAClE;EACA,MAAM,UAAiE,EAAE,KAAK,GAAG,IAAI;EACrF,IAAI,GAAG,WAAW,YAAY,QAAQ,aAAa;EACnD,IAAI,GAAG,WAAW,eAAe,QAAQ,gBAAgB;EACzD,IAAI,GAAG,WAAW,YAAY,QAAQ,aAAa,GAAG,UAAU;EAChE,MAAM,KAAK,aAAa,MAAM,OAAO,EAAE,GAAG,UAAU,KAAK,EAAE,EAAE,aAAa;CAC5E;CAEA,KAAK,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG;EACtC,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,QAAQ,GAAG;EAC/C,IAAI,GAAG,cAAc,OAAO,QAAQ,YAAY;EAChD,MAAM,KAAK,wBAAwB,GAAG,MAAM,gBAAgB,MAAM,OAAO,EAAE,kBAAkB;CAC/F;CAEA,KAAK,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG;EACtC,MAAM,UAAiE,EACrE,SAAS,IAAI,QACf;EACA,IAAI,IAAI,WAAW,KAAA,GAAW,QAAQ,SAAS,IAAI;EACnD,MAAM,KAAK,wBAAwB,IAAI,MAAM,eAAe,MAAM,OAAO,EAAE,kBAAkB;CAC/F;CAEA,KAAK,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG;EACxC,MAAM,UAAiE,EAAE,MAAM,GAAG,KAAK;EACvF,IAAI,GAAG,QAAQ,KAAA,GAAW,QAAQ,MAAM,GAAG;EAC3C,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG;EACjD,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG;EACjD,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,YAAY,GAAG;EACvD,MAAM,KACJ,wBAAwB,GAAG,MAAM,kBAAkB,MAAM,OAAO,EAAE,kBACpE;CACF;CAEA,KAAK,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG;EACxC,MAAM,UAAiE,EACrE,kBAAkB,GAAG,iBACvB;EACA,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,OAAO,GAAG;EAC7C,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,QAAQ,GAAG;EAC/C,IAAI,GAAG,QAAQ,KAAA,GAAW,QAAQ,MAAM,GAAG;EAC3C,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,OAAO,GAAG;EAC7C,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG;EACjD,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,SAAS,GAAG;EACjD,MAAM,KACJ,wBAAwB,GAAG,MAAM,2BAA2B,MAAM,OAAO,EAAE,4BAC7E;CACF;CACA,IAAI,MAAM,SAAS,GACjB,OAAO,oBAAoB,GAAG,IAAI,IAAI,MAAM,KAAK,EAAE,EAAE;CAEvD,OAAO,iBAAiB,cAAc,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;AAC9D;;;;;;;AAQA,SAAgB,gBAAgB,MAA8C;CAC5E,MAAM,KAAwB,EAAE,KAAK,KAAK,MAAM,KAAK,KAAK,GAAG;CAC7D,KAAK,MAAM,SAAS,KAAK,YAAY,CAAC,GACpC,IAAI,MAAM,SAAS,gBAAgB;EACjC,MAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK;EACzC,MAAM,eAAe,WAAW,KAAK,OAAO,cAAc,CAAC;EAC3D,MAAM,gBAAgB,OAAO,KAAK,OAAO,YAAY,CAAC,MAAM;EAC5D,KAAK,MAAM,MAAM,MAAM,YAAY,CAAC,GAClC,IAAI,GAAG,SAAS,SAAS;GACvB,GAAG,UAAU,CAAC;GACd,MAAM,IAAwB;IAAE;IAAO,KAAK,QAAQ,IAAI,KAAK,KAAK;GAAE;GACpE,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,MAAM;GAC7C,IAAI,WAAW,KAAK,IAAI,SAAS,CAAC,GAAG,EAAE,UAAU;GACjD,MAAM,KAAK,QAAQ,IAAI,WAAW;GAClC,IAAI,OAAO,KAAA,GAAW,EAAE,YAAY;GACpC,IAAI,cAAc,EAAE,eAAe;GACnC,IAAI,eAAe,EAAE,aAAa;GAClC,GAAG,MAAM,KAAK,CAAC;EACjB,OAAO,IAAI,GAAG,SAAS,iBAAiB;GACtC,GAAG,kBAAkB,CAAC;GACtB,MAAM,KAA0B,EAAE,MAAM;GACxC,IAAI,WAAW,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,MAAM;GAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,EAAA,CAAG,QAAQ,MAAM,EAAE,SAAS,cAAc;GACvE,MAAM,QAAQ,IAAI;GAClB,IAAI,OAAO;IACT,MAAM,KAAK,KAAK,OAAO,UAAU;IACjC,IAAI,IAAI,GAAG,WAAW;IACtB,MAAM,IAAI,KAAK,OAAO,KAAK;IAC3B,IAAI,MAAM,KAAA,GAAW,GAAG,MAAM;GAChC;GACA,MAAM,SAAS,IAAI;GACnB,IAAI,QAAQ;IACV,MAAM,KAAK,KAAK,QAAQ,KAAK;IAC7B,IAAI,OAAO,KAAA,GAAW,GAAG,OAAO;GAClC;GACA,IAAI,cAAc,GAAG,eAAe;GACpC,IAAI,eAAe,GAAG,aAAa;GACnC,GAAG,cAAc,KAAK,EAAE;EAC1B,OAAO,IAAI,GAAG,SAAS,WAAW;GAEhC,MAAM,KAAyB,EAAE,MAAM;GACvC,IAAI,WAAW,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG,QAAQ;GAC9C,MAAM,MAAM,KAAK,IAAI,cAAc;GACnC,IAAI,KAAK,GAAG,eAAe;GAC3B,MAAM,SAAmB,CAAC;GAC1B,KAAK,MAAM,KAAK,GAAG,YAAY,CAAC,GAC9B,IAAI,EAAE,SAAS,UAAU;IACvB,MAAM,IAAI,KAAK,GAAG,KAAK;IACvB,IAAI,MAAM,KAAA,GAAW,OAAO,KAAK,CAAC;GACpC,OAAO,IAAI,EAAE,SAAS,iBAAiB;IACrC,GAAG,mBAAmB,CAAC;IACvB,MAAM,KAA6B;KACjC;KACA,kBAAkB,KAChB,GACA,kBACF;IACF;IACA,MAAM,IAAI,QAAQ,GAAG,MAAM;IAC3B,IAAI,MAAM,KAAA,GAAW,GAAG,OAAO;IAC/B,MAAM,KAAK,QAAQ,GAAG,OAAO;IAC7B,IAAI,OAAO,KAAA,GAAW,GAAG,QAAQ;IACjC,MAAM,IAAI,QAAQ,GAAG,KAAK;IAC1B,IAAI,MAAM,KAAA,GAAW,GAAG,MAAM;IAC9B,MAAM,IAAI,QAAQ,GAAG,MAAM;IAC3B,IAAI,MAAM,KAAA,GAAW,GAAG,OAAO;IAC/B,MAAM,KAAK,QAAQ,GAAG,QAAQ;IAC9B,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;IAClC,MAAM,IAAI,QAAQ,GAAG,QAAQ;IAC7B,IAAI,MAAM,KAAA,GAAW,GAAG,SAAS;IACjC,GAAG,eAAe,KAAK,EAAE;GAC3B;GAEF,IAAI,OAAO,SAAS,GAAG,GAAG,SAAS;GACnC,GAAG,YAAY,CAAC;GAChB,GAAG,QAAQ,KAAK,EAAE;EACpB,OAAO,IAAI,GAAG,SAAS,eAAe;GACpC,GAAG,iBAAiB,CAAC;GACrB,MAAM,MAA0B,EAAE,MAAM;GACxC,MAAM,QAAQ,QAAQ,IAAI,OAAO;GACjC,IAAI,UAAU,KAAA,GAAW,IAAI,QAAQ;GACrC,IAAI,OAAO,KAAK,IAAI,WAAW,CAAC,MAAM,KAAK,IAAI,YAAY;GAC3D,GAAG,aAAa,KAAK,GAAG;EAC1B,OAAO,IAAI,GAAG,SAAS,cAAc;GACnC,GAAG,gBAAgB,CAAC;GACpB,MAAM,MAAyB;IAAE;IAAO,SAAS,QAAQ,IAAI,SAAS,KAAK;GAAE;GAC7E,MAAM,SAAS,QAAQ,IAAI,QAAQ;GACnC,IAAI,WAAW,KAAA,GAAW,IAAI,SAAS;GACvC,GAAG,YAAY,KAAK,GAAG;EACzB,OAAO,IAAI,GAAG,SAAS,iBAAiB;GACtC,GAAG,mBAAmB,CAAC;GACvB,MAAM,KAA2B;IAC/B;IACA,MAAM,KAAK,IAAI,MAAM;GACvB;GACA,MAAM,IAAI,QAAQ,IAAI,KAAK;GAC3B,IAAI,MAAM,KAAA,GAAW,GAAG,MAAM;GAC9B,MAAM,KAAK,QAAQ,IAAI,QAAQ;GAC/B,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,MAAM,KAAK,KAAK,IAAI,QAAQ;GAC5B,IAAI,IAAI,GAAG,SAAS;GACpB,MAAM,MAAM,KAAK,IAAI,WAAW;GAChC,IAAI,KAAK,GAAG,YAAY;GACxB,GAAG,eAAe,KAAK,EAAE;EAC3B;CAEJ,OAAO,IAAI,MAAM,SAAS,aAAa;EACrC,MAAM,KAAuB,CAAC;EAC9B,IAAI,WAAW,KAAK,OAAO,YAAY,CAAC,GAAG,GAAG,aAAa;EAC3D,IAAI,WAAW,KAAK,OAAO,eAAe,CAAC,GAAG,GAAG,gBAAgB;EACjE,MAAM,KAAK,KAAK,OAAO,YAAY;EACnC,IAAI,IAAI,GAAG,aAAa;EACxB,GAAG,YAAY;EACf,KAAK,MAAM,MAAM,MAAM,YAAY,CAAC,GAAG;GACrC,IAAI,GAAG,SAAS,iBAAiB;GACjC,GAAG,SAAS,CAAC;GACb,MAAM,OAAsB,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG;GACzD,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,KAAK,aAAa;GAC1D,MAAM,KAAK,KAAK,IAAI,QAAQ;GAC5B,IAAI,IAAI,KAAK,SAAS;GACtB,MAAM,KAAK,KAAK,IAAI,YAAY;GAChC,IAAI,IAAI,KAAK,aAAa;GAC1B,MAAM,KAAK,QAAQ,IAAI,QAAQ;GAC/B,IAAI,OAAO,KAAA,GAAW,KAAK,SAAS;GACpC,GAAG,KAAK,KAAK,IAAI;EACnB;CACF;CAYF,OATE,GAAG,UAAU,KAAA,KACb,GAAG,kBAAkB,KAAA,KACrB,GAAG,YAAY,KAAA,KACf,GAAG,iBAAiB,KAAA,KACpB,GAAG,gBAAgB,KAAA,KACnB,GAAG,mBAAmB,KAAA,KACtB,GAAG,mBAAmB,KAAA,KACtB,GAAG,cAAc,KAAA,KACjB,GAAG,SAAS,KAAA,IACM,KAAK,GAAG;AAC9B;;;;;;;;AC7RA,SAAgB,eAAe,IAA2C;CACxE,MAAM,SAAoC,CAAC;CAC3C,MAAM,QAAQ,QAAQ,IAAI,OAAO;CACjC,IAAI,UAAU,KAAA,GAAW,OAAO,QAAQ;CACxC,MAAM,UAAU,KAAK,IAAI,MAAM;CAC/B,IAAI,SAAS,OAAO,OAAO;CAC3B,IAAI,OAAO,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,WAAW;CAC5D,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;CAC1D,IAAI,WAAW,KAAK,IAAI,UAAU,CAAC,GAAG,OAAO,WAAW;CACxD,IAAI,WAAW,KAAK,IAAI,UAAU,CAAC,GAAG,OAAO,WAAW;CACxD,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;CAC5D,IAAI,OAAO,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,UAAU;CAC1D,IAAI,KAAK,IAAI,QAAQ,GAAG,OAAO,SAAS,KAAK,IAAI,QAAQ;CACzD,IAAI,WAAW,KAAK,IAAI,6BAA6B,CAAC,GACpD,OAAO,8BAA8B;CACvC,MAAM,UAAU,KAAK,IAAI,MAAM;CAC/B,IAAI,SAAS,OAAO,OAAO;CAC3B,MAAM,KAAK,QAAQ,IAAI,eAAe;CACtC,IAAI,OAAO,KAAA,GAAW,OAAO,gBAAgB;CAC7C,MAAM,SAAS,UAAU,IAAI,YAAY;CACzC,IAAI,QAAQ;EACV,MAAM,OAA6C,CAAC;EACpD,KAAK,MAAM,OAAO,OAAO,YAAY,CAAC,GAAG;GACvC,IAAI,IAAI,SAAS,aAAa;GAC9B,MAAM,MAA0C,CAAC;GACjD,MAAM,SAAS,QAAQ,KAAK,OAAO;GACnC,IAAI,WAAW,KAAA,GAAW,IAAI,QAAQ;GACtC,MAAM,SAAS,QAAQ,KAAK,OAAO;GACnC,IAAI,WAAW,KAAA,GAAW,IAAI,QAAQ;GACtC,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC,MAAM,KAAK,IAAI,WAAW;GAC1D,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,IAAI,aAAa;GAC1D,IAAI,WAAW,KAAK,KAAK,UAAU,CAAC,GAAG,IAAI,WAAW;GACtD,IAAI,WAAW,KAAK,KAAK,iBAAiB,CAAC,GAAG,IAAI,kBAAkB;GACpE,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,IAAI,cAAc;GAC5D,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,IAAI,cAAc;GAC5D,IAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG,IAAI,iBAAiB;GAClE,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,IAAI,cAAc;GAC5D,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,IAAI,cAAc;GAC5D,MAAM,OAAiB,CAAC;GACxB,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,GACjC,IAAI,IAAI,SAAS,KAAK;IACpB,MAAM,IAAI,QAAQ,KAAK,GAAG;IAC1B,IAAI,MAAM,KAAA,GAAW,KAAK,KAAK,CAAC;GAClC;GAEF,IAAI,KAAK,SAAS,GAAG,IAAI,IAAI;GAC7B,KAAK,KAAK,GAAG;EACf;EACA,OAAO,aAAa;CACtB;CACA,OAAO;AACT;;;;;;;;;ACnDA,SAAgB,gBAAgB,IAAoC;CAClE,MAAM,SAA6B,CAAC;CACpC,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG;EACrC,IAAI,MAAM,SAAS,OAAO;EAC1B,MAAM,KAAK,QAAQ,OAAO,IAAI;EAC9B,IAAI,OAAO,KAAA,GAAW;EACtB,MAAM,IAAsB,EAAE,GAAG;EACjC,MAAM,MAAM,QAAQ,OAAO,KAAK;EAChC,IAAI,QAAQ,KAAA,GAAW,EAAE,MAAM;EAC/B,MAAM,MAAM,QAAQ,OAAO,KAAK;EAChC,IAAI,QAAQ,KAAA,GAAW,EAAE,MAAM;EAC/B,IAAI,WAAW,KAAK,OAAO,KAAK,CAAC,GAAG,EAAE,SAAS;EAC/C,IAAI,WAAW,KAAK,OAAO,IAAI,CAAC,GAAG,EAAE,QAAQ;EAC7C,OAAO,KAAK,CAAC;CACf;CACA,OAAO;AACT;AAEA,SAAgB,UAAU,IAA6B;CACrD,MAAM,SAAsB,EAAE,MAAO,KAAK,IAAI,MAAM,KAAK,MAAmB;CAC5E,MAAM,MAAM,KAAK,IAAI,KAAK;CAC1B,IAAI,QAAQ,KAAA,GAAW,OAAO,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,MAAM,OAAO,GAAG;CACzE,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,MAAM;CAClD,OAAO;AACT;AAEA,SAAgB,aAAa,KAAuD;CAClF,MAAM,QAAQ,IAAI,MAAM,iBAAiB;CACzC,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,MAAM,SAAS,MAAM,MAAM;CAC3B,MAAM,MAAM,SAAS,MAAM,MAAM,KAAK,EAAE;CACxC,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,MAAM,MAAM,MAAM,OAAO,WAAW,CAAC,IAAI;CAE3C,OAAO;EAAE;EAAK;CAAI;AACpB;;;;;;;;;;;;;;;;AC3BA,SAAS,WAAW,KAAa,MAAc,MAAc,OAAuB;CAClF,MAAM,OAAO,IAAI;CACjB,MAAM,UAAU,KAAK;CACrB,IAAI,IAAI;CACR,SAAS;EACP,MAAM,MAAM,IAAI,QAAQ,MAAM,CAAC;EAC/B,IAAI,QAAQ,MAAM,OAAO,OAAO,OAAO;EACvC,MAAM,QAAQ,IAAI,WAAW,MAAM,IAAI,OAAO;EAC9C,IACE,UAAU,MACV,UAAU,KACV,UAAU,MACV,UAAU,MACV,UAAU,MACV,UAAU,IAEV,OAAO;EAET,IAAI,MAAM,IAAI;CAChB;AACF;;;;;AAMA,SAAS,WAAW,KAAa,MAAsB;CACrD,IAAI,IAAI;CACR,MAAM,MAAM,IAAI;CAChB,OAAO,IAAI,KAAK;EACd,MAAM,IAAI,IAAI,WAAW,CAAC;EAC1B,IAAI,MAAM,IAAM;GACd,MAAM,QAAQ,IAAI,QAAQ,MAAK,IAAI,CAAC;GACpC,IAAI,UAAU,IAAI,OAAO;GACzB,IAAI,QAAQ;GACZ;EACF;EACA,IAAI,MAAM,IAAM,OAAO;EACvB;CACF;CACA,OAAO;AACT;;AAGA,SAAS,UACP,KACA,MACA,IACA,OACM;CACN,IAAI,IAAI;CACR,OAAO,IAAI,IAAI;EACb,OAAO,IAAI,IAAI;GACb,MAAM,IAAI,IAAI,WAAW,CAAC;GAC1B,IAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,IAAM;GAC1D;EACF;EACA,IAAI,KAAK,IAAI;EACb,MAAM,YAAY;EAClB,OAAO,IAAI,MAAM,IAAI,WAAW,CAAC,MAAM,IAAM;EAC7C,IAAI,KAAK,IAAI;EACb,MAAM,OAAO,IAAI,MAAM,WAAW,CAAC;EACnC;EACA,OAAO,IAAI,IAAI;GACb,MAAM,IAAI,IAAI,WAAW,CAAC;GAC1B,IAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,IAAM;GAC1D;EACF;EACA,MAAM,QAAQ,IAAI,WAAW,CAAC;EAC9B,IAAI,UAAU,MAAQ,UAAU,IAAM;EACtC;EACA,MAAM,aAAa;EACnB,OAAO,IAAI,MAAM,IAAI,WAAW,CAAC,MAAM,OAAO;EAC9C,MAAM,MAAM,YAAY,IAAI,MAAM,YAAY,CAAC,CAAC,CAAC;EACjD;CACF;AACF;;AAGA,SAAS,KAAK,OAAwB;CACpC,MAAM,QAAQ,MAAM,UAAU,IAAI,MAAM,YAAY,IAAI;CACxD,OAAO,UAAU,OAAO,UAAU,UAAU,UAAU;AACxD;;;;;;AAOA,SAAS,YAAY,KAAa,MAAc,IAAoB;CAClE,IAAI,MAAM,MAAM,OAAO;CACvB,IAAI,OAAO,IAAI,MAAM,MAAM,EAAE;CAE7B,IAAI,KAAK,QAAQ,WAAW,MAAM,IAChC,OAAO,KAAK,QAAQ,qBAAqB,EAAE;CAE7C,OAAO,YAAY,IAAI;AACzB;;AAGA,SAAS,iBAAiB,KAAa,MAAc,IAAgC;CACnF,IAAI,IAAI;CACR,OAAO,IAAI,IAAI;EACb,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC;EAC7B,IAAI,OAAO,MAAM,MAAM,IAAI;EAC3B,MAAM,OAAO,WAAW,KAAK,KAAK,CAAC;EACnC,IAAI,SAAS,MAAM,QAAQ,IAAI;EAC/B,MAAM,UAAU,KAAK;EACrB,IAAI,UAAU;EACd,OAAO,UAAU,MAAM;GACrB,MAAM,IAAI,IAAI,WAAW,OAAO;GAChC,IAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,MAAQ,MAAM,IAAM;GACxE;EACF;EACA,MAAM,OAAO,IAAI,MAAM,SAAS,OAAO;EACvC,IAAI,SAAS,KAAK;GAChB,IAAI,IAAI,WAAW,OAAO,CAAC,MAAM,IAAM,OAAO;GAC9C,MAAM,QAAQ,IAAI,QAAQ,QAAQ,OAAO,CAAC;GAC1C,OAAO,UAAU,KAAK,KAAK,YAAY,KAAK,OAAO,GAAG,KAAK;EAC7D;EACA,IAAI,SAAS,KAAK;GAEhB,MAAM,QAAQ,IAAI,QAAQ,QAAQ,OAAO,CAAC;GAC1C,IAAI,UAAU,IAAI;GAClB,IAAI,QAAQ;GACZ;EACF;EACA,IAAI,OAAO;CACb;AAEF;;;;;;AASA,SAAgB,mBACd,KACA,SACA,KACc;CACd,MAAM,OAAqB,CAAC;CAC5B,MAAM,MAAM,IAAI;CAChB,IAAI,MAAM;CAEV,SAAS;EACP,MAAM,UAAU,WAAW,KAAK,OAAO,KAAK,GAAG;EAC/C,IAAI,YAAY,IAAI;EACpB,MAAM,SAAS,WAAW,KAAK,UAAU,CAAC;EAC1C,IAAI,WAAW,IAAI;EACnB,MAAM,cAAc,IAAI,WAAW,SAAS,CAAC,MAAM;EACnD,MAAM,UAAU,cAAc,SAAS,IAAI;EAE3C,MAAM,MAAkB,CAAC;EACzB,IAAI,WAAW;EACf,UAAU,KAAK,UAAU,GAAG,UAAU,MAAM,UAAU;GACpD,QAAQ,MAAR;IACE,KAAK,KAAK;KACR,MAAM,IAAI,OAAO,KAAK;KACtB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,YAAY;KAC/B;IACF;IACA,KAAK,MAAM;KACT,MAAM,IAAI,OAAO,KAAK;KACtB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS;KAC5B;IACF;IACA,KAAK;KACH,IAAI,KAAK,KAAK,GAAG,IAAI,SAAS;KAC9B;IACF,KAAK;KACH,IAAI,QAAQ;KACZ;IACF,KAAK;KACH,IAAI,KAAK,KAAK,GAAG,IAAI,eAAe;KACpC;IACF,KAAK;KACH,IAAI,KAAK,KAAK,GAAG,IAAI,WAAW;KAChC;IACF,KAAK;KACH,IAAI,KAAK,KAAK,GAAG,IAAI,WAAW;KAChC;IACF,KAAK;KACH,IAAI,KAAK,KAAK,GAAG,IAAI,WAAW;KAChC;GACJ;EACF,CAAC;EAED,MAAM,QAAuB,CAAC;EAC9B,IAAI,CAAC,aAAa;GAChB,WAAW,IAAI,QAAQ,UAAU,SAAS,CAAC;GAC3C,IAAI,aAAa,IAAI;GACrB,IAAI,KAAK,SAAS;GAClB,SAAS;IACP,MAAM,WAAW,WAAW,KAAK,KAAK,IAAI,QAAQ;IAClD,IAAI,aAAa,IAAI;IACrB,MAAM,aAAa,WAAW,KAAK,WAAW,CAAC;IAC/C,IAAI,eAAe,IAAI;IACvB,MAAM,kBAAkB,IAAI,WAAW,aAAa,CAAC,MAAM;IAC3D,MAAM,OAAoB,CAAC;IAC3B,IAAI;IACJ,IAAI;IAEJ,UAAU,KAAK,WAAW,GAAG,kBAAkB,aAAa,IAAI,aAAa,IAAI,OAAO;KACtF,QAAQ,IAAR;MACE,KAAK;OACH,KAAK,YAAY;OACjB;MACF,KAAK;OACH,OAAO;OACP;MACF,KAAK,KAAK;OACR,MAAM,IAAI,OAAO,EAAE;OACnB,IAAI,CAAC,MAAM,CAAC,GAAG,WAAW;OAC1B;MACF;MACA,KAAK,MAAM;OACT,MAAM,IAAI,OAAO,EAAE;OACnB,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,iBAAiB;OACrC;MACF;MACA,KAAK,MAAM;OACT,MAAM,IAAI,OAAO,EAAE;OACnB,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,kBAAkB;OACtC;MACF;KACF;IACF,CAAC;IAED,IAAI,aAAa,KAAA,GAAW;KAI1B,MAAM,WAAW,MAAM,IAAI,aAAa,QAAQ,IAAI,KAAA;KACpD,IAAI,UAAU,KAAK,QAAQ;UACtB,KAAK,aAAa;IACzB;IAEA,IAAI,UAAU,aAAa;IAC3B,IAAI,CAAC,iBAAiB;KACpB,MAAM,YAAY,IAAI,QAAQ,QAAQ,aAAa,CAAC;KACpD,IAAI,cAAc,IAAI;KACtB,UAAU,YAAY;KACtB,IAAI;KACJ,IAAI;KACJ,IAAI,YAAY;KAChB,IAAI;KAEJ,IAAI,IAAI,aAAa;KACrB,OAAO,IAAI,WAAW;MACpB,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC;MAC7B,IAAI,OAAO,MAAM,MAAM,WAAW;MAClC,MAAM,OAAO,WAAW,KAAK,KAAK,CAAC;MACnC,IAAI,SAAS,IAAI;MACjB,IAAI,UAAU,KAAK;MACnB,OAAO,UAAU,MAAM;OACrB,MAAM,IAAI,IAAI,WAAW,OAAO;OAChC,IAAI,MAAM,MAAQ,MAAM,KAAQ,MAAM,MAAQ,MAAM,MAAQ,MAAM,IAAM;OACxE;MACF;MACA,MAAM,OAAO,IAAI,MAAM,KAAK,GAAG,OAAO;MACtC,IAAI,SAAS,KACX,IAAI,IAAI,WAAW,OAAO,CAAC,MAAM;WAC3B,UAAU,KAAA,GAAW,QAAQ;MAAA,OAC5B;OACL,MAAM,QAAQ,IAAI,QAAQ,QAAQ,OAAO,CAAC;OAC1C,IAAI,UAAU,IAAI;OAClB,IAAI,UAAU,KAAA,GAAW,QAAQ,YAAY,KAAK,OAAO,GAAG,KAAK;OACjE,IAAI,QAAQ;OACZ;MACF;WACK,IAAI,SAAS,MAAM;OACxB,YAAY;OACZ,MAAM,QAAQ,IAAI,QAAQ,SAAS,OAAO,CAAC;OAC3C,MAAM,QAAQ,UAAU,KAAK,YAAY;OACzC,IAAI,eAAe,KAAA,GAAW,aAAa,iBAAiB,KAAK,OAAO,GAAG,KAAK;OAChF,IAAI,UAAU,IAAI;OAClB,IAAI,QAAQ;OACZ;MACF,OAAO,IAAI,SAAS,KAAK;OACvB,MAAM,eAAe,IAAI,WAAW,OAAO,CAAC,MAAM;OAClD,MAAM,IAAoB,EAAE,SAAS,GAAG;OACxC,UAAU,KAAK,SAAS,eAAe,OAAO,IAAI,OAAO,IAAI,OAAO;QAClE,QAAQ,IAAR;SACE,KAAK;UACH,IAAI,OAAO,UAAU,EAAE,OAAO;UAC9B;SACF,KAAK;UACH,EAAE,YAAY;UACd;SACF,KAAK,MAAM;UACT,MAAM,IAAI,OAAO,EAAE;UACnB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,cAAc;UAC/B;SACF;SACA,KAAK;UACH,IAAI,KAAK,EAAE,GAAG,EAAE,MAAM;UACtB;SACF,KAAK;UACH,IAAI,KAAK,EAAE,GAAG,EAAE,gBAAgB;UAChC;SACF,KAAK;UACH,IAAI,KAAK,EAAE,GAAG,EAAE,eAAe;UAC/B;QACJ;OACF,CAAC;OACD,IAAI,cACF,IAAI,OAAO;YACN;QACL,MAAM,QAAQ,IAAI,QAAQ,QAAQ,OAAO,CAAC;QAC1C,IAAI,UAAU,IAAI;QAClB,EAAE,UAAU,YAAY,KAAK,OAAO,GAAG,KAAK;QAC5C,IAAI,QAAQ;OACd;OACA,IAAI,YAAY,KAAA,GAAW,UAAU;OACrC;MACF;MACA,IAAI,OAAO;KACb;KAGA,IAAI,SAAS,OAAO,UAAU,KAAA,GAC5B,KAAK,QAAQ,QAAQ,SAAS,OAAO,EAAE,MAAM;UACxC,IAAI,SAAS,OAAO,UAAU,KAAA,GACnC,KAAK,QAAQ,UAAU;UAClB,IAAI,SAAS,eAAe,WACjC,KAAK,QAAQ,cAAc;UACtB,IAAI,UAAU,KAAA,GAAW;MAC9B,MAAM,MAAM,OAAO,KAAK;MACxB,KAAK,QAAQ,MAAM,GAAG,IAAI,QAAQ;KACpC;KACA,IAAI,YAAY,KAAA,GAAW,KAAK,UAAU;IAC5C;IAEA,MAAM,KAAK,IAAI;IACf,KAAK;GACP;EACF;EAEA,IAAI,QAAQ;EACZ,KAAK,KAAK,GAAG;EACb,MAAM,cAAc,SAAS,IAAI,WAAW;CAC9C;CAEA,OAAO;AACT;;;;;;;;;;;;AC7SA,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,gBAAoD;CAC/D,MAAM;;;;;;;CAQN,UAAU,OAAO,MAAM;EACrB,MAAM,IAAI,MACR,mGACF;CACF;CAEA,MAAM,IAAI,KAAK;EACb,MAAM,SAAoC,CAAC;EAC3C,IAAI;EAGJ,MAAM,UACJ,OAAO,mBAAmB,MAAO,IAAwB,gBAAgB,CAAC;EAG5E,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,MAAM,KAA6B,CAAC;GACpC,IAAI,WAAW,KAAK,WAAW,gBAAgB,CAAC,GAAG,GAAG,iBAAiB;GACvE,IAAI,WAAW,KAAK,WAAW,cAAc,CAAC,GAAG,GAAG,eAAe;GACnE,IAAI,KAAK,WAAW,SAAS,GAAG,GAAG,UAAU,KAAK,WAAW,SAAS;GACtE,IAAI,WAAW,KAAK,WAAW,sBAAsB,CAAC,GAAG,GAAG,uBAAuB;GACnF,IAAI,WAAW,KAAK,WAAW,iBAAiB,CAAC,GAAG,GAAG,kBAAkB;GACzE,IAAI,WAAW,KAAK,WAAW,WAAW,CAAC,GAAG,GAAG,YAAY;GAC7D,IAAI,WAAW,KAAK,WAAW,YAAY,CAAC,GAAG,GAAG,aAAa;GAC/D,IAAI,WAAW,KAAK,WAAW,mCAAmC,CAAC,GACjE,GAAG,oCAAoC;GAEzC,MAAM,YAAY,UAAU,WAAW,WAAW;GAClD,IAAI,WAAW;IACb,IAAI,WAAW,KAAK,WAAW,aAAa,CAAC,GAAG,GAAG,qBAAqB;IACxE,IAAI,OAAO,KAAK,WAAW,oBAAoB,CAAC,MAAM,KAAK,GAAG,qBAAqB;IACnF,IAAI,OAAO,KAAK,WAAW,cAAc,CAAC,MAAM,KAAK,GAAG,sBAAsB;IAC9E,IAAI,OAAO,KAAK,WAAW,cAAc,CAAC,MAAM,KAAK,GAAG,sBAAsB;GAChF;GAIA,MAAM,cAAc,UAAU,WAAW,aAAa;GACtD,IAAI,aAAa;IACf,MAAM,OAAkC,CAAC;IACzC,IAAI,WAAW,KAAK,aAAa,WAAW,CAAC,GAAG,KAAK,YAAY;IACjE,IAAI,WAAW,KAAK,aAAa,gBAAgB,CAAC,GAAG,KAAK,iBAAiB;IAC3E,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,mBAAmB;GACvD;GACA,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG,OAAO,UAAU;GAGjD,MAAM,aAAa,UAAU,WAAW,UAAU;GAClD,IAAI,YAAY;IACd,MAAM,KAAsB,CAAC;IAC7B,IAAI,KAAK,YAAY,KAAK,GAAG,GAAG,MAAM,KAAK,YAAY,KAAK;IAC5D,IAAI,QAAQ,YAAY,OAAO,MAAM,KAAA,GAAW,GAAG,QAAQ,QAAQ,YAAY,OAAO;IACtF,IAAI,QAAQ,YAAY,MAAM,MAAM,KAAA,GAAW,GAAG,OAAO,QAAQ,YAAY,MAAM;IACnF,IAAI,QAAQ,YAAY,SAAS,MAAM,KAAA,GACrC,GAAG,UAAU,QAAQ,YAAY,SAAS;IAC5C,OAAO,WAAW;GACpB;EACF;EAGA,MAAM,eAAe,UAAU,IAAI,YAAY;EAC/C,IAAI,cAAc;GAChB,MAAM,OAAO,UAAU,cAAc,WAAW;GAChD,IAAI,MAAM;IACR,MAAM,KAAuB,CAAC;IAC9B,IAAI,OAAO,KAAK,MAAM,eAAe,CAAC,MAAM,KAAK,GAAG,gBAAgB;IACpE,IAAI,OAAO,KAAK,MAAM,mBAAmB,CAAC,MAAM,KAAK,GAAG,oBAAoB;IAC5E,IAAI,OAAO,KAAK,MAAM,WAAW,CAAC,MAAM,KAAK,GAAG,YAAY;IAC5D,MAAM,KAAK,QAAQ,MAAM,WAAW;IACpC,IAAI,OAAO,KAAA,GAAW,GAAG,YAAY;IACrC,IAAI,KAAK,MAAM,aAAa,MAAM,KAAA,GAChC,GAAG,cAAc,WAAW,KAAK,MAAM,aAAa,CAAC,KAAK;IAC5D,IAAI,WAAW,KAAK,MAAM,aAAa,CAAC,GAAG,GAAG,cAAc;IAC5D,IAAI,WAAW,KAAK,MAAM,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;IACtE,IAAI,WAAW,KAAK,MAAM,cAAc,CAAC,GAAG,GAAG,eAAe;IAC9D,IAAI,OAAO,KAAK,MAAM,WAAW,CAAC,MAAM,KAAK,GAAG,YAAY;IAC5D,IAAI,OAAO,KAAK,MAAM,oBAAoB,CAAC,MAAM,KAAK,GAAG,qBAAqB;IAC9E,IAAI,OAAO,KAAK,MAAM,kBAAkB,CAAC,MAAM,KAAK,GAAG,mBAAmB;IAC1E,IAAI,OAAO,KAAK,MAAM,gBAAgB,CAAC,MAAM,KAAK,GAAG,iBAAiB;IACtE,MAAM,UAAU,KAAK,MAAM,MAAM;IACjC,IAAI,SAAS,GAAG,OAAO;IACvB,MAAM,UAAU,QAAQ,MAAM,SAAS;IACvC,IAAI,YAAY,KAAA,GAAW,GAAG,UAAU;IACxC,MAAM,MAAM,QAAQ,MAAM,iBAAiB;IAC3C,IAAI,QAAQ,KAAA,GAAW,GAAG,kBAAkB;IAC5C,MAAM,OAAO,QAAQ,MAAM,0BAA0B;IACrD,IAAI,SAAS,KAAA,GAAW,GAAG,2BAA2B;IACtD,MAAM,OAAO,QAAQ,MAAM,yBAAyB;IACpD,IAAI,SAAS,KAAA,GAAW,GAAG,0BAA0B;IACrD,OAAO,YAAY;IAGnB,MAAM,SAAS,UAAU,MAAM,MAAM;IACrC,IAAI,UAAU,KAAK,QAAQ,OAAO,MAAM,UAAU;KAChD,MAAM,KAAwB,CAAC;KAC/B,MAAM,KAAK,QAAQ,QAAQ,QAAQ;KACnC,IAAI,MAAM,KAAK,GAAG,GAAG,MAAM;KAC3B,MAAM,KAAK,QAAQ,QAAQ,QAAQ;KACnC,IAAI,MAAM,KAAK,GAAG,GAAG,MAAM;KAC3B,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG,OAAO,cAAc;IACvD;IAGA,MAAM,QAAQ,UAAU,MAAM,WAAW;IACzC,IAAI,OAAO;KACT,MAAM,MAAwB,CAAC;KAC/B,MAAM,OAAO,KAAK,OAAO,MAAM;KAC/B,IAAI,MAAM,IAAI,OAAO;KACrB,MAAM,aAAa,KAAK,OAAO,YAAY;KAC3C,IAAI,YAAY,IAAI,aAAa;KACjC,MAAM,OAAO,QAAQ,OAAO,cAAc;KAC1C,IAAI,SAAS,KAAA,GAAW,IAAI,eAAe;KAC3C,MAAM,QAAQ,KAAK,OAAO,OAAO;KACjC,IAAI,OAAO,IAAI,QAAQ;KACvB,OAAO,YAAY;IACrB;IAGA,MAAM,OAAO,UAAU,MAAM,gBAAgB;IAC7C,IAAI,MAAM;KACR,MAAM,KAAqC,CAAC;KAC5C,MAAM,OAAO,KAAK,MAAM,MAAM;KAC9B,IAAI,MAAM,GAAG,OAAO;KACpB,IAAI,WAAW,KAAK,MAAM,YAAY,CAAC,GAAG,GAAG,aAAa;KAC1D,IAAI,WAAW,KAAK,MAAM,OAAO,CAAC,GAAG,GAAG,QAAQ;KAChD,IAAI,WAAW,KAAK,MAAM,MAAM,CAAC,GAAG,GAAG,OAAO;KAC9C,IAAI,WAAW,KAAK,MAAM,YAAY,CAAC,GAAG,GAAG,aAAa;KAC1D,MAAM,QAAQ,QAAQ,MAAM,OAAO;KACnC,IAAI,UAAU,KAAA,GAAW,GAAG,QAAQ;KACpC,MAAM,OAAO,KAAK,MAAM,MAAM;KAC9B,IAAI,MAAM,GAAG,OAAO;KACpB,KAAK,MAAM,OAAO;MAChB;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;KACF,GAAY;MACV,MAAM,IAAI,QAAQ,MAAM,GAAG;MAC3B,IAAI,MAAM,KAAA,GAAW,GAAG,OAAO;KACjC;KACA,MAAM,MAAM,KAAK,MAAM,MAAM;KAC7B,IAAI,KAAK,GAAG,MAAM;KAClB,MAAM,OAAO,UAAU,MAAM,WAAW;KACxC,IAAI,MAAM,GAAG,YAAY,eAAe,IAAI;KAC5C,OAAO,iBAAiB;IAC1B;GACF;EACF;EAGA,MAAM,QAAQ,UAAU,IAAI,eAAe;EAC3C,IAAI,OAAO;GACT,MAAM,MAAoC,CAAC;GAC3C,MAAM,MAAM,QAAQ,OAAO,cAAc;GACzC,IAAI,QAAQ,KAAA,GAAW,IAAI,eAAe;GAC1C,MAAM,MAAM,QAAQ,OAAO,iBAAiB;GAC5C,IAAI,QAAQ,KAAA,GAAW,IAAI,kBAAkB;GAC7C,MAAM,MAAM,QAAQ,OAAO,kBAAkB;GAC7C,IAAI,QAAQ,KAAA,GAAW,IAAI,mBAAmB;GAC9C,IAAI,WAAW,KAAK,OAAO,YAAY,CAAC,GAAG,IAAI,aAAa;GAC5D,IAAI,WAAW,KAAK,OAAO,UAAU,CAAC,GAAG,IAAI,WAAW;GACxD,IAAI,WAAW,KAAK,OAAO,aAAa,CAAC,GAAG,IAAI,cAAc;GAC9D,MAAM,MAAM,QAAQ,OAAO,iBAAiB;GAC5C,IAAI,QAAQ,KAAA,GAAW,IAAI,kBAAkB;GAC7C,MAAM,MAAM,QAAQ,OAAO,iBAAiB;GAC5C,IAAI,QAAQ,KAAA,GAAW,IAAI,kBAAkB;GAC7C,OAAO,gBAAgB;EACzB;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,MAAM,KAAK,aAAa,KAAK;GACnC,IAAI,KAAK,OAAO,YAAY;EAC9B;EAGA,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe;GACjB,MAAM,KAAyB,CAAC;GAChC,MAAM,MAAM,QAAQ,eAAe,MAAM;GACzC,IAAI,QAAQ,KAAA,GAAW,GAAG,OAAO;GACjC,MAAM,MAAM,QAAQ,eAAe,OAAO;GAC1C,IAAI,QAAQ,KAAA,GAAW,GAAG,QAAQ;GAClC,MAAM,MAAM,QAAQ,eAAe,KAAK;GACxC,IAAI,QAAQ,KAAA,GAAW,GAAG,MAAM;GAChC,MAAM,MAAM,QAAQ,eAAe,QAAQ;GAC3C,IAAI,QAAQ,KAAA,GAAW,GAAG,SAAS;GACnC,MAAM,MAAM,QAAQ,eAAe,QAAQ;GAC3C,IAAI,QAAQ,KAAA,GAAW,GAAG,SAAS;GACnC,MAAM,MAAM,QAAQ,eAAe,QAAQ;GAC3C,IAAI,QAAQ,KAAA,GAAW,GAAG,SAAS;GACnC,OAAO,cAAc;EACvB;EAGA,MAAM,SAAS,UAAU,IAAI,MAAM;EACnC,IAAI,QAAQ;GACV,MAAM,UAA2B,CAAC;GAClC,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GAAG;IACzC,IAAI,MAAM,SAAS,OAAO;IAC1B,MAAM,MAAqB;KACzB,KAAK,QAAQ,OAAO,KAAK,KAAK;KAC9B,KAAK,QAAQ,OAAO,KAAK,KAAK;IAChC;IACA,MAAM,IAAI,QAAQ,OAAO,OAAO;IAChC,IAAI,MAAM,KAAA,GAAW,IAAI,QAAQ;IACjC,IAAI,WAAW,KAAK,OAAO,QAAQ,CAAC,GAAG,IAAI,SAAS;IACpD,IAAI,WAAW,KAAK,OAAO,aAAa,CAAC,GAAG,IAAI,cAAc;IAC9D,MAAM,KAAK,QAAQ,OAAO,cAAc;IACxC,IAAI,OAAO,KAAA,GAAW,IAAI,eAAe;IACzC,IAAI,WAAW,KAAK,OAAO,WAAW,CAAC,GAAG,IAAI,YAAY;IAC1D,IAAI,WAAW,KAAK,OAAO,SAAS,CAAC,GAAG,IAAI,UAAU;IACtD,IAAI,WAAW,KAAK,OAAO,UAAU,CAAC,GAAG,IAAI,WAAW;IACxD,QAAQ,KAAK,GAAG;GAClB;GACA,IAAI,QAAQ,SAAS,GAAG,OAAO,UAAU;EAC3C;EAGA,MAAM,SAAS,UAAU,IAAI,iBAAiB;EAC9C,IAAI,QAAQ,YAAY;GACtB,MAAM,OAA+B,CAAC;GACtC,IAAI,KAAK,QAAQ,UAAU,GAAG,KAAK,WAAW,KAAK,QAAQ,UAAU;GACrE,IAAI,KAAK,QAAQ,eAAe,GAAG,KAAK,gBAAgB,KAAK,QAAQ,eAAe;GACpF,IAAI,KAAK,QAAQ,WAAW,GAAG,KAAK,YAAY,KAAK,QAAQ,WAAW;GACxE,IAAI,KAAK,QAAQ,WAAW,GAAG,KAAK,YAAY,KAAK,QAAQ,WAAW;GACxE,IAAI,QAAQ,QAAQ,WAAW,MAAM,KAAA,GAAW,KAAK,YAAY,QAAQ,QAAQ,WAAW;GAC5F,IAAI,WAAW,KAAK,QAAQ,OAAO,CAAC,GAAG,KAAK,QAAQ;GACpD,IAAI,WAAW,KAAK,QAAQ,SAAS,CAAC,GAAG,KAAK,UAAU;GACxD,IAAI,WAAW,KAAK,QAAQ,WAAW,CAAC,GAAG,KAAK,YAAY;GAC5D,IAAI,OAAO,KAAK,QAAQ,aAAa,CAAC,MAAM,KAAK,KAAK,cAAc;GACpE,IAAI,OAAO,KAAK,QAAQ,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;GACxE,IAAI,OAAO,KAAK,QAAQ,YAAY,CAAC,MAAM,KAAK,KAAK,aAAa;GAClE,IAAI,OAAO,KAAK,QAAQ,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;GACxE,IAAI,OAAO,KAAK,QAAQ,YAAY,CAAC,MAAM,KAAK,KAAK,aAAa;GAClE,IAAI,OAAO,KAAK,QAAQ,kBAAkB,CAAC,MAAM,KAAK,KAAK,mBAAmB;GAC9E,IAAI,OAAO,KAAK,QAAQ,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;GACxE,IAAI,OAAO,KAAK,QAAQ,YAAY,CAAC,MAAM,KAAK,KAAK,aAAa;GAClE,IAAI,WAAW,KAAK,QAAQ,mBAAmB,CAAC,GAAG,KAAK,oBAAoB;GAC5E,IAAI,OAAO,KAAK,QAAQ,MAAM,CAAC,MAAM,KAAK,KAAK,OAAO;GACtD,IAAI,OAAO,KAAK,QAAQ,YAAY,CAAC,MAAM,KAAK,KAAK,aAAa;GAClE,IAAI,OAAO,KAAK,QAAQ,aAAa,CAAC,MAAM,KAAK,KAAK,cAAc;GACpE,IAAI,WAAW,KAAK,QAAQ,qBAAqB,CAAC,GAAG,KAAK,sBAAsB;GAChF,OAAO,aAAa;EACtB;EAGA,MAAM,OAAO,UAAU,IAAI,iBAAiB;EAC5C,IAAI,MAAM;GACR,MAAM,SAAkC,CAAC;GACzC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,kBAAkB;IACnC,MAAM,IAA2B;KAC/B,OAAO,KAAK,KAAK,OAAO,KAAK;KAC7B,MAAM,KAAK,KAAK,MAAM,KAAK;IAC7B;IACA,IAAI,KAAK,KAAK,UAAU,GAAG,EAAE,WAAW,KAAK,KAAK,UAAU;IAC5D,IAAI,KAAK,KAAK,eAAe,GAAG,EAAE,gBAAgB,KAAK,KAAK,eAAe;IAC3E,IAAI,KAAK,KAAK,WAAW,GAAG,EAAE,YAAY,KAAK,KAAK,WAAW;IAC/D,IAAI,KAAK,KAAK,WAAW,GAAG,EAAE,YAAY,KAAK,KAAK,WAAW;IAC/D,MAAM,YAAY,QAAQ,KAAK,WAAW;IAC1C,IAAI,cAAc,KAAA,GAAW,EAAE,YAAY;IAC3C,MAAM,SAAS,KAAK,KAAK,oBAAoB;IAC7C,IAAI,WAAW,KAAA,GAAW,EAAE,qBAAqB;IACjD,MAAM,OAAO,UAAU,KAAK,oBAAoB;IAChD,IAAI,MAAM,EAAE,qBAAqB,OAAO,IAAI,KAAK,KAAA;IACjD,OAAO,KAAK,CAAC;GACf;GACA,IAAI,OAAO,SAAS,GAAG,OAAO,kBAAkB;EAClD;EAGA,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MACF,OAAO,aAAa,gBAAgB,IAAI;EAI1C,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MAAM;GACR,MAAM,SAA6B,CAAC;GACpC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,aAAa;IAE9B,MAAM,SADM,KAAK,KAAK,KAAK,KAAK,GAAA,CACd,MAAM,GAAG;IAC3B,IAAI,MAAM,WAAW,GAAG;KACtB,MAAM,OAAO,aAAa,MAAM,MAAM,EAAE;KACxC,MAAM,KAAK,aAAa,MAAM,MAAM,EAAE;KACtC,IAAI,QAAQ,IAAI,OAAO,KAAK;MAAE;MAAM;KAAG,CAAC;IAC1C;GACF;GACA,IAAI,OAAO,SAAS,GAAG,OAAO,aAAa;EAC7C;EAGA,MAAM,QAAQ,GAAG,UAAU,QAAQ,MAAM,EAAE,SAAS,uBAAuB,KAAK,CAAC;EACjF,IAAI,MAAM,SAAS,GAAG;GACpB,MAAM,MAAkC,CAAC;GACzC,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,KAAK,MAAM,OAAO,KAAK;IACrC,MAAM,QAAiC,CAAC;IACxC,KAAK,MAAM,UAAU,KAAK,YAAY,CAAC,GAAG;KACxC,IAAI,OAAO,SAAS,UAAU;KAC9B,MAAM,OAA8B;MAClC,MAAM,KAAK,QAAQ,MAAM;MACzB,UAAU,QAAQ,QAAQ,UAAU,KAAK;KAC3C;KACA,MAAM,QAAQ,KAAK,QAAQ,UAAU;KACrC,IAAI,OAAO,KAAK,WAAW;KAC3B,MAAM,QAAQ,QAAQ,QAAQ,OAAO;KACrC,IAAI,UAAU,KAAA,GAAW,KAAK,QAAQ;KACtC,IAAI,WAAW,KAAK,QAAQ,YAAY,CAAC,GAAG,KAAK,aAAa;KAC9D,MAAM,QAAQ,KAAK,QAAQ,YAAY;KACvC,IAAI,OAAO,KAAK,aAAa;KAC7B,MAAM,OAAO,QAAQ,QAAQ,MAAM;KACnC,IAAI,SAAS,KAAA,GAAW,KAAK,OAAO;KACpC,IAAI,WAAW,KAAK,QAAQ,cAAc,CAAC,GAAG,KAAK,eAAe;KAClE,IAAI,OAAO,KAAK,QAAQ,cAAc,CAAC,MAAM,KAAK,KAAK,eAAe;KACtE,MAAM,SAAS,QAAQ,QAAQ,QAAQ;KACvC,IAAI,WAAW,KAAA,GAAW,KAAK,SAAS;KAGxC,MAAM,OAAO,UAAU,QAAQ,YAAY;KAC3C,IAAI,MAAM;MACR,MAAM,OAAsB,CAAC;MAC7B,MAAM,SAAmB,CAAC;MAC1B,KAAK,MAAM,SAAS,KAAK,YAAY,CAAC,GAAG;OACvC,IAAI,MAAM,SAAS,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;OACrD,IAAI,MAAM,SAAS,SAAS;QAC1B,MAAM,MAAM,cAAc,KAAK;QAC/B,IAAI,KAAK,OAAO,KAAK,GAAG;OAC1B;MACF;MACA,KAAK,aAAa;OAAE;OAAM;MAAO;KACnC;KAGA,MAAM,OAAO,UAAU,QAAQ,SAAS;KACxC,IAAI,MAAM;MACR,MAAM,OAAsB,CAAC;MAC7B,IAAI,QAAQ;MACZ,KAAK,MAAM,SAAS,KAAK,YAAY,CAAC,GAAG;OACvC,IAAI,MAAM,SAAS,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;OACrD,IAAI,MAAM,SAAS,SAAS;QAC1B,MAAM,MAAM,cAAc,KAAK;QAC/B,IAAI,KAAK,QAAQ;OACnB;MACF;MACA,KAAK,UAAU;OAAQ;OAAoC;MAAM;KACnE;KAGA,MAAM,OAAO,UAAU,QAAQ,SAAS;KACxC,IAAI,MAAM;MACR,MAAM,OAAsB,CAAC;MAC7B,KAAK,MAAM,SAAS,KAAK,YAAY,CAAC,GACpC,IAAI,MAAM,SAAS,QAAQ,KAAK,KAAK,UAAU,KAAK,CAAC;MAEvD,MAAM,UAA0B,EAAE,KAAK;MACvC,MAAM,QAAQ,KAAK,MAAM,SAAS;MAClC,IAAI,OAAO,QAAQ,UAAU;MAC7B,IAAI,OAAO,KAAK,MAAM,WAAW,CAAC,MAAM,KAAK,QAAQ,YAAY;MACjE,IAAI,OAAO,KAAK,MAAM,SAAS,CAAC,MAAM,KAAK,QAAQ,UAAU;MAC7D,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,GAAG,QAAQ,UAAU;MACzD,KAAK,UAAU;KACjB;KAGA,MAAM,WAAqB,CAAC;KAC5B,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GACtC,IAAI,MAAM,SAAS,WAAW,SAAS,KAAK,OAAO,KAAK,KAAK,EAAE;KAEjE,IAAI,SAAS,SAAS,GAAG,KAAK,WAAW;KAEzC,MAAM,KAAK,IAAI;IACjB;IACA,IAAI,KAAK;KAAE;KAAO;IAAM,CAAC;GAC3B;GACA,OAAO,qBAAqB;EAC9B;EAGA,MAAM,OAAO,UAAU,IAAI,iBAAiB;EAC5C,IAAI,MAAM;GACR,MAAM,MAA+B,CAAC;GACtC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,kBAAkB;IACnC,MAAM,KAA4B,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG;IACpE,MAAM,UAAU,KAAK,KAAK,MAAM;IAChC,IAAI,SAAS,GAAG,OAAO;IACvB,MAAM,QAAQ,KAAK,KAAK,UAAU;IAClC,IAAI,OAAO,GAAG,WAAW;IACzB,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,GAAG,aAAa;IACzD,IAAI,WAAW,KAAK,KAAK,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;IACrE,IAAI,WAAW,KAAK,KAAK,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;IACrE,IAAI,KAAK,KAAK,YAAY,GAAG,GAAG,aAAa,KAAK,KAAK,YAAY;IACnE,IAAI,KAAK,KAAK,OAAO,GAAG,GAAG,QAAQ,KAAK,KAAK,OAAO;IACpD,IAAI,KAAK,KAAK,aAAa,GAAG,GAAG,cAAc,KAAK,KAAK,aAAa;IACtE,IAAI,KAAK,KAAK,QAAQ,GAAG,GAAG,SAAS,KAAK,KAAK,QAAQ;IACvD,MAAM,QAAQ,KAAK,KAAK,YAAY;IACpC,IAAI,OAAO,GAAG,aAAa;IAC3B,MAAM,QAAQ,KAAK,KAAK,SAAS;IACjC,IAAI,OAAO,GAAG,UAAU;IACxB,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,GAAG,eAAe;IAE7D,MAAM,OAAO,UAAU,KAAK,UAAU;IACtC,IAAI,MAAM,GAAG,WAAW,OAAO,IAAI;IACnC,MAAM,OAAO,UAAU,KAAK,UAAU;IACtC,IAAI,MAAM,GAAG,WAAW,OAAO,IAAI;IAEnC,IAAI,KAAK,EAAE;GACb;GACA,OAAO,kBAAkB;EAC3B;EAGA,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MAAM;GACR,MAAM,aAAiC,CAAC;GACxC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,aAAa;IAC9B,MAAM,MAAM,IAAI,aAAa;IAC7B,MAAM,WAAW,KAAK,KAAK,UAAU;IACrC,MAAM,SAA0B,MAC5B;KAAE,MAAM;KAAY,KAAK;IAAI,IAC7B;KAAE,MAAM;KAAY,UAAU,YAAY;IAAG;IACjD,MAAM,KAAuB;KAAE,MAAM,KAAK,KAAK,KAAK,KAAK;KAAI;IAAO;IACpE,IAAI,KAAK,KAAK,SAAS,GAAG,GAAG,UAAU,KAAK,KAAK,SAAS;IAC1D,IAAI,KAAK,KAAK,SAAS,GAAG,GAAG,UAAU,KAAK,KAAK,SAAS;IAC1D,WAAW,KAAK,EAAE;GACpB;GACA,OAAO,aAAa;EACtB;EAGA,MAAM,OAAO,UAAU,IAAI,cAAc;EACzC,IAAI,MAAM;GACR,MAAM,KAAmB,CAAC;GAC1B,IAAI,WAAW,KAAK,MAAM,oBAAoB,CAAC,GAAG,GAAG,qBAAqB;GAC1E,IAAI,WAAW,KAAK,MAAM,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;GACtE,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC,GAAG,GAAG,WAAW;GACtD,IAAI,WAAW,KAAK,MAAM,WAAW,CAAC,GAAG,GAAG,YAAY;GACxD,IAAI,OAAO,KAAK,MAAM,cAAc,CAAC,MAAM,KAAK,GAAG,eAAe;GAClE,OAAO,eAAe;EACxB;EAGA,MAAM,OAAO,UAAU,IAAI,WAAW;EACtC,IAAI,MAAM;GACR,MAAM,KAAuB,CAAC;GAC9B,MAAM,KAAK,QAAQ,MAAM,WAAW;GACpC,IAAI,OAAO,KAAA,GAAW,GAAG,YAAY;GACrC,MAAM,KAAK,YAAY,MAAM,aAAa;GAC1C,IAAI,OAAO,KAAA,GAAW,GAAG,cAAc;GACvC,MAAM,KAAK,YAAY,MAAM,YAAY;GACzC,IAAI,OAAO,KAAA,GAAW,GAAG,aAAa;GACtC,MAAM,YAAY,KAAK,MAAM,aAAa;GAC1C,IAAI,WAAW,GAAG,cAAc;GAChC,MAAM,KAAK,QAAQ,MAAM,OAAO;GAChC,IAAI,OAAO,KAAA,GAAW,GAAG,QAAQ;GACjC,MAAM,MAAM,QAAQ,MAAM,YAAY;GACtC,IAAI,QAAQ,KAAA,GAAW,GAAG,aAAa;GACvC,MAAM,MAAM,QAAQ,MAAM,aAAa;GACvC,IAAI,QAAQ,KAAA,GAAW,GAAG,cAAc;GACxC,MAAM,eAAe,KAAK,MAAM,WAAW;GAC3C,IAAI,cAAc,GAAG,YAAY;GACjC,IAAI,WAAW,KAAK,MAAM,oBAAoB,CAAC,GAAG,GAAG,qBAAqB;GAC1E,MAAM,MAAM,QAAQ,MAAM,iBAAiB;GAC3C,IAAI,QAAQ,KAAA,GAAW,GAAG,kBAAkB;GAC5C,IAAI,kBAAkB,OAAO,OAAO,IAAI,gBAAgB;GACxD,OAAO,YAAY;EACrB,OAAO,IAAI,kBACT,OAAO,YAAY;EAIrB,MAAM,OAAO,UAAU,IAAI,cAAc;EACzC,IAAI,MAAM;GACR,MAAM,KAA0B,CAAC;GACjC,IAAI,WAAW,KAAK,MAAM,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;GACtE,IAAI,WAAW,KAAK,MAAM,gBAAgB,CAAC,GAAG,GAAG,iBAAiB;GAClE,IAAI,OAAO,KAAK,MAAM,cAAc,CAAC,MAAM,KAAK,GAAG,eAAe;GAClE,IAAI,OAAO,KAAK,MAAM,kBAAkB,CAAC,MAAM,KAAK,GAAG,mBAAmB;GAC1E,MAAM,KAAK,UAAU,MAAM,WAAW;GACtC,IAAI,IAAI,GAAG,YAAY,OAAO,EAAE;GAChC,MAAM,MAAM,UAAU,MAAM,WAAW;GACvC,IAAI,KAAK,GAAG,YAAY,OAAO,GAAG;GAClC,MAAM,KAAK,UAAU,MAAM,YAAY;GACvC,IAAI,IAAI,GAAG,aAAa,OAAO,EAAE;GACjC,MAAM,KAAK,UAAU,MAAM,YAAY;GACvC,IAAI,IAAI,GAAG,aAAa,OAAO,EAAE;GACjC,MAAM,KAAK,UAAU,MAAM,aAAa;GACxC,IAAI,IAAI,GAAG,cAAc,OAAO,EAAE;GAClC,MAAM,KAAK,UAAU,MAAM,aAAa;GACxC,IAAI,IAAI,GAAG,cAAc,OAAO,EAAE;GAClC,OAAO,eAAe;EACxB;EAGA,MAAM,OAAO,UAAU,IAAI,eAAe;EAC1C,IAAI,MAAM;GACR,MAAM,SAAgC,CAAC;GACvC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,gBAAgB;IACjC,MAAM,KAA0B,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG;IAClE,IAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG,GAAG,YAAY;IACvD,IAAI,WAAW,KAAK,KAAK,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;IACrE,IAAI,WAAW,KAAK,KAAK,oBAAoB,CAAC,GAAG,GAAG,qBAAqB;IACzE,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,GAAG,GAAG,UAAU;IACnD,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,GAAG,eAAe;IAC7D,IAAI,WAAW,KAAK,KAAK,iBAAiB,CAAC,GAAG,GAAG,kBAAkB;IACnE,IAAI,WAAW,KAAK,KAAK,oBAAoB,CAAC,GAAG,GAAG,qBAAqB;IACzE,IAAI,WAAW,KAAK,KAAK,oBAAoB,CAAC,GAAG,GAAG,qBAAqB;IACzE,IAAI,WAAW,KAAK,KAAK,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;IACrE,OAAO,KAAK,EAAE;GAChB;GACA,OAAO,gBAAgB;EACzB;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,UAAkC,CAAC;GACzC,KAAK,MAAM,SAAS,YAAY,YAAY,CAAC,GAAG;IAC9C,IAAI,MAAM,SAAS,iBAAiB;IACpC,MAAM,MAA4B;KAChC,WAAW,KAAK,OAAO,GAAG,KAAK;KAC/B,WAAW,CAAC;IACd;IACA,KAAK,MAAM,QAAQ,MAAM,YAAY,CAAC,GAAG;KACvC,IAAI,KAAK,SAAS,gBAAgB;KAClC,MAAM,KAKF,EACF,MAAM,QAAQ,MAAM,MAAM,KAAK,EACjC;KACA,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,GAAG,GAAG,UAAU;KACpD,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC,GAAG,GAAG,WAAW;KACtD,MAAM,QAAQ,KAAK,UAAU,QAAQ,MAAM,EAAE,SAAS,gBAAgB,KAAK,CAAC;KAC5E,IAAI,MAAM,SAAS,GACjB,GAAG,aAAa,MAAM,KAAK,UAAU;MACnC,KAAK,KAAK,MAAM,KAAK,KAAK;MAC1B,KAAK,KAAK,MAAM,KAAK,KAAK;KAC5B,EAAE;KAEJ,IAAI,UAAU,KAAK,EAAE;IACvB;IACA,QAAQ,KAAK,GAAG;GAClB;GACA,IAAI,QAAQ,SAAS,GAAG,OAAO,YAAY;EAC7C;EAGA,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MAAM;GACR,MAAM,KAAgC,EAAE,QAAQ,QAAQ,MAAM,QAAQ,KAAK,EAAE;GAC7E,MAAM,SAAS,KAAK,MAAM,MAAM;GAChC,IAAI,QAAQ,GAAG,OAAO;GACtB,MAAM,UAAU,KAAK,MAAM,WAAW;GACtC,IAAI,SAAS,GAAG,YAAY;GAC5B,OAAO,aAAa;EACtB;EAGA,MAAM,OAAO,UAAU,IAAI,aAAa;EACxC,IAAI,MAAM;GACR,MAAM,KAAwC,CAAC;GAC/C,IAAI,WAAW,KAAK,MAAM,gBAAgB,CAAC,GAAG,GAAG,iBAAiB;GAClE,OAAO,cAAc;EACvB;EAMA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,OAAO,mBACX,YAAY,OAAO,UAAU,WAAW,GACxC,SACA,OAAO,kBAAkB,MAAO,MAA0B,KAAA,CAC5D;GACA,IAAI,KAAK,SAAS,GAAG,OAAO,OAAO;EACrC;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,SAAS,gBAAgB,WAAW;GAC1C,IAAI,OAAO,SAAS,GAAG,OAAO,YAAY;EAC5C;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,SAAS,gBAAgB,WAAW;GAC1C,IAAI,OAAO,SAAS,GAAG,OAAO,YAAY;EAC5C;EAGA,MAAM,gBAAgB,UAAU,IAAI,kBAAkB;EACtD,IAAI,eAAe;GACjB,MAAM,QAAsC,CAAC;GAC7C,KAAK,MAAM,QAAQ,cAAc,YAAY,CAAC,GAAG;IAC/C,IAAI,KAAK,SAAS,YAAY;IAC9B,MAAM,OAAO,KAAK,MAAM,MAAM;IAC9B,MAAM,MAAM,KAAK,aAAa;IAC9B,IAAI,SAAS,KAAA,KAAa,QAAQ,KAAA,GAAW,MAAM,KAAK;KAAE;KAAM;IAAI,CAAC;GACvE;GACA,IAAI,MAAM,SAAS,GAAG,OAAO,mBAAmB;EAClD;EAGA,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe;GACjB,MAAM,UAA8B,CAAC;GACrC,KAAK,MAAM,QAAQ,cAAc,YAAY,CAAC,GAAG;IAC/C,IAAI,KAAK,SAAS,aAAa;IAC/B,MAAM,IAAI,KAAK,MAAM,GAAG;IACxB,IAAI,GAAG,QAAQ,KAAK,EAAE,WAAW,EAAE,CAAC;GACtC;GACA,IAAI,QAAQ,SAAS,GAAG,OAAO,cAAc;EAC/C;EAGA,MAAM,aAAa,UAAU,IAAI,iBAAiB;EAClD,IAAI,YAAY;GACd,MAAM,MAAM,WAAW,aAAa;GACpC,IAAI,KAAK,OAAO,kBAAkB;EACpC;EAGA,MAAM,OAAO,UAAU,IAAI,iBAAiB;EAC5C,IAAI,MAAM;GACR,MAAM,KAA6B,CAAC;GACpC,MAAM,KAAK,KAAK,MAAM,UAAU;GAChC,IAAI,IAAI,GAAG,WAAW;GACtB,IAAI,WAAW,KAAK,MAAM,WAAW,CAAC,GAAG,GAAG,YAAY;GACxD,IAAI,WAAW,KAAK,MAAM,YAAY,CAAC,GAAG,GAAG,aAAa;GAC1D,IAAI,WAAW,KAAK,MAAM,aAAa,CAAC,GAAG,GAAG,cAAc;GAC5D,IAAI,WAAW,KAAK,MAAM,MAAM,CAAC,GAAG,GAAG,OAAO;GAC9C,MAAM,SAAS,UAAU,MAAM,UAAU;GACzC,IAAI,QAAQ;IACV,MAAM,OAAiB,CAAC;IACxB,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GAAG;KACzC,IAAI,MAAM,SAAS,WAAW;KAC9B,MAAM,IAAI,KAAK,OAAO,KAAK;KAC3B,IAAI,GAAG,KAAK,KAAK,CAAC;IACpB;IACA,IAAI,KAAK,SAAS,GAAG,GAAG,OAAO;GACjC;GACA,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG,OAAO,kBAAkB;EAC3D;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,YAAkC,CAAC;GACzC,KAAK,MAAM,QAAQ,YAAY,YAAY,CAAC,GAAG;IAC7C,IAAI,KAAK,SAAS,YAAY;IAC9B,MAAM,OAAO,KAAK,MAAM,MAAM;IAC9B,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,WAA+B;KAAE;KAAM,YAAY,CAAC;IAAE;IAC5D,MAAM,QAAQ,QAAQ,MAAM,OAAO;IACnC,IAAI,UAAU,KAAA,GAAW,SAAS,QAAQ;IAC1C,MAAM,OAAO,KAAK,MAAM,MAAM;IAC9B,IAAI,SAAS,KAAA,GAAW,SAAS,OAAO;IACxC,MAAM,UAAU,KAAK,MAAM,SAAS;IACpC,IAAI,YAAY,KAAA,GAAW,SAAS,UAAU;IAC9C,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,GAAG,SAAS,SAAS;IACxD,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,GAAG,SAAS,SAAS;IACxD,KAAK,MAAM,QAAQ,KAAK,YAAY,CAAC,GAAG;KACtC,IAAI,KAAK,SAAS,cAAc;KAChC,MAAM,IAAI,KAAK,MAAM,GAAG;KACxB,MAAM,SAAS,KAAK,MAAM,KAAK;KAC/B,IAAI,MAAM,KAAA,KAAa,WAAW,KAAA,GAAW;KAC7C,MAAM,MAAM,OAAO,MAAM;KACzB,MAAM,OAA4B;MAChC,WAAW;MACX,KAAK,OAAO,GAAG,MAAM,SAAS,MAAM;KACtC;KACA,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,GAAG,KAAK,UAAU;KACtD,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,GAAG,KAAK,SAAS;KACpD,SAAS,WAAW,KAAK,IAAI;IAC/B;IACA,UAAU,KAAK,QAAQ;GACzB;GACA,IAAI,UAAU,SAAS,GAAG;IACxB,MAAM,KAAsB,EAAE,UAAU;IACxC,MAAM,UAAU,QAAQ,aAAa,SAAS;IAC9C,IAAI,YAAY,KAAA,GAAW,GAAG,UAAU;IACxC,MAAM,OAAO,QAAQ,aAAa,MAAM;IACxC,IAAI,SAAS,KAAA,GAAW,GAAG,OAAO;IAClC,OAAO,YAAY;GACrB;EACF;EAGA,MAAM,YAAY,UAAU,IAAI,kBAAkB;EAClD,IAAI,WAAW;GACb,MAAM,QAAkC,CAAC;GACzC,KAAK,MAAM,OAAO,UAAU,YAAY,CAAC,GAAG;IAC1C,IAAI,IAAI,SAAS,mBAAmB;IACpC,MAAM,OAAO,KAAK,KAAK,MAAM;IAC7B,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,OAA+B,EAAE,KAAK;IAC5C,MAAM,QAAQ,QAAQ,KAAK,OAAO;IAClC,IAAI,UAAU,KAAA,GAAW,KAAK,QAAQ;IACtC,IAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG,KAAK,iBAAiB;IACnE,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,KAAK,eAAe;IAC/D,IAAI,OAAO,KAAK,KAAK,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;IACrE,IAAI,OAAO,KAAK,KAAK,YAAY,CAAC,MAAM,KAAK,KAAK,oBAAoB;IACtE,IAAI,OAAO,KAAK,KAAK,gBAAgB,CAAC,MAAM,KAAK,KAAK,iBAAiB;IACvE,IAAI,OAAO,KAAK,KAAK,YAAY,CAAC,MAAM,KAAK,KAAK,aAAa;IAC/D,IAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG,KAAK,YAAY;IACzD,IAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG,KAAK,YAAY;IACzD,IAAI,WAAW,KAAK,KAAK,QAAQ,CAAC,GAAG,KAAK,SAAS;IACnD,IAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG,KAAK,iBAAiB;IACnE,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,KAAK,aAAa;IAC3D,IAAI,WAAW,KAAK,KAAK,eAAe,CAAC,GAAG,KAAK,gBAAgB;IACjE,MAAM,QAAQ,KAAK,KAAK,OAAO;IAC/B,IAAI,UAAU,KAAA,GAAW,KAAK,QAAQ;IACtC,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,KAAK,eAAe;IAC/D,MAAM,WAAW,KAAK,KAAK,MAAM;IACjC,IAAI,aAAa,KAAA,GAAW,KAAK,OAAO;IACxC,MAAM,KAAK,IAAI;GACjB;GACA,IAAI,MAAM,SAAS,GAAG,OAAO,mBAAmB;EAClD;EAGA,MAAM,YAAY,UAAU,IAAI,YAAY;EAC5C,IAAI,WAAW;GACb,MAAM,aAAiC,CAAC;GACxC,KAAK,MAAM,QAAQ,UAAU,YAAY,CAAC,GAAG;IAC3C,IAAI,KAAK,SAAS,aAAa;IAC/B,MAAM,UAAU,QAAQ,MAAM,SAAS;IACvC,IAAI,YAAY,KAAA,GAAW;IAC3B,MAAM,KAAuB,EAAE,QAAQ;IACvC,MAAM,SAAS,KAAK,MAAM,QAAQ;IAClC,IAAI,WAAW,KAAA,GAAW,GAAG,SAAS;IACtC,MAAM,WAAW,KAAK,MAAM,UAAU;IACtC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW;IAC1C,MAAM,OAAO,KAAK,MAAM,MAAM;IAC9B,IAAI,SAAS,KAAA,GAAW,GAAG,OAAO;IAClC,MAAM,YAAY,KAAK,MAAM,WAAW;IACxC,IAAI,cAAc,KAAA,GAAW,GAAG,YAAY;IAC5C,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC,GAAG,GAAG,WAAW;IACtD,MAAM,QAAQ,KAAK,MAAM,MAAM;IAC/B,IAAI,UAAU,KAAA,GAAW,GAAG,MAAM;IAClC,MAAM,QAAQ,UAAU,MAAM,UAAU;IACxC,IAAI,OAAO;KACT,MAAM,MAAkC,CAAC;KACzC,IAAI,OAAO,KAAK,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,SAAS;KACxD,IAAI,OAAO,KAAK,OAAO,aAAa,CAAC,MAAM,KAAK,IAAI,cAAc;KAClE,IAAI,OAAO,KAAK,OAAO,OAAO,CAAC,MAAM,KAAK,IAAI,QAAQ;KACtD,IAAI,WAAW,KAAK,OAAO,UAAU,CAAC,GAAG,IAAI,WAAW;KACxD,IAAI,WAAW,KAAK,OAAO,UAAU,CAAC,GAAG,IAAI,WAAW;KACxD,IAAI,OAAO,KAAK,OAAO,UAAU,CAAC,MAAM,KAAK,IAAI,WAAW;KAC5D,IAAI,OAAO,KAAK,OAAO,UAAU,CAAC,MAAM,KAAK,IAAI,WAAW;KAC5D,IAAI,OAAO,KAAK,OAAO,UAAU,CAAC,MAAM,KAAK,IAAI,WAAW;KAC5D,MAAM,QAAQ,KAAK,OAAO,OAAO;KACjC,IAAI,UAAU,KAAA,GAAW,IAAI,QAAQ;KACrC,MAAM,UAAU,KAAK,OAAO,SAAS;KACrC,IAAI,YAAY,KAAA,GAAW,IAAI,UAAU;KACzC,IAAI,WAAW,KAAK,OAAO,KAAK,CAAC,GAAG,IAAI,MAAM;KAC9C,MAAM,SAAS,KAAK,OAAO,MAAM;KACjC,IAAI,WAAW,KAAA,GAAW,IAAI,MAAM;KACpC,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,WAAW;IACjD;IACA,WAAW,KAAK,EAAE;GACpB;GACA,IAAI,WAAW,SAAS,GAAG,OAAO,aAAa;EACjD;EAGA,MAAM,aAAa,UAAU,IAAI,UAAU;EAC3C,IAAI,YAAY;GACd,MAAM,WAA6B,CAAC;GACpC,KAAK,MAAM,OAAO,WAAW,YAAY,CAAC,GAAG;IAC3C,IAAI,IAAI,SAAS,WAAW;IAC5B,MAAM,UAAU,QAAQ,KAAK,SAAS;IACtC,MAAM,OAAO,KAAK,KAAK,MAAM;IAC7B,IAAI,YAAY,KAAA,KAAa,SAAS,KAAA,GAAW;IACjD,MAAM,IAAoB;KAAE;KAAS,KAAK;IAAK;IAC/C,MAAM,OAAO,KAAK,KAAK,MAAM;IAC7B,IAAI,SAAS,KAAA,GAAW,EAAE,OAAO;IACjC,MAAM,OAAO,UAAU,KAAK,WAAW;IACvC,IAAI,MAAM;KACR,IAAI,OAAO,KAAK,MAAM,QAAQ,CAAC,MAAM,KAAK,EAAE,SAAS;KACrD,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC,GAAG,EAAE,WAAW;KACrD,IAAI,WAAW,KAAK,MAAM,cAAc,CAAC,GAAG,EAAE,eAAe;KAC7D,MAAM,aAAa,KAAK,MAAM,YAAY;KAC1C,IAAI,eAAe,KAAA,GAAW,EAAE,aAAa;KAC7C,MAAM,gBAAgB,KAAK,MAAM,eAAe;KAChD,IAAI,kBAAkB,KAAA,GAAW,EAAE,gBAAgB;KACnD,MAAM,KAAK,KAAK,MAAM,IAAI;KAC1B,IAAI,OAAO,KAAA,GAAW,EAAE,UAAU;IACpC;IACA,SAAS,KAAK,CAAC;GACjB;GACA,IAAI,SAAS,SAAS,GAAG,OAAO,WAAW;EAC7C;EAGA,MAAM,OAAO,UAAU,IAAI,iBAAiB;EAC5C,IAAI,MAAM;GACR,MAAM,QAAiC,CAAC;GACxC,KAAK,MAAM,SAAS,KAAK,YAAY,CAAC,GAAG;IACvC,IAAI,MAAM,SAAS,kBAAkB;IACrC,MAAM,KAAK,QAAQ,OAAO,IAAI;IAC9B,MAAM,QAAQ,KAAK,OAAO,OAAO;IACjC,MAAM,aAAa,KAAK,OAAO,YAAY;IAC3C,MAAM,kBAAkB,KAAK,OAAO,iBAAiB;IACrD,IACE,OAAO,KAAA,KACP,UAAU,KAAA,KACV,eAAe,KAAA,KACf,oBAAoB,KAAA,GAEpB;IACF,MAAM,MAA6B;KACjC;KACA;KACY;KACZ;IACF;IACA,MAAM,YAAY,KAAK,OAAO,WAAW;IACzC,IAAI,cAAc,KAAA,GAAW,IAAI,YAAY;IAC7C,MAAM,eAAe,KAAK,OAAO,cAAc;IAC/C,IAAI,iBAAiB,KAAA,GAAW,IAAI,eAAe;IACnD,MAAM,QAAQ,KAAK,OAAO,OAAO;IACjC,IAAI,UAAU,KAAA,GAAW,IAAI,QAAQ;IACrC,IAAI,WAAW,KAAK,OAAO,eAAe,CAAC,GAAG,IAAI,gBAAgB;IAClE,MAAM,KAAK,GAAG;GAChB;GACA,IAAI,MAAM,SAAS,GAAG,OAAO,kBAAkB;EACjD;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,MAAM,KAAK,aAAa,MAAM;GACpC,IAAI,QAAQ,KAAA,GAAW;IACrB,MAAM,MAAwB,EAAE,IAAI;IACpC,KAAK,MAAM,OAAO,wBAAwB;KACxC,MAAM,IAAI,QAAQ,aAAa,GAAG;KAClC,IAAI,MAAM,KAAA,GAAW,IAAI,OAAO;IAClC;IACA,OAAO,YAAY;GACrB;EACF;EAGA,MAAM,WAAW,UAAU,IAAI,QAAQ;EACvC,IAAI,UAAU;GACZ,MAAM,QAAQ,UAAU,QAAQ;GAChC,IAAI,OAAO,OAAO,MAAM;EAC1B;EAEA,OAAO;CACT;AACF;;;;;;;;;;ACn8BA,MAAM,iBAA2B,CAAC;AAElC,SAAgB,eAAe,KAAqB;CAClD,MAAM,SAAS,eAAe;CAC9B,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,GAAG;EACZ,MAAM,aAAa,IAAI,KAAK;EAC5B,SAAS,OAAO,aAAa,KAAK,SAAS,IAAI;EAC/C,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE;CAC7B;CACA,eAAe,OAAO;CACtB,OAAO;AACT;;;;;AAMA,SAAgB,eAAe,SAAyB;CACtD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,MAAM,MAAM,MAAM,QAAQ,WAAW,CAAC,IAAI;CACnF,OAAO;AACT;;;;;AAMA,SAAgB,mBAAmB,MAAoB;CAIrD,MAAM,UAAU,KAAK,IAAI,MAAM,IAAI,EAAE;CACrC,QAAQ,KAAK,QAAQ,IAAI,WAAW;AACtC;;;;;AAMA,SAAgB,aAAa,UAA0B;CACrD,IAAI,OAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,IAAI,SAAS,WAAW,CAAC;EAC/B,QAAS,QAAQ,KAAM,MAAO,QAAQ,IAAK;EAC3C,QAAQ;EACR,OAAO,OAAO,QAAS,OAAO,IAAM;CACtC;CACA,QAAS,QAAQ,KAAM,MAAO,QAAQ,IAAK;CAC3C,QAAS,QAAQ,KAAM,MAAO,QAAQ,IAAK;CAC3C,QAAQ,SAAS;CACjB,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,GAAG,GAAG;AACxD;;;;ACmDA,MAAa,kBAAkB;CAC7B,SAAS;CACT,OAAO;CACP,SAAS;CACT,KAAK;CACL,eAAe;CACf,mBAAmB;CACnB,qBAAqB;CACrB,yBAAyB;CACzB,mBAAmB;CACnB,uBAAuB;CACvB,kBAAkB;CAClB,sBAAsB;CACtB,sBAAsB;CACtB,+BAA+B;CAC/B,mBAAmB;CACnB,4BAA4B;CAC5B,iBAAiB;CACjB,qBAAqB;CACrB,aAAa;CACb,iBAAiB;CACjB,oBAAoB;CACpB,6BAA6B;CAC7B,iBAAiB;CACjB,0BAA0B;CAC1B,eAAe;CACf,mBAAmB;CACnB,YAAY;CACZ,gBAAgB;CAChB,iBAAiB;CACjB,0BAA0B;CAC1B,iBAAiB;CACjB,0BAA0B;CAC1B,cAAc;CACd,kBAAkB;CAClB,UAAU;CACV,OAAO;CACP,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CACd,cAAc;CACd,WAAW;CACX,WAAW;CACX,WAAW;CACX,cAAc;CACd,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;AACP;;;;;AAgsBA,SAAgB,oBACd,SACA,UACmC;CACnC,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,SAA4C,CAAC;CACnD,KAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,IAAI;EAChB,MAAM,MAAM,eAAe,OAAO,IAAI,YAAY,IAAI,OAAO,GAAG;EAChE,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG;GAClB,KAAK,IAAI,GAAG;GACZ,OAAO,KAAK,OAAO,IAAI;EACzB;CACF;CACA,OAAO;AACT;;;;AAKA,SAAgB,eACd,SACA,UACS;CACT,KAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,IAAI;EAChB,IAAI,OAAO,QAAQ,YAAY,QAAQ,IAAI,OAAO;CACpD;CACA,OAAO;AACT;;;;AAKA,SAAgB,UAAU,QAAkB,MAAmC;CAC7E,IAAI,OAAO,WAAW,GAAG,OAAO;CAChC,QAAQ,MAAR;EACE,KAAK,OACH,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC;EACzC,KAAK;EACL,KAAK,aACH,OAAO,OAAO;EAChB,KAAK,WACH,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;EACpD,KAAK,OAIH,OAAO,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC;EAC/C,KAAK,OACH,OAAO,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC;EAC/C,KAAK,WACH,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC;EACzC,KAAK,OACH,OAAO,eAAe,MAAM;EAC9B,KAAK,QACH,OAAO,mBAAmB,MAAM;EAClC,KAAK,UACH,OAAO,KAAK,KAAK,eAAe,MAAM,CAAC;EACzC,KAAK,WACH,OAAO,KAAK,KAAK,mBAAmB,MAAM,CAAC;EAC7C,SACE,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC;CAC3C;AACF;AAEA,SAAS,mBAAmB,QAA0B;CACpD,MAAM,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;CACxD,OAAO,OAAO,QAAQ,KAAK,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC,IAAI,OAAO;AACtE;AAEA,SAAS,eAAe,QAA0B;CAChD,IAAI,OAAO,SAAS,GAAG,OAAO;CAC9B,MAAM,OAAO,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;CACxD,OAAO,OAAO,QAAQ,KAAK,MAAM,OAAO,IAAI,SAAS,GAAG,CAAC,KAAK,OAAO,SAAS;AAChF;;;;;;;;ACx6BA,SAAgB,oBACd,GACA,IACA,SACQ;CACR,MAAM,SAAS,GAAG;CAClB,MAAM,gBAAgB,EAAE;CACxB,MAAM,gBAAgB,EAAE,WAAW,CAAC;CACpC,MAAM,aAAa,EAAE;CACrB,MAAM,QAAQ,EAAE,SAAS;CACzB,MAAM,WAAW,EAAE,YAAY;CAC/B,MAAM,OAAO,EAAE,QAAQ;CAEvB,MAAM,kBAAkB,cAAc,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;CAClE,MAAM,kBAAkB,cAAc,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;CAClE,MAAM,mBAAmB,WAAW,KAAK,OAAO,OAAO,QAAQ,GAAG,KAAK,CAAC;CAExE,MAAM,oBADiB,EAAE,SAAS,CAAC,EAAA,CACK,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;CAEpE,MAAM,iBAAiB,iBACrB,GACA,IACA,iBACA,iBACA,kBACA,gBACF;CACA,MAAM,gBAAgB,gBAAgB,GAAG,gBAAgB;CACzD,MAAM,eAAe,eAAe,eAAe;CACnD,MAAM,cAAc,cAAc,IAAI,eAAe;CACrD,MAAM,eAAe,eAAe,eAAe;CACnD,MAAM,cAAc,cAAc,IAAI,iBAAiB,UAAU;CACjE,MAAM,gBAAgB,gBAAgB,YAAY,gBAAgB;CAElE,MAAM,cAAc,mBAClB,IACA,UACA,iBACA,iBACA,UACF;CAEA,MAAM,IAAc,CAAC;CACrB,MAAM,WAAqB;EACzB,SAAS,UAAU,IAAI,EAAE;EACzB,YAAY,QAAQ;EACpB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,IAAI,EAAE,YAAY,SAAS,KAAK,kBAAgB;CAChD,IAAI,EAAE,mBAAmB,SAAS,KAAK,sBAAsB,UAAU,EAAE,iBAAiB,EAAE,EAAE;CAC9F,IAAI,EAAE,cAAc,SAAS,KAAK,iBAAiB,UAAU,EAAE,YAAY,EAAE,EAAE;CAC/E,IAAI,EAAE,WAAW,SAAS,KAAK,iBAAe;CAC9C,IAAI,EAAE,gBAAgB,SAAS,KAAK,mBAAmB,UAAU,EAAE,cAAc,EAAE,EAAE;CACrF,IAAI,EAAE,gBAAgB,OAAO,SAAS,KAAK,mBAAiB;CAC5D,IAAI,EAAE,WAAW,SAAS,KAAK,cAAc,UAAU,EAAE,SAAS,EAAE,EAAE;CACtE,IAAI,EAAE,iBAAiB,SAAS,KAAK,oBAAoB,UAAU,EAAE,eAAe,EAAE,EAAE;CACxF,IAAI,EAAE,KAAK,SAAS,KAAK,QAAQ,UAAU,EAAE,GAAG,EAAE,EAAE;CACpD,IAAI,EAAE,cAAc,OAAO,SAAS,KAAK,iBAAe;CACxD,IAAI,EAAE,UAAU,SAAS,KAAK,gBAAc;CAC5C,IAAI,EAAE,kBAAkB,SAAS,KAAK,wBAAsB;CAC5D,IAAI,EAAE,iBAAiB,OAAO,SAAS,KAAK,oBAAkB;CAC9D,IAAI,EAAE,cAAc,SAAS,KAAK,oBAAkB;CACpD,IAAI,EAAE,sBAAsB,OAAO,SAAS,KAAK,yBAAuB;CACxE,IAAI,EAAE,qBAAqB,OAAO,SAAS,KAAK,wBAAsB;CACtE,IAAI,EAAE,cAAc,OAAO,SAAS,KAAK,iBAAe;CACxD,IAAI,EAAE,YAAY,SAAS,KAAK,kBAAgB;CAChD,IAAI,EAAE,wBAAwB,SAAS,KAAK,8BAA4B;CACxE,IAAI,EAAE,iBAAiB,OAAO,SAAS,KAAK,oBAAkB;CAC9D,IAAI,EAAE,iBAAiB,OAAO,SAAS,KAAK,oBAAkB;CAC9D,IAAI,EAAE,gBAAgB,OAAO,SAAS,KAAK,mBAAiB;CAC5D,IAAI,EAAE,0BAA0B,OAAO,SAAS,KAAK,6BAA2B;CAChF,IAAI,EAAE,aAAa,KAAA,GAAW,SAAS,KAAK,aAAa,EAAE,SAAS,EAAE;CACtE,IAAI,EAAE,kBAAkB,SAAS,KAAK,wBAAsB;CAC5D,IAAI,EAAE,qBAAqB,SAAS,KAAK,2BAAyB;CAClE,IAAI,EAAE,kBAAkB,SAAS,KAAK,wBAAsB;CAC5D,IAAI,EAAE,WAAW,SAAS,KAAK,iBAAe;CAC9C,IAAI,EAAE,kBAAkB,OAAO,SAAS,KAAK,qBAAmB;CAChE,IAAI,EAAE,cAAc,SAAS,KAAK,oBAAkB;CACpD,IAAI,EAAE,cAAc,SAAS,KAAK,oBAAkB;CACpD,IAAI,EAAE,gBAAgB,OAAO,SAAS,KAAK,mBAAiB;CAC5D,IAAI,EAAE,WAAW,SAAS,KAAK,iBAAe;CAC9C,IAAI,EAAE,kBAAkB,OAAO,SAAS,KAAK,qBAAmB;CAChE,IAAI,EAAE,yBAAyB,OAAO,SAAS,KAAK,4BAA0B;CAC9E,IAAI,EAAE,kBAAkB,SAAS,KAAK,qBAAqB,UAAU,EAAE,gBAAgB,EAAE,EAAE;CAC3F,IAAI,EAAE,kBAAkB,SAAS,KAAK,qBAAqB,UAAU,EAAE,gBAAgB,EAAE,EAAE;CAC3F,IAAI,EAAE,wBAAwB,SAAS,KAAK,8BAA4B;CACxE,IAAI,EAAE,eAAe,SAAS,KAAK,qBAAmB;CACtD,IAAI,EAAE,mBAAmB,OAAO,SAAS,KAAK,sBAAoB;CAClE,IAAI,EAAE,gBAAgB,SAAS,KAAK,sBAAoB;CACxD,IAAI,EAAE,iBAAiB,KAAA,GAAW,SAAS,KAAK,iBAAiB,EAAE,aAAa,EAAE;CAClF,IAAI,EAAE,WAAW,SAAS,KAAK,iBAAe;CAC9C,IAAI,EAAE,cAAc,SAAS,KAAK,iBAAiB,UAAU,EAAE,YAAY,EAAE,EAAE;CAC/E,IAAI,EAAE,aAAa,SAAS,KAAK,mBAAiB;CAClD,IAAI,EAAE,uBAAuB,OAAO,SAAS,KAAK,0BAAwB;CAE1E,EAAE,KACA,2FAA2F,SAAS,KAAK,GAAG,EAAE,EAChH;CAGA,MAAM,WAAqB;EACzB,QAAQ,UAAU,WAAW,EAAE;EAC/B;EACA,iBAAiB,gBAAgB,SAAS,EAAE;EAC5C,iBAAiB,gBAAgB,OAAO;CAC1C;CACA,IAAI,EAAE,yBAAyB,KAAA,GAC7B,SAAS,KAAK,iBAAiB,EAAE,qBAAqB,EAAE;CAC1D,IAAI,EAAE,yBAAyB,KAAA,GAC7B,SAAS,KAAK,iBAAiB,EAAE,qBAAqB,EAAE;CAC1D,EAAE,KAAK,aAAa,SAAS,KAAK,GAAG,EAAE,GAAG;CAE1C,EAAE,KAAK,cAAc;CACrB,EAAE,KAAK,YAAY;CACnB,EAAE,KAAK,WAAW;CAClB,IAAI,gBAAgB,SAAS,GAAG,EAAE,KAAK,YAAY;CACnD,EAAE,KAAK,WAAW;CAClB,IAAI,iBAAiB,SAAS,GAAG,EAAE,KAAK,aAAa;CACrD,IAAI,WAAW,SAAS,GAAG,EAAE,KAAK,aAAa;CAG/C,IAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,GAAG;EACrC,MAAM,WAAqB,CAAC,mBAAmB,EAAE,QAAQ,OAAO,GAAG;EACnE,KAAK,MAAM,OAAO,EAAE,SAAS;GAC3B,MAAM,WAAqB,CAAC;GAC5B,IAAI,IAAI,UAAU,IAAI,WAAW,cAAc,SAAS,KAAK,WAAW,IAAI,OAAO,EAAE;GACrF,IAAI,IAAI,UAAU,KAAA,GAAW,SAAS,KAAK,UAAU,IAAI,MAAM,EAAE;GACjE,SAAS,KACP,UAAU,SAAS,SAAS,MAAM,SAAS,KAAK,GAAG,IAAI,GAAG,GAAG,kBAAkB,IAAI,SAAS,EAAE,UAChG;EACF;EACA,SAAS,KAAK,YAAY;EAC1B,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;CAC1B;CAGA,IAAI,EAAE,2BAA2B,EAAE,wBAAwB,SAAS,GAAG;EACrE,MAAM,UAAoB,CAAC,8BAA8B,EAAE,wBAAwB,OAAO,GAAG;EAC7F,KAAK,MAAM,MAAM,EAAE,yBAAyB;GAC1C,MAAM,UAAoB,CAAC,aAAa,GAAG,SAAS,EAAE;GACtD,IAAI,GAAG,SAAS,GAAG,UAAU,aAAa,QAAQ,KAAK,UAAU,GAAG,MAAM,EAAE;GAC5E,IAAI,GAAG,QAAQ,GAAG,SAAS,QAAQ,QAAQ,KAAK,SAAS,GAAG,KAAK,EAAE;GACnE,MAAM,WAAW,GAAG,YAAY,SAC5B,sBAAsB,GAAG,WAAW,OAAO,IAAI,GAAG,WAAW,KAAK,MAAM,kBAAkB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,iBACvG;GACJ,QAAQ,KAAK,sBAAsB,QAAQ,KAAK,GAAG,EAAE,GAAG,SAAS,qBAAqB;EACxF;EACA,QAAQ,KAAK,uBAAuB;EACpC,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,EAAE,gBAAgB,EAAE,aAAa,SAAS,GAAG;EAC/C,MAAM,UAAoB,CAAC,wBAAwB,EAAE,aAAa,OAAO,GAAG;EAC5E,KAAK,MAAM,MAAM,EAAE,cAAc;GAC/B,MAAM,UAAoB,CAAC,UAAU,GAAG,MAAM,IAAI,WAAW,GAAG,OAAO,EAAE;GACzE,IAAI,GAAG,QAAQ,QAAQ,KAAK,cAAY;GACxC,MAAM,UAAU,GAAG,YAAY,kBAAkB,GAAG,SAAS,IAAI;GACjE,QAAQ,KAAK,gBAAgB,QAAQ,KAAK,GAAG,EAAE,GAAG,QAAQ,eAAe;EAC3E;EACA,QAAQ,KAAK,iBAAiB;EAC9B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,EAAE,oBAAoB,EAAE,iBAAiB,SAAS,GACpD,EAAE,KAAK,sBAAsB,EAAE,gBAAgB,CAAC;CAIlD,EAAE,KACA,8BAA8B,UAAU,KAAK,EAAE,mGACjD;CAGA,IAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,GAAG;EACrC,MAAM,SAAmB,CAAC,mBAAmB,EAAE,QAAQ,OAAO,GAAG;EACjE,KAAK,MAAM,KAAK,EAAE,SAAS;GACzB,MAAM,SAAgE;IACpE,KAAK,EAAE;IACP,MAAM,EAAE;IACR,IAAI,EAAE;GACR;GACA,IAAI,EAAE,UAAU,KAAA,GAAW,OAAO,QAAQ,EAAE;GAC5C,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,YAAY,EAAE;GACpD,IAAI,EAAE,iBAAiB,KAAA,GAAW,OAAO,eAAe,EAAE;GAC1D,IAAI,EAAE,gBAAgB,KAAA,GAAW,OAAO,cAAc,EAAE;GACxD,IAAI,EAAE,MAAM,OAAO,OAAO,EAAE;GAC5B,IAAI,EAAE,aAAa,OAAO,cAAc,EAAE;GAC1C,IAAI,EAAE,cAAc,OAAO,eAAe,EAAE;GAC5C,IAAI,EAAE,cAAc,OAAO,eAAe,EAAE;GAC5C,OAAO,KAAK,UAAU,MAAM,MAAM,EAAE,oCAAoC;EAC1E;EACA,OAAO,KAAK,YAAY;EACxB,EAAE,KAAK,OAAO,KAAK,EAAE,CAAC;CACxB;CAGA,IAAI,EAAE,uBAAuB,EAAE,oBAAoB,SAAS,GAAG;EAC7D,MAAM,MAAM,EAAE;EACd,EAAE,KACA,+BAA+B,IAAI,OAAO,IAAI,IAAI,KAAK,MAAM,sCAAsC,EAAE,eAAe,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,uBACrI;CACF;CAGA,IAAI,EAAE,uBAAuB,EAAE,oBAAoB,SAAS,GAAG;EAC7D,MAAM,MAAM,EAAE;EACd,EAAE,KACA,+BAA+B,IAAI,OAAO,IAAI,IAAI,KAAK,MAAM,sCAAsC,EAAE,eAAe,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,uBACrI;CACF;CAEA,EAAE,KAAK,yBAAyB;CAChC,OAAO,EAAE,KAAK,EAAE;AAClB;AAIA,SAAS,wBAAwB,IAAuC;CACtE,MAAM,IAAc,CAAC;CACrB,IAAI,GAAG,YAAY,EAAE,KAAK,kBAAgB;CAC1C,IAAI,GAAG,UAAU,EAAE,KAAK,gBAAc;CACtC,IAAI,GAAG,eAAe,EAAE,KAAK,qBAAmB;CAChD,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,gBAAgB,EAAE,KAAK,sBAAoB;CAClD,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,gBAAgB,EAAE,KAAK,sBAAoB;CAClD,IAAI,GAAG,4BAA4B,EAAE,KAAK,kCAAgC;CAC1E,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,cAAc,EAAE,KAAK,oBAAkB;CAC9C,IAAI,GAAG,gBAAgB,EAAE,KAAK,sBAAoB;CAClD,IAAI,GAAG,iBAAiB,EAAE,KAAK,uBAAqB;CACpD,IAAI,GAAG,eAAe,EAAE,KAAK,qBAAmB;CAChD,IAAI,GAAG,eAAe,EAAE,KAAK,qBAAmB;CAChD,IAAI,GAAG,oBAAoB,EAAE,KAAK,0BAAwB;CAC1D,IAAI,GAAG,iBAAiB,EAAE,KAAK,uBAAqB;CACpD,IAAI,GAAG,WAAW,KAAA,GAAW,EAAE,KAAK,WAAW,GAAG,OAAO,EAAE;CAC3D,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,eAAe,EAAE,KAAK,qBAAmB;CAChD,IAAI,GAAG,mBAAmB,EAAE,KAAK,yBAAuB;CACxD,IAAI,GAAG,cAAc,EAAE,KAAK,oBAAkB;CAC9C,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,iBAAiB,EAAE,KAAK,uBAAqB;CACpD,IAAI,GAAG,gBAAgB,EAAE,KAAK,sBAAoB;CAClD,IAAI,GAAG,iBAAiB,EAAE,KAAK,oBAAoB,UAAU,GAAG,eAAe,EAAE,EAAE;CACnF,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,IAAI,GAAG,sBAAsB,EAAE,KAAK,4BAA0B;CAC9D,IAAI,GAAG,cAAc,EAAE,KAAK,oBAAkB;CAC9C,IAAI,GAAG,aAAa,EAAE,KAAK,mBAAiB;CAC5C,OAAO,EAAE,KAAK,GAAG;AACnB;AAEA,SAAS,iBACP,GACA,IACA,YACA,YACA,aACA,aACQ;CACR,MAAM,aAAa,GAAG;CACtB,MAAM,QAAkB,CAAC,uBAAuB,WAAW,OAAO,GAAG;CAErE,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,QAAQ,WAAW,SAAS,CAAC;EACnC,MAAM,QAAQ,WAAW,SAAS,CAAC;EACnC,MAAM,SAAS,YAAY,SAAS,CAAC;EACrC,MAAM,SAAS,YAAY,SAAS,CAAC;EACrC,MAAM,WAAW,EAAE,gBAAgB,MAAM,OAAO,GAAG,UAAU,WAAW,EAAE;EAC1E,MAAM,aAAa,WAAW,wBAAwB,QAAQ,IAAI;EAElE,IAAI,QAAQ;GACV,MAAM,eAAe,YAAY,QAAQ,CAAC;GAC1C,MAAM,KAAK,EAAE,KAAK;GAClB,MAAM,UAAoB,CAAC,mBAAiB,eAAa;GACzD,IAAI,YAAY,QAAQ,KAAK,UAAU;GACvC,IAAI,IAAI,YAAY,QAAQ,KAAK,eAAe,GAAG,WAAW,EAAE;GAChE,IAAI,IAAI,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;GAC3E,IAAI,IAAI,aAAa,KAAA,GAAW,QAAQ,KAAK,aAAa,GAAG,SAAS,EAAE;GACxE,IAAI,EAAE,eACJ,MAAM,KACJ,eAAe,QAAQ,KAAK,GAAG,EAAE,kBAAkB,kBAAkB,EAAE,aAAa,EAAE,8BACxF;QAEA,MAAM,KAAK,eAAe,QAAQ,KAAK,GAAG,EAAE,GAAG;EAEnD,OAAO,IAAI,OAAO;GAChB,MAAM,aAAa,oBAAoB,GAAG,SAAS,CAAC;GACpD,MAAM,SAAS,aACX,+BAA+B,eAC/B;GACJ,MAAM,KAAK,cAAc,OAAO,EAAE;GAClC,MAAM,KAAK,iBAAiB,WAAW,SAAS,EAAE,GAAG;GACrD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,MAAM,KAAK,YAAY,EAAE,IAAI;GACzE,MAAM,KAAK,oBAAoB,UAAU,kBAAkB,QAAQ,cAAY,GAAG,GAAG;GACrF,MAAM,KAAK,uBAAuB;EACpC,OAAO,IAAI,OAAO;GAChB,MAAM,aAAa,oBAAoB,GAAG,SAAS,CAAC;GACpD,MAAM,SAAS,aACX,+BAA+B,eAC/B;GACJ,MAAM,KAAK,cAAc,OAAO,EAAE;GAClC,MAAM,KAAK,iBAAiB,WAAW,SAAS,EAAE,GAAG;GACrD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,MAAM,KAAK,YAAY,EAAE,IAAI;GACzE,MAAM,KAAK,oBAAoB,UAAU,kBAAkB,QAAQ,cAAY,GAAG,GAAG;GACrF,MAAM,KAAK,uBAAuB;EACpC,OAAO,IAAI,QAAQ;GACjB,MAAM,aAAa,oBAAoB,GAAG,SAAS,CAAC;GACpD,MAAM,SAAS,aACX,gCAAgC,eAChC;GACJ,MAAM,KAAK,cAAc,OAAO,EAAE;GAClC,MAAM,KAAK,iBAAiB,WAAW,SAAS,EAAE,GAAG;GACrD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK,MAAM,KAAK,YAAY,EAAE,IAAI;GACzE,MAAM,KAAK,oBAAoB,UAAU,kBAAkB,QAAQ,cAAY,GAAG,GAAG;GACrF,MAAM,KAAK,uBAAuB;EACpC,OAAO;GACL,MAAM,SAAS,aAAa,gBAAgB,eAAe;GAC3D,MAAM,KAAK,cAAc,OAAO,GAAG;EACrC;CACF;CAEA,MAAM,KAAK,gBAAgB;CAC3B,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,gBAAgB,GAAsB,aAA+B;CAC5E,IAAI,YAAY,WAAW,GAAG,OAAO;CACrC,MAAM,QAAkB,CAAC,sBAAsB,YAAY,OAAO,GAAG;CACrE,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,MAAM,EAAE,eAAe;EAC7B,MAAM,UAAU,MAAM,SAAS,UAAU,GAAG,EAAE,KAAK;EACnD,MAAM,OAAO,EAAE,iBAAiB;EAChC,MAAM,WAAW,SAAS,KAAA,IAAY,UAAU,KAAK,KAAK;EAC1D,MAAM,KAAK,mBAAmB,YAAY,GAAG,UAAU,EAAE,GAAG,UAAU,SAAS,GAAG;CACpF;CACA,MAAM,KAAK,eAAe;CAC1B,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,eAAe,YAA8B;CACpD,IAAI,WAAW,WAAW,GAAG,OAAO;CACpC,MAAM,QAAkB,CAAC,qBAAqB,WAAW,OAAO,GAAG;CACnE,KAAK,MAAM,OAAO,YAAY,MAAM,KAAK,aAAa,IAAI,IAAI;CAC9D,MAAM,KAAK,cAAc;CACzB,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,cAAc,IAAqB,YAA8B;CACxE,IAAI,WAAW,WAAW,GAAG,OAAO;CAEpC,MAAM,kBAA4B,CAAC;CACnC,KAAK,MAAM,OAAO,YAChB,gBAAgB,KAAK,oBAAoB,GAAG,SAAS,GAAG,CAAC,CAAC,MAAM;CAGlE,IAAI,WAAW,WAAW,GAAG;EAC3B,MAAM,QAAQ,gBAAgB,MAAM;EACpC,MAAM,QAAkB,CAAC,oBAAoB,QAAQ,EAAE,GAAG;EAC1D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,MAAM,KAAK,YAAY,EAAE,QAAQ;EACjE,MAAM,KAAK,uBAAuB;EAClC,MAAM,KAAK,aAAa;EACxB,OAAO,MAAM,KAAK,EAAE;CACtB;CAEA,MAAM,SAAS,kBAAkB,eAAe;CAChD,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,SAAS,QAClB,SAAS,KAAK,MAAM,MAAM,KAAK,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK;CAEtE,SAAS,KAAK,gBAAgB,WAAW,UAAU,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK;CACzE,OAAO,oBAAoB,SAAS,OAAO,IAAI,SAAS,KAAK,EAAE,EAAE;AACnE;AAEA,SAAS,eAAe,YAA8B;CACpD,IAAI,WAAW,WAAW,GAAG,OAAO;CACpC,MAAM,QAAkB,CAAC,qBAAqB,WAAW,OAAO,GAAG;CACnE,KAAK,MAAM,OAAO,YAAY,MAAM,KAAK,aAAa,IAAI,IAAI;CAC9D,MAAM,KAAK,cAAc;CACzB,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,cACP,IACA,YACA,YACQ;CACR,IAAI,WAAW,SAAS,GAAG;EACzB,MAAM,kBAA4B,CAAC;EACnC,KAAK,MAAM,OAAO,YAChB,gBAAgB,KAAK,oBAAoB,GAAG,SAAS,GAAG,CAAC,CAAC,MAAM;EAElE,MAAM,SAAS,kBAAkB,eAAe;EAChD,MAAM,QAAkB,CAAC;EACzB,KAAK,MAAM,SAAS,QAClB,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK;EAEnE,MAAM,KAAK,gBAAgB,WAAW,UAAU,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK;EACtE,OAAO,oBAAoB,MAAM,OAAO,IAAI,MAAM,KAAK,EAAE,EAAE;CAC7D;CACA,IAAI,WAAW,SAAS,GAAG;EACzB,MAAM,QAAQ,WAAW,KAAK,GAAG,MAAM,YAAY,EAAE,QAAQ;EAC7D,OAAO,oBAAoB,MAAM,OAAO,IAAI,MAAM,KAAK,EAAE,EAAE;CAC7D;CACA,OAAO;AACT;AAEA,SAAS,gBAAgB,YAA8B,kBAAoC;CACzF,IAAI,WAAW,WAAW,GAAG,OAAO;CACpC,MAAM,QAAkB,CAAC,sBAAsB,WAAW,OAAO,GAAG;CACpE,KAAK,MAAM,CAAC,GAAG,OAAO,WAAW,QAAQ,GAAG;EAC1C,MAAM,WAAW,GAAG,aAAa;EAEjC,MAAM,UAAoB;GACxB,SAAS,UAFE,GAAG,QAAQ,GAAG,aAAa,QAAQ,QAAQ,SAAS,MAAM,GAAG,OAEjD,EAAE;GACzB,QAAQ,iBAAiB,MAAM,EAAE;GACjC,aAAa,SAAS;EACxB;EACA,IAAI,GAAG,YAAY,QAAQ,KAAK,eAAe,GAAG,WAAW,EAAE;EAC/D,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;EAC1E,IAAI,GAAG,aAAa,KAAA,GAAW,QAAQ,KAAK,aAAa,GAAG,SAAS,EAAE;EACvE,MAAM,KAAK,cAAc,QAAQ,KAAK,GAAG,EAAE,GAAG;CAChD;CACA,MAAM,KAAK,eAAe;CAC1B,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,mBACP,IACA,UACA,iBACA,iBACA,YACQ;CAER,MAAM,SADY,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,SAAA,CACpB,MAAM,iBAAiB;CAC/C,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,WAAW,MAAM,MAAM;CAC7B,MAAM,WAAW,SAAS,MAAM,MAAM,KAAK,EAAE;CAE7C,IAAI,WAAW;CACf,MAAM,iBAAiB,gBAAgB;CACvC,IAAI,mBAAmB,KAAA,GACrB,YAAY,oBAAoB,GAAG,SAAS,cAAc,CAAC,CAAC;CAE9D,YAAY;CAEZ,IAAI,WAAW,KAAK,IAAI,gBAAgB,QAAQ,CAAC;CACjD,MAAM,iBAAiB,gBAAgB;CACvC,IAAI,mBAAmB,KAAA,GACrB,YAAY,oBAAoB,GAAG,SAAS,cAAc,CAAC,CAAC;MACvD,IAAI,WAAW,SAAS,GAC7B,YAAY,WAAW,SAAS;CAElC,YAAY;CAIZ,OAAO,GAAG,WAAW,SAAS,GAFf,eAAe,eAAe,QAAQ,IAAI,WAAW,CAE9B,IADvB,WAAW,WAAW;AAEvC;AAEA,SAAS,sBAAsB,aAA8C;CAC3E,MAAM,QAAkB,CAAC,4BAA4B,YAAY,OAAO,GAAG;CAC3E,KAAK,MAAM,KAAK,aAAa;EAC3B,MAAM,SAAmB,CAAC;EAC1B,IAAI,EAAE,SAAS,OAAO,KAAK,eAAa;EACxC,IAAI,EAAE,8BAA8B,OAAO,KAAK,oCAAkC;EAClF,IAAI,EAAE,aAAa,OAAO,KAAK,mBAAiB;EAChD,IAAI,EAAE,oBAAoB,OAAO,OAAO,KAAK,uBAAqB;EAClE,IAAI,EAAE,cAAc,OAAO,OAAO,KAAK,iBAAe;EACtD,IAAI,EAAE,cAAc,OAAO,OAAO,KAAK,iBAAe;EACtD,IAAI,EAAE,eAAe,OAAO,OAAO,KAAK,kBAAgB;EACxD,IAAI,EAAE,YAAY,OAAO,KAAK,kBAAgB;EAC9C,IAAI,EAAE,YAAY,OAAO,OAAO,KAAK,eAAa;EAClD,IAAI,EAAE,yBAAyB,OAAO,KAAK,+BAA6B;EACxE,IAAI,EAAE,SAAS,OAAO,KAAK,YAAY,UAAU,EAAE,OAAO,EAAE,EAAE;EAC9D,MAAM,SACH,EAAE,mBACC,eAAe,EAAE,iBAAiB,OAAO,IAAI,EAAE,iBAC5C,KAAK,OAAO;GACX,MAAM,UAAoB,CAAC,UAAU,GAAG,MAAM,EAAE;GAChD,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;GACtE,IAAI,GAAG,UAAU,QAAQ,KAAK,gBAAc;GAC5C,IAAI,GAAG,SAAS,QAAQ,KAAK,eAAa;GAC1C,IAAI,GAAG,eAAe,QAAQ,KAAK,qBAAmB;GACtD,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;GACpE,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,SAAS,GAAG,KAAK,EAAE;GAC3D,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,SAAS,GAAG,KAAK,EAAE;GAC3D,OAAO,OAAO,QAAQ,KAAK,GAAG,EAAE;EAClC,CAAC,CAAC,CACD,KAAK,EAAE,EAAE,UACZ,OACH,EAAE,UACC,mBAAmB,EAAE,QAAQ,OAAO,IAAI,EAAE,QAAQ,KAAK,MAAM,iBAAiB,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,KAAA,IAAY,WAAW,EAAE,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,cACpK;EACN,IAAI,OACF,MAAM,KAAK,mBAAmB,OAAO,KAAK,GAAG,EAAE,GAAG,MAAM,kBAAkB;OAE1E,MAAM,KAAK,mBAAmB,OAAO,KAAK,GAAG,EAAE,GAAG;CAEtD;CACA,MAAM,KAAK,qBAAqB;CAChC,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAgB,kBAAkB,MAAgC;CAChE,MAAM,SAAmB,CAAC;CAC1B,IAAI,KAAK,UAAU,KAAA,GAAW,OAAO,KAAK,UAAU,KAAK,MAAM,EAAE;CACjE,IAAI,KAAK,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,EAAE;CAChD,IAAI,KAAK,aAAa,OAAO,OAAO,KAAK,gBAAc;CACvD,IAAI,KAAK,WAAW,OAAO,KAAK,iBAAe;CAC/C,IAAI,KAAK,UAAU,OAAO,KAAK,gBAAc;CAC7C,IAAI,KAAK,UAAU,OAAO,KAAK,gBAAc;CAC7C,IAAI,KAAK,YAAY,OAAO,KAAK,kBAAgB;CACjD,IAAI,KAAK,YAAY,OAAO,OAAO,KAAK,eAAa;CACrD,IAAI,KAAK,QAAQ,OAAO,KAAK,WAAW,UAAU,KAAK,MAAM,EAAE,EAAE;CACjE,IAAI,KAAK,6BAA6B,OAAO,KAAK,mCAAiC;CACnF,IAAI,KAAK,MAAM,OAAO,KAAK,SAAS,KAAK,KAAK,EAAE;CAChD,IAAI,KAAK,kBAAkB,KAAA,GAAW,OAAO,KAAK,kBAAkB,KAAK,cAAc,EAAE;CACzF,MAAM,UAAU,KAAK,aAAa,yBAAyB,KAAK,UAAU,IAAI;CAC9E,IAAI,SAAS,OAAO,cAAc,OAAO,KAAK,GAAG,EAAE,GAAG,QAAQ;CAC9D,OAAO,cAAc,OAAO,KAAK,GAAG,EAAE;AACxC;AAEA,SAAS,yBAAyB,MAA2C;CAC3E,MAAM,QAAkB,CAAC,sBAAsB,KAAK,OAAO,GAAG;CAC9D,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAmB,CAAC;EAC1B,IAAI,IAAI,UAAU,KAAA,GAAW,OAAO,KAAK,UAAU,IAAI,MAAM,EAAE;EAC/D,IAAI,IAAI,UAAU,KAAA,GAAW,OAAO,KAAK,UAAU,IAAI,MAAM,EAAE;EAC/D,IAAI,IAAI,aAAa,OAAO,OAAO,KAAK,gBAAc;EACtD,IAAI,IAAI,YAAY,OAAO,KAAK,kBAAgB;EAChD,IAAI,IAAI,UAAU,OAAO,KAAK,gBAAc;EAC5C,IAAI,IAAI,iBAAiB,OAAO,KAAK,uBAAqB;EAC1D,IAAI,IAAI,aAAa,OAAO,KAAK,mBAAiB;EAClD,IAAI,IAAI,aAAa,OAAO,KAAK,mBAAiB;EAClD,IAAI,IAAI,gBAAgB,OAAO,KAAK,sBAAoB;EACxD,IAAI,IAAI,aAAa,OAAO,KAAK,mBAAiB;EAClD,IAAI,IAAI,aAAa,OAAO,KAAK,mBAAiB;EAClD,MAAM,OAAO,IAAI,IAAI,IAAI,EAAE,KAAK,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI;EAClE,IAAI,MACF,MAAM,KAAK,cAAc,OAAO,KAAK,GAAG,EAAE,GAAG,KAAK,aAAa;OAE/D,MAAM,KAAK,cAAc,OAAO,KAAK,GAAG,EAAE,GAAG;CAEjD;CACA,MAAM,KAAK,eAAe;CAC1B,OAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,kBAAkB,QAA8B;CACvD,IAAI,OAAO,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC;CACnC,IAAI,SAAqB,CAAC,CAAC,CAAC;CAC5B,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,OAAmB,CAAC;EAC1B,KAAK,MAAM,UAAU,QACnB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,KAAK,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;EAE1D,SAAS;CACX;CACA,OAAO;AACT;;;;ACrdA,MAAa,cAAc;CACzB,QAAQ;CACR,OAAO;CACP,QAAQ;AACV;;;;;;;;;;;;;;;;;ACxGA,SAAgB,mBAAmB,MAAwB,KAA+B;CACxF,MAAM,gBAAgB,IAAI;CAC1B,MAAM,SAAS,IAAI;CAEnB,MAAM,OAAO,KAAK,QAAQ,CAAC;CAC3B,MAAM,UAAU,KAAK,WAAW,CAAC;CACjC,MAAM,aAAa,KAAK,cAAc,CAAC;CACvC,MAAM,kBAAkB,KAAK,mBAAmB,CAAC;CACjD,MAAM,gBAAgB,KAAK,iBAAiB,CAAC;CAC7C,MAAM,YAAY,KAAK,aAAa,CAAC;CACrC,MAAM,YAAY,KAAK,aAAa,CAAC;CACrC,MAAM,mBAAmB,KAAK,oBAAoB,CAAC;CACnD,MAAM,cAAc,KAAK,eAAe,CAAC;CACzC,MAAM,WAAW,KAAK,YAAY,CAAC;CACnC,MAAM,mBAAmB,KAAK,oBAAoB,CAAC;CACnD,MAAM,aAAa,KAAK,cAAc,CAAC;CACvC,MAAM,kBAAkB,KAAK,mBAAmB,CAAC;CAEjD,MAAM,IAAc,CAClB,mkBAQF;CAGA,MAAM,cAAc,CAAC,CAAC,KAAK;CAC3B,MAAM,aAAa,QAAQ,MAAM,MAAM,EAAE,iBAAiB,KAAA,CAAS;CACnE,MAAM,KAAK,KAAK;CAChB,MAAM,kBACJ,OACC,GAAG,kBACF,GAAG,gBACH,GAAG,WACH,GAAG,wBACH,GAAG,mBACH,GAAG,aACH,GAAG,cACH,GAAG;CACP,MAAM,iBACJ,CAAC,CAAC,KAAK,WAAW,cAClB,CAAC,CAAC,KAAK,WAAW,eAClB,CAAC,CAAC,KAAK,WAAW;CACpB,IAAI,eAAe,cAAc,mBAAmB,gBAAgB;EAClE,MAAM,UAAoB,CAAC;EAC3B,MAAM,UAAiE,CAAC;EACxE,IAAI,IAAI,gBAAgB,QAAQ,iBAAiB;EACjD,IAAI,IAAI,cAAc,QAAQ,eAAe;EAC7C,IAAI,IAAI,SAAS,QAAQ,UAAU,GAAG;EACtC,IAAI,IAAI,sBAAsB,QAAQ,uBAAuB;EAC7D,IAAI,IAAI,iBAAiB,QAAQ,kBAAkB;EACnD,IAAI,IAAI,WAAW,QAAQ,YAAY;EACvC,IAAI,IAAI,YAAY,QAAQ,aAAa;EACzC,IAAI,IAAI,mCAAmC,QAAQ,oCAAoC;EACvF,IAAI,KAAK,UAAU;GACjB,MAAM,KAAK,KAAK;GAChB,MAAM,UAAiE,CAAC;GACxE,IAAI,GAAG,KAAK,QAAQ,MAAM,GAAG;GAC7B,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,QAAQ,GAAG;GAC/C,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,OAAO,GAAG;GAC7C,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,UAAU,GAAG;GACnD,QAAQ,KAAK,YAAY,MAAM,OAAO,EAAE,GAAG;EAC7C;EACA,IAAI,YAAY;GACd,MAAM,WAAkE;IACtE,cAAc;IACd,cAAc;GAChB;GACA,IAAI,IAAI,wBAAwB,OAAO,SAAS,eAAe;GAC/D,IAAI,IAAI,wBAAwB,OAAO,SAAS,eAAe;GAC/D,IAAI,IAAI,oBAAoB,SAAS,cAAc;GACnD,IAAI,IAAI,uBAAuB,OAAO,SAAS,qBAAqB;GACpE,QAAQ,KAAK,aAAa,MAAM,QAAQ,EAAE,GAAG;EAC/C;EAEA,IACE,KAAK,WAAW,cAChB,KAAK,WAAW,eAChB,KAAK,WAAW,gBAChB;GACA,MAAM,YAAmE,CAAC;GAC1E,IAAI,KAAK,WAAW,cAAc,KAAK,WAAW,aAAa,UAAU,YAAY;GACrF,IAAI,KAAK,WAAW,gBAAgB,UAAU,iBAAiB;GAC/D,QAAQ,KAAK,eAAe,MAAM,SAAS,EAAE,GAAG;EAClD;EACA,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,MAAM,OAAO,IAAI;EACrE,EAAE,KAAK,WAAW,UAAU,GAAG,QAAQ,KAAK,EAAE,EAAE,WAAW;CAC7D;CAGA,MAAM,SAAS,KAAK;CACpB,IAAI,SAAS;CACb,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,SAAS,IAAI,MAAM,SAAS,QAAQ,SAAS,IAAI,MAAM;CAEjE,IAAI,KAAK,WACP,EAAE,KAAK,mBAAmB,KAAK,UAAU,IAAI;MACxC,IAAI,SAAS,KAAK,SAAS,GAAG;EACnC,MAAM,SAAS,MAAM,eAAe,QAAQ,MAAM;EAClD,EAAE,KAAK,mBAAmB,OAAO,IAAI;CACvC;CAGA,IAAI,KAAK,aAAa;EACpB,MAAM,KAAK,KAAK;EAChB,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM;EACjC,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM;EAGjC,MAAM,cAAc,eAFL,GAAG,MAAM,GAAG,MAAM,IAAI,GACrB,GAAG,MAAM,GAAG,MAAM,IAAI,CACY;EAClD,MAAM,aACJ,SAAS,KAAK,SAAS,IAAI,gBAAgB,SAAS,IAAI,eAAe;EACzE,MAAM,UAAU,oBAAoB,KAAK,SAAS;EAClD,EAAE,KACA,yBAAyB,QAAQ,IACjC,iBAAiB,OAAO,YAAY,OAAO,iBAAiB,YAAY,gBAAgB,WAAW,qBACnG,KAAK,YAAY,kBAAkB,KAAK,SAAS,IAAI,IACrD,KAAK,iBAAiB,uBAAuB,KAAK,cAAc,IAAI,IACpE,2BACF;CACF,OAAO;EACL,MAAM,UAAU,oBAAoB,KAAK,SAAS;EAClD,MAAM,YACH,KAAK,YAAY,kBAAkB,KAAK,SAAS,IAAI,OACrD,KAAK,iBAAiB,uBAAuB,KAAK,cAAc,IAAI;EACvE,IAAI,UACF,EAAE,KAAK,yBAAyB,QAAQ,GAAG,SAAS,0BAA0B;OAE9E,EAAE,KAAK,yBAAyB,QAAQ,gBAAgB;CAE5D;CAGA,IAAI,KAAK,eAAe;EACtB,MAAM,MAAM,KAAK;EACjB,MAAM,WAAkE,CAAC;EACzE,IAAI,IAAI,iBAAiB,KAAA,GAAW,SAAS,eAAe,IAAI;EAChE,IAAI,IAAI,oBAAoB,KAAA,GAAW,SAAS,kBAAkB,IAAI;EACtE,SAAS,mBAAmB,IAAI,oBAAoB;EACpD,IAAI,IAAI,YAAY,SAAS,aAAa;EAC1C,IAAI,IAAI,UAAU,SAAS,WAAW;EACtC,IAAI,IAAI,aAAa,SAAS,cAAc;EAC5C,IAAI,IAAI,oBAAoB,KAAA,GAAW,SAAS,kBAAkB,IAAI;EACtE,IAAI,IAAI,oBAAoB,KAAA,GAAW,SAAS,kBAAkB,IAAI;EACtE,EAAE,KAAK,iBAAiB,MAAM,QAAQ,EAAE,GAAG;CAC7C,OACE,EAAE,KAAK,8DAA0D;CAInE,IAAI,QAAQ,SAAS,GAAG;EACtB,EAAE,KAAK,QAAQ;EACf,KAAK,MAAM,OAAO,SAAS;GACzB,MAAM,WAAkE;IACtE,KAAK,IAAI;IACT,KAAK,IAAI;GACX;GACA,IAAI,IAAI,UAAU,KAAA,GAAW;IAC3B,SAAS,QAAQ,IAAI;IACrB,SAAS,cAAc;GACzB;GAGA,IAAI,IAAI,aAAa,SAAS,cAAc;GAC5C,IAAI,IAAI,QACN,SAAS,SAAS;GAEpB,IAAI,IAAI,iBAAiB,KAAA,GACvB,SAAS,eAAe,IAAI;GAE9B,IAAI,IAAI,WACN,SAAS,YAAY;GAEvB,IAAI,IAAI,SACN,SAAS,UAAU;GAErB,IAAI,IAAI,UACN,SAAS,WAAW;GAEtB,EAAE,KAAK,iBAAiB,OAAO,MAAM,QAAQ,CAAC,CAAC;EACjD;EACA,EAAE,KAAK,SAAS;CAClB;CAGA,EAAE,KAAK,aAAa;CACpB,oBAAoB,MAAM,GAAG,eAAe,MAAM;CAClD,EAAE,KAAK,cAAc;CAGrB,IAAI,KAAK,aAAa;EACpB,MAAM,UAAoB,CAAC;EAC3B,IAAI,KAAK,YAAY,gBAAgB,QAAQ,KAAK,sBAAoB;EACtE,EAAE,KAAK,eAAe,QAAQ,SAAS,MAAM,QAAQ,KAAK,GAAG,IAAI,GAAG,GAAG;CACzE;CAGA,IAAI,UAAU,SAAS,GAAG;EACxB,IAAI,cAAc;EAClB,MAAM,WAAW,UAAU,KAAK,MAAM;GACpC,MAAM,SAAgE,EAAE,IAAI,EAAE,GAAG;GACjF,IAAI,EAAE,QAAQ,KAAA,GAAW,OAAO,MAAM,EAAE;GACxC,IAAI,EAAE,QAAQ,KAAA,GAAW,OAAO,MAAM,EAAE;GACxC,IAAI,EAAE,QAAQ;IACZ,OAAO,MAAM;IACb;GACF;GACA,IAAI,EAAE,OAAO,OAAO,KAAK;GACzB,OAAO,OAAO,MAAM,MAAM,EAAE;EAC9B,CAAC;EACD,EAAE,KACA,qBAAqB,UAAU,OAAO,sBAAsB,YAAY,IAAI,SAAS,KAAK,EAAE,EAAE,aAChG;CACF;CAGA,IAAI,UAAU,SAAS,GAAG;EACxB,IAAI,cAAc;EAClB,MAAM,WAAW,UAAU,KAAK,MAAM;GACpC,MAAM,SAAgE,EAAE,IAAI,EAAE,GAAG;GACjF,IAAI,EAAE,QAAQ,KAAA,GAAW,OAAO,MAAM,EAAE;GACxC,IAAI,EAAE,QAAQ,KAAA,GAAW,OAAO,MAAM,EAAE;GACxC,IAAI,EAAE,QAAQ;IACZ,OAAO,MAAM;IACb;GACF;GACA,IAAI,EAAE,OAAO,OAAO,KAAK;GACzB,OAAO,OAAO,MAAM,MAAM,EAAE;EAC9B,CAAC;EACD,EAAE,KACA,qBAAqB,UAAU,OAAO,sBAAsB,YAAY,IAAI,SAAS,KAAK,EAAE,EAAE,aAChG;CACF;CAGA,IAAI,iBAAiB,SAAS,GAAG;EAC/B,MAAM,UAAoB,CAAC,oBAAoB;EAC/C,KAAK,MAAM,MAAM,kBACf,QAAQ,KAAK,mBAAmB,UAAU,GAAG,IAAI,EAAE,UAAU,UAAU,GAAG,GAAG,EAAE,IAAI;EAErF,QAAQ,KAAK,qBAAqB;EAClC,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,KAAK,SACP,EAAE,KAAK,iBAAiB,UAAU,KAAK,OAAO,EAAE,IAAI;CAItD,IAAI,iBAAiB,SAAS,GAAG;EAC/B,EAAE,KAAK,oBAAoB;EAC3B,KAAK,MAAM,OAAO,kBAAkB;GAClC,MAAM,WAAkE,EAAE,MAAM,IAAI,KAAK;GACzF,IAAI,IAAI,UAAU,KAAA,GAAW,SAAS,QAAQ,IAAI;GAClD,IAAI,IAAI,gBAAgB,SAAS,iBAAiB;GAClD,IAAI,IAAI,cAAc,SAAS,eAAe;GAC9C,IAAI,IAAI,kBAAkB,OAAO,SAAS,gBAAgB;GAC1D,IAAI,IAAI,sBAAsB,OAAO,SAAS,aAAa;GAC3D,IAAI,IAAI,mBAAmB,OAAO,SAAS,iBAAiB;GAC5D,IAAI,IAAI,eAAe,OAAO,SAAS,aAAa;GACpD,IAAI,IAAI,WAAW,SAAS,YAAY;GACxC,IAAI,IAAI,WAAW,SAAS,YAAY;GACxC,IAAI,IAAI,QAAQ,SAAS,SAAS;GAClC,IAAI,IAAI,gBAAgB,SAAS,iBAAiB;GAClD,IAAI,IAAI,YAAY,SAAS,aAAa;GAC1C,IAAI,IAAI,eAAe,SAAS,gBAAgB;GAChD,IAAI,IAAI,SAAS,IAAI,UAAU,WAAW,SAAS,QAAQ,IAAI;GAC/D,IAAI,IAAI,cAAc,SAAS,eAAe;GAC9C,IAAI,IAAI,QAAQ,IAAI,SAAS,UAAU,SAAS,OAAO,IAAI;GAC3D,EAAE,KAAK,mBAAmB,MAAM,QAAQ,EAAE,GAAG;EAC/C;EACA,EAAE,KAAK,qBAAqB;CAC9B;CAGA,IAAI,YAAY,SAAS,GAAG;EAC1B,EAAE,KAAK,eAAe;EACtB,KAAK,MAAM,MAAM,aACf,EAAE,KAAK,iBAAiB,UAAU,GAAG,SAAS,EAAE,IAAI;EAEtD,EAAE,KAAK,gBAAgB;CACzB;CAGA,IAAI,KAAK,iBAAiB;EACxB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,YAAY,GAAG,aAAa,OAAO,QAAQ,WAAW,GAAG;EAChE,IAAI,GAAG,WAAW,QAAQ,YAAY;EACtC,IAAI,GAAG,YAAY,QAAQ,aAAa;EACxC,IAAI,GAAG,aAAa,QAAQ,cAAc;EAC1C,IAAI,GAAG,MAAM,QAAQ,OAAO;EAC5B,MAAM,YAAY,GAAG,MAAM,KAAK,MAAM,iBAAiB,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK;EACtF,MAAM,UAAU,YAAY,aAAa,UAAU,eAAe;EAClE,IAAI,WAAW,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAC3C,EAAE,KAAK,mBAAmB,MAAM,OAAO,EAAE,GAAG,QAAQ,mBAAmB;CAE3E;CAGA,IAAI,KAAK,YAAY;EACnB,MAAM,OAAO,KAAK;EAClB,MAAM,YAAmE,CAAC;EAC1E,IAAI,KAAK,UAAU,UAAU,WAAW,aAAa,KAAK,QAAQ;EAElE,IAAI;EACJ,IAAI,KAAK,aAAa,KAAA,KAAa,KAAK,cAAc,KAAA,GACpD,UAAU,mBAAmB,KAAK,QAAQ;EAE5C,UAAU,gBAAgB,KAAK,iBAAiB,SAAS;EACzD,UAAU,YAAY,KAAK,aAAa,SAAS;EACjD,UAAU,YAAY,KAAK,aAAa,SAAS;EACjD,IAAI,KAAK,cAAc,KAAA,GAAW,UAAU,YAAY,KAAK;OACxD,IAAI,SAAS,UAAU,YAAY,QAAQ;EAChD,IAAI,KAAK,OAAO,UAAU,QAAQ;EAClC,IAAI,KAAK,SAAS,UAAU,UAAU;EACtC,IAAI,KAAK,WAAW,UAAU,YAAY;EAC1C,IAAI,KAAK,gBAAgB,OAAO,UAAU,cAAc;EACxD,IAAI,KAAK,kBAAkB,OAAO,UAAU,gBAAgB;EAC5D,IAAI,KAAK,eAAe,OAAO,UAAU,aAAa;EACtD,IAAI,KAAK,kBAAkB,OAAO,UAAU,gBAAgB;EAC5D,IAAI,KAAK,eAAe,OAAO,UAAU,aAAa;EACtD,IAAI,KAAK,qBAAqB,OAAO,UAAU,mBAAmB;EAClE,IAAI,KAAK,kBAAkB,OAAO,UAAU,gBAAgB;EAC5D,IAAI,KAAK,eAAe,OAAO,UAAU,aAAa;EACtD,IAAI,KAAK,mBAAmB,UAAU,oBAAoB;EAC1D,IAAI,KAAK,SAAS,OAAO,UAAU,OAAO;EAC1C,IAAI,KAAK,eAAe,OAAO,UAAU,aAAa;EACtD,IAAI,KAAK,gBAAgB,OAAO,UAAU,cAAc;EACxD,IAAI,KAAK,qBAAqB,UAAU,sBAAsB;EAC9D,EAAE,KAAK,iBAAiB,mBAAmB,MAAM,SAAS,CAAC,CAAC;CAC9D;CAGA,IAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,UAAoB,CAAC,mBAAmB;EAC9C,KAAK,MAAM,MAAM,iBAAiB;GAChC,MAAM,UAAiE;IACrE,MAAM,GAAG;IACT,OAAO,GAAG;GACZ;GACA,IAAI,GAAG,UAAU,QAAQ,WAAW,aAAa,GAAG,QAAQ;GAE5D,IAAI;GACJ,IAAI,GAAG,aAAa,KAAA,KAAa,GAAG,cAAc,KAAA,GAChD,YAAY,mBAAmB,GAAG,QAAQ;GAE5C,QAAQ,gBAAgB,GAAG,iBAAiB,WAAW;GACvD,QAAQ,YAAY,GAAG,aAAa,WAAW;GAC/C,QAAQ,YAAY,GAAG,aAAa,WAAW;GAC/C,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,YAAY,GAAG;QAClD,IAAI,WAAW,QAAQ,YAAY,UAAU;GAClD,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB,GAAG;GAE3D,IAAI,CAD2B,CAAC,GAAG,oBAEjC,QAAQ,KACN,kBAAkB,MAAM,OAAO,EAAE,uBAAuB,UAAU,GAAG,kBAAmB,EAAE,uCAC5F;QAEA,QAAQ,KAAK,iBAAiB,kBAAkB,MAAM,OAAO,CAAC,CAAC;EAEnE;EACA,QAAQ,KAAK,oBAAoB;EACjC,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,KAAK,WAAW;EAClB,MAAM,UAAoB,CAAC,YAAY;EACvC,MAAM,UAA2C,CAAC;EAClD,IAAI,KAAK,UAAU,YAAY,KAAA,GAAW,QAAQ,UAAU,KAAK,UAAU;EAC3E,IAAI,KAAK,UAAU,SAAS,KAAA,GAAW,QAAQ,OAAO,KAAK,UAAU;EACrE,QAAQ,KAAK,aAAa,MAAM,OAAO,EAAE;EAEzC,KAAK,MAAM,YAAY,KAAK,UAAU,WAAW;GAC/C,MAAM,SAAgE,EACpE,MAAM,SAAS,KACjB;GACA,IAAI,SAAS,UAAU,KAAA,GAAW,OAAO,QAAQ,SAAS;GAC1D,IAAI,SAAS,MAAM,OAAO,OAAO,SAAS;GAC1C,IAAI,SAAS,SAAS,OAAO,UAAU,SAAS;GAChD,IAAI,SAAS,QAAQ,OAAO,SAAS;GACrC,IAAI,SAAS,QAAQ,OAAO,SAAS;GAErC,MAAM,SAAmB,CAAC,YAAY,MAAM,MAAM,EAAE,EAAE;GACtD,KAAK,MAAM,QAAQ,SAAS,YAAY;IACtC,MAAM,UAAiE;KACrE,GAAG,KAAK;KACR,KAAK,OAAO,KAAK,GAAG;IACtB;IACA,IAAI,KAAK,SAAS,QAAQ,UAAU;IACpC,IAAI,KAAK,QAAQ,QAAQ,SAAS;IAClC,OAAO,KAAK,cAAc,MAAM,OAAO,EAAE,GAAG;GAC9C;GACA,OAAO,KAAK,aAAa;GACzB,QAAQ,KAAK,OAAO,KAAK,EAAE,CAAC;EAC9B;EACA,QAAQ,KAAK,cAAc;EAC3B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,KAAK,YACP,EAAE,KAAK,oBAAoB,KAAK,UAAU,CAAC;CAI7C,IAAI,WAAW,SAAS,GAAG;EACzB,EAAE,KAAK,sBAAsB,WAAW,OAAO,GAAG;EAClD,KAAK,MAAM,MAAM,YAAY;GAC3B,MAAM,UAAU,eAAe,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG;GACvD,MAAM,QAAQ,eAAe,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG;GACjD,EAAE,KAAK,iBAAiB,aAAa,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;EAC7E;EACA,EAAE,KAAK,eAAe;CACxB;CAGA,IAAI,KAAK,YAAY;EACnB,MAAM,KAAK,KAAK;EAChB,MAAM,UAA2C,EAAE,QAAQ,GAAG,OAAO;EACrE,IAAI,GAAG,QAAQ,GAAG,SAAS,qBAAqB,QAAQ,OAAO,GAAG;EAClE,IAAI,GAAG,aAAa,GAAG,cAAc,QAAQ,QAAQ,YAAY,GAAG;EACpE,EAAE,KAAK,iBAAiB,cAAc,MAAM,OAAO,CAAC,CAAC;CACvD;CAGA,MAAM,qBAAqB,KAAK,sBAAsB,CAAC;CACvD,IAAI,mBAAmB,SAAS,GAC9B,KAAK,MAAM,MAAM,oBAAoB;EACnC,EAAE,KAAK,iCAAiC,GAAG,MAAM,GAAG;EACpD,KAAK,MAAM,CAAC,IAAI,SAAS,GAAG,MAAM,QAAQ,GAAG;GAC3C,MAAM,YAAmE;IACvE,MAAM,KAAK;IACX,UAAU,KAAK,YAAY,KAAK;GAClC;GACA,IAAI,KAAK,UAAU,UAAU,WAAW,KAAK;GAC7C,IAAI,KAAK,UAAU,KAAA,GAAW,UAAU,QAAQ,KAAK;GACrD,IAAI,KAAK,YAAY,UAAU,aAAa;GAC5C,IAAI,KAAK,YAAY,UAAU,aAAa,KAAK;GACjD,IAAI,KAAK,SAAS,KAAA,GAAW,UAAU,OAAO,KAAK;GACnD,IAAI,KAAK,cAAc,UAAU,eAAe;GAChD,IAAI,KAAK,iBAAiB,OAAO,UAAU,eAAe;GAC1D,IAAI,KAAK,WAAW,KAAA,GAAW,UAAU,SAAS,KAAK;GAGvD,IAAI,KAAK,SAAS,gBAAgB,KAAK,YAAY;IACjD,MAAM,KAAK,KAAK;IAChB,MAAM,QAAkB,CAAC;IACzB,KAAK,MAAM,KAAK,GAAG,MACjB,MAAM,KAAK,aAAa,CAAC,CAAC;IAE5B,KAAK,MAAM,KAAK,GAAG,QACjB,MAAM,KAAK,iBAAiB,EAAE,IAAI;IAEpC,EAAE,KAAK,UAAU,MAAM,SAAS,EAAE,eAAe,MAAM,KAAK,EAAE,EAAE,uBAAuB;GACzF,OAEK,IAAI,KAAK,SAAS,aAAa,KAAK,SAAS;IAChD,MAAM,KAAK,KAAK;IAChB,MAAM,QAAkB,CAAC;IACzB,KAAK,MAAM,KAAK,GAAG,MACjB,MAAM,KAAK,aAAa,CAAC,CAAC;IAE5B,MAAM,KAAK,iBAAiB,GAAG,MAAM,IAAI;IACzC,MAAM,UAAiE,CAAC;IACxE,IAAI,GAAG,cAAc,KAAA,KAAa,GAAG,cAAc,IAAI,QAAQ,YAAY,GAAG;IAC9E,IAAI,GAAG,cAAc,KAAA,KAAa,GAAG,cAAc,IAAI,QAAQ,YAAY,GAAG;IAC9E,IAAI,GAAG,cAAc,OAAO,QAAQ,YAAY;IAChD,MAAM,UAAU,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,MAAM,OAAO,IAAI;IACnE,EAAE,KACA,UAAU,MAAM,SAAS,EAAE,WAAW,QAAQ,GAAG,MAAM,KAAK,EAAE,EAAE,oBAClE;GACF,OAEK,IAAI,KAAK,SAAS,aAAa,KAAK,SAAS;IAChD,MAAM,KAAK,KAAK;IAChB,MAAM,QAAkB,CAAC;IACzB,KAAK,MAAM,KAAK,GAAG,MACjB,MAAM,KAAK,aAAa,CAAC,CAAC;IAE5B,MAAM,UAAiE,CAAC;IACxE,IAAI,GAAG,YAAY,KAAA,KAAa,GAAG,YAAY,mBAC7C,QAAQ,UAAU,GAAG;IACvB,IAAI,GAAG,cAAc,OAAO,QAAQ,YAAY;IAChD,IAAI,GAAG,YAAY,OAAO,QAAQ,UAAU;IAC5C,IAAI,GAAG,SAAS,QAAQ,UAAU;IAClC,MAAM,UAAU,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,MAAM,OAAO,IAAI;IACnE,EAAE,KACA,UAAU,MAAM,SAAS,EAAE,WAAW,QAAQ,GAAG,MAAM,KAAK,EAAE,EAAE,oBAClE;GACF,OAGE,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;IAC7C,MAAM,eAAe,KAAK,SAAS,KAAK,MAAM,YAAY,UAAU,CAAC,EAAE,WAAW;IAClF,EAAE,KAAK,UAAU,MAAM,SAAS,EAAE,IAAI,GAAG,cAAc,WAAW;GACpE,OACE,EAAE,KAAK,iBAAiB,UAAU,MAAM,SAAS,CAAC,CAAC;EAGzD;EACA,EAAE,KAAK,0BAA0B;CACnC;CAIF,MAAM,kBAAkB,KAAK,mBAAmB,CAAC;CACjD,IAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,mBAA0E,EAC9E,OAAO,gBAAgB,OACzB;EACA,IAAI,KAAK,+BAA+B,iBAAiB,iBAAiB;EAC1E,EAAE,KAAK,mBAAmB,MAAM,gBAAgB,EAAE,EAAE;EACpD,KAAK,MAAM,MAAM,iBAAiB;GAChC,MAAM,UAAiE,EAAE,OAAO,GAAG,MAAM;GACzF,IAAI,GAAG,QAAQ,GAAG,SAAS,QAAQ,QAAQ,OAAO,GAAG;GACrD,IAAI,GAAG,UAAU,QAAQ,WAAW,GAAG;GACvC,IAAI,GAAG,YAAY,QAAQ,aAAa;GACxC,IAAI,GAAG,kBAAkB,QAAQ,mBAAmB;GACpD,IAAI,GAAG,kBAAkB,QAAQ,mBAAmB;GACpD,IAAI,GAAG,YAAY,QAAQ,aAAa,GAAG;GAC3C,IAAI,GAAG,OAAO,QAAQ,QAAQ,GAAG;GACjC,IAAI,GAAG,aAAa,QAAQ,cAAc,GAAG;GAC7C,IAAI,GAAG,QAAQ,QAAQ,SAAS,GAAG;GACnC,IAAI,GAAG,YAAY,QAAQ,aAAa,GAAG;GAC3C,IAAI,GAAG,SAAS,QAAQ,UAAU,GAAG;GACrC,IAAI,GAAG,cAAc,QAAQ,eAAe;GAC5C,MAAM,QAAkB,CAAC;GACzB,IAAI,GAAG,aAAa,KAAA,GAAW,MAAM,KAAK,aAAa,UAAU,GAAG,QAAQ,EAAE,YAAY;GAC1F,IAAI,GAAG,aAAa,KAAA,GAAW,MAAM,KAAK,aAAa,UAAU,GAAG,QAAQ,EAAE,YAAY;GAC1F,IAAI,MAAM,SAAS,GACjB,EAAE,KAAK,kBAAkB,MAAM,OAAO,EAAE,IAAI,GAAG,OAAO,mBAAmB;QAEzE,EAAE,KAAK,iBAAiB,kBAAkB,MAAM,OAAO,CAAC,CAAC;EAE7D;EACA,EAAE,KAAK,oBAAoB;CAC7B;CAGA,MAAM,aAAa,KAAK,cAAc,CAAC;CACvC,IAAI,WAAW,SAAS,GAAG;EACzB,EAAE,KAAK,cAAc;EACrB,IAAI,QAAQ;EACZ,KAAK,MAAM,MAAM,YAAY;GAC3B,MAAM,UAAiE,EAAE,KAAK,GAAG,KAAK;GACtF,IAAI,GAAG,OAAO,SAAS,YAAY;IACjC;IACA,QAAQ,UAAU,MAAM;GAC1B,OACE,QAAQ,WAAW,GAAG,OAAO;GAE/B,IAAI,GAAG,SAAS,QAAQ,UAAU,GAAG;GACrC,IAAI,GAAG,SAAS,QAAQ,UAAU,GAAG;GACrC,EAAE,KAAK,iBAAiB,aAAa,MAAM,OAAO,CAAC,CAAC;EACtD;EACA,EAAE,KAAK,eAAe;CACxB;CAGA,IAAI,KAAK,cAAc;EACrB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB;EACxD,IAAI,GAAG,kBAAkB,QAAQ,mBAAmB;EACpD,IAAI,GAAG,UAAU,QAAQ,WAAW;EACpC,IAAI,GAAG,WAAW,QAAQ,YAAY;EACtC,IAAI,GAAG,iBAAiB,OAAO,QAAQ,eAAe;EACtD,EAAE,KAAK,iBAAiB,gBAAgB,MAAM,OAAO,CAAC,CAAC;CACzD;CAEA,IAAI,KAAK,aAAa;EACpB,MAAM,KAAK,KAAK;EAChB,EAAE,KACA,eAAe,MAAM;GACnB,MAAM,cAAc,GAAG,QAAQ,GAAI;GACnC,OAAO,cAAc,GAAG,SAAS,GAAI;GACrC,KAAK,cAAc,GAAG,OAAO,CAAC;GAC9B,QAAQ,cAAc,GAAG,UAAU,CAAC;GACpC,QAAQ,cAAc,GAAG,UAAU,EAAG;GACtC,QAAQ,cAAc,GAAG,UAAU,EAAG;EACxC,CAAC,EAAE,GACL;CACF,OACE,EAAE,KAAK,kGAAsF;CAI/F,IAAI,KAAK,WAAW;EAClB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,YAAY,GAAG;EACvD,IAAI,GAAG,eAAe,GAAG,gBAAgB,WAAW,QAAQ,cAAc,GAAG;EAC7E,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,QAAQ,GAAG;EAC/C,IAAI,GAAG,eAAe,KAAA,GAAW,QAAQ,aAAa,GAAG;EACzD,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,cAAc,GAAG;EAC3D,IAAI,GAAG,aAAa,GAAG,cAAc,gBAAgB,QAAQ,YAAY,GAAG;EAC5E,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB;EACxD,IAAI,GAAG,oBAAoB,KAAA,GAAW,QAAQ,kBAAkB,GAAG;EACnE,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,cAAc,GAAG;EAC3D,IAAI,GAAG,eAAe,KAAA,GAAW,QAAQ,aAAa,GAAG;EACzD,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB;EACxD,IAAI,GAAG,eAAe,QAAQ,gBAAgB;EAC9C,IAAI,GAAG,OAAO,QAAQ,QAAQ;EAC9B,IAAI,GAAG,gBAAgB,GAAG,iBAAiB,QAAQ,QAAQ,eAAe,GAAG;EAC7E,IAAI,GAAG,UAAU,GAAG,WAAW,aAAa,QAAQ,SAAS,GAAG;EAChE,EAAE,KAAK,iBAAiB,aAAa,MAAM,OAAO,CAAC,CAAC;CACtD;CAGA,IAAI,KAAK,cAAc;EACrB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAiE,CAAC;EACxE,IAAI,GAAG,kBAAkB,QAAQ,mBAAmB;EACpD,IAAI,GAAG,gBAAgB,QAAQ,iBAAiB;EAChD,IAAI,GAAG,iBAAiB,OAAO,QAAQ,eAAe;EACtD,IAAI,GAAG,qBAAqB,OAAO,QAAQ,mBAAmB;EAC9D,MAAM,QAAkB,CAAC;EACzB,IAAI,GAAG,WAAW,MAAM,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,aAAa;EAChF,IAAI,GAAG,WAAW,MAAM,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,aAAa;EAChF,IAAI,GAAG,YAAY,MAAM,KAAK,eAAe,UAAU,GAAG,UAAU,EAAE,cAAc;EACpF,IAAI,GAAG,YAAY,MAAM,KAAK,eAAe,UAAU,GAAG,UAAU,EAAE,cAAc;EACpF,IAAI,GAAG,aAAa,MAAM,KAAK,gBAAgB,UAAU,GAAG,WAAW,EAAE,eAAe;EACxF,IAAI,GAAG,aAAa,MAAM,KAAK,gBAAgB,UAAU,GAAG,WAAW,EAAE,eAAe;EACxF,IAAI,MAAM,SAAS,GACjB,EAAE,KAAK,gBAAgB,MAAM,OAAO,EAAE,IAAI,GAAG,OAAO,iBAAiB;OAChE,IAAI,QAAQ,oBAAoB,QAAQ,gBAC7C,EAAE,KAAK,iBAAiB,gBAAgB,MAAM,OAAO,CAAC,CAAC;CAE3D;CAGA,IAAI,KAAK,WAAW;EAClB,MAAM,MAAM,KAAK;EACjB,MAAM,WAAkE,EAAE,QAAQ,IAAI,IAAI;EAC1F,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,IAAI,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM,IAAI;EAC9C,EAAE,KAAK,iBAAiB,aAAa,MAAM,QAAQ,CAAC,CAAC;CACvD;CAGA,IAAI,KAAK,iBACP,EAAE,KAAK,0BAA0B,UAAU,KAAK,eAAe,EAAE,IAAI;CAIvE,IAAI,cAAc,SAAS,GAAG;EAC5B,MAAM,UAAoB,CAAC,iBAAiB;EAC5C,KAAK,MAAM,MAAM,eAAe;GAC9B,MAAM,UAAiE,EACrE,OAAO,GAAG,MACZ;GACA,IAAI,GAAG,WAAW,QAAQ,YAAY;GACtC,IAAI,GAAG,kBAAkB,QAAQ,mBAAmB;GACpD,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB;GACxD,IAAI,GAAG,SAAS,QAAQ,UAAU;GAClC,IAAI,GAAG,cAAc,QAAQ,eAAe;GAC5C,IAAI,GAAG,iBAAiB,QAAQ,kBAAkB;GAClD,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB;GACxD,IAAI,GAAG,oBAAoB,QAAQ,qBAAqB;GACxD,IAAI,GAAG,kBAAkB,QAAQ,mBAAmB;GACpD,QAAQ,KAAK,iBAAiB,gBAAgB,MAAM,OAAO,CAAC,CAAC;EAC/D;EACA,QAAQ,KAAK,kBAAkB;EAC/B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;EAC/C,MAAM,UAAoB,CAAC,aAAa;EACxC,KAAK,MAAM,OAAO,KAAK,WAAW;GAChC,QAAQ,KAAK,qBAAqB,UAAU,IAAI,SAAS,EAAE,GAAG;GAC9D,KAAK,MAAM,MAAM,IAAI,WAAW;IAC9B,MAAM,UAAoB,CAAC,SAAS,GAAG,KAAK,EAAE;IAC9C,IAAI,GAAG,SAAS,QAAQ,KAAK,eAAa;IAC1C,IAAI,GAAG,UAAU,QAAQ,KAAK,gBAAc;IAC5C,MAAM,QAAQ,GAAG,aACb,GAAG,WACA,KACE,OAAO,wBAAwB,UAAU,GAAG,GAAG,EAAE,SAAS,UAAU,GAAG,GAAG,EAAE,IAC/E,CAAC,CACA,KAAK,EAAE,IACV;IACJ,QAAQ,KACN,QACI,iBAAiB,QAAQ,KAAK,GAAG,EAAE,GAAG,MAAM,mBAC5C,iBAAiB,QAAQ,KAAK,GAAG,EAAE,GACzC;GACF;GACA,QAAQ,KAAK,kBAAkB;EACjC;EACA,QAAQ,KAAK,cAAc;EAC3B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,KAAK,iBACP,EAAE,KAAK,2BAA2B;CAIpC,IAAI,WAAW,SAAS,GAAG;EACzB,MAAM,WAAqB,CAAC,cAAc;EAC1C,KAAK,MAAM,OAAO,YAAY;GAC5B,MAAM,WAAqB,CAAC,YAAY,IAAI,QAAQ,EAAE;GACtD,IAAI,IAAI,QAAQ,SAAS,KAAK,WAAW,UAAU,IAAI,MAAM,EAAE,EAAE;GACjE,IAAI,IAAI,YAAY,IAAI,aAAa,oBACnC,SAAS,KAAK,aAAa,IAAI,SAAS,EAAE;GAC5C,IAAI,IAAI,MAAM,SAAS,KAAK,SAAS,UAAU,IAAI,IAAI,EAAE,EAAE;GAC3D,IAAI,IAAI,WAAW,SAAS,KAAK,cAAc,IAAI,UAAU,EAAE;GAC/D,IAAI,IAAI,UAAU,SAAS,KAAK,gBAAc;GAC9C,IAAI,IAAI,KAAK,SAAS,KAAK,SAAS,UAAU,IAAI,GAAG,EAAE,EAAE;GAEzD,IAAI,IAAI,UAAU;IAChB,MAAM,MAAM,IAAI;IAChB,MAAM,WAAqB,CAAC;IAC5B,IAAI,IAAI,WAAW,OAAO,SAAS,KAAK,cAAY;IACpD,IAAI,IAAI,gBAAgB,OAAO,SAAS,KAAK,mBAAiB;IAC9D,IAAI,IAAI,UAAU,OAAO,SAAS,KAAK,aAAW;IAClD,IAAI,IAAI,UAAU,SAAS,KAAK,gBAAc;IAC9C,IAAI,IAAI,UAAU,SAAS,KAAK,gBAAc;IAC9C,IAAI,IAAI,aAAa,OAAO,SAAS,KAAK,gBAAc;IACxD,IAAI,IAAI,aAAa,OAAO,SAAS,KAAK,gBAAc;IACxD,IAAI,IAAI,aAAa,OAAO,SAAS,KAAK,gBAAc;IACxD,IAAI,IAAI,OAAO,SAAS,KAAK,UAAU,UAAU,IAAI,KAAK,EAAE,EAAE;IAC9D,IAAI,IAAI,SAAS,SAAS,KAAK,YAAY,UAAU,IAAI,OAAO,EAAE,EAAE;IACpE,IAAI,IAAI,KAAK,SAAS,KAAK,WAAS;IACpC,IAAI,IAAI,KAAK,SAAS,KAAK,SAAS,UAAU,IAAI,GAAG,EAAE,EAAE;IACzD,SAAS,KACP,cAAc,SAAS,KAAK,GAAG,EAAE,YAAY,SAAS,SAAS,MAAM,SAAS,KAAK,GAAG,IAAI,GAAG,eAC/F;GACF,OACE,SAAS,KAAK,cAAc,SAAS,KAAK,GAAG,EAAE,GAAG;EAEtD;EACA,SAAS,KAAK,eAAe;EAC7B,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;CAC1B;CAGA,IAAI,SAAS,SAAS,GAAG;EACvB,MAAM,YAAsB,CAAC,YAAY;EACzC,KAAK,MAAM,KAAK,UAAU;GACxB,MAAM,SAAmB,CAAC,YAAY,EAAE,QAAQ,IAAI,SAAS,UAAU,EAAE,GAAG,EAAE,EAAE;GAChF,IAAI,EAAE,MAAM,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;GAErD,MAAM,UAAoB,CAAC;GAC3B,IAAI,EAAE,WAAW,OAAO,QAAQ,KAAK,cAAY;GACjD,IAAI,EAAE,UAAU,QAAQ,KAAK,gBAAc;GAC3C,IAAI,EAAE,cAAc,QAAQ,KAAK,oBAAkB;GACnD,IAAI,EAAE,YAAY,QAAQ,KAAK,eAAe,UAAU,EAAE,UAAU,EAAE,EAAE;GACxE,IAAI,EAAE,eAAe,QAAQ,KAAK,kBAAkB,UAAU,EAAE,aAAa,EAAE,EAAE;GACjF,IAAI,EAAE,SAAS,QAAQ,KAAK,OAAO,UAAU,EAAE,OAAO,EAAE,EAAE;GAC1D,IAAI,QAAQ,SAAS,GACnB,UAAU,KACR,YAAY,OAAO,KAAK,GAAG,EAAE,aAAa,QAAQ,SAAS,MAAM,QAAQ,KAAK,GAAG,IAAI,GAAG,aAC1F;QAEA,UAAU,KAAK,YAAY,OAAO,KAAK,GAAG,EAAE,GAAG;EAEnD;EACA,UAAU,KAAK,aAAa;EAC5B,EAAE,KAAK,UAAU,KAAK,EAAE,CAAC;CAC3B;CAGA,IAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,UAAoB,CAAC,2BAA2B,gBAAgB,OAAO,GAAG;EAChF,KAAK,MAAM,OAAO,iBAAiB;GACjC,MAAM,WAAqB;IACzB,OAAO,IAAI,GAAG;IACd,UAAU,UAAU,IAAI,KAAK,EAAE;IAC/B,eAAe,IAAI,WAAW;IAC9B,oBAAoB,UAAU,IAAI,eAAe,EAAE;GACrD;GACA,IAAI,IAAI,WAAW,SAAS,KAAK,cAAc,UAAU,IAAI,SAAS,EAAE,EAAE;GAC1E,IAAI,IAAI,cAAc,SAAS,KAAK,iBAAiB,UAAU,IAAI,YAAY,EAAE,EAAE;GACnF,IAAI,IAAI,OAAO,SAAS,KAAK,UAAU,UAAU,IAAI,KAAK,EAAE,EAAE;GAC9D,IAAI,IAAI,eAAe,SAAS,KAAK,qBAAmB;GACxD,QAAQ,KAAK,mBAAmB,SAAS,KAAK,GAAG,EAAE,GAAG;EACxD;EACA,QAAQ,KAAK,oBAAoB;EACjC,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;CACzB;CAGA,IAAI,KAAK,KACP,EAAE,KAAK,WAAW,KAAK,IAAI,UAAU;CAGvC,EAAE,KAAK,cAAc;CACrB,OAAO,EAAE,KAAK,EAAE;AAClB;AAIA,SAAS,aAAa,MAA2B;CAC/C,MAAM,IAA2D,EAAE,MAAM,KAAK,KAAK;CACnF,IAAI,KAAK,QAAQ,KAAA,GAAW,EAAE,MAAM,KAAK;CACzC,IAAI,KAAK,QAAQ,OAAO,EAAE,MAAM;CAChC,OAAO,QAAQ,MAAM,CAAC,EAAE;AAC1B;AAEA,SAAS,oBAAoB,IAA+B;CAC1D,MAAM,QAA+D,EACnE,gBAAgB,EAClB;CACA,IAAI,IAAI,gBAAgB,KAAA,GAAW,MAAM,cAAc,GAAG,cAAc,IAAI;CAG5E,IAAI,IAAI,kBAAkB,OAAO,MAAM,gBAAgB;CACvD,IAAI,IAAI,sBAAsB,OAAO,MAAM,oBAAoB;CAC/D,IAAI,IAAI,cAAc,OAAO,MAAM,YAAY;CAC/C,IAAI,IAAI,cAAc,KAAA,GAAW,MAAM,YAAY,GAAG;CACtD,IAAI,IAAI,aAAa,MAAM,cAAc;CACzC,IAAI,IAAI,kBAAkB,MAAM,mBAAmB;CACnD,IAAI,IAAI,cAAc,MAAM,eAAe;CAC3C,IAAI,IAAI,cAAc,OAAO,MAAM,YAAY;CAC/C,IAAI,IAAI,uBAAuB,OAAO,MAAM,qBAAqB;CACjE,IAAI,IAAI,qBAAqB,OAAO,MAAM,mBAAmB;CAC7D,IAAI,IAAI,mBAAmB,OAAO,MAAM,iBAAiB;CACzD,IAAI,IAAI,MAAM,MAAM,OAAO,GAAG;CAC9B,IAAI,IAAI,YAAY,KAAA,GAAW,MAAM,UAAU,GAAG;CAClD,IAAI,IAAI,oBAAoB,KAAA,GAAW,MAAM,kBAAkB,GAAG;CAClE,IAAI,IAAI,6BAA6B,KAAA,GACnC,MAAM,2BAA2B,GAAG;CACtC,IAAI,IAAI,4BAA4B,KAAA,GAClC,MAAM,0BAA0B,GAAG;CACrC,OAAO,MAAM,KAAK;AACpB;AAEA,SAAS,uBAAuB,IAAmC;CACjE,MAAM,UAAoB,CAAC;CAC3B,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK,EAAE;CAC7C,IAAI,GAAG,YAAY,QAAQ,KAAK,kBAAgB;CAChD,IAAI,GAAG,OAAO,QAAQ,KAAK,aAAW;CACtC,IAAI,GAAG,MAAM,QAAQ,KAAK,YAAU;CACpC,IAAI,GAAG,YAAY,QAAQ,KAAK,kBAAgB;CAChD,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,KAAK,UAAU,GAAG,MAAM,EAAE;CAC9D,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,GAAG,KAAK,EAAE;CAC7C,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;CAC1E,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,KAAK,UAAU,GAAG,MAAM,EAAE;CAC9D,IAAI,GAAG,QAAQ,KAAA,GAAW,QAAQ,KAAK,QAAQ,GAAG,IAAI,EAAE;CACxD,IAAI,GAAG,QAAQ,KAAA,GAAW,QAAQ,KAAK,QAAQ,GAAG,IAAI,EAAE;CACxD,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;CAC1E,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;CAC1E,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,KAAK,gBAAgB,GAAG,YAAY,EAAE;CAChF,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,KAAK,gBAAgB,GAAG,YAAY,EAAE;CAChF,IAAI,GAAG,UAAU,KAAA,GAAW,QAAQ,KAAK,UAAU,GAAG,MAAM,EAAE;CAC9D,IAAI,GAAG,KAAK,QAAQ,KAAK,SAAS,UAAU,GAAG,GAAG,EAAE,EAAE;CACtD,MAAM,UAAU,GAAG,YAAY,kBAAkB,GAAG,SAAS,IAAI;CACjE,MAAM,UAAU,QAAQ,KAAK,GAAG;CAChC,OAAO,UACH,mBAAmB,QAAQ,GAAG,QAAQ,qBACtC,mBAAmB,QAAQ;AACjC;AAEA,SAAS,kBAAkB,KAA+B;CACxD,MAAM,WAAkE,CAAC;CACzE,IAAI,IAAI,MAAM,SAAS,OAAO,IAAI;CAClC,IAAI,IAAI,YAAY,SAAS,aAAa,IAAI;CAC9C,IAAI,IAAI,iBAAiB,KAAA,GAAW,SAAS,eAAe,IAAI;CAChE,IAAI,IAAI,OAAO,SAAS,QAAQ,IAAI;CACpC,OAAO,aAAa,MAAM,QAAQ,EAAE;AACtC;AAEA,SAAS,mBAAmB,aAA8C;CACxE,MAAM,QAAQ,OAAO,gBAAgB,WAAW,EAAE,SAAS,YAAY,IAAI;CAC3E,MAAM,SAAgE,CAAC;CACvE,IAAI,MAAM,QAAQ,MAAM,SAAS,YAAY,QAAQ,OAAO,IAAI,MAAM;CACtE,IAAI,MAAM,WAAW,OAAO,MAAM,MAAM;CACxC,IAAI,MAAM,gBAAgB,KAAA,GAAW,OAAO,KAAK,MAAM;CACvD,IAAI,MAAM,KAAK,OAAO,MAAM;CAC5B,IAAI,MAAM,MAAM,OAAO,OAAO;CAC9B,IAAI,MAAM,KAAK,OAAO,MAAM;CAC5B,IAAI,MAAM,MAAM,OAAO,OAAO;CAC9B,IAAI,MAAM,MAAM,OAAO,OAAO;CAC9B,IAAI,MAAM,YAAY,OAAO,KAAK,MAAM;CACxC,IAAI,MAAM,YAAY,OAAO,KAAK,MAAM;CACxC,IAAI,MAAM,eAAe,OAAO,KAAK;CACrC,IAAI,MAAM,cAAc,OAAO,KAAK;CAIpC,IAFmB,MAAM,YAAY,KAAA,KAAa,MAAM,YAAY,IAGlE,OAAO,KAAK,MAAM,MAAM,EAAE,GAAG,UAAU,MAAM,OAAO,EAAE;CAExD,IAAI,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAC/B,OAAO,iBAAiB,KAAK,MAAM,MAAM,CAAC;CAE5C,OAAO;AACT;;;;;;;;;AAUA,SAAgB,oBACd,MACA,KACA,eACA,QACA,iBAAiB,GACX;CAGN,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,UAAU,KAAK;EACrB,MAAM,YAAY,QAAQ,aAAa,iBAAiB;EAGxD,IAAI,UAAU,OAAO,UAAU;EAC/B,IAAI,QAAQ,WAAW,KAAA,GACrB,WAAW,QAAQ,YAAY,QAAQ,MAAM,EAAE;EAEjD,IAAI,QAAQ,QAAQ,WAAW;EAC/B,IAAI,QAAQ,OAAO,WAAW,WAAW,QAAQ,MAAM;EACvD,IAAI,QAAQ,cAAc,WAAW;EACrC,IAAI,QAAQ,UAAU,WAAW;EACjC,IAAI,QAAQ,UAAU,WAAW;EACjC,IAAI,QAAQ,UAAU,WAAW;EAEjC,MAAM,QAAQ,QAAQ;EACtB,IAAI,OAAO;GACT,IAAI,KAAK,OAAO,QAAQ,EAAE;GAC1B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;IACrC,MAAM,OAAO,MAAM;IAEnB,MAAM,UAAU,gBADJ,KAAK,aAAa,eAAe,WAAW,IAAI,CAAC,GACxB,MAAM,eAAe,MAAM;IAChE,IAAI,SAAS,IAAI,KAAK,OAAO;GAC/B;GACA,IAAI,KAAK,QAAQ;EACnB,OACE,IAAI,KAAK,OAAO,QAAQ,GAAG;CAE/B;AACF;AAEA,SAAS,gBACP,KACA,MACA,eACA,QACQ;CAIR,MAAM,QAAQ,OAAO,IAAI;CACzB,IAAI,QAAQ;CACZ,IAAI,KAAK,UAAU,KAAA,KAAa,QAC9B,QAAQ,OAAO,OAAO,SAAS,KAAK,KAAK,EAAE;MACtC,IAAI,KAAK,eAAe,KAAA,GAC7B,QAAQ,OAAO,KAAK,WAAW;CAEjC,IAAI,SAAS;CACb,IAAI,KAAK,mBAAmB,KAAA,GAAW,UAAU,QAAQ,KAAK,eAAe;CAC7E,IAAI,KAAK,oBAAoB,KAAA,GAAW,UAAU,QAAQ,KAAK,gBAAgB;CAE/E,MAAM,QAAQ,KAAK;CAGnB,IAAI,KAAK,SAAS;EAChB,MAAM,OAAO,mBAAmB,KAAK,OAAO;EAC5C,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC9B,OAAO,KAAK,QAAQ,QAAQ,OAAO,GAAG,KAAK;EAE7C,IAAI,OAAO;EACX,IAAI,QAAQ;EACZ,IAAI,OAAO,UAAU,UACnB,OAAO,MAAM,MAAM;OACd,IAAI,OAAO,UAAU,WAAW;GACrC,QAAQ;GACR,OAAO,MAAM,QAAQ,IAAI,EAAE;EAC7B,OAAO,IAAI,OAAO,UAAU,UAAU;GACpC,QAAQ;GACR,OAAO,MAAM,UAAU,KAAK,EAAE;EAChC,OAAO,IAAI,iBAAiB,MAC1B,OAAO,MAAM,mBAAmB,KAAK,EAAE;EAEzC,IAAI,MACF,OAAO,KAAK,QAAQ,QAAQ,SAAS,MAAM,GAAG,OAAO,KAAK;EAE5D,OAAO,KAAK,QAAQ,QAAQ,OAAO,GAAG,KAAK;CAC7C;CAEA,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW;EACzC,IAAI,KAAK,eAAe,KAAA,GACtB,OAAO,KAAK,QAAQ,QAAQ,OAAO;EAErC,OAAO;CACT;CAGA,IAAI,OAAO,UAAU,YAAY,EAAE,iBAAiB,OAAO;EACzD,IAAI,eAAe;GACjB,MAAM,MAAM,cAAc,aAAa,KAAK;GAC5C,OAAO,KAAK,QAAQ,QAAQ,OAAO,YAAY,IAAI;EACrD;EACA,OAAO,KAAK,QAAQ,QAAQ,OAAO,qBAAqBC,cAAY,KAAK,EAAE;CAC7E;CAEA,IAAI,OAAO,UAAU,UAAU;EAC7B,IAAI,eAAe;GACjB,MAAM,MAAM,cAAc,SAAS,KAAK;GACxC,OAAO,KAAK,QAAQ,QAAQ,OAAO,YAAY,IAAI;EACrD;EACA,OAAO,KAAK,QAAQ,QAAQ,OAAO,wBAAwB,UAAU,KAAK,EAAE;CAC9E;CAEA,IAAI,OAAO,UAAU,UACnB,OAAO,KAAK,QAAQ,QAAQ,OAAO,MAAM,MAAM;CAGjD,IAAI,OAAO,UAAU,WACnB,OAAO,KAAK,QAAQ,QAAQ,OAAO,YAAY,QAAQ,IAAI,EAAE;CAG/D,IAAI,iBAAiB,MAAM;EACzB,MAAM,SAAS,mBAAmB,KAAK;EACvC,OAAO,KAAK,QAAQ,QAAQ,OAAO,MAAM,OAAO;CAClD;CAEA,OAAO;AACT;AAEA,SAAS,eAAe,KAAa,KAAqB;CACxD,OAAO,eAAe,GAAG,IAAI;AAC/B;;;;;;;;;;ACliCA,MAAa,gBAAoD;CAC/D,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,QAAkB,CACtB,iFACF;EACA,KAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAuD;IAC3D,GAAG,KAAK;IACR,GAAG,KAAK;GACV;GACA,IAAI,KAAK,OAAO,UAAU,IAAI;GAC9B,IAAI,KAAK,YAAY,UAAU,IAAI;GACnC,MAAM,KAAK,KAAK,MAAM,SAAS,EAAE,GAAG;EACtC;EACA,MAAM,KAAK,cAAc;EACzB,OAAO,MAAM,KAAK,EAAE;CACtB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAoC,CAAC;EAC3C,MAAM,QAAoB,CAAC;EAC3B,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG;GACrC,IAAI,MAAM,SAAS,KAAK;GACxB,MAAM,IAAI,MAAM,aAAa;GAC7B,MAAM,IAAI,MAAM,aAAa;GAC7B,IAAI,KAAK,GAAG;IACV,MAAM,OAAiB;KACrB,WAAW,OAAO,CAAC;KACnB,YAAY,OAAO,CAAC;IACtB;IACA,IAAI,MAAM,aAAa,MAAM,KAAK,QAAQ;IAC1C,IAAI,WAAW,MAAM,aAAa,IAAI,GAAG,KAAK,aAAa;IAC3D,MAAM,KAAK,IAAI;GACjB;EACF;EACA,OAAO,QAAQ;EACf,OAAO;CACT;AACF;;;;;;;;;;;;AC2BA,MAAa,iBAAgE;CAC3E,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,kKAEF;EAGA,IAAI,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;GACpD,MAAM,UAAoB,CAAC;GAC3B,IAAI,KAAK,UAAU,QAAQ,KAAK,YAAY,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,EAAE,GAAG;GAC7E,MAAM,UAAoB,CAAC;GAC3B,IAAI,KAAK,WAAW,QAAQ,KAAK,kBAAgB;GACjD,IAAI,KAAK,UAAU,QAAQ,KAAK,cAAc,UAAU,KAAK,QAAQ,EAAE,EAAE;GACzE,EAAE,KAAK,WAAW,QAAQ,KAAK,EAAE,EAAE,GAAG,QAAQ,KAAK,EAAE,EAAE,WAAW;EACpE;EAGA,MAAM,UAAoB,CAAC,sBAAoB;EAC/C,IAAI,KAAK,WAAW,QAAQ,KAAK,iBAAe;EAChD,EAAE,KAAK,0BAA0B,QAAQ,KAAK,GAAG,EAAE,gBAAgB;EAGnE,IAAI,KAAK,iBAAiB;GACxB,MAAM,KAAK,KAAK;GAChB,MAAM,UAAoB,CAAC;GAC3B,IAAI,GAAG,SAAS,QAAQ,KAAK,cAAc;GAC3C,IAAI,GAAG,SAAS,QAAQ,KAAK,cAAc;GAC3C,IAAI,QAAQ,SAAS,GACnB,EAAE,KAAK,mBAAmB,QAAQ,KAAK,EAAE,EAAE,GAAG;EAElD;EAGA,IAAI,KAAK,aAAa;GACpB,MAAM,KAAK,KAAK;GAChB,EAAE,KACA,eAAe,MAAM;IACnB,MAAM,cAAc,GAAG,QAAQ,EAAG;IAClC,OAAO,cAAc,GAAG,SAAS,EAAG;IACpC,KAAK,cAAc,GAAG,OAAO,GAAI;IACjC,QAAQ,cAAc,GAAG,UAAU,GAAI;IACvC,QAAQ,cAAc,GAAG,UAAU,EAAG;IACtC,QAAQ,cAAc,GAAG,UAAU,EAAG;GACxC,CAAC,EAAE,GACL;EACF;EAGA,IAAI,KAAK,WAAW;GAClB,MAAM,KAAK,KAAK;GAChB,EAAE,KACA,aAAa,MAAM;IACjB,WAAW,GAAG;IACd,aAAa,GAAG;IAChB,eAAe,GAAG;IAClB,aAAa,GAAG;IAChB,QAAQ,GAAG;GACb,CAAC,EAAE,GACL;EACF;EAGA,IAAI,KAAK,cAAc;GACrB,MAAM,KAAK,KAAK;GAChB,MAAM,UAAoB,CAAC;GAC3B,IAAI,GAAG,gBAAgB,QAAQ,KAAK,qBAAqB;GACzD,IAAI,GAAG,kBAAkB,QAAQ,KAAK,uBAAuB;GAC7D,MAAM,YAAsB,CAAC;GAC7B,IAAI,GAAG,WAAW,UAAU,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,aAAa;GACpF,IAAI,GAAG,WAAW,UAAU,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,aAAa;GACpF,EAAE,KAAK,gBAAgB,QAAQ,KAAK,EAAE,EAAE,GAAG,UAAU,KAAK,EAAE,EAAE,gBAAgB;EAChF;EAGA,EAAE,KAAK,kBAAkB,UAAU,KAAK,UAAU,EAAE,IAAI;EAExD,EAAE,KAAK,eAAe;EACtB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAA+C,CAAC;EAKtD,MAAM,UAAU,UAAU,IAAI,SAAS;EACvC,IAAI,SAAS;GACX,IAAI,WAAW,KAAK,SAAS,WAAW,CAAC,GAAG,OAAO,YAAY;GAC/D,IAAI,KAAK,SAAS,UAAU,GAAG,OAAO,WAAW,KAAK,SAAS,UAAU;GACzE,MAAM,WAAW,UAAU,SAAS,UAAU;GAC9C,IAAI,UAAU;IACZ,MAAM,MAAM,KAAK,UAAU,KAAK;IAChC,IAAI,KAAK,OAAO,WAAW,OAAO,GAAG;GACvC;EACF;EAGA,MAAM,aAAa,UAAU,IAAI,YAAY;EAC7C,IAAI,YAAY;GACd,MAAM,KAAK,UAAU,YAAY,WAAW;GAC5C,IAAI,MAAM,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAClE;EAGA,MAAM,oBAAoB,UAAU,IAAI,iBAAiB;EACzD,IAAI,mBAAmB;GACrB,MAAM,KAA2C,CAAC;GAClD,IAAI,WAAW,KAAK,mBAAmB,SAAS,CAAC,GAAG,GAAG,UAAU;GACjE,IAAI,WAAW,KAAK,mBAAmB,SAAS,CAAC,GAAG,GAAG,UAAU;GACjE,OAAO,kBAAkB;EAC3B;EAGA,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe;GACjB,MAAM,KAAqC,CAAC;GAC5C,MAAM,KAAK,QAAQ,eAAe,MAAM;GACxC,IAAI,OAAO,KAAA,GAAW,GAAG,OAAO;GAChC,MAAM,KAAK,QAAQ,eAAe,OAAO;GACzC,IAAI,OAAO,KAAA,GAAW,GAAG,QAAQ;GACjC,MAAM,KAAK,QAAQ,eAAe,KAAK;GACvC,IAAI,OAAO,KAAA,GAAW,GAAG,MAAM;GAC/B,MAAM,KAAK,QAAQ,eAAe,QAAQ;GAC1C,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,MAAM,KAAK,QAAQ,eAAe,QAAQ;GAC1C,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,MAAM,KAAK,QAAQ,eAAe,QAAQ;GAC1C,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,OAAO,cAAc;EACvB;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,KAAmC,CAAC;GAC1C,MAAM,KAAK,QAAQ,aAAa,WAAW;GAC3C,IAAI,OAAO,KAAA,GAAW,GAAG,YAAY;GACrC,MAAM,SAAS,KAAK,aAAa,aAAa;GAC9C,IAAI,QAAQ,GAAG,cAAc;GAC7B,MAAM,OAAO,QAAQ,aAAa,eAAe;GACjD,IAAI,SAAS,KAAA,GAAW,GAAG,gBAAgB;GAC3C,MAAM,OAAO,QAAQ,aAAa,aAAa;GAC/C,IAAI,SAAS,KAAA,GAAW,GAAG,cAAc;GACzC,MAAM,SAAS,QAAQ,aAAa,QAAQ;GAC5C,IAAI,WAAW,KAAA,GAAW,GAAG,SAAS;GACtC,OAAO,YAAY;EACrB;EAGA,MAAM,iBAAiB,UAAU,IAAI,cAAc;EACnD,IAAI,gBAAgB;GAClB,MAAM,KAA6C,CAAC;GACpD,IAAI,WAAW,KAAK,gBAAgB,gBAAgB,CAAC,GAAG,GAAG,iBAAiB;GAC5E,IAAI,WAAW,KAAK,gBAAgB,kBAAkB,CAAC,GAAG,GAAG,mBAAmB;GAChF,MAAM,KAAK,UAAU,gBAAgB,WAAW;GAChD,IAAI,IAAI,GAAG,YAAY,OAAO,EAAE;GAChC,MAAM,MAAM,UAAU,gBAAgB,WAAW;GACjD,IAAI,KAAK,GAAG,YAAY,OAAO,GAAG;GAClC,OAAO,eAAe;EACxB;EAEA,OAAO;CACT;AACF;;;;;;;;;;;ACnOA,MAAa,eAAqD;CAChE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,IAAI,KAAK,SAAS,WAAW,GAAG,OAAO,KAAA;EACvC,MAAM,UAAU,eAAe,KAAK,QAAQ;EAC5C,MAAM,IAAc,CAClB,gKACA,WACF;EAEA,KAAK,MAAM,UAAU,SACnB,EAAE,KAAK,WAAW,UAAU,MAAM,EAAE,UAAU;EAGhD,EAAE,KAAK,yBAAyB;EAEhC,KAAK,MAAM,SAAS,KAAK,UAAU;GACjC,MAAM,WAAW,QAAQ,QAAQ,MAAM,MAAM;GAC7C,MAAM,UACJ,OAAO,MAAM,SAAS,WAClB,MAAM,UAAU,MAAM,IAAI,EAAE,QAC5B,YAAY,MAAM,IAAI;GAK5B,EAAE,KACA,iBAAiB,MAAM,KAAK,cAAc,SAAS,UAAU,QAAQ,kBACvE;EACF;EAEA,EAAE,KAAK,2BAA2B;EAClC,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,WAA6B,CAAC;EACpC,MAAM,UAAoB,CAAC;EAE3B,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI;QACG,MAAM,KAAK,UAAU,YAAY,CAAC,GACrC,IAAI,EAAE,SAAS,UAAU,QAAQ,KAAK,OAAO,CAAC,KAAK,EAAE;EAAA;EAIzD,MAAM,SAAS,UAAU,IAAI,aAAa;EAC1C,IAAI,QACF,KAAK,MAAM,KAAK,OAAO,YAAY,CAAC,GAAG;GACrC,IAAI,EAAE,SAAS,WAAW;GAC1B,MAAM,MAAM,KAAK,GAAG,KAAK,KAAK;GAC9B,MAAM,WAAW,OAAO,KAAK,GAAG,UAAU,KAAK,CAAC;GAChD,MAAM,SAAS,UAAU,GAAG,MAAM;GAClC,MAAM,OAAO,SAAS,SAAS,MAAM,IAAI;GACzC,MAAM,cAAc,UAAU,GAAG,WAAW;GAC5C,MAAM,UAA0B;IAC9B,MAAM;IACN,QAAQ,QAAQ,aAAa;IAC7B;GACF;GACA,IAAI,aAAa,QAAQ,YAAY,eAAe,WAAW;GAC/D,SAAS,KAAK,OAAO;EACvB;EAGF,OAAO,EAAE,SAAS;CACpB;AACF;AAoBA,MAAa,eAAoF;CAC/F,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,IAAI,KAAK,SAAS,WAAW,GAAG,OAAO,KAAA;EAEvC,MAAM,IAAc;GAClB;GACA,wBAAwB;IAAE,KAAK;IAAQ,OAAO;KAAE,KAAK;KAAQ,MAAM;IAAI;GAAE,CAAC;GAC1E,sBAAsB;IACpB,IAAI;IACJ,WAAW;IACX,KAAK;IACL,MAAM;IACN,QAAQ,EAAE,WAAW,QAAQ;IAC7B,aAAa;KAAE,iBAAiB;KAAM,aAAa;IAAO;GAC5D,CAAC;EACH;EAEA,KAAK,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS,QAAQ,GAAG;GAC5C,MAAM,EAAE,KAAK,QAAQ,mBAAmB,EAAE,IAAI;GAC9C,MAAM,SAAS,EAAE,UAAU;IAAC;IAAK;IAAG;IAAK;IAAG,MAAM;IAAG;IAAG,MAAM;IAAG;GAAC;GAClE,MAAM,QAAQ;IACZ,UAAU;IACV,YAAY;IACZ,WAAW;IACX,OAAO,GAAG,EAAE,MAAM,SAAS,mBAAmB;IAC9C,QAAQ,GAAG,EAAE,MAAM,UAAU,oBAAoB;IACjD,QAAQ;GACV;GACA,IAAI,CAAC,EAAE,SAAS,MAAM,aAAa;GACnC,EAAE,KACA,kBAAkB;IAChB,IAAI,WAAW,OAAO;IACtB,MAAM;IACN;IACA,WAAW;IACX,aAAa;IACb,WAAW;IACX,MAAM,EAAE,QAAQ,sBAAsB;IACtC,QAAQ;KAAE,OAAO;KAAa,UAAU;IAAK;IAC7C,aAAa,EAAE,aAAa,OAAO;IACnC,SAAS;KACP,OAAO,EAAE,cAAc,OAAO;KAC9B,SAAS;IACX;IACA,YAAY;KACV,YAAY;KACZ,eAAe;KACf,eAAe;KACf,QAAQ,OAAO,KAAK,IAAI;KACxB,UAAU;KACV,KAAK;KACL,QAAQ;IACV;GACF,CAAC,CACH;EACF;EAEA,EAAE,KAAK,QAAQ;EACf,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,UAA2B,CAAC;EAClC,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG;GACrC,IAAI,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW;GAC1D,MAAM,QAAQ,cAAc,KAAK;GACjC,MAAM,KAAK,MAAM;GACjB,IAAI,CAAC,MAAM,GAAG,eAAe,UAAU,GAAG,QAAQ,KAAA,KAAa,GAAG,WAAW,KAAA,GAC3E;GAEF,MAAM,OAAsB;IAC1B,KAAK,GAAG;IACR,QAAQ,GAAG;IACX,SAAS,MAAM,OAAO,eAAe;GACvC;GACA,MAAM,QAAQ,GAAG,UAAU,GAAA,CACxB,MAAM,QAAQ,CAAC,CACf,OAAO,OAAO,CAAC,CACf,IAAI,MAAM;GACb,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,KAAK,SAAS;GAC5E,MAAM,QAAQ,WAAW,MAAM,OAAO,KAAK;GAC3C,IAAI,UAAU,KAAA,GAAW,KAAK,QAAQ;GACtC,MAAM,SAAS,WAAW,MAAM,OAAO,MAAM;GAC7C,IAAI,WAAW,KAAA,GAAW,KAAK,SAAS;GACxC,QAAQ,KAAK,IAAI;EACnB;EACA,OAAO;CACT;AACF;;AAGA,SAAS,WAAW,OAAmD;CACrE,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,YAAY,CAAC,WAAW,KAAK,KAAK,GAAG,OAAO,KAAA;CACjE,OAAO,YAAY,KAAyB;AAC9C;;AAGA,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;;AAG5B,SAAgB,iBACd,UACA,SACM;CACN,IAAI,CAAC,YAAY,QAAQ,WAAW,GAAG;CACvC,KAAK,MAAM,QAAQ,SAAS;EAC1B,MAAM,UAAU,SAAS,MAAM,MAAM;GACnC,MAAM,EAAE,KAAK,QAAQ,mBAAmB,EAAE,IAAI;GAC9C,OAAO,QAAQ,KAAK,UAAU,QAAQ,KAAK;EAC7C,CAAC;EACD,IAAI,CAAC,SAAS;EACd,IAAI,KAAK,WAAW,KAAA,GAAW,QAAQ,SAAS,KAAK;EACrD,IAAI,KAAK,SAAS,QAAQ,UAAU;EACpC,IAAI,KAAK,UAAU,KAAA,KAAa,KAAK,WAAW,KAAA,GAC9C,QAAQ,OAAO;GACb,OAAO,KAAK,SAAS;GACrB,QAAQ,KAAK,UAAU;EACzB;CAEJ;AACF;AAIA,SAAS,eAAe,UAAsC;CAC5D,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,SAAmB,CAAC;CAC1B,KAAK,MAAM,SAAS,UAClB,IAAI,CAAC,KAAK,IAAI,MAAM,MAAM,GAAG;EAC3B,KAAK,IAAI,MAAM,MAAM;EACrB,OAAO,KAAK,MAAM,MAAM;CAC1B;CAEF,OAAO,OAAO,SAAS,IAAI,SAAS,CAAC,EAAE;AACzC;AAIA,SAAS,eAAe,IAA0C;CAChE,MAAM,KAA+B,CAAC;CACtC,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,GAAG,SAAS,WAAW,MAAM,KAAK;CAC5D,MAAM,cAAc,KAAK,IAAI,aAAa;CAC1C,IAAI,gBAAgB,KAAA,GAAW,GAAG,cAAc,WAAW,WAAW,KAAK;CAC3E,MAAM,QAAQ,KAAK,IAAI,OAAO;CAC9B,IAAI,UAAU,KAAA,GAAW,GAAG,QAAQ,WAAW,KAAK,KAAK;CACzD,MAAM,WAAW,KAAK,IAAI,UAAU;CACpC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW,WAAW,QAAQ,KAAK;CAClE,MAAM,WAAW,KAAK,IAAI,UAAU;CACpC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW,WAAW,QAAQ,KAAK;CAClE,MAAM,WAAW,KAAK,IAAI,UAAU;CACpC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW,WAAW,QAAQ,KAAK;CAClE,MAAM,UAAU,KAAK,IAAI,SAAS;CAClC,IAAI,YAAY,KAAA,GAAW,GAAG,UAAU;CACxC,MAAM,aAAa,KAAK,IAAI,YAAY;CACxC,IAAI,eAAe,KAAA,GACjB,GAAG,aAAa;CAClB,MAAM,aAAa,KAAK,IAAI,YAAY;CACxC,IAAI,eAAe,KAAA,GACjB,GAAG,aAAa;CAClB,MAAM,WAAW,KAAK,IAAI,UAAU;CACpC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW,WAAW,QAAQ,KAAK;CAClE,MAAM,YAAY,KAAK,IAAI,WAAW;CACtC,IAAI,cAAc,KAAA,GAAW,GAAG,YAAY,WAAW,SAAS,KAAK;CACrE,MAAM,YAAY,KAAK,IAAI,WAAW;CACtC,IAAI,cAAc,KAAA,GAAW,GAAG,YAAY,WAAW,SAAS,KAAK;CACrE,MAAM,WAAW,UAAU,IAAI,QAAQ;CACvC,IAAI,UAAU,GAAG,SAAS,YAAY,QAAQ;CAC9C,OAAO;AACT;AAEA,SAAS,YAAY,IAAqC;CACxD,MAAM,SAA8B;EAClC,eAAe,WAAW,KAAK,IAAI,eAAe,CAAC;EACnD,eAAe,WAAW,KAAK,IAAI,eAAe,CAAC;CACrD;CACA,MAAM,OAAO,UAAU,IAAI,UAAU;CACrC,IAAI,MAAM,OAAO,OAAO,YAAY,IAAI;CACxC,MAAM,KAAK,UAAU,IAAI,QAAQ;CACjC,IAAI,IAAI,OAAO,KAAK,YAAY,EAAE;CAClC,OAAO;AACT;AAEA,SAAS,YAAY,IAAqC;CACxD,MAAM,OAAO,QAAgB,OAAO,OAAO,UAAU,IAAI,GAAG,CAAE,KAAK,CAAC;CACpE,OAAO;EACL,KAAK,IAAI,SAAS;EAClB,QAAQ,IAAI,YAAY;EACxB,KAAK,IAAI,SAAS;EAClB,QAAQ,IAAI,YAAY;CAC1B;AACF;AAGA,SAAS,mBAAmB,KAA2C;CACrE,IAAI,IAAI;CACR,OAAO,IAAI,IAAI,UAAU,IAAI,WAAW,CAAC,KAAK,MAAM,IAAI,WAAW,CAAC,KAAK,IAAI;CAC7E,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,MAAM,MAAM,MAAM,IAAI,WAAW,CAAC,IAAI;CAClE,OAAO;EAAE,KAAK,MAAM;EAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI;CAAE;AAC7D;;AAGA,SAAS,YAAY,KAA8B;CACjD,MAAM,OAAO,IAAI,QAAQ,CAAC;CAC1B,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,IAAI;EAClB,IAAI,CAAC,OAAO;GACV,MAAM,KAAK,SAAS,UAAU,IAAI,IAAI,EAAE,SAAS;GACjD;EACF;EACA,MAAM,MAAgB,CAAC;EACvB,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM;EAC/B,IAAI,MAAM,QAAQ,IAAI,KAAK,MAAM;EACjC,IAAI,MAAM,WAAW,IAAI,KAAK,WAAW,MAAM,UAAU,IAAI;EAC7D,IAAI,MAAM,QAAQ,IAAI,KAAK,WAAW;EACtC,IAAI,MAAM,MAAM,IAAI,KAAK,YAAY,MAAM,KAAK,IAAI;EACpD,IAAI,MAAM,OAAO,IAAI,KAAK,eAAe,MAAM,MAAM,IAAI;EACzD,IAAI,MAAM,MAAM,IAAI,KAAK,eAAe,MAAM,KAAK,IAAI;EACvD,MAAM,SAAS,IAAI,SAAS,QAAQ,IAAI,KAAK,EAAE,EAAE,UAAU;EAC3D,MAAM,KAAK,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI,EAAE,SAAS;CAC5D;CACA,OAAO,MAAM,KAAK,EAAE;AACtB;;AAGA,SAAS,SAAS,QAA8C;CAC9D,MAAM,OAA6B,CAAC;CACpC,MAAM,QAAkB,CAAC;CACzB,IAAI,UAAU;CACd,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GACtC,IAAI,MAAM,SAAS,KACjB,MAAM,KAAK,OAAO,KAAK,KAAK,EAAE;MACzB,IAAI,MAAM,SAAS,KAAK;EAC7B,UAAU;EACV,MAAM,IAAI,UAAU,OAAO,GAAG;EAC9B,MAAM,MAA0B,EAAE,MAAM,IAAK,OAAO,CAAC,KAAK,KAAM,GAAG;EACnE,MAAM,MAAM,UAAU,OAAO,KAAK;EAClC,IAAI,KAAK;GACP,MAAM,QAAsC,CAAC;GAC7C,IAAI,UAAU,KAAK,GAAG,GAAG,MAAM,OAAO;GACtC,IAAI,UAAU,KAAK,GAAG,GAAG,MAAM,SAAS;GACxC,MAAM,MAAM,UAAU,KAAK,GAAG;GAC9B,IAAI,KACF,MAAM,YACH,KAAK,KAAK,KAAK,KAAmD;GACvE,IAAI,UAAU,KAAK,QAAQ,GAAG,MAAM,SAAS;GAC7C,MAAM,OAAO,UAAU,KAAK,IAAI;GAChC,IAAI,MAAM;IACR,MAAM,KAAK,OAAO,KAAK,MAAM,KAAK,CAAC;IACnC,IAAI,CAAC,OAAO,MAAM,EAAE,GAAG,MAAM,OAAO;GACtC;GACA,MAAM,UAAU,UAAU,KAAK,OAAO;GACtC,IAAI,WAAW,KAAK,SAAS,KAAK,GAAG,MAAM,QAAQ,KAAK,SAAS,KAAK;GACtE,MAAM,UAAU,UAAU,KAAK,OAAO;GACtC,IAAI,WAAW,KAAK,SAAS,KAAK,GAAG,MAAM,OAAO,KAAK,SAAS,KAAK;GACrE,IAAI,aAAa;EACnB;EACA,KAAK,KAAK,GAAG;CACf;CAEF,IAAI,SAAS,OAAO,EAAE,KAAK;CAC3B,OAAO,MAAM,KAAK,EAAE;AACtB;;;;AClVA,MAAa,eAAe;CAC1B,SAAS;CACT,SAAS;CACT,UAAU;AACZ;;AAIA,MAAa,gBAAgB;CAC3B,SAAS;CACT,SAAS;CACT,UAAU;AACZ;;;;;;;;AC3BA,SAAS,aAAa,IAAgB,KAAqB;CACzD,MAAM,QAAQ,UAAU,IAAI,GAAG;CAC/B,IAAI,CAAC,OAAO,UAAU,QAAQ,OAAO;CACrC,MAAM,IAAI,OAAO,MAAM,SAAS,EAAE,EAAE,QAAQ,EAAE;CAC9C,OAAO,OAAO,MAAM,CAAC,IAAI,IAAI;AAC/B;AASA,SAAS,WAAW,IAAwB;CAC1C,OAAO;EACL,KAAK,aAAa,IAAI,KAAK,IAAI;EAC/B,WAAW,aAAa,IAAI,QAAQ,KAAK,KAAA;EACzC,KAAK,aAAa,IAAI,KAAK,IAAI;EAC/B,WAAW,aAAa,IAAI,QAAQ,KAAK,KAAA;CAC3C;AACF;;AAGA,SAAS,iBAAiB,QAAoB,MAAc,QAAoC;CAC9F,OAAO,MAAM;CACb,OAAO,MAAM;CAEb,MAAM,aAAa,UAAU,QAAQ,YAAY;CACjD,IAAI,YAAY,YAAY;EAC1B,IAAI,WAAW,WAAW,uBAAuB,KAAA,GAC/C,OAAO,iBAAiB,WAAW,WAAW,WAAW,kBAAkB,KAAK;EAElF,IAAI,WAAW,WAAW,wBAAwB,KAAA,GAChD,OAAO,kBAAkB,WAAW,WAAW,WAAW,mBAAmB,KAAK;CAEtF;CAEA,MAAM,WAAW,OAAqC;EACpD,IAAI,CAAC,IAAI,YAAY;EACrB,MAAM,KAAK,OAAO,GAAG,WAAW,KAAK;EACrC,MAAM,KAAK,OAAO,GAAG,WAAW,KAAK;EACrC,IAAI,CAAC,OAAO,MAAM,EAAE,GAAG,OAAO,WAAW;EACzC,IAAI,CAAC,OAAO,MAAM,EAAE,GAAG,OAAO,WAAW;CAC3C;CAEA,IAAI,SAAS,kBAAkB;EAC7B,OAAO,aAAa,aAAa;EACjC,MAAM,MAAM,UAAU,QAAQ,KAAK;EACnC,IAAI,KAAK,YAAY;GACnB,MAAM,IAAI,OAAO,IAAI,WAAW,IAAI;GACpC,MAAM,IAAI,OAAO,IAAI,WAAW,IAAI;GACpC,IAAI,CAAC,OAAO,MAAM,CAAC,GAAG,OAAO,YAAY;GACzC,IAAI,CAAC,OAAO,MAAM,CAAC,GAAG,OAAO,YAAY;EAC3C;EACA,QAAQ,UAAU,QAAQ,KAAK,CAAC;EAChC;CACF;CAEA,MAAM,OAAO,UAAU,QAAQ,MAAM;CACrC,IAAI,MAAM;EACR,MAAM,IAAI,WAAW,IAAI;EACzB,OAAO,MAAM,EAAE;EACf,OAAO,MAAM,EAAE;EACf,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,YAAY,EAAE;EACpD,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,YAAY,EAAE;CACtD;CAEA,IAAI,SAAS,iBAAiB;EAC5B,OAAO,aAAa,aAAa;EACjC,QAAQ,UAAU,QAAQ,KAAK,CAAC;EAChC;CACF;CAGA,OAAO,aAAa,aAAa;CACjC,MAAM,KAAK,UAAU,QAAQ,IAAI;CACjC,IAAI,IAAI;EACN,MAAM,IAAI,WAAW,EAAE;EACvB,OAAO,QAAQ,EAAE;EACjB,OAAO,QAAQ,EAAE;EACjB,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,cAAc,EAAE;EACtD,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,cAAc,EAAE;CACxD;CACA,MAAM,SAAS,OAAO,aAAa;CACnC,IAAI,QAAQ,OAAO,SAAS;AAC9B;;AAGA,SAAS,UACP,QACA,cAC4C;CAC5C,MAAM,YAAY,UAAU,QAAQ,YAAY;CAEhD,OAAO,gCADO,YAAY,UAAU,WAAW,OAAO,IAAI,KAAA,CACd;AAC9C;AAEA,SAAgB,iBACd,QACA,KACA,MACuB;CACvB,MAAM,SAAgC;EACpC,KAAK;EACL,KAAK;EACL,KAAK,WAAW,GAAG,KAAK;CAC1B;CAGA,MAAM,MAAM,cAAc,GAAG;CAC7B,IAAI,IAAI,OAAO,KAAA,GAAW,OAAO,WAAW,IAAI;CAChD,IAAI,IAAI,OAAO,KAAA,GAAW,OAAO,WAAW,IAAI;CAEhD,iBAAiB,QAAQ,MAAM,MAAM;CACrC,OAAO;AACT;AAEA,SAAS,WAAW,KAAqC;CAGvD,OADa,UADI,UAAU,KAAK,UAAU,KAAK,KACd,QACvB,CAAC,EAAE,aAAa;AAC5B;;AAGA,SAAS,cAAc,KAA+C;CACpE,MAAM,OAAO,UAAU,KAAK,MAAM;CAClC,MAAM,OAAO,OAAO,UAAU,MAAM,QAAQ,IAAI,KAAA;CAChD,MAAM,MAAM,OAAO,UAAU,MAAM,OAAO,IAAI,KAAA;CAC9C,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC;CAC9B,MAAM,KAAK,OAAO,IAAI,WAAW,KAAK;CACtC,MAAM,KAAK,OAAO,IAAI,WAAW,KAAK;CACtC,OAAO;EACL,IAAI,OAAO,MAAM,EAAE,IAAI,KAAA,IAAY;EACnC,IAAI,OAAO,MAAM,EAAE,IAAI,KAAA,IAAY;CACrC;AACF;AAEA,SAAgB,iBACd,QACA,cACiC;CACjC,MAAM,cAAc,UAClB,UAAU,cAAc,WAAW,KAAK,cACxC,eACF;CAEA,MAAM,OADU,cAAc,UAAU,aAAa,SAAS,IAAI,KAAA,EAAA,EAC7C,aAAa;CAClC,IAAI,CAAC,KAAK,OAAO,KAAA;CAEjB,MAAM,SAA8B;EAAE,KAAK;EAAG,KAAK;EAAG;CAAI;CAC1D,MAAM,OAAO,UAAU,QAAQ,MAAM;CACrC,IAAI,MAAM;EACR,MAAM,IAAI,WAAW,IAAI;EACzB,OAAO,MAAM,EAAE;EACf,OAAO,MAAM,EAAE;EACf,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,YAAY,EAAE;EACpD,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,YAAY,EAAE;CACtD;CACA,MAAM,aAAa,UAAU,QAAQ,YAAY;CACjD,IAAI,YAAY,YAAY;EAC1B,IAAI,WAAW,WAAW,uBAAuB,KAAA,GAC/C,OAAO,iBAAiB,WAAW,WAAW,WAAW,kBAAkB,KAAK;EAElF,IAAI,WAAW,WAAW,wBAAwB,KAAA,GAChD,OAAO,kBAAkB,WAAW,WAAW,WAAW,mBAAmB,KAAK;CAEtF;CACA,OAAO;AACT;AAEA,SAAgB,iBACd,QACA,IACA,MACA,KACc;CACd,MAAM,SAAS;EAAE,KAAK;EAAG,KAAK;EAAG,MAAM,CAAC;CAAE;CAC1C,iBAAiB,QAAQ,MAAM,MAAM;CAErC,OAAO,OAAO,QAAQ,UAAU,IAAI,QAAQ,CAAC;CAE7C,MAAM,OAAO,UAAU,IAAI,MAAM;CACjC,IAAI,MAAM,OAAO,OAAO,oBAAoB,MAAM,MAAM,GAAG;CAE3D,MAAM,SAAS,UAAU,IAAI,QAAQ;CACrC,IAAI,QAAQ,OAAO,WAAW,aAAa,MAAM,QAAQ,GAAG;CAE5D,IAAI,GAAG,aAAa,aAAa,KAAA,GAAW,OAAO,QAAQ,OAAO,GAAG,WAAW,QAAQ;CACxF,IAAI,GAAG,aAAa,gBAAgB,KAAA,GAClC,OAAO,WAAW,OAAO,GAAG,WAAW,WAAW;CACpD,OAAO;AACT;;AAGA,SAAS,uBACP,QAKA,OACA,KACM;CACN,MAAM,YAAY,UAAU,OAAO,WAAW;CAC9C,IAAI,CAAC,WAAW;CAChB,MAAM,aAAa,UAAU,WAAW,YAAY;CACpD,IAAI,CAAC,YAAY;CACjB,MAAM,aAAa,UAAU,YAAY,cAAc;CACvD,IAAI,YAAY;EACd,MAAM,QAAQ,qBAAqB,MAAM,YAAY,GAAG;EACxD,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO,UAAU;CAC/D;CACA,MAAM,QAAQ,UAAU,YAAY,SAAS;CAC7C,IAAI,OAAO;EACT,MAAM,OAAO,wBAAwB,KAAK;EAC1C,IAAI,MAAM,OAAO,kBAAkB;CACrC;CACA,MAAM,SAAS,UAAU,YAAY,UAAU;CAC/C,IAAI,QAAQ;EACV,MAAM,OAAO,wBAAwB,MAAM;EAC3C,IAAI,MAAM,OAAO,gBAAgB;CACnC;AACF;AAEA,SAAgB,qBACd,QACA,OACA,MACA,KACkB;CAClB,MAAM,SAAS;EAAE,KAAK;EAAG,KAAK;EAAG,MAAM,CAAC;CAAE;CAC1C,iBAAiB,QAAQ,MAAM,MAAM;CAErC,OAAO,OAAO,QAAQ,UAAU,OAAO,WAAW,CAAC;CAEnD,MAAM,OAAO,UAAU,OAAO,MAAM;CACpC,IAAI,MAAM,OAAO,OAAO,oBAAoB,MAAM,MAAM,GAAG;CAE3D,IAAI,MAAM,aAAa,aAAa,KAAA,GAAW,OAAO,QAAQ,OAAO,MAAM,WAAW,QAAQ;CAE9F,uBAAuB,QAAQ,OAAO,GAAG;CACzC,OAAO;AACT;AAEA,SAAgB,iBACd,QACA,OACA,MACA,KACc;CACd,MAAM,SAAS;EAAE,KAAK;EAAG,KAAK;EAAG,SAAS,CAAC;CAAE;CAC7C,iBAAiB,QAAQ,MAAM,MAAM;CAErC,OAAO,OAAO,QAAQ,UAAU,OAAO,WAAW,CAAC;CAEnD,MAAM,YAAY,UAAU,OAAO,SAAS;CAC5C,IAAI,WACF,OAAO,UAAU,yBAAyB,MAAM,WAAW,GAAG;CAGhE,MAAM,SAAmC,CAAC;CAC1C,MAAM,kBAAgD,CAAC;CACvD,KAAK,MAAM,SAAS,MAAM,YAAY,CAAC,GACrC,IAAI,MAAM,SAAS,MAAM;EACvB,MAAM,OAAO,UAAU,OAAO,MAAM;EACpC,MAAM,aAAa,EACjB,MAAM,OAAO,oBAAoB,MAAM,MAAM,GAAG,IAAI,CAAC,EACvD;EACA,OAAO,OAAO,YAAY,UAAU,OAAO,QAAQ,CAAC;EACpD,MAAM,SAAS,UAAU,OAAO,QAAQ;EACxC,IAAI,QAAQ,WAAW,WAAW,aAAa,MAAM,QAAQ,GAAG;EAChE,IAAI,MAAM,aAAa,aAAa,KAAA,GAClC,WAAW,QAAQ,OAAO,MAAM,WAAW,QAAQ;EACrD,IAAI,MAAM,aAAa,gBAAgB,KAAA,GACrC,WAAW,WAAW,OAAO,MAAM,WAAW,WAAW;EAC3D,OAAO,KAAK,UAAU;CACxB,OAAO,IAAI,MAAM,SAAS,SAAS;EACjC,MAAM,OAAO,UAAU,OAAO,MAAM;EACpC,MAAM,YAAY,EAChB,MAAM,OAAO,oBAAoB,MAAM,MAAM,GAAG,IAAI,CAAC,EACvD;EACA,OAAO,OAAO,WAAW,UAAU,OAAO,WAAW,CAAC;EACtD,IAAI,MAAM,aAAa,aAAa,KAAA,GAClC,UAAU,QAAQ,OAAO,MAAM,WAAW,QAAQ;EACpD,uBAAuB,WAAW,OAAO,GAAG;EAC5C,gBAAgB,KAAK,SAAS;CAChC;CAEF,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;CACvC,IAAI,gBAAgB,SAAS,GAAG,OAAO,aAAa;CACpD,OAAO;AACT;AAEA,SAAgB,uBACd,QACA,aACA,MACuC;CACvC,MAAM,MAAM,YAAY,aAAa;CACrC,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,MAAM,SAAS;EAAE,KAAK;EAAG,KAAK;EAAG;CAAI;CACrC,iBAAiB,QAAQ,MAAM,MAAM;CACrC,OAAO;AACT;;;;;;;;AClTA,MAAa,SAAS;AACtB,MAAa,OAAO;AACpB,MAAaC,SAAO;AACpB,MAAa,QAAQ;;AAQrB,SAAS,UACP,KACA,QACA,KACA,QACQ;CACR,OAAO,QAAQ,MAAM,EAAE,gBAAgB,aAAa,MAAM,EAAE,gBAAgB,MAAM,EAAE,gBAAgB,aAAa,MAAM,EAAE;AAC3H;AAEA,SAAgB,cAAc,KAGnB;CAGT,OAAO,gCAFO,IAAI,mBAAmB,QAAQ,IAAI,EAEJ,sBAD9B,IAAI,oBAAoB,QAAQ,IAAI,EACuB;AAC5E;;AAGA,SAAgB,WAAW,MAA4B,OAAuB;CAC5E,MAAM,aAAa,KAAK,cAAc,aAAa;CACnD,MAAM,KAAK,aAAa,KAAK,YAAA,GAA6B;CAC1D,MAAM,KAAK,aAAa,KAAK,YAAA,GAA6B;CAE1D,IAAI,eAAe,aAAa,UAG9B,OAAO,2BAFG,aAAa,KAAK,aAAa,CAEP,EAAE,OAD1B,aAAa,KAAK,aAAa,CACE,EAAE,cAAc,GAAG,QAAQ,GAAG,KAAK,MAAM;CAGtF,MAAM,OAAO,UAAU,KAAK,KAAK,KAAK,aAAa,GAAG,KAAK,KAAK,KAAK,aAAa,CAAC;CAEnF,IAAI,eAAe,aAAa,SAC9B,OAAO,wBAAwB,KAAK,kBAAkB,GAAG,QAAQ,GAAG,KAAK,MAAM;CAWjF,OAAO,0BAPQ,KAAK,UAAU,cAAc,QAOJ,UAAU,KAAK,aAN5C,UACT,KAAK,SAAS,KAAK,MAAM,GACzB,KAAK,eAAe,GACpB,KAAK,SAAS,KAAK,MAAM,GACzB,KAAK,eAAe,CAE+C,EAAE,OAAO,MAAM;AACtF;AAEA,SAAS,OACP,KACA,IACA,IACA,IACA,KACQ;CACR,MAAM,OACJ,oBAAoB,UAAU;EAAE,GAAG;EAAG,GAAG;EAAG,OAAO;EAAI,QAAQ;EAAI,UAAU;CAAO,GAAG,GAAG,KAC1F;CACF,OACE,iBAAiB,oCAAoC,SAAS,IAAI,KAAK,WAAW,IAAI,EAAE,2EAC1D,IAAI,IAAI,0DAC7B,KAAK;AAElB;AAEA,SAAgB,eAAe,KAA4B,IAAY,KAA2B;CAIhG,OAAO,WAAW,KAAK,GADX,OAAO,KAAK,IAFb,aAAa,IAAI,YAAA,GAEC,GADlB,aAAa,IAAI,YAAA,GACK,GAAG,GACR,IAAI,cAAc,GAAG,GAAG;AACtD;;;;;;AAOA,SAAgB,gBACd,IACA,OACA,MACA,KACA,IACA,IACQ;CACR,OACE,mCAAmC,oCAAoC,SAAS,IAAI,OAAO,IAAI,EAAA,iIAEvD,GAAG,QAAQ,GAAG,2CACpB,MAAM,uFAC8CA,OAAK,UAAU,IAAI;AAG7G;AAEA,SAAgB,eAAe,OAA4B,IAAoB;CAE7E,MAAM,OAAO,UAAU,MAAM,KAAK,MAAM,aAAa,GAAG,MAAM,KAAK,MAAM,aAAa,CAAC;CACvF,MAAM,KAAK,UAAU,MAAM,MAAM,GAAG,GAAG,MAAM,MAAM,IAAI,CAAC;CACxD,MAAM,aAAa,cAAc,KAAK;CAEtC,OAAO,yCAAyC,KAAK,aAAa,GAAG,OADvD,gBAAgB,IAAI,OAAO,SAAS,MAAM,MAAM,KAAK,GAAG,CACU,IAAI,WAAW;AACjG;;AAGA,SAAS,kBACP,OACA,IACA,cACA,MACA,UACA,KACA,QAAQ,IACA;CACR,MAAM,UAAU,oBAAoB,UAAU,MAAM,GAAG,KAAK;CAC5D,MAAM,YAAY,WAAW,WAAW,aAAa,UAAU,UAAU,GAAG,EAAE,aAAa;CAC3F,OAAO,MAAM,MAAM,WAAW,oCAAoC,SAAS,IAAI,OAAO,YAAY,EAAE,2BAA2B,QAAQ,SAAS,UAAU;AAC5J;;AAGA,SAAS,sBACP,OACA,IACA,cACA,MACA,KACA,QAAQ,IACR,WAKQ;CACR,MAAM,UAAU,oBAAoB,UAAU,MAAM,GAAG,KAAK;CAC5D,MAAM,kBAA4B,CAAC;CACnC,IAAI,WAAW,SAAS;EACtB,MAAM,QAAQ,qBAAqB,UAAU,UAAU,SAAS,GAAG;EACnE,IAAI,OAAO,gBAAgB,KAAK,KAAK;CACvC;CACA,IAAI,WAAW,iBACb,gBAAgB,KAAK,4BAA4B,SAAS,UAAU,eAAe,CAAC;CAEtF,IAAI,WAAW,eACb,gBAAgB,KAAK,4BAA4B,UAAU,UAAU,aAAa,CAAC;CAErF,MAAM,aAAa,gBAAgB,SAC/B,eAAe,gBAAgB,KAAK,EAAE,EAAE,iBACxC;CACJ,OAAO,SAAS,MAAM,cAAc,oCAAoC,SAAS,IAAI,OAAO,YAAY,IAAI,WAAW,oBAAoB,QAAQ;AACrJ;AAEA,SAAgB,eAAe,OAAqB,IAAY,KAA2B;CAUzF,OAAO,WAAW,OAAO,GATb,kBACV,OACA,IACA,SAAS,MACT,MAAM,MACN,MAAM,UACN,KACA,mBAAmB,KAAK,CAEI,IAAI,cAAc,KAAK,GAAG;AAC1D;AAEA,SAAgB,mBAAmB,MAAwB,IAAY,KAA2B;CAUhG,OAAO,WAAW,MAAM,GATZ,sBACV,MACA,IACA,aAAa,MACb,KAAK,MACL,KACA,mBAAmB,IAAI,GACvB,IAE2B,IAAI,cAAc,IAAI,GAAG;AACxD;AAEA,SAAgB,qBAAqB,IAAuC;CAC1E,OAAO,WAAW,IAAI,sBAAsB,GAAG,IAAI,KAAK,cAAc,EAAE,GAAG;AAC7E;;AAGA,SAAgB,WACd,KACA,IACA,KACiC;CACjC,MAAM,aAAa,yBAAyB,UAAU,IAAI,SAAS,GAAG,KAAK;CAC3E,IAAI,UAAU,KAAK;CACnB,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,cAAc,IAAI,UAAU,CAAC,GAAG;EACzC,SAAS,KACP,kBACE,YACA,SACA,SAAS,WACT,WAAW,MACX,WAAW,UACX,KACA,mBAAmB,UAAU,CAC/B,CACF;EACA;CACF;CACA,KAAK,MAAM,aAAa,IAAI,cAAc,CAAC,GAAG;EAC5C,SAAS,KACP,sBACE,WACA,SACA,aAAa,WACb,UAAU,MACV,KACA,mBAAmB,SAAS,GAC5B,SACF,CACF;EACA;CACF;CAIA,OAAO;EAAE,KAAA,qBAFc,oCAAoC,SAAS,IAAI,KAAK,SAAS,IAAI,EAAE,oCAC9E,WAAW,YAAY,SAAS,KAAK,EAAE,EAAE;EACzC,QAAQ;CAAQ;AAChC;;AAGA,SAAS,mBAAmB,OAAsD;CAChF,MAAM,IAAc,CAAC;CACrB,IAAI,MAAM,UAAU,KAAA,GAAW,EAAE,KAAK,UAAU,UAAU,MAAM,KAAK,EAAE,EAAE;CACzE,IAAI,MAAM,aAAa,KAAA,GAAW,EAAE,KAAK,aAAa,UAAU,MAAM,QAAQ,EAAE,EAAE;CAClF,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,GAAG,IAAI;AACxC;;;ACzOA,MAAa,cAAgD;CAC3D,MAAM;CAEN,UAAU,MAAM,KAAK;EACnB,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,MAAM,aAAa,KAAK,cAAc,CAAC;EACvC,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,MAAM,eAAe,KAAK,gBAAgB,CAAC;EAQ3C,IANE,OAAO,SACP,OAAO,SACP,OAAO,SACP,WAAW,SACX,OAAO,SACP,aAAa,WACD,GAAG,OAAO,KAAA;EAExB,MAAM,IAAc,CAAC,gBAAgB,OAAO,aAAa,KAAK,aAAaC,OAAK,GAAG;EACnF,IAAI,KAAK;EAET,KAAK,MAAM,OAAO,QAAQ;GACxB,EAAE,KAAK,eAAe,KAAK,IAAI,GAAG,CAAC;GACnC;EACF;EACA,KAAK,MAAM,SAAS,QAAQ;GAC1B,EAAE,KAAK,eAAe,OAAO,EAAE,CAAC;GAChC;EACF;EACA,KAAK,MAAM,SAAS,QAAQ;GAC1B,EAAE,KAAK,eAAe,OAAO,IAAI,GAAG,CAAC;GACrC;EACF;EACA,KAAK,MAAM,QAAQ,YAAY;GAC7B,EAAE,KAAK,mBAAmB,MAAM,IAAI,GAAG,CAAC;GACxC;EACF;EACA,KAAK,MAAM,OAAO,QAAQ;GACxB,MAAM,QAAQ,WAAW,KAAK,IAAI,GAAG;GACrC,EAAE,KAAK,WAAW,KAAK,GAAG,MAAM,MAAM,cAAc,GAAG,GAAG,CAAC;GAC3D,KAAK,MAAM;EACb;EACA,KAAK,MAAM,MAAM,cAAc;GAC7B,EAAE,KAAK,qBAAqB,EAAE,CAAC;GAC/B;EACF;EAEA,EAAE,KAAK,SAAS;EAChB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,KAAK;EACb,MAAM,SAAkC,CAAC;EACzC,MAAM,SAAkC,CAAC;EACzC,MAAM,SAAgC,CAAC;EACvC,MAAM,SAAyB,CAAC;EAChC,MAAM,aAAiC,CAAC;EACxC,MAAM,SAAyB,CAAC;EAChC,MAAM,eAA4C,CAAC;EAEnD,KAAK,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG;GACtC,MAAM,OAAO,OAAO;GACpB,IAAI,SAAS,mBAAmB,SAAS,mBAAmB,SAAS,kBACnE;GAGF,MAAM,MAAM,UAAU,QAAQ,KAAK;GACnC,IAAI,KAAK;IACP,OAAO,KAAK,iBAAiB,QAAQ,KAAK,IAAI,CAAC;IAC/C;GACF;GAEA,MAAM,eAAe,UAAU,QAAQ,cAAc;GACrD,IAAI,cAAc;IAChB,MAAM,QAAQ,iBAAiB,QAAQ,YAAY;IACnD,IAAI,OAAO,OAAO,KAAK,KAAK;IAC5B;GACF;GAEA,MAAM,KAAK,UAAU,QAAQ,IAAI;GACjC,IAAI,IAAI;IACN,OAAO,KAAK,iBAAiB,QAAQ,IAAI,MAAM,GAAG,CAAC;IACnD;GACF;GAEA,MAAM,QAAQ,UAAU,QAAQ,OAAO;GACvC,IAAI,OAAO;IACT,WAAW,KAAK,qBAAqB,QAAQ,OAAO,MAAM,GAAG,CAAC;IAC9D;GACF;GAEA,MAAM,QAAQ,UAAU,QAAQ,OAAO;GACvC,IAAI,OAAO;IACT,OAAO,KAAK,iBAAiB,QAAQ,OAAO,MAAM,GAAG,CAAC;IACtD;GACF;GAEA,MAAM,cAAc,UAAU,QAAQ,aAAa;GACnD,IAAI,aAAa;IACf,MAAM,KAAK,uBAAuB,QAAQ,aAAa,IAAI;IAC3D,IAAI,IAAI,aAAa,KAAK,EAAE;GAC9B;EACF;EAEA,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACvC,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACvC,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACvC,IAAI,WAAW,SAAS,GAAG,OAAO,aAAa;EAC/C,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACvC,IAAI,aAAa,SAAS,GAAG,OAAO,eAAe;EACnD,OAAO;CACT;AACF;;;ACxBA,MAAa,mBAA0D;CACrE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,oKAEF;EAEA,IAAI,KAAK,cAAc;GACrB,MAAM,OAAO,KAAK;GAClB,MAAM,YAAsB,CAAC;GAE7B,IAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;IACjD,UAAU,KAAK,cAAc;IAC7B,KAAK,MAAM,QAAQ,KAAK,YACtB,UAAU,KAAK,mBAAmB,UAAU,IAAI,EAAE,IAAI;IAExD,UAAU,KAAK,eAAe;GAChC;GAEA,IAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;IACrD,UAAU,KAAK,gBAAgB;IAC/B,KAAK,MAAM,MAAM,KAAK,cAAc;KAClC,MAAM,UAAiE,EAAE,MAAM,GAAG,KAAK;KACvF,IAAI,GAAG,aAAa,KAAA,GAAW,QAAQ,WAAW,GAAG;KACrD,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,UAAU,GAAG;KACnD,IAAI,GAAG,iBAAiB,QAAQ,kBAAkB;KAClD,IAAI,GAAG,aAAa,QAAQ,cAAc;KAC1C,IAAI,GAAG,mBAAmB,QAAQ,oBAAoB;KACtD,IAAI,GAAG,KAAK,QAAQ,MAAM;KAC1B,UAAU,KAAK,eAAe,MAAM,OAAO,EAAE,GAAG;IAClD;IACA,UAAU,KAAK,iBAAiB;GAClC;GAEA,IAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;IACrD,UAAU,KAAK,gBAAgB;IAC/B,KAAK,MAAM,MAAM,KAAK,cAAc;KAClC,MAAM,UAAiE,EACrE,SAAS,GAAG,QACd;KACA,IAAI,GAAG,cAAc,QAAQ,eAAe;KAC5C,UAAU,KAAK,aAAa,MAAM,OAAO,EAAE,EAAE;KAE7C,IAAI,GAAG,MACL,KAAK,MAAM,OAAO,GAAG,MAAM;MACzB,UAAU,KAAK,WAAW,IAAI,UAAU,GAAG;MAC3C,IAAI,IAAI,OACN,KAAK,MAAM,QAAQ,IAAI,OAAO;OAC5B,MAAM,YAAyD,EAC7D,GAAG,KAAK,UACV;OACA,IAAI,KAAK,SAAS,KAAA,GAAW,UAAU,IAAI,KAAK;OAChD,IAAI,KAAK,uBAAuB,KAAA,GAAW,UAAU,KAAK,KAAK;OAC/D,IAAI,KAAK,UAAU,KAAA,GACjB,UAAU,KACR,QAAQ,MAAM,SAAS,EAAE,MAAM,UAAU,KAAK,KAAK,EAAE,YACvD;YAEA,UAAU,KAAK,QAAQ,MAAM,SAAS,EAAE,GAAG;MAE/C;MAEF,UAAU,KAAK,QAAQ;KACzB;KAEF,UAAU,KAAK,cAAc;IAC/B;IACA,UAAU,KAAK,iBAAiB;GAClC;GAEA,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,QAAQ,KAAK;GAC3D,EAAE,KACA,gBAAgB,UAAU,UAAU,SAAS,IAAI,IAAI,UAAU,KAAK,EAAE,EAAE,mBAAmB,MAC7F;EACF;EAGA,IAAI,KAAK,SAAS;GAChB,MAAM,MAAM,KAAK;GACjB,MAAM,WAAqB,CAAC;GAC5B,IAAI,IAAI,YAAY,IAAI,SAAS,SAAS,GAAG;IAC3C,SAAS,KAAK,YAAY;IAC1B,KAAK,MAAM,QAAQ,IAAI,UAAU;KAC/B,MAAM,YAAsB,CAAC;KAC7B,IAAI,KAAK,SAAS,KAAA,GAAW,UAAU,KAAK,SAAS,UAAU,KAAK,IAAI,EAAE,EAAE;KAC5E,IAAI,KAAK,KAAK,UAAU,KAAK,WAAS;KACtC,IAAI,KAAK,QAAQ,UAAU,KAAK,cAAY;KAC5C,IAAI,KAAK,WAAW,UAAU,KAAK,iBAAe;KAClD,IAAI,KAAK,QAAQ;MACf,MAAM,IAAI,KAAK;MACf,MAAM,cAAwB,CAAC;MAC/B,IAAI,EAAE,SAAS,KAAA,GAAW,YAAY,KAAK,SAAS,EAAE,KAAK,EAAE;MAC7D,IAAI,EAAE,SAAS,KAAA,GAAW,YAAY,KAAK,SAAS,EAAE,KAAK,EAAE;MAC7D,MAAM,aAAuB,CAAC;MAC9B,KAAK,MAAM,MAAM,EAAE,QAAQ;OACzB,MAAM,aAAa,GAAG,SAAS,KAAA,IAAY,OAAO,GAAG,KAAK,KAAK;OAC/D,WAAW,KAAK,SAAS,WAAW,QAAQ,UAAU,GAAG,KAAK,EAAE,eAAe;MACjF;MACA,SAAS,KACP,WAAW,UAAU,SAAS,IAAI,MAAM,UAAU,KAAK,GAAG,IAAI,GAAG,UAAU,YAAY,SAAS,IAAI,MAAM,YAAY,KAAK,GAAG,IAAI,GAAG,GAAG,WAAW,KAAK,EAAE,EAAE,oBAC9J;KACF,OACE,SAAS,KAAK,WAAW,UAAU,SAAS,IAAI,MAAM,UAAU,KAAK,GAAG,IAAI,GAAG,GAAG;IAEtF;IACA,SAAS,KAAK,aAAa;GAC7B;GACA,EAAE,KACA,wBAAwB,UAAU,IAAI,UAAU,EAAE,cAAc,UAAU,IAAI,QAAQ,EAAE,GAAG,SAAS,SAAS,IAAI,IAAI,SAAS,KAAK,EAAE,EAAE,cAAc,MACvJ;EACF;EAGA,IAAI,KAAK,SAAS;GAChB,MAAM,SAAS,KAAK,SAAS,UAAU,UAAU,KAAK,MAAM,EAAE,KAAK;GACnE,MAAM,aAAa,KAAK,QAAQ,SAAS,YAAY,UAAU,KAAK,QAAQ,MAAM,EAAE,KAAK;GACzF,MAAM,cAAwB,CAAC;GAC/B,IAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,SAAS,SAAS,GAAG;IAC7D,MAAM,YAAsB,CAAC,YAAY;IACzC,KAAK,MAAM,QAAQ,KAAK,QAAQ,UAAU;KACxC,MAAM,YAAsB,CAAC,SAAS,UAAU,KAAK,IAAI,EAAE,EAAE;KAC7D,IAAI,KAAK,MAAM,UAAU,KAAK,YAAU;KACxC,IAAI,KAAK,QAAQ,UAAU,KAAK,cAAY;KAC5C,IAAI,KAAK,WAAW,UAAU,KAAK,iBAAe;KAClD,UAAU,KAAK,YAAY,UAAU,KAAK,GAAG,EAAE,GAAG;IACpD;IACA,UAAU,KAAK,aAAa;IAC5B,YAAY,KAAK,UAAU,KAAK,EAAE,CAAC;GACrC;GACA,IAAI,YAAY,SAAS,GACvB,EAAE,KAAK,WAAW,SAAS,WAAW,GAAG,YAAY,KAAK,EAAE,EAAE,WAAW;QAEzE,EAAE,KAAK,WAAW,SAAS,WAAW,GAAG;EAE7C;EAEA,EAAE,KAAK,iBAAiB;EACxB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAuC,CAAC;EAE9C,MAAM,SAAS,UAAU,IAAI,cAAc;EAC3C,IAAI,QAAQ;GACV,MAAM,OAA4B,CAAC;GACnC,IAAI,OAAO,aAAa,SAAS,OAAO,UAAU,OAAO,OAAO,WAAW,OAAO;GAGlF,MAAM,eAAe,UAAU,QAAQ,YAAY;GACnD,IAAI,cAAc;IAChB,MAAM,QAAkB,CAAC;IACzB,KAAK,MAAM,SAAS,aAAa,YAAY,CAAC,GAC5C,IAAI,MAAM,SAAS,eAAe,MAAM,aAAa,QACnD,MAAM,KAAK,OAAO,MAAM,WAAW,MAAM,CAAC;IAG9C,IAAI,MAAM,SAAS,GAAG,KAAK,aAAa;GAC1C;GAGA,MAAM,iBAAiB,UAAU,QAAQ,cAAc;GACvD,IAAI,gBAAgB;IAClB,MAAM,MAAoC,CAAC;IAC3C,KAAK,MAAM,SAAS,eAAe,YAAY,CAAC,GAAG;KACjD,IAAI,MAAM,SAAS,eAAe;KAClC,MAAM,KAAiC,EAAE,MAAM,OAAO,MAAM,aAAa,WAAW,EAAE,EAAE;KACxF,IAAI,MAAM,aAAa,aAAa,GAAG,WAAW,OAAO,MAAM,WAAW,WAAW;KACrF,IAAI,MAAM,aAAa,eAAe,KAAA,GACpC,GAAG,UAAU,OAAO,MAAM,WAAW,UAAU;KACjD,IAAI,MAAM,aAAa,oBAAoB,GAAG,kBAAkB;KAChE,IAAI,MAAM,aAAa,gBAAgB,GAAG,cAAc;KACxD,IAAI,MAAM,aAAa,sBAAsB,GAAG,oBAAoB;KACpE,IAAI,MAAM,aAAa,QAAQ,GAAG,MAAM;KACxC,IAAI,KAAK,EAAE;IACb;IACA,IAAI,IAAI,SAAS,GAAG,KAAK,eAAe;GAC1C;GAGA,MAAM,iBAAiB,UAAU,QAAQ,cAAc;GACvD,IAAI,gBAAgB;IAClB,MAAM,MAAkC,CAAC;IACzC,KAAK,MAAM,WAAW,eAAe,YAAY,CAAC,GAAG;KACnD,IAAI,QAAQ,SAAS,aAAa;KAClC,MAAM,KAA+B,EACnC,SAAS,OAAO,QAAQ,aAAa,cAAc,CAAC,EACtD;KACA,IAAI,QAAQ,aAAa,iBAAiB,GAAG,eAAe;KAE5D,MAAM,OAA6B,CAAC;KACpC,KAAK,MAAM,YAAY,QAAQ,YAAY,CAAC,GAAG;MAC7C,IAAI,SAAS,SAAS,OAAO;MAC7B,MAAM,MAA0B,EAC9B,WAAW,OAAO,SAAS,aAAa,QAAQ,CAAC,EACnD;MAEA,MAAM,QAA+B,CAAC;MACtC,KAAK,MAAM,aAAa,SAAS,YAAY,CAAC,GAAG;OAC/C,IAAI,UAAU,SAAS,QAAQ;OAC/B,MAAM,OAA4B,EAChC,WAAW,OAAO,UAAU,aAAa,QAAQ,EAAE,EACrD;OACA,IAAI,UAAU,aAAa,MAAM,KAAK,OAAO,OAAO,UAAU,WAAW,IAAI;OAC7E,IAAI,UAAU,aAAa,UAAU,KAAA,GACnC,KAAK,qBAAqB,OAAO,UAAU,WAAW,KAAK;OAC7D,MAAM,MAAM,UAAU,WAAW,GAAG;OACpC,IAAI,OAAO,IAAI,WAAW,EAAE,EAAE,SAAS,KAAA,GACrC,KAAK,QAAQ,OAAO,IAAI,SAAS,EAAE,CAAC,IAAI;OAE1C,MAAM,KAAK,IAAI;MACjB;MACA,IAAI,MAAM,SAAS,GAAG,IAAI,QAAQ;MAClC,KAAK,KAAK,GAAG;KACf;KACA,IAAI,KAAK,SAAS,GAAG,GAAG,OAAO;KAC/B,IAAI,KAAK,EAAE;IACb;IACA,IAAI,IAAI,SAAS,GAAG,KAAK,eAAe;GAC1C;GAEA,OAAO,eAAe;EACxB;EAGA,MAAM,QAAQ,UAAU,IAAI,SAAS;EACrC,IAAI,OAAO;GACT,MAAM,MAAsB;IAC1B,YAAY,OAAO,MAAM,aAAa,iBAAiB,EAAE;IACzD,UAAU,OAAO,MAAM,aAAa,eAAe,EAAE;GACvD;GAEA,MAAM,aAAa,UAAU,OAAO,UAAU;GAC9C,IAAI,YAAY;IACd,MAAM,QAA0B,CAAC;IACjC,KAAK,MAAM,SAAS,WAAW,YAAY,CAAC,GAAG;KAC7C,IAAI,MAAM,SAAS,WAAW;KAC9B,MAAM,OAAuB,CAAC;KAC9B,IAAI,MAAM,aAAa,YAAY,KAAA,GACjC,KAAK,OAAO,OAAO,MAAM,WAAW,OAAO;KAC7C,IAAI,MAAM,aAAa,QAAQ,KAAK,MAAM;KAC1C,IAAI,MAAM,aAAa,WAAW,KAAK,SAAS;KAChD,IAAI,MAAM,aAAa,cAAc,KAAK,YAAY;KAEtD,MAAM,WAAW,UAAU,OAAO,QAAQ;KAC1C,IAAI,UAAU;MACZ,MAAM,SAA2B,EAAE,QAAQ,CAAC,EAAE;MAC9C,IAAI,SAAS,aAAa,YAAY,KAAA,GACpC,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO;MAClD,IAAI,SAAS,aAAa,YAAY,KAAA,GACpC,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO;MAClD,KAAK,MAAM,cAAc,SAAS,YAAY,CAAC,GAAG;OAChD,IAAI,WAAW,SAAS,SAAS;OACjC,MAAM,QAAQ,UAAU,YAAY,KAAK;OACzC,MAAM,KAAsB,EAC1B,OAAO,QAAQ,OAAO,MAAM,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,GAC3D;OACA,IAAI,WAAW,aAAa,MAC1B,GAAG,OAAO,WAAW,WAAW;OAClC,OAAO,OAAO,KAAK,EAAE;MACvB;MACA,KAAK,SAAS;KAChB;KACA,MAAM,KAAK,IAAI;IACjB;IACA,IAAI,MAAM,SAAS,GAAG,IAAI,WAAW;GACvC;GAEA,OAAO,UAAU;EACnB;EAGA,MAAM,QAAQ,UAAU,IAAI,SAAS;EACrC,IAAI,OAAO;GACT,MAAM,MAAsB,CAAC;GAC7B,IAAI,MAAM,aAAa,SAAS,OAAO,SAAS,OAAO,MAAM,WAAW,OAAO;GAC/E,IAAI,MAAM,aAAa,WAAW,IAAI,SAAS,OAAO,MAAM,WAAW,SAAS;GAEhF,MAAM,aAAa,UAAU,OAAO,UAAU;GAC9C,IAAI,YAAY;IACd,MAAM,QAA0B,CAAC;IACjC,KAAK,MAAM,SAAS,WAAW,YAAY,CAAC,GAAG;KAC7C,IAAI,MAAM,SAAS,WAAW;KAC9B,MAAM,OAAuB,EAAE,MAAM,OAAO,MAAM,aAAa,WAAW,EAAE,EAAE;KAC9E,IAAI,MAAM,aAAa,SAAS,KAAK,OAAO;KAC5C,IAAI,MAAM,aAAa,WAAW,KAAK,SAAS;KAChD,IAAI,MAAM,aAAa,cAAc,KAAK,YAAY;KACtD,MAAM,KAAK,IAAI;IACjB;IACA,IAAI,MAAM,SAAS,GAAG,IAAI,WAAW;GACvC;GAEA,OAAO,UAAU;EACnB;EAEA,OAAO;CACT;AACF;;;;;;;;;;AC/OA,MAAa,kBAAwD;CACnE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,mFACF;EACA,KAAK,MAAM,KAAK,KAAK,aAAa;GAChC,MAAM,SAAmB,CAAC,OAAO,EAAE,GAAG,EAAE;GACxC,IAAI,EAAE,eAAe,KAAA,GAAW,OAAO,KAAK,eAAe,UAAU,EAAE,UAAU,EAAE,EAAE;GACrF,IAAI,EAAE,YAAY,KAAA,GAAW,OAAO,KAAK,YAAY,UAAU,EAAE,OAAO,EAAE,EAAE;GAC5E,IAAI,EAAE,WAAW,OAAO,KAAK,iBAAe;GAC5C,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;GACpE,IAAI,EAAE,SAAS,KAAA,GAAW,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;GACnE,IAAI,EAAE,gBAAgB,KAAA,GAAW,OAAO,KAAK,gBAAgB,UAAU,EAAE,WAAW,EAAE,EAAE;GACxF,IAAI,EAAE,SAAS,KAAA,GAAW,OAAO,KAAK,SAAS,EAAE,KAAK,EAAE;GACxD,IAAI,EAAE,uBAAuB,KAAA,GAC3B,OAAO,KAAK,uBAAuB,EAAE,mBAAmB,EAAE;GAC5D,OAAO,KAAK,qBAAqB,EAAE,iBAAiB,EAAE;GACtD,IAAI,EAAE,0BAA0B,KAAA,GAC9B,OAAO,KAAK,0BAA0B,EAAE,sBAAsB,EAAE;GAClE,IAAI,EAAE,cAAc,OAAO,KAAK,oBAAkB;GAClD,IAAI,EAAE,KAAK,OAAO,KAAK,WAAS;GAChC,IAAI,EAAE,SAAS,OAAO,KAAK,eAAa;GACxC,IAAI,EAAE,uBAAuB,OAAO,KAAK,6BAA2B;GACpE,IAAI,EAAE,mBAAmB,OAAO,KAAK,kBAAgB;GACrD,IAAI,EAAE,eAAe,OAAO,KAAK,qBAAmB;GACpD,IAAI,EAAE,UAAU,OAAO,KAAK,gBAAc;GAC1C,IAAI,EAAE,gBAAgB,KAAA,GAAW,OAAO,KAAK,gBAAgB,UAAU,EAAE,WAAW,EAAE,EAAE;GACxF,IAAI,EAAE,mBAAmB,KAAA,GACvB,OAAO,KAAK,mBAAmB,UAAU,EAAE,cAAc,EAAE,EAAE;GAE/D,MAAM,QAAkB,CAAC;GACzB,IAAI,EAAE,MAAM;IACV,MAAM,SAAmB,CAAC,eAAe,UAAU,EAAE,KAAK,UAAU,EAAE,EAAE;IACxE,IAAI,EAAE,KAAK,YAAY,KAAA,GAAW,OAAO,KAAK,YAAY,UAAU,EAAE,KAAK,OAAO,EAAE,EAAE;IACtF,IAAI,EAAE,KAAK,kBAAkB,KAAA,GAC3B,OAAO,KAAK,kBAAkB,UAAU,EAAE,KAAK,aAAa,EAAE,EAAE;IAClE,IAAI,EAAE,KAAK,gBAAgB,KAAA,GAAW,OAAO,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE;IACvF,MAAM,KAAK,SAAS,OAAO,KAAK,GAAG,EAAE,GAAG;GAC1C;GACA,IAAI,EAAE,OAAO;IACX,MAAM,IAAI,EAAE;IACZ,MAAM,SAAmB,CAAC;IAC1B,IAAI,EAAE,KAAK,OAAO,KAAK,WAAS;IAChC,IAAI,EAAE,YAAY,OAAO,KAAK,kBAAgB;IAC9C,IAAI,EAAE,UAAU,OAAO,KAAK,gBAAc;IAC1C,IAAI,EAAE,aAAa,OAAO,KAAK,mBAAiB;IAChD,IAAI,EAAE,UAAU,OAAO,KAAK,gBAAc;IAC1C,IAAI,EAAE,MAAM,OAAO,KAAK,YAAU;IAClC,IAAI,EAAE,WAAW,OAAO,KAAK,iBAAe;IAC5C,IAAI,EAAE,QAAQ,OAAO,KAAK,cAAY;IACtC,IAAI,EAAE,QAAQ,KAAA,GAAW,OAAO,KAAK,QAAQ,UAAU,EAAE,GAAG,EAAE,EAAE;IAChE,IAAI,EAAE,SAAS,KAAA,GAAW,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;IACnE,IAAI,EAAE,YAAY,OAAO,KAAK,kBAAgB;IAC9C,IAAI,EAAE,eAAe,KAAA,GAAW,OAAO,KAAK,eAAe,UAAU,EAAE,UAAU,EAAE,EAAE;IACrF,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,UAAU,EAAE,QAAQ,EAAE,EAAE;IAC/E,MAAM,YACJ,EAAE,UAAU,EAAE,OAAO,SAAS,IAC1B,kBAAkB,EAAE,OAAO,OAAO,IAAI,EAAE,OACrC,KAAK,MACJ,MAAM,OACF,SACA,OAAO,MAAM,WACX,SAAS,EAAE,OACX,SAAS,UAAU,CAAC,EAAE,IAC9B,CAAC,CACA,KAAK,EAAE,EAAE,aACZ;IACN,IAAI,WAAW,MAAM,KAAK,UAAU,OAAO,KAAK,GAAG,EAAE,GAAG,UAAU,SAAS;SACtE,MAAM,KAAK,UAAU,OAAO,KAAK,GAAG,EAAE,GAAG;GAChD;GACA,IAAI,EAAE,QAAQ;IACZ,MAAM,IAAI,EAAE;IACZ,MAAM,SAAmB,CAAC;IAC1B,IAAI,EAAE,WAAW,OAAO,OAAO,KAAK,cAAY;IAChD,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;IACpE,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;IACpE,IAAI,EAAE,iBAAiB,KAAA,GACrB,OAAO,KAAK,iBAAiB,UAAU,EAAE,YAAY,EAAE,EAAE;IAC3D,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;IACpE,IAAI,EAAE,eAAe,KAAA,GAAW,OAAO,KAAK,eAAe,UAAU,EAAE,UAAU,EAAE,EAAE;IACrF,IAAI,EAAE,cAAc,OAAO,OAAO,KAAK,iBAAe;IACtD,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,KAAK,cAAc,UAAU,EAAE,SAAS,EAAE,EAAE;IAClF,IAAI,EAAE,YAAY,KAAA,GAAW,OAAO,KAAK,YAAY,UAAU,EAAE,OAAO,EAAE,EAAE;IAC5E,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,KAAK,cAAc,UAAU,EAAE,SAAS,EAAE,EAAE;IAClF,IAAI,EAAE,QAAQ,OAAO,OAAO,KAAK,WAAS;IAC1C,IAAI,EAAE,OAAO,OAAO,KAAK,aAAW;IACpC,IAAI,EAAE,OAAO,OAAO,KAAK,aAAW;IACpC,IAAI,EAAE,WAAW,OAAO,KAAK,iBAAe;IAC5C,IAAI,EAAE,aAAa,OAAO,KAAK,mBAAiB;IAChD,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,KAAK,cAAc,EAAE,UAAU,EAAE;IACvE,MAAM,YACJ,EAAE,cAAc,EAAE,WAAW,SAAS,IAClC,sBAAsB,EAAE,WAAW,OAAO,IAAI,EAAE,WAC7C,KAAK,MAAM;KACV,MAAM,SAAmB,CAAC;KAC1B,IAAI,EAAE,SAAS,KAAA,GAAW,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;KACnE,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;KACpE,OAAO,cAAc,OAAO,KAAK,GAAG,EAAE;IACxC,CAAC,CAAC,CACD,KAAK,EAAE,EAAE,iBACZ;IACN,IAAI,WAAW,MAAM,KAAK,WAAW,OAAO,KAAK,GAAG,EAAE,GAAG,UAAU,UAAU;SACxE,MAAM,KAAK,WAAW,OAAO,KAAK,GAAG,EAAE,GAAG;GACjD;GACA,IAAI,EAAE,cAAc,EAAE,WAAW,SAAS,GAAG;IAC3C,MAAM,UAAoB,CAAC,sBAAsB,EAAE,WAAW,OAAO,GAAG;IACxE,KAAK,MAAM,MAAM,EAAE,YAAY;KAC7B,MAAM,UAAoB,CAAC;KAC3B,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;KACtE,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;KACpE,IAAI,GAAG,kBAAkB,KAAA,GAAW,QAAQ,KAAK,kBAAkB,GAAG,cAAc,EAAE;KACtF,IAAI,GAAG,iBAAiB,QAAQ,KAAK,uBAAqB;KAC1D,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,KAAK,WAAW,UAAU,GAAG,MAAM,EAAE,EAAE;KAC5E,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,GAAG,UAAU,IAAI,EAAE,EAAE;KAC5E,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,KAAK,WAAW,GAAG,OAAO,EAAE;KACjE,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;KACpE,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,KAAK,WAAW,UAAU,GAAG,MAAM,EAAE,EAAE;KAC5E,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;KACtE,QAAQ,KAAK,cAAc,QAAQ,KAAK,GAAG,EAAE,GAAG;IAClD;IACA,QAAQ,KAAK,eAAe;IAC5B,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC;GAC7B;GAEA,IAAI,MAAM,SAAS,GACjB,EAAE,KAAK,eAAe,OAAO,KAAK,GAAG,EAAE,GAAG,MAAM,KAAK,EAAE,EAAE,cAAc;QACpE,EAAE,KAAK,eAAe,OAAO,KAAK,GAAG,EAAE,GAAG;EACjD;EACA,EAAE,KAAK,gBAAgB;EACvB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,cAAmC,CAAC;EAC1C,KAAK,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG;GACnC,IAAI,IAAI,SAAS,cAAc;GAC/B,MAAM,IAAgC,EAAE,IAAI,QAAQ,KAAK,IAAI,KAAK,EAAE;GACpE,IAAI,KAAK,KAAK,YAAY,MAAM,KAAA,GAAW,EAAE,aAAa,KAAK,KAAK,YAAY;GAChF,IAAI,KAAK,KAAK,SAAS,MAAM,KAAA,GAAW,EAAE,UAAU,KAAK,KAAK,SAAS;GACvE,IAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG,EAAE,YAAY;GACtD,MAAM,WAAW,QAAQ,KAAK,UAAU;GACxC,IAAI,aAAa,KAAA,GAAW,EAAE,WAAW;GACzC,IAAI,KAAK,KAAK,MAAM,MAAM,KAAA,GAAW,EAAE,OAAO,KAAK,KAAK,MAAM;GAC9D,IAAI,KAAK,KAAK,aAAa,MAAM,KAAA,GAAW,EAAE,cAAc,KAAK,KAAK,aAAa;GACnF,MAAM,OAAO,QAAQ,KAAK,MAAM;GAChC,IAAI,SAAS,KAAA,GAAW,EAAE,OAAO;GACjC,MAAM,KAAK,QAAQ,KAAK,oBAAoB;GAC5C,IAAI,OAAO,KAAA,GAAW,EAAE,qBAAqB;GAC7C,MAAM,KAAK,QAAQ,KAAK,kBAAkB;GAC1C,IAAI,OAAO,KAAA,GAAW,EAAE,mBAAmB;GAC3C,MAAM,MAAM,QAAQ,KAAK,uBAAuB;GAChD,IAAI,QAAQ,KAAA,GAAW,EAAE,wBAAwB;GACjD,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,EAAE,eAAe;GAC5D,IAAI,WAAW,KAAK,KAAK,KAAK,CAAC,GAAG,EAAE,MAAM;GAC1C,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,GAAG,EAAE,UAAU;GAClD,IAAI,WAAW,KAAK,KAAK,uBAAuB,CAAC,GAAG,EAAE,wBAAwB;GAC9E,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,EAAE,oBAAoB;GAC/D,IAAI,WAAW,KAAK,KAAK,eAAe,CAAC,GAAG,EAAE,gBAAgB;GAC9D,IAAI,WAAW,KAAK,KAAK,UAAU,CAAC,GAAG,EAAE,WAAW;GACpD,IAAI,KAAK,KAAK,aAAa,MAAM,KAAA,GAAW,EAAE,cAAc,KAAK,KAAK,aAAa;GACnF,IAAI,KAAK,KAAK,gBAAgB,MAAM,KAAA,GAAW,EAAE,iBAAiB,KAAK,KAAK,gBAAgB;GAE5F,MAAM,OAAO,UAAU,KAAK,MAAM;GAClC,IAAI,MACF,EAAE,OAAO;IACP,YAAY,KAAK,MAAM,YAAY,KAAK;IACxC,SAAS,KAAK,MAAM,SAAS;IAC7B,eAAe,KAAK,MAAM,eAAe;IACzC,aAAa,QAAQ,MAAM,aAAa;GAC1C;GAEF,MAAM,QAAQ,UAAU,KAAK,OAAO;GACpC,IAAI,OAAO;IACT,MAAM,IAAmC,CAAC;IAC1C,IAAI,WAAW,KAAK,OAAO,KAAK,CAAC,GAAG,EAAE,MAAM;IAC5C,IAAI,WAAW,KAAK,OAAO,YAAY,CAAC,GAAG,EAAE,aAAa;IAC1D,IAAI,WAAW,KAAK,OAAO,UAAU,CAAC,GAAG,EAAE,WAAW;IACtD,IAAI,WAAW,KAAK,OAAO,aAAa,CAAC,GAAG,EAAE,cAAc;IAC5D,IAAI,WAAW,KAAK,OAAO,UAAU,CAAC,GAAG,EAAE,WAAW;IACtD,IAAI,WAAW,KAAK,OAAO,MAAM,CAAC,GAAG,EAAE,OAAO;IAC9C,IAAI,WAAW,KAAK,OAAO,WAAW,CAAC,GAAG,EAAE,YAAY;IACxD,IAAI,WAAW,KAAK,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS;IAClD,IAAI,KAAK,OAAO,KAAK,MAAM,KAAA,GAAW,EAAE,MAAM,KAAK,OAAO,KAAK;IAC/D,IAAI,KAAK,OAAO,MAAM,MAAM,KAAA,GAAW,EAAE,OAAO,KAAK,OAAO,MAAM;IAClE,IAAI,WAAW,KAAK,OAAO,YAAY,CAAC,GAAG,EAAE,aAAa;IAC1D,IAAI,KAAK,OAAO,YAAY,MAAM,KAAA,GAAW,EAAE,aAAa,KAAK,OAAO,YAAY;IACpF,IAAI,KAAK,OAAO,UAAU,MAAM,KAAA,GAAW,EAAE,WAAW,KAAK,OAAO,UAAU;IAC9E,MAAM,WAAW,UAAU,OAAO,QAAQ;IAC1C,IAAI,UAAU;KACZ,MAAM,SAA8B,CAAC;KACrC,KAAK,MAAM,OAAO,SAAS,YAAY,CAAC,GACtC,IAAI,IAAI,SAAS,KAAK,OAAO,KAAK,IAAI;UACjC,IAAI,IAAI,SAAS,KAAK,OAAO,KAAK,KAAK,KAAK,GAAG,KAAK,EAAE;UACtD,IAAI,IAAI,SAAS,KAAK,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,CAAC;KAE/D,IAAI,OAAO,SAAS,GAAG,EAAE,SAAS;IACpC;IACA,EAAE,QAAQ;GACZ;GACA,MAAM,SAAS,UAAU,KAAK,QAAQ;GACtC,IAAI,QAAQ;IACV,MAAM,IAAoC,CAAC;IAC3C,IAAI,OAAO,KAAK,QAAQ,QAAQ,CAAC,MAAM,KAAK,EAAE,SAAS;IACvD,MAAM,KAAK,KAAK,QAAQ,UAAU;IAClC,IAAI,OAAO,KAAA,GAAW,EAAE,WAAW;IACnC,MAAM,KAAK,QAAQ,QAAQ,UAAU;IACrC,IAAI,OAAO,KAAA,GAAW,EAAE,WAAW;IACnC,IAAI,KAAK,QAAQ,cAAc,MAAM,KAAA,GACnC,EAAE,eAAe,KAAK,QAAQ,cAAc;IAC9C,MAAM,KAAK,QAAQ,QAAQ,UAAU;IACrC,IAAI,OAAO,KAAA,GAAW,EAAE,WAAW;IACnC,IAAI,KAAK,QAAQ,YAAY,MAAM,KAAA,GAAW,EAAE,aAAa,KAAK,QAAQ,YAAY;IACtF,IAAI,OAAO,KAAK,QAAQ,WAAW,CAAC,MAAM,KAAK,EAAE,YAAY;IAC7D,IAAI,KAAK,QAAQ,WAAW,MAAM,KAAA,GAAW,EAAE,YAAY,KAAK,QAAQ,WAAW;IACnF,IAAI,KAAK,QAAQ,SAAS,MAAM,KAAA,GAAW,EAAE,UAAU,KAAK,QAAQ,SAAS;IAC7E,IAAI,KAAK,QAAQ,WAAW,MAAM,KAAA,GAAW,EAAE,YAAY,KAAK,QAAQ,WAAW;IACnF,IAAI,OAAO,KAAK,QAAQ,KAAK,CAAC,MAAM,KAAK,EAAE,MAAM;IACjD,IAAI,WAAW,KAAK,QAAQ,OAAO,CAAC,GAAG,EAAE,QAAQ;IACjD,IAAI,WAAW,KAAK,QAAQ,OAAO,CAAC,GAAG,EAAE,QAAQ;IACjD,IAAI,WAAW,KAAK,QAAQ,WAAW,CAAC,GAAG,EAAE,YAAY;IACzD,IAAI,WAAW,KAAK,QAAQ,aAAa,CAAC,GAAG,EAAE,cAAc;IAC7D,MAAM,IAAI,KAAK,QAAQ,WAAW;IAClC,IAAI,MAAM,KAAA,GAAW,EAAE,YAAY;IACnC,MAAM,WAAW,UAAU,QAAQ,YAAY;IAC/C,IAAI,UAAU;KACZ,MAAM,SAAuC,CAAC;KAC9C,KAAK,MAAM,OAAO,SAAS,YAAY,CAAC,GAAG;MACzC,IAAI,IAAI,SAAS,aAAa;MAC9B,MAAM,IAAgC,CAAC;MACvC,IAAI,KAAK,KAAK,MAAM,MAAM,KAAA,GAAW,EAAE,OAAO,KAAK,KAAK,MAAM;MAC9D,MAAM,MAAM,QAAQ,KAAK,UAAU;MACnC,IAAI,QAAQ,KAAA,GAAW,EAAE,WAAW;MACpC,OAAO,KAAK,CAAC;KACf;KACA,IAAI,OAAO,SAAS,GAAG,EAAE,aAAa;IACxC;IACA,EAAE,SAAS;GACb;GACA,MAAM,WAAW,UAAU,KAAK,YAAY;GAC5C,IAAI,UAAU;IACZ,MAAM,SAA6B,CAAC;IACpC,KAAK,MAAM,QAAQ,SAAS,YAAY,CAAC,GAAG;KAC1C,IAAI,KAAK,SAAS,aAAa;KAC/B,MAAM,KAAuB,CAAC;KAC9B,IAAI,KAAK,MAAM,MAAM,MAAM,KAAA,GAAW,GAAG,OAAO,KAAK,MAAM,MAAM;KACjE,MAAM,KAAK,QAAQ,MAAM,SAAS;KAClC,IAAI,OAAO,KAAA,GAAW,GAAG,UAAU;KACnC,MAAM,KAAK,KAAK,MAAM,eAAe;KACrC,IAAI,OAAO,KAAA,GAAW,GAAG,gBAAgB;KACzC,IAAI,WAAW,KAAK,MAAM,iBAAiB,CAAC,GAAG,GAAG,kBAAkB;KACpE,IAAI,KAAK,MAAM,QAAQ,MAAM,KAAA,GAAW,GAAG,SAAS,KAAK,MAAM,QAAQ;KACvE,IAAI,KAAK,MAAM,SAAS,MAAM,KAAA,GAAW,GAAG,UAAU,WAAW,KAAK,MAAM,SAAS,CAAC;KACtF,MAAM,MAAM,QAAQ,MAAM,QAAQ;KAClC,IAAI,QAAQ,KAAA,GAAW,GAAG,SAAS;KACnC,MAAM,MAAM,QAAQ,MAAM,SAAS;KACnC,IAAI,QAAQ,KAAA,GAAW,GAAG,UAAU;KACpC,IAAI,KAAK,MAAM,QAAQ,MAAM,KAAA,GAAW,GAAG,SAAS,KAAK,MAAM,QAAQ;KACvE,IAAI,KAAK,MAAM,MAAM,MAAM,KAAA,GAAW,GAAG,OAAO,KAAK,MAAM,MAAM;KACjE,OAAO,KAAK,EAAE;IAChB;IACA,IAAI,OAAO,SAAS,GAAG,EAAE,aAAa;GACxC;GACA,YAAY,KAAK,CAAsB;EACzC;EACA,OAAO,EAAE,YAAY;CACvB;AACF;;;;;;;;;;AC3WA,MAAa,iBAAsD;CACjE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,QAAkB,CAAC;EACzB,IAAI,KAAK,SAAS,KAAA,GAAW,MAAM,KAAK,SAAS,UAAU,KAAK,IAAI,EAAE,EAAE;EACxE,IAAI,KAAK,YAAY,OAAO,MAAM,KAAK,eAAa;EACpD,IAAI,KAAK,YAAY,MAAM,KAAK,kBAAgB;EAChD,IAAI,KAAK,gBAAgB,MAAM,KAAK,sBAAoB;EACxD,IAAI,KAAK,sBAAsB,OAAO,MAAM,KAAK,yBAAuB;EACxE,IAAI,KAAK,wBAAwB,MAAM,KAAK,8BAA4B;EACxE,IAAI,KAAK,eAAe,MAAM,KAAK,qBAAmB;EACtD,IAAI,KAAK,mBAAmB,KAAA,GAAW,MAAM,KAAK,mBAAmB,KAAK,eAAe,EAAE;EAC3F,IAAI,KAAK,cAAc,MAAM,KAAK,oBAAkB;EACpD,IAAI,KAAK,kBAAkB,MAAM,KAAK,wBAAsB;EAC5D,IAAI,KAAK,aAAa,MAAM,KAAK,mBAAiB;EAClD,IAAI,KAAK,uBAAuB,OAAO,MAAM,KAAK,0BAAwB;EAC1E,IAAI,KAAK,mBAAmB,MAAM,KAAK,yBAAuB;EAC9D,IAAI,KAAK,YAAY,MAAM,KAAK,kBAAgB;EAChD,IAAI,KAAK,cAAc,MAAM,KAAK,oBAAkB;EACpD,MAAM,KAAK,iBAAiB,KAAK,aAAa,EAAE;EAEhD,IAAI,QAAQ;EACZ,MAAM,IAAI,KAAK;EACf,IAAI,GAAG;GACL,MAAM,SAAmB,CAAC;GAC1B,IAAI,EAAE,6BAA6B,OAAO,OAAO,KAAK,gCAA8B;GACpF,IAAI,EAAE,gBAAgB,OAAO,KAAK,sBAAoB;GACtD,IAAI,EAAE,yBAAyB,OAAO,OAAO,KAAK,4BAA0B;GAC5E,IAAI,EAAE,mBAAmB,KAAA,GAAW,OAAO,KAAK,mBAAmB,EAAE,eAAe,EAAE;GACtF,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO,KAAK,WAAW,EAAE,OAAO,EAAE;GAC9D,IAAI,EAAE,uBAAuB,KAAA,GAC3B,OAAO,KAAK,uBAAuB,EAAE,mBAAmB,EAAE;GAC5D,IAAI,EAAE,wBAAwB,KAAA,GAC5B,OAAO,KAAK,wBAAwB,EAAE,oBAAoB,EAAE;GAC9D,MAAM,SAAmB,CAAC;GAC1B,IAAI,EAAE,oBAAoB,EAAE,iBAAiB,SAAS,GAAG;IACvD,MAAM,SAAmB,CAAC,4BAA4B,EAAE,iBAAiB,OAAO,GAAG;IACnF,KAAK,MAAM,KAAK,EAAE,kBAAkB;KAClC,MAAM,SAAmB,CAAC,OAAO,EAAE,GAAG,EAAE;KACxC,IAAI,EAAE,SAAS,KAAA,GAAW,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;KACnE,IAAI,EAAE,cAAc,OAAO,OAAO,KAAK,iBAAe;KACtD,IAAI,EAAE,YAAY,OAAO,KAAK,kBAAgB;KAC9C,IAAI,EAAE,cAAc,OAAO,KAAK,oBAAkB;KAClD,IAAI,EAAE,SAAS,OAAO,KAAK,eAAa;KACxC,IAAI,EAAE,kBAAkB,KAAA,GAAW,OAAO,KAAK,kBAAkB,EAAE,cAAc,EAAE;KACnF,OAAO,KAAK,oBAAoB,OAAO,KAAK,GAAG,EAAE,GAAG;IACtD;IACA,OAAO,KAAK,qBAAqB;IACjC,OAAO,KAAK,OAAO,KAAK,EAAE,CAAC;GAC7B;GACA,IAAI,EAAE,iBAAiB,EAAE,cAAc,SAAS,GAAG;IACjD,MAAM,SAAmB,CAAC,mCAAmC,EAAE,cAAc,OAAO,GAAG;IACvF,KAAK,MAAM,KAAK,EAAE,eAChB,OAAO,KAAK,uBAAuB,UAAU,EAAE,IAAI,EAAE,IAAI;IAE3D,OAAO,KAAK,4BAA4B;IACxC,OAAO,KAAK,OAAO,KAAK,EAAE,CAAC;GAC7B;GACA,IAAI,OAAO,SAAS,GAClB,QAAQ,sBAAsB,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,KAAK,EAAE,EAAE;QAC/D,QAAQ,sBAAsB,OAAO,KAAK,GAAG,EAAE;EACtD;EAEA,OACE,iFAAiF,MAAM,KAAK,GAAG,EAAE,GAC9F,MAAM;CAEb;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAqC,CAAC;EAC5C,IAAI,KAAK,IAAI,MAAM,MAAM,KAAA,GAAW,OAAO,OAAO,KAAK,IAAI,MAAM;EACjE,IAAI,OAAO,KAAK,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,UAAU;EAC1D,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;EAC5D,IAAI,WAAW,KAAK,IAAI,gBAAgB,CAAC,GAAG,OAAO,iBAAiB;EACpE,IAAI,OAAO,KAAK,IAAI,mBAAmB,CAAC,MAAM,KAAK,OAAO,oBAAoB;EAC9E,IAAI,WAAW,KAAK,IAAI,wBAAwB,CAAC,GAAG,OAAO,yBAAyB;EACpF,IAAI,WAAW,KAAK,IAAI,eAAe,CAAC,GAAG,OAAO,gBAAgB;EAClE,MAAM,MAAM,KAAK,IAAI,gBAAgB;EACrC,IAAI,QAAQ,KAAA,GAAW,OAAO,iBAAiB;EAC/C,IAAI,WAAW,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,eAAe;EAChE,IAAI,WAAW,KAAK,IAAI,kBAAkB,CAAC,GAAG,OAAO,mBAAmB;EACxE,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,OAAO,cAAc;EAC9D,IAAI,OAAO,KAAK,IAAI,oBAAoB,CAAC,MAAM,KAAK,OAAO,qBAAqB;EAChF,IAAI,WAAW,KAAK,IAAI,mBAAmB,CAAC,GAAG,OAAO,oBAAoB;EAC1E,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;EAC5D,IAAI,WAAW,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,eAAe;EAChE,MAAM,MAAM,QAAQ,IAAI,cAAc;EACtC,IAAI,QAAQ,KAAA,GAAW,OAAO,eAAe;EAE7C,MAAM,MAAM,UAAU,IAAI,mBAAmB;EAC7C,IAAI,KAAK;GACP,MAAM,IAAuC,CAAC;GAC9C,IAAI,OAAO,KAAK,KAAK,0BAA0B,CAAC,MAAM,KAAK,EAAE,2BAA2B;GACxF,IAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG,EAAE,iBAAiB;GAChE,IAAI,OAAO,KAAK,KAAK,sBAAsB,CAAC,MAAM,KAAK,EAAE,uBAAuB;GAChF,MAAM,KAAK,QAAQ,KAAK,gBAAgB;GACxC,IAAI,OAAO,KAAA,GAAW,EAAE,iBAAiB;GACzC,MAAM,MAAM,QAAQ,KAAK,QAAQ;GACjC,IAAI,QAAQ,KAAA,GAAW,EAAE,SAAS;GAClC,MAAM,MAAM,QAAQ,KAAK,oBAAoB;GAC7C,IAAI,QAAQ,KAAA,GAAW,EAAE,qBAAqB;GAC9C,MAAM,MAAM,QAAQ,KAAK,qBAAqB;GAC9C,IAAI,QAAQ,KAAA,GAAW,EAAE,sBAAsB;GAC/C,MAAM,WAAW,UAAU,KAAK,kBAAkB;GAClD,IAAI,UAAU;IACZ,MAAM,SAAmC,CAAC;IAC1C,KAAK,MAAM,OAAO,SAAS,YAAY,CAAC,GAAG;KACzC,IAAI,IAAI,SAAS,mBAAmB;KACpC,MAAM,IAA4B,EAAE,IAAI,QAAQ,KAAK,IAAI,KAAK,EAAE;KAChE,IAAI,KAAK,KAAK,MAAM,MAAM,KAAA,GAAW,EAAE,OAAO,KAAK,KAAK,MAAM;KAC9D,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC,MAAM,KAAK,EAAE,YAAY;KAC1D,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,EAAE,aAAa;KACxD,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,EAAE,eAAe;KAC5D,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,GAAG,EAAE,UAAU;KAClD,MAAM,MAAM,QAAQ,KAAK,eAAe;KACxC,IAAI,QAAQ,KAAA,GAAW,EAAE,gBAAgB;KACzC,OAAO,KAAK,CAAC;IACf;IACA,IAAI,OAAO,SAAS,GAAG,EAAE,mBAAmB;GAC9C;GACA,MAAM,QAAQ,UAAU,KAAK,yBAAyB;GACtD,IAAI,OAAO;IACT,MAAM,UAA2C,CAAC;IAClD,KAAK,MAAM,OAAO,MAAM,YAAY,CAAC,GAAG;KACtC,IAAI,IAAI,SAAS,gBAAgB;KACjC,QAAQ,KAAK,EAAE,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG,CAAC;IAChD;IACA,IAAI,QAAQ,SAAS,GAAG,EAAE,gBAAgB;GAC5C;GACA,OAAO,oBAAoB;EAC7B;EACA,OAAO;CACT;AACF;;;;;;;;;;ACtBA,MAAM,2BAA2B;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,eAAkD;CAC7D,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,gFACF;EAEA,IAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;GACvC,EAAE,KAAK,yBAAyB,KAAK,MAAM,OAAO,GAAG;GACrD,KAAK,MAAM,KAAK,KAAK,OAAO;IAC1B,MAAM,QAAkB,CACtB,SAAS,UAAU,EAAE,IAAI,EAAE,IAC3B,wBAAwB,EAAE,oBAAoB,EAChD;IACA,KAAK,MAAM,OAAO,0BAChB,IAAI,EAAE,MAAM,MAAM,KAAK,GAAG,IAAI,KAAK;IAErC,EAAE,KAAK,iBAAiB,MAAM,KAAK,GAAG,EAAE,GAAG;GAC7C;GACA,EAAE,KAAK,kBAAkB;EAC3B;EAEA,IAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,GAAG;GAC3C,EAAE,KAAK,2BAA2B,KAAK,QAAQ,OAAO,GAAG;GACzD,KAAK,MAAM,KAAK,KAAK,SAAS,EAAE,KAAK,SAAS,UAAU,EAAE,KAAK,EAAE,IAAI;GACrE,EAAE,KAAK,oBAAoB;EAC7B;EAEA,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,GAAG;GACnC,EAAE,KAAK,uBAAuB,KAAK,IAAI,OAAO,GAAG;GACjD,KAAK,MAAM,KAAK,KAAK,KAAK;IACxB,MAAM,QAAkB,CAAC,MAAM,EAAE,YAAY,IAAI,MAAM,EAAE,aAAa,EAAE;IACxE,IAAI,QAAQ;IACZ,IAAI,EAAE,OAAO;KACX,MAAM,IAAI,EAAE;KACZ,MAAM,SAAmB,CAAC;KAC1B,IAAI,EAAE,UAAU,KAAA,GAAW,OAAO,KAAK,MAAM,EAAE,MAAM,EAAE;KACvD,IAAI,EAAE,YAAY,KAAA,GAAW,OAAO,KAAK,OAAO,UAAU,EAAE,OAAO,EAAE,EAAE;KACvE,IAAI,EAAE,eAAe,KAAA,GAAW,OAAO,KAAK,OAAO,EAAE,WAAW,EAAE;KAClE,IAAI,EAAE,gBAAgB,KAAA,GAAW,OAAO,KAAK,OAAO,EAAE,YAAY,EAAE;KACpE,IAAI,EAAE,oBAAoB,KAAA,GAAW,OAAO,KAAK,OAAO,EAAE,gBAAgB,EAAE;KAC5E,IAAI,EAAE,oBAAoB,KAAA,GAAW,OAAO,KAAK,OAAO,EAAE,gBAAgB,EAAE;KAC5E,IAAI,EAAE,QAAQ,OAAO,KAAK,SAAO;KACjC,IAAI,EAAE,WAAW,OAAO,KAAK,SAAO;KACpC,IAAI,EAAE,eAAe,OAAO,KAAK,UAAQ;KACzC,IAAI,EAAE,MAAM,OAAO,KAAK,SAAO;KAC/B,MAAM,SAAS,uBAAuB,EAAE,aAAa;KACrD,QAAQ,SAAS,MAAM,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,QAAQ,MAAM,OAAO,KAAK,GAAG,EAAE;IACnF,OAAO,IAAI,EAAE,KAAK;KAChB,MAAM,IAAI,EAAE;KACZ,MAAM,SAAmB,CAAC,OAAO,EAAE,eAAe,EAAE;KACpD,IAAI,EAAE,UAAU,KAAA,GAAW,OAAO,KAAK,MAAM,EAAE,MAAM,EAAE;KACvD,IAAI,EAAE,UAAU,KAAA,KAAa,EAAE,UAAU,KAAK,OAAO,KAAK,MAAM,UAAU,EAAE,KAAK,EAAE,EAAE;KACrF,MAAM,SAAS,uBAAuB,EAAE,aAAa;KACrD,QAAQ,SAAS,OAAO,OAAO,KAAK,GAAG,EAAE,GAAG,OAAO,SAAS,OAAO,OAAO,KAAK,GAAG,EAAE;IACtF,OAAO,IAAI,EAAE,YACX,QAAQ,SAAS,EAAE,WAAW,UAAU,QAAQ,EAAE,WAAW,cAAc;SACtE,IAAI,EAAE,KACX,QAAQ,SAAS,EAAE,IAAI,UAAU,QAAQ,EAAE,IAAI,cAAc,OAAO,EAAE,IAAI,SAAS;IAErF,EAAE,KAAK,QAAQ,MAAM,KAAK,GAAG,EAAE,GAAG,MAAM,OAAO;GACjD;GACA,EAAE,KAAK,gBAAgB;EACzB;EAEA,KAAK,MAAM,MAAM,KAAK,kBAAkB,CAAC,GAAG;GAC1C,MAAM,SAAS,GAAG,UAAU,CAAC;GAC7B,IAAI,OAAO,SAAS,GAAG;IACrB,EAAE,KAAK,yBAAyB,UAAU,GAAG,IAAI,EAAE,WAAW,OAAO,OAAO,GAAG;IAC/E,KAAK,MAAM,KAAK,QACd,IAAI,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,OAAO,MAAM;SACtC,EAAE,KAAK,OAAO;IAErB,EAAE,KAAK,mBAAmB;GAC5B,OACE,EAAE,KAAK,yBAAyB,UAAU,GAAG,IAAI,EAAE,IAAI;EAE3D;EAEA,IAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;GACrD,EAAE,KAAK,wBAAwB,KAAK,aAAa,OAAO,GAAG;GAC3D,KAAK,MAAM,KAAK,KAAK,cAAc,EAAE,KAAK,eAAe,CAAC,CAAC;GAC3D,EAAE,KAAK,iBAAiB;EAC1B;EAEA,IAAI,KAAK,iBAAiB,KAAK,cAAc,SAAS,GAAG;GACvD,EAAE,KAAK,yBAAyB,KAAK,cAAc,OAAO,GAAG;GAC7D,KAAK,MAAM,KAAK,KAAK,eAAe,EAAE,KAAK,eAAe,CAAC,CAAC;GAC5D,EAAE,KAAK,kBAAkB;EAC3B;EAEA,EAAE,KAAK,aAAa;EACpB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAmC,CAAC;EAE1C,MAAM,UAAU,UAAU,IAAI,eAAe;EAC7C,IAAI,SAAS;GACX,MAAM,QAA+B,CAAC;GACtC,KAAK,MAAM,OAAO,QAAQ,YAAY,CAAC,GAAG;IACxC,IAAI,IAAI,SAAS,gBAAgB;IACjC,MAAM,IAAkC,EAAE,MAAM,KAAK,KAAK,MAAM,KAAK,GAAG;IACxE,MAAM,MAAM,QAAQ,KAAK,qBAAqB;IAC9C,IAAI,QAAQ,KAAA,GAAW,EAAE,sBAAsB;IAC/C,KAAK,MAAM,OAAO,0BAChB,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,OAAO;IAE3C,MAAM,KAAK,CAAwB;GACrC;GACA,OAAO,QAAQ;EACjB;EAEA,MAAM,YAAY,UAAU,IAAI,iBAAiB;EACjD,IAAI,WAAW;GACb,MAAM,UAAmC,CAAC;GAC1C,KAAK,MAAM,OAAO,UAAU,YAAY,CAAC,GAAG;IAC1C,IAAI,IAAI,SAAS,KAAK;IACtB,QAAQ,KAAK,EAAE,OAAO,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC;GAC9C;GACA,OAAO,UAAU;EACnB;EAEA,MAAM,QAAQ,UAAU,IAAI,aAAa;EACzC,IAAI,OAAO;GACT,MAAM,MAAoB,CAAC;GAC3B,KAAK,MAAM,OAAO,MAAM,YAAY,CAAC,GAAG;IACtC,IAAI,IAAI,SAAS,OAAO;IACxB,MAAM,IAAyB;KAC7B,aAAa,QAAQ,KAAK,GAAG,KAAK;KAClC,cAAe,KAAK,KAAK,GAAG,KAAK;IACnC;IACA,MAAM,MAAM,UAAU,KAAK,GAAG;IAC9B,IAAI,KAAK;KACP,MAAM,IAA8B,CAAC;KACrC,MAAM,IAAI,QAAQ,KAAK,GAAG;KAC1B,IAAI,MAAM,KAAA,GAAW,EAAE,QAAQ;KAC/B,IAAI,KAAK,KAAK,IAAI,MAAM,KAAA,GAAW,EAAE,UAAU,KAAK,KAAK,IAAI;KAC7D,MAAM,KAAK,QAAQ,KAAK,IAAI;KAC5B,IAAI,OAAO,KAAA,GAAW,EAAE,aAAa;KACrC,MAAM,KAAK,QAAQ,KAAK,IAAI;KAC5B,IAAI,OAAO,KAAA,GAAW,EAAE,cAAc;KACtC,IAAI,KAAK,KAAK,IAAI,MAAM,KAAA,GAAW,EAAE,kBAAkB,KAAK,KAAK,IAAI;KACrE,IAAI,KAAK,KAAK,IAAI,MAAM,KAAA,GAAW,EAAE,kBAAkB,KAAK,KAAK,IAAI;KACrE,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,SAAS;KAC3C,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,YAAY;KAC9C,IAAI,WAAW,KAAK,KAAK,IAAI,CAAC,GAAG,EAAE,gBAAgB;KACnD,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,OAAO;KACzC,MAAM,MAAM,mBAAmB,GAAG;KAClC,IAAI,KAAK,EAAE,gBAAgB;KAC3B,EAAE,QAAQ;IACZ;IACA,MAAM,OAAO,UAAU,KAAK,IAAI;IAChC,IAAI,MAAM;KACR,MAAM,IAA4B,EAAE,gBAAgB,QAAQ,MAAM,IAAI,KAAK,EAAE;KAC7E,MAAM,IAAI,QAAQ,MAAM,GAAG;KAC3B,IAAI,MAAM,KAAA,GAAW,EAAE,QAAQ;KAC/B,IAAI,KAAK,MAAM,GAAG,MAAM,KAAA,GAAW,EAAE,QAAQ,KAAK,MAAM,GAAG;KAC3D,MAAM,MAAM,mBAAmB,IAAI;KACnC,IAAI,KAAK,EAAE,gBAAgB;KAC3B,EAAE,MAAM;IACV;IACA,MAAM,MAAM,UAAU,KAAK,GAAG;IAC9B,IAAI,KACF,EAAE,aAAa;KACb,WAAW,QAAQ,KAAK,GAAG,KAAK;KAChC,eAAe,QAAQ,KAAK,IAAI,KAAK;IACvC;IAEF,MAAM,MAAM,UAAU,KAAK,GAAG;IAC9B,IAAI,KACF,EAAE,MAAM;KACN,WAAW,QAAQ,KAAK,GAAG,KAAK;KAChC,eAAe,QAAQ,KAAK,IAAI,KAAK;KACrC,UAAW,KAAK,KAAK,GAAG,KAAK;IAC/B;IAEF,IAAI,KAAK,CAAe;GAC1B;GACA,OAAO,MAAM;EACf;EAEA,MAAM,SAAkC,CAAC;EACzC,KAAK,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG;GACpC,IAAI,KAAK,SAAS,kBAAkB;GACpC,MAAM,KAA4B,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,GAAG;GACnE,MAAM,SAAuC,CAAC;GAC9C,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,MAAM;IACvB,MAAM,QAAQ,UAAU,KAAK,QAAQ;IACrC,OAAO,KAAK,EAAE,QAAQ,QAAQ,iBAAiB,KAAK,IAAI,KAAA,EAAU,CAAC;GACrE;GACA,IAAI,OAAO,SAAS,GAAG,GAAG,SAAS;GACnC,OAAO,KAAK,EAAE;EAChB;EACA,IAAI,OAAO,SAAS,GAAG,OAAO,iBAAiB;EAE/C,MAAM,SAAS,UAAU,IAAI,cAAc;EAC3C,IAAI,QAAQ,OAAO,eAAe,YAAY,MAAM;EACpD,MAAM,UAAU,UAAU,IAAI,eAAe;EAC7C,IAAI,SAAS,OAAO,gBAAgB,YAAY,OAAO;EAEvD,OAAO;CACT;AACF;AAIA,SAAS,uBAAuB,SAA2D;CACzF,IAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,OAAO;CAC7C,OAAO,QAAQ,KAAK,MAAM,SAAS,EAAE,MAAM,GAAG,EAAE,OAAO,aAAW,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE;AACnF;AAEA,SAAS,mBAAmB,QAA2D;CACrF,MAAM,MAAoC,CAAC;CAC3C,KAAK,MAAM,OAAO,OAAO,YAAY,CAAC,GAAG;EACvC,IAAI,IAAI,SAAS,KAAK;EACtB,MAAM,MAAkC,EAAE,OAAO,QAAQ,KAAK,GAAG,KAAK,EAAE;EACxE,IAAI,WAAW,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI,OAAO;EAC3C,IAAI,KAAK,GAAG;CACd;CACA,OAAO,IAAI,SAAS,IAAI,MAAM,KAAA;AAChC;AAEA,SAAS,eAAe,GAAiC;CAEvD,OAAO,QADK,EAAE,WAAW,CAAC,EAAA,CAAG,KAAK,MAAM,UAAU,EAAE,UAAU,OAAO,EAAE,WAAW,IAAI,CAAC,CAAC,KAAK,EAC9E,EAAE;AACnB;AAEA,SAAS,YAAY,IAAqC;CACxD,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG;EACnC,IAAI,IAAI,SAAS,MAAM;EACvB,MAAM,UAAmC,CAAC;EAC1C,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,GAAG;GACrC,IAAI,KAAK,SAAS,MAAM;GACxB,QAAQ,KAAK;IAAE,WAAW,QAAQ,MAAM,GAAG,KAAK;IAAG,YAAY,QAAQ,MAAM,GAAG,KAAK;GAAE,CAAC;EAC1F;EACA,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC;CACnD;CACA,OAAO;AACT;;;;;;;;;;;ACncA,MAAa,iBAIT;CACF,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,oBAAoB,KAAK,SAAS,KAAK,YAAY,KAAK,OAAO;CACxE;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAyC,CAAC;EAGhD,IAAI,KAAK,IAAI,MAAM,GAAG,OAAO,OAAO,KAAK,IAAI,MAAM;EACnD,IAAI,KAAK,IAAI,SAAS,MAAM,KAAA,GAAW,OAAO,UAAU,QAAQ,IAAI,SAAS,KAAK;EAClF,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;EAC5D,IAAI,OAAO,KAAK,IAAI,aAAa,CAAC,MAAM,KAAK,OAAO,cAAc;EAClE,IAAI,WAAW,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,eAAe;EAChE,IAAI,WAAW,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,eAAe;EAChE,IAAI,KAAK,IAAI,mBAAmB,GAAG,OAAO,oBAAoB,KAAK,IAAI,mBAAmB;EAC1F,IAAI,KAAK,IAAI,cAAc,GAAG,OAAO,eAAe,KAAK,IAAI,cAAc;EAC3E,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAC1D,IAAI,KAAK,IAAI,gBAAgB,GAAG,OAAO,iBAAiB,KAAK,IAAI,gBAAgB;EACjF,IAAI,OAAO,KAAK,IAAI,aAAa,CAAC,MAAM,KAAK,OAAO,cAAc;EAClE,IAAI,KAAK,IAAI,WAAW,GAAG,OAAO,YAAY,KAAK,IAAI,WAAW;EAClE,IAAI,KAAK,IAAI,iBAAiB,GAAG,OAAO,kBAAkB,KAAK,IAAI,iBAAiB;EACpF,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,MAAM,KAAK,IAAI,KAAK;EAChD,IAAI,OAAO,KAAK,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,YAAY;EAC9D,IAAI,WAAW,KAAK,IAAI,UAAU,CAAC,GAAG,OAAO,WAAW;EACxD,IAAI,WAAW,KAAK,IAAI,kBAAkB,CAAC,GAAG,OAAO,mBAAmB;EACxE,IAAI,OAAO,KAAK,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,eAAe;EACpE,IAAI,WAAW,KAAK,IAAI,cAAc,CAAC,GAAG,OAAO,eAAe;EAChE,IAAI,OAAO,KAAK,IAAI,mBAAmB,CAAC,MAAM,KAAK,OAAO,oBAAoB;EAC9E,IAAI,OAAO,KAAK,IAAI,kBAAkB,CAAC,MAAM,KAAK,OAAO,mBAAmB;EAC5E,IAAI,OAAO,KAAK,IAAI,WAAW,CAAC,MAAM,KAAK,OAAO,YAAY;EAC9D,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;EAC5D,IAAI,WAAW,KAAK,IAAI,wBAAwB,CAAC,GAAG,OAAO,yBAAyB;EACpF,IAAI,OAAO,KAAK,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,eAAe;EACpE,IAAI,OAAO,KAAK,IAAI,cAAc,CAAC,MAAM,KAAK,OAAO,eAAe;EACpE,IAAI,OAAO,KAAK,IAAI,aAAa,CAAC,MAAM,KAAK,OAAO,cAAc;EAClE,IAAI,OAAO,KAAK,IAAI,uBAAuB,CAAC,MAAM,KAAK,OAAO,wBAAwB;EACtF,MAAM,WAAW,QAAQ,IAAI,UAAU;EACvC,IAAI,aAAa,KAAA,GAAW,OAAO,WAAW;EAC9C,IAAI,WAAW,KAAK,IAAI,kBAAkB,CAAC,GAAG,OAAO,mBAAmB;EACxE,IAAI,WAAW,KAAK,IAAI,qBAAqB,CAAC,GAAG,OAAO,sBAAsB;EAC9E,IAAI,WAAW,KAAK,IAAI,kBAAkB,CAAC,GAAG,OAAO,mBAAmB;EACxE,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAC1D,IAAI,OAAO,KAAK,IAAI,eAAe,CAAC,MAAM,KAAK,OAAO,gBAAgB;EACtE,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAC1D,IAAI,OAAO,KAAK,IAAI,eAAe,CAAC,MAAM,KAAK,OAAO,gBAAgB;EACtE,IAAI,OAAO,KAAK,IAAI,sBAAsB,CAAC,MAAM,KAAK,OAAO,uBAAuB;EACpF,IAAI,KAAK,IAAI,kBAAkB,GAAG,OAAO,mBAAmB,KAAK,IAAI,kBAAkB;EACvF,IAAI,KAAK,IAAI,kBAAkB,GAAG,OAAO,mBAAmB,KAAK,IAAI,kBAAkB;EACvF,IAAI,WAAW,KAAK,IAAI,wBAAwB,CAAC,GAAG,OAAO,yBAAyB;EACpF,IAAI,WAAW,KAAK,IAAI,eAAe,CAAC,GAAG,OAAO,gBAAgB;EAClE,IAAI,OAAO,KAAK,IAAI,gBAAgB,CAAC,MAAM,KAAK,OAAO,iBAAiB;EACxE,IAAI,WAAW,KAAK,IAAI,gBAAgB,CAAC,GAAG,OAAO,iBAAiB;EACpE,MAAM,eAAe,QAAQ,IAAI,cAAc;EAC/C,IAAI,iBAAiB,KAAA,GAAW,OAAO,eAAe;EACtD,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAC1D,IAAI,KAAK,IAAI,cAAc,GAAG,OAAO,eAAe,KAAK,IAAI,cAAc;EAC3E,IAAI,WAAW,KAAK,IAAI,aAAa,CAAC,GAAG,OAAO,cAAc;EAC9D,IAAI,OAAO,KAAK,IAAI,oBAAoB,CAAC,MAAM,KAAK,OAAO,qBAAqB;OAC3E,IAAI,WAAW,KAAK,IAAI,oBAAoB,CAAC,GAAG,OAAO,qBAAqB;EACjF,IAAI,KAAK,IAAI,aAAa,GAAG,OAAO,cAAc,KAAK,IAAI,aAAa;EAGxE,MAAM,QAAQ,UAAU,IAAI,UAAU;EACtC,IAAI,OAAO;GACT,IAAI,KAAK,OAAO,KAAK,GAAG,OAAO,WAAW,KAAK,OAAO,KAAK;GAC3D,MAAM,MAAM,QAAQ,OAAO,cAAc;GACzC,IAAI,QAAQ,KAAA,GAAW,OAAO,uBAAuB;GACrD,MAAM,MAAM,QAAQ,OAAO,cAAc;GACzC,IAAI,QAAQ,KAAA,GAAW,OAAO,uBAAuB;EACvD;EAGA,MAAM,OAAO,UAAU,IAAI,aAAa;EACxC,IAAI,MAAM;GACR,MAAM,SAAkC,CAAC;GACzC,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,cAAc;IAC/B,MAAM,QAA+B,CAAC;IACtC,MAAM,OAAO,KAAK,KAAK,MAAM;IAC7B,IAAI,MAAM,MAAM,OAAO;IACvB,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,MAAM,KAAK,MAAM,UAAU;SACrD,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,GAAG,MAAM,UAAU;IAC3D,IAAI,WAAW,KAAK,KAAK,WAAW,CAAC,GAAG,MAAM,YAAY;IAC1D,IAAI,KAAK,KAAK,WAAW,GAAG,MAAM,YAAY,KAAK,KAAK,WAAW;IACnE,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC,MAAM,KAAK,MAAM,YAAY;IAC9D,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC,MAAM,KAAK,MAAM,YAAY;IAC9D,IAAI,OAAO,KAAK,KAAK,YAAY,CAAC,MAAM,KAAK,MAAM,aAAa;IAChE,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,MAAM,aAAa;IAC5D,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,MAAM,KAAK,MAAM,UAAU;IAC1D,IAAI,OAAO,KAAK,KAAK,eAAe,CAAC,MAAM,KAAK,MAAM,gBAAgB;IACtE,IAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG,MAAM,iBAAiB;IACpE,IAAI,WAAW,KAAK,KAAK,cAAc,CAAC,GAAG,MAAM,eAAe;IAChE,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,MAAM,cAAc;IAC9D,IAAI,WAAW,KAAK,KAAK,mBAAmB,CAAC,GAAG,MAAM,oBAAoB;IAC1E,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,MAAM,KAAK,MAAM,UAAU;IAC1D,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,GAAG,MAAM,UAAU;IACtD,IAAI,OAAO,KAAK,KAAK,aAAa,CAAC,MAAM,KAAK,MAAM,cAAc;IAClE,IAAI,WAAW,KAAK,KAAK,yBAAyB,CAAC,GAAG,MAAM,0BAA0B;IACtF,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,MAAM,cAAc;IAC9D,IAAI,WAAW,KAAK,KAAK,gBAAgB,CAAC,GAAG,MAAM,iBAAiB;IACpE,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,MAAM,cAAc;IAC9D,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,MAAM,cAAc;IAC9D,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,MAAM,cAAc;IAC9D,OAAO,KAAK,KAAK;GACnB;GACA,OAAO,cAAc;EACvB;EAGA,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MAAM;GACR,MAAM,aAAqC,CAAC;GAC5C,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,aAAa;IAC9B,MAAM,KAA2B,CAAC;IAClC,IAAI,KAAK,KAAK,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,MAAM;IACjD,MAAM,MAAM,QAAQ,KAAK,KAAK;IAC9B,IAAI,QAAQ,KAAA,GAAW,GAAG,MAAM;IAChC,IAAI,KAAK,KAAK,UAAU,GAAG,GAAG,WAAW,KAAK,KAAK,UAAU;IAC7D,IAAI,KAAK,KAAK,YAAY,GAAG,GAAG,aAAa,KAAK,KAAK,YAAY;IACnE,MAAM,YAAY,QAAQ,KAAK,WAAW;IAC1C,IAAI,cAAc,KAAA,GAAW,GAAG,YAAY;IAC5C,MAAM,WAAW,QAAQ,KAAK,UAAU;IACxC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW;IAC1C,IAAI,KAAK,KAAK,UAAU,GAAG,GAAG,WAAW,KAAK,KAAK,UAAU;IAC7D,WAAW,KAAK,EAAE;GACpB;GACA,OAAO,aAAa;EACtB;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,YAAsB,CAAC;GAC7B,KAAK,MAAM,KAAK,YAAY,YAAY,CAAC,GACvC,IAAI,EAAE,SAAS,SAAS;IACtB,MAAM,IAAI,QAAQ,GAAG,GAAG;IACxB,IAAI,MAAM,KAAA,GAAW,UAAU,KAAK,CAAC;GACvC;GAEF,OAAO,YAAY;EACrB;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,YAAsB,CAAC;GAC7B,KAAK,MAAM,KAAK,YAAY,YAAY,CAAC,GACvC,IAAI,EAAE,SAAS,SAAS;IACtB,MAAM,IAAI,QAAQ,GAAG,GAAG;IACxB,IAAI,MAAM,KAAA,GAAW,UAAU,KAAK,CAAC;GACvC;GAEF,OAAO,YAAY;EACrB;EAGA,MAAM,eAAe,UAAU,IAAI,YAAY;EAC/C,IAAI,cAAc;GAChB,MAAM,aAAqC,CAAC;GAC5C,KAAK,MAAM,MAAM,aAAa,YAAY,CAAC,GAAG;IAC5C,IAAI,GAAG,SAAS,aAAa;IAC7B,MAAM,WAAiC,CAAC;IACxC,MAAM,MAAM,QAAQ,IAAI,KAAK;IAC7B,IAAI,QAAQ,KAAA,GAAW,SAAS,MAAM;IACtC,MAAM,OAAO,QAAQ,IAAI,MAAM;IAC/B,IAAI,SAAS,KAAA,GAAW,SAAS,OAAO;IACxC,IAAI,KAAK,IAAI,KAAK,GAAG,SAAS,MAAM,KAAK,IAAI,KAAK;IAClD,MAAM,OAAO,QAAQ,IAAI,MAAM;IAC/B,IAAI,SAAS,KAAA,GAAW,SAAS,OAAO;IACxC,WAAW,KAAK,QAAQ;GAC1B;GACA,OAAO,aAAa;EACtB;EAGA,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,MAAM,UAAoC,CAAC;GAC3C,KAAK,MAAM,SAAS,UAAU,YAAY,CAAC,GAAG;IAC5C,IAAI,MAAM,SAAS,UAAU;IAC7B,MAAM,MAA8B,CAAC;IACrC,IAAI,KAAK,OAAO,QAAQ,GAAG,IAAI,SAAS,KAAK,OAAO,QAAQ;IAC5D,MAAM,QAAQ,QAAQ,OAAO,OAAO;IACpC,IAAI,UAAU,KAAA,GAAW,IAAI,QAAQ;IACrC,MAAM,OAAO,UAAU,OAAO,WAAW;IACzC,IAAI,MAAM,IAAI,YAAY,eAAe,IAAI;IAC7C,QAAQ,KAAK,GAAG;GAClB;GACA,OAAO,UAAU;EACnB;EAGA,MAAM,gBAAgB,UAAU,IAAI,oBAAoB;EACxD,IAAI,eAAe;GACjB,MAAM,cAA8C,CAAC;GACrD,KAAK,MAAM,QAAQ,cAAc,YAAY,CAAC,GAAG;IAC/C,IAAI,KAAK,SAAS,qBAAqB;IACvC,MAAM,KAAmC,CAAC;IAC1C,IAAI,KAAK,MAAM,OAAO,GAAG,GAAG,QAAQ,KAAK,MAAM,OAAO;IACtD,IAAI,KAAK,MAAM,MAAM,GAAG,GAAG,OAAO,KAAK,MAAM,MAAM;IACnD,MAAM,WAAW,QAAQ,MAAM,UAAU;IACzC,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW;IAC1C,MAAM,UAAU,UAAU,MAAM,YAAY;IAC5C,IAAI,SAAS;KACX,MAAM,QAAqC,CAAC;KAC5C,KAAK,MAAM,OAAO,QAAQ,YAAY,CAAC,GAAG;MACxC,IAAI,IAAI,SAAS,aAAa;MAC9B,MAAM,KAAK,eAAe,GAAG,CAAC;KAChC;KACA,GAAG,aAAa;IAClB;IACA,YAAY,KAAK,EAAE;GACrB;GACA,OAAO,qBAAqB;EAC9B;EAGA,MAAM,iBAAiB,UAAU,IAAI,cAAc;EACnD,IAAI,gBAAgB;GAClB,MAAM,eAAyC,CAAC;GAChD,KAAK,MAAM,QAAQ,eAAe,YAAY,CAAC,GAAG;IAChD,IAAI,KAAK,SAAS,eAAe;IACjC,MAAM,KAA6B,CAAC;IACpC,MAAM,QAAQ,QAAQ,MAAM,OAAO;IACnC,IAAI,UAAU,KAAA,GAAW,GAAG,QAAQ;IACpC,MAAM,SAAS,QAAQ,MAAM,QAAQ;IACrC,IAAI,WAAW,KAAA,GAAW,GAAG,SAAS;IACtC,IAAI,WAAW,KAAK,MAAM,QAAQ,CAAC,GAAG,GAAG,SAAS;IAClD,MAAM,OAAO,UAAU,MAAM,WAAW;IACxC,IAAI,MAAM,GAAG,YAAY,eAAe,IAAI;IAC5C,aAAa,KAAK,EAAE;GACtB;GACA,OAAO,eAAe;EACxB;EAGA,MAAM,gBAAgB,UAAU,IAAI,kBAAkB;EACtD,IAAI,eAAe;GACjB,MAAM,cAA2C,CAAC;GAClD,KAAK,MAAM,OAAO,cAAc,YAAY,CAAC,GAAG;IAC9C,IAAI,IAAI,SAAS,kBAAkB;IACnC,MAAM,IAA+B,CAAC;IACtC,IAAI,WAAW,KAAK,KAAK,SAAS,CAAC,GAAG,EAAE,UAAU;IAClD,IAAI,WAAW,KAAK,KAAK,8BAA8B,CAAC,GACtD,EAAE,+BAA+B;IACnC,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,EAAE,cAAc;IAC1D,IAAI,OAAO,KAAK,KAAK,iBAAiB,CAAC,MAAM,KAAK,EAAE,kBAAkB;IACtE,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC,MAAM,KAAK,EAAE,YAAY;IAC1D,IAAI,OAAO,KAAK,KAAK,WAAW,CAAC,MAAM,KAAK,EAAE,YAAY;IAC1D,IAAI,OAAO,KAAK,KAAK,YAAY,CAAC,MAAM,KAAK,EAAE,aAAa;IAC5D,IAAI,WAAW,KAAK,KAAK,YAAY,CAAC,GAAG,EAAE,aAAa;IACxD,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,MAAM,KAAK,EAAE,UAAU;IACtD,IAAI,WAAW,KAAK,KAAK,yBAAyB,CAAC,GAAG,EAAE,0BAA0B;IAClF,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,UAAU,KAAK,KAAK,SAAS;IACzD,YAAY,KAAK,CAAC;GACpB;GACA,OAAO,mBAAmB;EAC5B;EAGA,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,MAAM,UAAoC,CAAC;GAC3C,KAAK,MAAM,OAAO,UAAU,YAAY,CAAC,GAAG;IAC1C,IAAI,IAAI,SAAS,UAAU;IAC3B,MAAM,IAA4B,CAAC;IACnC,MAAM,MAAM,QAAQ,KAAK,KAAK;IAC9B,IAAI,QAAQ,KAAA,GAAW,EAAE,MAAM;IAC/B,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,OAAO,KAAK,KAAK,MAAM;IAChD,MAAM,KAAK,QAAQ,KAAK,IAAI;IAC5B,IAAI,OAAO,KAAA,GAAW,EAAE,KAAK;IAC7B,MAAM,QAAQ,QAAQ,KAAK,OAAO;IAClC,IAAI,UAAU,KAAA,GAAW,EAAE,QAAQ;IACnC,MAAM,YAAY,QAAQ,KAAK,WAAW;IAC1C,IAAI,cAAc,KAAA,GAAW,EAAE,YAAY;IAC3C,MAAM,MAAM,QAAQ,KAAK,cAAc;IACvC,IAAI,QAAQ,KAAA,GAAW,EAAE,eAAe;IACxC,MAAM,MAAM,QAAQ,KAAK,aAAa;IACtC,IAAI,QAAQ,KAAA,GAAW,EAAE,cAAc;IACvC,IAAI,KAAK,KAAK,cAAc,GAAG,EAAE,eAAe,KAAK,KAAK,cAAc;IACxE,IAAI,KAAK,KAAK,cAAc,GAAG,EAAE,eAAe,KAAK,KAAK,cAAc;IACxE,QAAQ,KAAK,CAAC;GAChB;GACA,OAAO,UAAU;EACnB;EAGA,MAAM,QAAQ,UAAU,IAAI,qBAAqB;EACjD,IAAI,OAAO;GACT,MAAM,QAAqC,CAAC;GAC5C,KAAK,MAAM,KAAK,MAAM,YAAY,CAAC,GACjC,IAAI,EAAE,SAAS,qBACb,MAAM,KAAK,EAAE,gBAAgB,QAAQ,GAAG,gBAAgB,KAAK,EAAE,CAAC;GAGpE,OAAO,sBAAsB;EAC/B;EAGA,MAAM,QAAQ,UAAU,IAAI,qBAAqB;EACjD,IAAI,OAAO;GACT,MAAM,QAAqC,CAAC;GAC5C,KAAK,MAAM,KAAK,MAAM,YAAY,CAAC,GACjC,IAAI,EAAE,SAAS,qBACb,MAAM,KAAK,EAAE,gBAAgB,QAAQ,GAAG,gBAAgB,KAAK,EAAE,CAAC;GAGpE,OAAO,sBAAsB;EAC/B;EAGA,MAAM,OAAO,UAAU,IAAI,iBAAiB;EAC5C,IAAI,MAAM;GACR,MAAM,QAAqC,CAAC;GAC5C,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,kBAAkB;IACnC,MAAM,OAAkC,CAAC;IACzC,MAAM,QAAQ,QAAQ,KAAK,OAAO;IAClC,IAAI,UAAU,KAAA,GAAW,KAAK,QAAQ;IACtC,MAAM,YAAY,UAAU,KAAK,SAAS;IAC1C,IAAI,WAAW,KAAK,UAAU,OAAO,SAAS;IAC9C,MAAM,OAAO,UAAU,KAAK,WAAW;IACvC,IAAI,MAAM,KAAK,YAAY,eAAe,IAAI;IAC9C,MAAM,KAAK,IAAI;GACjB;GACA,OAAO,kBAAkB;EAC3B;EAGA,MAAM,OAAO,UAAU,IAAI,mBAAmB;EAC9C,IAAI,MAAM;GACR,MAAM,UAAyC,CAAC;GAChD,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,oBAAoB;IACrC,MAAM,IAAiC,CAAC;IACxC,IAAI,KAAK,KAAK,MAAM,GAAG,EAAE,OAAO,KAAK,KAAK,MAAM;IAChD,MAAM,QAAQ,UAAU,KAAK,KAAK;IAClC,IAAI,OAAO,EAAE,MAAM,OAAO,KAAK,KAAK;IACpC,IAAI,KAAK,KAAK,YAAY,GAAG,EAAE,aAAa,KAAK,KAAK,YAAY;IAClE,IAAI,KAAK,KAAK,WAAW,GAAG,EAAE,YAAY,KAAK,KAAK,WAAW;IAC/D,IAAI,KAAK,KAAK,QAAQ,GAAG,EAAE,SAAS,KAAK,KAAK,QAAQ;IACtD,MAAM,aAAa,QAAQ,KAAK,YAAY;IAC5C,IAAI,eAAe,KAAA,GAAW,EAAE,aAAa;IAC7C,IAAI,WAAW,KAAK,KAAK,KAAK,CAAC,GAAG,EAAE,MAAM;IAC1C,QAAQ,KAAK,CAAC;GAChB;GACA,OAAO,oBAAoB;EAC7B;EAGA,MAAM,cAAc,UAAU,IAAI,qBAAqB;EACvD,IAAI,aAAa;GACf,MAAM,YAAY,KAAK,aAAa,MAAM;GAC1C,IAAI,WAAW,OAAO,QAAQ;EAChC,OAAO,IAAI,KAAK,IAAI,WAAW,GAC7B,OAAO,QAAQ,KAAK,IAAI,WAAW;EAGrC,OAAO;CACT;AACF;;;;;;;;;;;AC/TA,MAAa,oBAIT;CACF,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,uBACL,KAAK,WACL,KAAK,aACL,KAAK,YACL,KAAK,YACL,KAAK,YACP;CACF;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAA4C,CAAC;EAGnD,IAAI,WAAW,KAAK,IAAI,SAAS,CAAC,GAAG,OAAO,UAAU;EACtD,IAAI,OAAO,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,WAAW;EAC5D,IAAI,WAAW,KAAK,IAAI,gBAAgB,CAAC,GAAG,OAAO,iBAAiB;EACpE,IAAI,OAAO,KAAK,IAAI,eAAe,CAAC,MAAM,KAAK,OAAO,gBAAgB;EACtE,IAAI,KAAK,IAAI,aAAa,GAAG,OAAO,cAAc,KAAK,IAAI,aAAa;EACxE,MAAM,KAAK,QAAQ,IAAI,eAAe;EACtC,IAAI,OAAO,KAAA,GAAW,OAAO,gBAAgB;EAC7C,IAAI,KAAK,IAAI,kBAAkB,GAAG,OAAO,mBAAmB,KAAK,IAAI,kBAAkB;EACvF,IAAI,WAAW,KAAK,IAAI,iBAAiB,CAAC,GAAG,OAAO,kBAAkB;EACtE,MAAM,MAAM,QAAQ,IAAI,mBAAmB;EAC3C,IAAI,QAAQ,KAAA,GAAW,OAAO,oBAAoB;EAClD,IAAI,WAAW,KAAK,IAAI,kBAAkB,CAAC,GAAG,OAAO,mBAAmB;EACxE,IAAI,WAAW,KAAK,IAAI,iBAAiB,CAAC,GAAG,OAAO,kBAAkB;EACtE,IAAI,WAAW,KAAK,IAAI,sBAAsB,CAAC,GAAG,OAAO,uBAAuB;EAChF,IAAI,WAAW,KAAK,IAAI,eAAe,CAAC,GAAG,OAAO,gBAAgB;EAClE,IAAI,WAAW,KAAK,IAAI,YAAY,CAAC,GAAG,OAAO,aAAa;EAC5D,MAAM,cAAc,QAAQ,IAAI,aAAa;EAC7C,IAAI,gBAAgB,KAAA,GAAW,OAAO,cAAc;EAEpD,MAAM,OAAO,UAAU,IAAI,aAAa;EACxC,IAAI,MAAM;GACR,OAAO,aAAa,KAAK,MAAM,MAAM;GACrC,MAAM,QAAQ,UAAU,MAAM,iBAAiB;GAC/C,IAAI,OAAO;IACT,MAAM,MAAoC,CAAC;IAC3C,IAAI,KAAK,OAAO,KAAK,GAAG,IAAI,MAAM,KAAK,OAAO,KAAK;IACnD,IAAI,KAAK,OAAO,OAAO,GAAG,IAAI,QAAQ,KAAK,OAAO,OAAO;IACzD,OAAO,kBAAkB;GAC3B;EACF;EACA,MAAM,OAAO,UAAU,IAAI,aAAa;EACxC,IAAI,MAAM;GACR,MAAM,SAAoC,CAAC;GAC3C,KAAK,MAAM,OAAO,KAAK,YAAY,CAAC,GAAG;IACrC,IAAI,IAAI,SAAS,cAAc;IAC/B,MAAM,QAAiC,CAAC;IACxC,IAAI,KAAK,KAAK,MAAM,GAAG,MAAM,OAAO,KAAK,KAAK,MAAM;IACpD,IAAI,QAAQ,KAAK,UAAU,MAAM,KAAA,GAAW,MAAM,WAAW,QAAQ,KAAK,UAAU;IACpF,MAAM,OAAO,UAAU,KAAK,aAAa;IACzC,IAAI,MAAM;KACR,MAAM,QAA6B,CAAC;KACpC,KAAK,MAAM,WAAW,KAAK,YAAY,CAAC,GAAG;MACzC,MAAM,IAAI,KAAK,SAAS,GAAG;MAC3B,IAAI,MAAM,KAAA,GAAW,MAAM,KAAK,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;KAClE;KACA,MAAM,cAAc;IACtB;IACA,OAAO,KAAK,KAAK;GACnB;GACA,OAAO,cAAc;EACvB;EACA,OAAO;CACT;AACF;AAEA,MAAa,wBAIT;CACF,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,2BAA2B,KAAK,UAAU;CACnD;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,UAAqC,CAAC;EAC5C,KAAK,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG;GACnC,IAAI,IAAI,SAAS,KAAK;GACtB,MAAM,SAAkC,CAAC;GACzC,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,GAAG;IACpC,IAAI;IACJ,IAAI,IAAI,SAAS,KACf,QAAQ;KAAE,MAAM;KAAU,GAAG,QAAQ,KAAK,GAAG,KAAK;IAAE;SAC/C,IAAI,IAAI,SAAS,KAAK;KAC3B,MAAM,IAAI,KAAK,KAAK,GAAG;KACvB,QAAQ;MAAE,MAAM;MAAU,GAAG,MAAM,KAAA,IAAY,OAAO,CAAC,IAAI;KAAE;IAC/D,OAAO,IAAI,IAAI,SAAS,KACtB,QAAQ;KAAE,MAAM;KAAQ,GAAG,KAAK,KAAK,GAAG,KAAK;IAAG;SAC3C,IAAI,IAAI,SAAS,KACtB,QAAQ;KAAE,MAAM;KAAS,GAAG,KAAK,KAAK,GAAG,KAAK;IAAG;SAC5C,IAAI,IAAI,SAAS,KACtB,QAAQ,EAAE,MAAM,UAAU;SAE1B;IAEF,OAAO,KAAK,KAAK;GACnB;GACA,QAAQ,KAAK,MAAM;EACrB;EACA,OAAO,EAAE,QAAQ;CACnB;AACF;AAIA,SAAS,uBACP,WACA,aACA,YACA,YACA,cACQ;CACR,MAAM,IAAc,CAAC;CACrB,MAAM,YAAsB;EAC1B;EACA;EACA,SAAS,UAAU,UAAU,EAAE;EAC/B,gBAAgB,WAAW,QAAQ,OAAO;EAC1C;EACA;EACA;CACF;CAEA,IAAI,cAAc;EAChB,MAAM,KAAK;EACX,IAAI,GAAG,SAAS,UAAU,KAAK,eAAa;EAC5C,IAAI,GAAG,aAAa,OAAO,UAAU,KAAK,gBAAc;EACxD,IAAI,GAAG,gBAAgB,UAAU,KAAK,sBAAoB;EAC1D,IAAI,GAAG,kBAAkB,OAAO,UAAU,KAAK,qBAAmB;EAClE,IAAI,GAAG,aAAa,UAAU,KAAK,gBAAgB,UAAU,GAAG,WAAW,EAAE,EAAE;EAC/E,IAAI,GAAG,kBAAkB,KAAA,GAAW,UAAU,KAAK,kBAAkB,GAAG,cAAc,EAAE;EACxF,IAAI,GAAG,kBAAkB,UAAU,KAAK,qBAAqB,UAAU,GAAG,gBAAgB,EAAE,EAAE;EAC9F,IAAI,GAAG,iBAAiB,UAAU,KAAK,uBAAqB;EAC5D,IAAI,GAAG,sBAAsB,KAAA,GAC3B,UAAU,KAAK,sBAAsB,GAAG,kBAAkB,EAAE;EAC9D,IAAI,GAAG,kBAAkB,UAAU,KAAK,wBAAsB;EAC9D,IAAI,GAAG,iBAAiB,UAAU,KAAK,uBAAqB;EAC5D,IAAI,GAAG,sBAAsB,UAAU,KAAK,4BAA0B;EACtE,IAAI,GAAG,eAAe,UAAU,KAAK,qBAAmB;EACxD,IAAI,GAAG,YAAY,UAAU,KAAK,kBAAgB;CACpD;CAEA,EAAE,KAAK,yBAAyB,UAAU,KAAK,GAAG,EAAE,EAAE;CAGtD,IAAI,cAAc,eAAe;EAC/B,MAAM,MAAM,aAAa;EACzB,MAAM,WAAqB,CAAC,oDAAkD;EAC9E,IAAI,IAAI,aAAa,OAAO,SAAS,KAAK,iBAAe;EACzD,SAAS,KAAK,GAAG;EACjB,IAAI,IAAI,SAAS,IAAI,MAAM,SAAS,GAAG;GACrC,SAAS,KAAK,iBAAiB,IAAI,MAAM,OAAO,GAAG;GACnD,KAAK,MAAM,MAAM,IAAI,OAAO;IAC1B,MAAM,UAAU,GAAG,SAAS,CAAC;IAC7B,SAAS,KAAK,QAAQ,QAAQ,SAAS,WAAW,QAAQ,OAAO,KAAK,GAAG,EAAE;IAC3E,KAAK,MAAM,MAAM,SAAS,SAAS,KAAK,mBAAmB,UAAU,GAAG,IAAI,EAAE,IAAI;IAClF,SAAS,KAAK,SAAS;GACzB;GACA,SAAS,KAAK,UAAU;EAC1B;EACA,SAAS,KAAK,qBAAqB,IAAI,UAAU,OAAO,GAAG;EAC3D,KAAK,MAAM,MAAM,IAAI,WAAW;GAC9B,MAAM,UAAoB,CAAC;GAC3B,IAAI,GAAG,oBAAoB,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,gBAAgB,EAAE;GAC/E,IAAI,GAAG,oBAAoB,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,gBAAgB,EAAE;GAC/E,IAAI,GAAG,oBAAoB,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,gBAAgB,EAAE;GAC/E,IAAI,GAAG,oBAAoB,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,gBAAgB,EAAE;GAC/E,IAAI,GAAG,KAAK,QAAQ,KAAK,QAAQ,UAAU,GAAG,GAAG,EAAE,EAAE;GACrD,IAAI,GAAG,MAAM,QAAQ,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;GACxD,IAAI,GAAG,OAAO,QAAQ,KAAK,UAAU,UAAU,GAAG,KAAK,EAAE,EAAE;GAC3D,IAAI,GAAG,KAAK,QAAQ,KAAK,SAAS,UAAU,GAAG,GAAG,EAAE,EAAE;GACtD,SAAS,KAAK,aAAa,QAAQ,KAAK,GAAG,EAAE,GAAG;EAClD;EACA,SAAS,KAAK,4CAA4C;EAC1D,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;CAC1B,OACE,EAAE,KACA,uDAC2B,UAAU,SAAS,EAAE,WAAW,UAAU,WAAW,EAAE,kBAEpF;CAIF,MAAM,aAAa,WAAW;CAC9B,EAAE,KAAK,uBAAuB,WAAW,OAAO,GAAG;CAEnD,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC1C,MAAM,YAAY,WAAW,MAAM;EACnC,MAAM,UAAU,eAAe,WAAW,SAAS,CAAC;EACpD,MAAM,aAAa,oBAAoB,WAAW,SAAS,CAAC;EAE5D,IAAI,SAAS;GACX,IAAI,MAAM,UACR,MAAM;GACR,KAAK,MAAM,OAAO,WAAW,SAAS;IACpC,MAAM,IAAI,IAAI;IACd,IAAI,OAAO,MAAM,UAAU;KACzB,IAAI,IAAI,KAAK,MAAM;KACnB,IAAI,IAAI,KAAK,MAAM;IACrB;GACF;GACA,IAAI,CAAC,SAAS,GAAG,GAAG;IAClB,MAAM;IACN,MAAM;GACR;GACA,MAAM,aAAa,WAAW,QAAQ,OACnC,QAAQ,OAAO,IAAI,OAAO,YAAY,OAAO,UAAU,IAAI,EAAE,CAChE;GAEA,MAAM,aAAa,cAAc,qBAAqB,IAAI,CAAC;GAC3D,MAAM,eAAyB,CAAC;GAChC,MAAM,eAAyB,CAAC;GAChC,IAAI,YAAY;IACd,IAAI,WAAW,eAAe,aAAa,KAAK,qBAAmB;IACnE,IAAI,WAAW,UAAU,KAAA,GAAW,aAAa,KAAK,UAAU,WAAW,MAAM,EAAE;IACnF,IAAI,WAAW,iBAAiB,KAAA,GAC9B,aAAa,KAAK,iBAAiB,WAAW,aAAa,EAAE;IAC/D,IAAI,WAAW,wBAAwB,KAAA,GACrC,aAAa,KAAK,wBAAwB,WAAW,oBAAoB,EAAE;IAC7E,IAAI,WAAW,cACb,aAAa,KAAK,iBAAiB,UAAU,WAAW,YAAY,EAAE,EAAE;IAC1E,IAAI,WAAW,aAAa,aAAa,KAAK,mBAAiB;IAC/D,IAAI,WAAW,YAAY,aAAa,KAAK,kBAAgB;IAC7D,IAAI,WAAW,YAAY,KAAA,GAAW,aAAa,KAAK,YAAY,WAAW,QAAQ,EAAE;IACzF,IAAI,WAAW,oBAAoB,aAAa,KAAK,0BAAwB;IAC7E,IAAI,WAAW,iBAAiB,aAAa,KAAK,uBAAqB;IACvE,IAAI,WAAW,UAAU,aAAa,KAAK,gBAAc;GAC3D;GAEA,EAAE,KACA,qBAAqB,UAAU,SAAS,EAAE,IAAI,aAAa,SAAS,aAAa,KAAK,GAAG,IAAI,MAAM,GAAG,8GAE5D,aAAa,MAAM,IAAI,cACjD,IAAI,cAAc,IAAI,WAAW,WAAW,OAAO,GAAG,aAAa,SAAS,MAAM,aAAa,KAAK,GAAG,IAAI,GAAG,EAChI;GACA,KAAK,MAAM,KAAK,YACd,IAAI,MAAM,MAAM,EAAE,KAAK,MAAM;QACxB,IAAI,aAAa,MAAM,EAAE,KAAK,SAAS,EAAE,YAAY,CAAC,CAAC,QAAQ,aAAa,GAAG,EAAE,IAAI;QACrF,EAAE,KAAK,SAAS,EAAE,IAAI;GAE7B,EAAE,KAAK,6BAA6B;EACtC,OAAO;GACL,IAAI,UAAU,OACZ,aAAa;GACf,KAAK,MAAM,KAAK,YAAY;IAC1B,IAAI,aAAa,MAAM,UAAU;IACjC,IAAI,MAAM,MAAM,aAAa;GAC/B;GACA,MAAM,UAAoB,CAAC,UAAU,WAAW,OAAO,EAAE;GACzD,IAAI,SAAS;IACX,QAAQ,KAAK,oBAAkB;IAC/B,IAAI;IACJ,IAAI;IACJ,KAAK,MAAM,KAAK,YAAY;KAC1B,IAAI,EAAE,aAAa,OAAO;KAC1B,IAAI,CAAC,QAAQ,IAAI,MAAM,OAAO;KAC9B,IAAI,CAAC,QAAQ,IAAI,MAAM,OAAO;IAChC;IACA,MAAM,OAAO,MAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,aAAa,GAAG;IACjE,IAAI,MAAM,QAAQ,KAAK,YAAY,IAAI,IAAI,EAAE,EAAE;IAC/C,IAAI,MAAM,QAAQ,KAAK,YAAY,IAAI,IAAI,EAAE,EAAE;GACjD;GACA,IAAI,YAAY,QAAQ,KAAK,qBAAmB;GAEhD,MAAM,aAAa,cAAc,qBAAqB,IAAI,CAAC;GAC3D,MAAM,eAAyB,CAAC;GAChC,IAAI,YAAY;IACd,IAAI,WAAW,eAAe,aAAa,KAAK,qBAAmB;IACnE,IAAI,WAAW,UAAU,KAAA,GAAW,aAAa,KAAK,UAAU,WAAW,MAAM,EAAE;IACnF,IAAI,WAAW,iBAAiB,KAAA,GAC9B,aAAa,KAAK,iBAAiB,WAAW,aAAa,EAAE;IAC/D,IAAI,WAAW,wBAAwB,KAAA,GACrC,aAAa,KAAK,wBAAwB,WAAW,oBAAoB,EAAE;IAC7E,IAAI,WAAW,cACb,aAAa,KAAK,iBAAiB,UAAU,WAAW,YAAY,EAAE,EAAE;IAC1E,IAAI,WAAW,aAAa,aAAa,KAAK,mBAAiB;IAC/D,IAAI,WAAW,YAAY,aAAa,KAAK,kBAAgB;IAC7D,IAAI,WAAW,YAAY,KAAA,GAAW,aAAa,KAAK,YAAY,WAAW,QAAQ,EAAE;IACzF,IAAI,WAAW,oBAAoB,QAAQ,KAAK,0BAAwB;IACxE,IAAI,WAAW,iBAAiB,QAAQ,KAAK,uBAAqB;IAClE,IAAI,WAAW,UAAU,QAAQ,KAAK,gBAAc;GACtD;GAEA,EAAE,KACA,qBAAqB,UAAU,SAAS,EAAE,IAAI,aAAa,SAAS,aAAa,KAAK,GAAG,IAAI,MAAM,GAAG,4BAA4B,QAAQ,KAAK,GAAG,EAAE,EACtJ;GAEA,KAAK,MAAM,KAAK,YACd,IAAI,MAAM,MAAM,EAAE,KAAK,MAAM;QACxB,IAAI,aAAa,MAAM,EAAE,KAAK,SAAS,EAAE,YAAY,CAAC,CAAC,QAAQ,aAAa,GAAG,EAAE,IAAI;QACrF,EAAE,KAAK,SAAS,UAAU,OAAO,CAAC,CAAC,EAAE,IAAI;GAEhD,EAAE,KAAK,gBAAgB;GAGvB,MAAM,KAAK,cAAc,aAAa,IAAI,CAAC;GAC3C,IAAI,IAAI;IACN,MAAM,UAAoB,CAAC,aAAa;IACxC,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,KAAK,SAAS,GAAG,OAAO,EAAE;IAC/D,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,UAAU,GAAG,KAAK,EAAE;IAC5D,QAAQ,KAAK,GAAG;IAChB,IAAI,GAAG,SAAS;KACd,MAAM,KAAK,GAAG;KACd,MAAM,UAAoB,CAAC;KAC3B,IAAI,GAAG,cAAc,OAAO,QAAQ,KAAK,iBAAe;KACxD,IAAI,GAAG,YAAY,OAAO,QAAQ,KAAK,eAAa;KACpD,IAAI,GAAG,WAAW,GAAG,YAAY,SAAS,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;KAChF,IAAI,GAAG,aAAa,KAAA,GAAW,QAAQ,KAAK,aAAa,GAAG,SAAS,EAAE;KACvE,IAAI,GAAG,WAAW,KAAA,GAAW,QAAQ,KAAK,WAAW,GAAG,OAAO,EAAE;KACjE,IAAI,GAAG,WAAW,QAAQ,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,EAAE;KACvE,IAAI,GAAG,SAAS,QAAQ,KAAK,YAAY,UAAU,GAAG,OAAO,EAAE,EAAE;KACjE,IAAI,GAAG,kBAAkB,KAAA,GAAW,QAAQ,KAAK,kBAAkB,GAAG,cAAc,EAAE;KACtF,QAAQ,KAAK,WAAW,QAAQ,SAAS,MAAM,QAAQ,KAAK,GAAG,IAAI,GAAG,GAAG;IAC3E;IACA,IAAI,GAAG,cAAc,GAAG,WAAW,SAAS,GAAG;KAC7C,QAAQ,KAAK,sBAAsB,GAAG,WAAW,OAAO,GAAG;KAC3D,KAAK,MAAM,OAAO,GAAG,YAAY,QAAQ,KAAK,SAAS,IAAI,IAAI;KAC/D,QAAQ,KAAK,eAAe;IAC9B;IACA,IAAI,GAAG,cAAc,GAAG,WAAW,SAAS,GAAG;KAC7C,QAAQ,KAAK,sBAAsB,GAAG,WAAW,OAAO,GAAG;KAC3D,KAAK,MAAM,MAAM,GAAG,YAAY,QAAQ,KAAK,SAAS,UAAU,EAAE,EAAE,IAAI;KACxE,QAAQ,KAAK,eAAe;IAC9B;IACA,QAAQ,KAAK,eAAe;IAC5B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;GACzB;GAEA,EAAE,KAAK,eAAe;EACxB;CACF;CACA,EAAE,KAAK,gBAAgB;CAGvB,IAAI,cAAc,QAChB,KAAK,MAAM,MAAM,aAAa,QAAQ,EAAE,KAAK,aAAa,GAAG,EAAE,IAAI;CAIrE,IAAI,cAAc,QAAQ;EACxB,MAAM,KAAK,aAAa;EACxB,MAAM,UAAoB,CAAC;EAC3B,IAAI,GAAG,OAAO,QAAQ,KAAK,WAAW,UAAU,GAAG,KAAK,EAAE,EAAE;EAC5D,IAAI,GAAG,iBAAiB,QAAQ,KAAK,qBAAqB,UAAU,GAAG,eAAe,EAAE,EAAE;EAC1F,IAAI,GAAG,YAAY,QAAQ,KAAK,mBAAiB;EACjD,IAAI,GAAG,kBAAkB,KAAA,GAAW,QAAQ,KAAK,mBAAmB,GAAG,cAAc,EAAE;EACvF,IAAI,GAAG,kBAAkB,KAAA,GAAW,QAAQ,KAAK,mBAAmB,GAAG,cAAc,EAAE;EACvF,IAAI,GAAG,cAAc,QAAQ,KAAK,qBAAmB;EACrD,IAAI,GAAG,eAAe,OAAO,QAAQ,KAAK,mBAAiB;EAC3D,IAAI,GAAG,uBAAuB,OAAO,QAAQ,KAAK,2BAAyB;EAC3E,IAAI,GAAG,eAAe,OAAO,QAAQ,KAAK,mBAAiB;EAC3D,IAAI,GAAG,oBAAoB,OAAO,QAAQ,KAAK,wBAAsB;EACrE,IAAI,QAAQ,SAAS,GAAG,EAAE,KAAK,UAAU,QAAQ,KAAK,EAAE,EAAE,GAAG;CAC/D;CAGA,IAAI,cAAc,oBAAoB,aAAa,iBAAiB,SAAS,GAAG;EAC9E,MAAM,MAAM,aAAa;EACzB,EAAE,KAAK,4BAA4B,IAAI,OAAO,GAAG;EACjD,KAAK,MAAM,MAAM,KAAK;GACpB,MAAM,UAAoB,CAAC,eAAe,UAAU,GAAG,UAAU,EAAE,IAAI,UAAU,GAAG,MAAM,EAAE;GAC5F,IAAI,GAAG,SAAS,QAAQ,KAAK,YAAY,UAAU,GAAG,OAAO,EAAE,EAAE;GACjE,IAAI,GAAG,SAAS,QAAQ,KAAK,eAAa;GAC1C,IAAI,GAAG,KAAK,QAAQ,KAAK,WAAS;GAClC,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;GAC1E,IAAI,GAAG,YAAY,KAAA,KAAa,GAAG,YAAY,GAAG,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;GACxF,IAAI,GAAG,WAAW,QAAQ,KAAK,iBAAe;GAC9C,IAAI,GAAG,MAAM,QAAQ,KAAK,YAAU;GACpC,IAAI,GAAG,cAAc,QAAQ,KAAK,oBAAkB;GACpD,IAAI,GAAG,yBACL,QAAQ,KAAK,4BAA4B,UAAU,GAAG,uBAAuB,EAAE,EAAE;GACnF,IAAI,GAAG,eAAe,QAAQ,KAAK,kBAAkB,UAAU,GAAG,aAAa,EAAE,EAAE;GACnF,IAAI,GAAG,YAAY,QAAQ,KAAK,eAAe,UAAU,GAAG,UAAU,EAAE,EAAE;GAC1E,IAAI,GAAG,qBACL,QAAQ,KAAK,wBAAwB,UAAU,GAAG,mBAAmB,EAAE,EAAE;GAC3E,IAAI,GAAG,eAAe,QAAQ,KAAK,kBAAkB,UAAU,GAAG,aAAa,EAAE,EAAE;GACnF,IAAI,GAAG,cAAc,QAAQ,KAAK,iBAAiB,UAAU,GAAG,YAAY,EAAE,EAAE;GAChF,IAAI,GAAG,UAAU,QAAQ,KAAK,gBAAc;GAC5C,IAAI,GAAG,UAAU,QAAQ,KAAK,gBAAc;GAC5C,IAAI,GAAG,QAAQ,QAAQ,KAAK,cAAY;GACxC,IAAI,GAAG,qBAAqB,QAAQ,KAAK,wBAAwB,GAAG,oBAAoB,EAAE;GAC1F,IAAI,GAAG,YAAY,QAAQ,KAAK,kBAAgB;GAChD,IAAI,GAAG,iBAAiB,QAAQ,KAAK,uBAAqB;GAE1D,MAAM,QAAQ,GAAG,eAAe,GAAG,YAAY,SAAS;GACxD,MAAM,QAAQ,GAAG,eAAe,GAAG,YAAY,SAAS;GACxD,IAAI,SAAS,OAAO;IAClB,EAAE,KAAK,mBAAmB,QAAQ,KAAK,GAAG,EAAE,EAAE;IAC9C,IAAI,OAAO;KACT,MAAM,UAAU,CAAC,uBAAuB,GAAG,YAAa,OAAO,GAAG;KAClE,KAAK,MAAM,MAAM,GAAG,aAAc,QAAQ,KAAK,kBAAkB,GAAG,MAAM,IAAI;KAC9E,QAAQ,KAAK,gBAAgB;KAC7B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;IACzB;IACA,IAAI,OAAO;KACT,MAAM,UAAU,CAAC,uBAAuB,GAAG,YAAa,OAAO,GAAG;KAClE,KAAK,MAAM,MAAM,GAAG,aAAc;MAChC,MAAM,UAAU,CACd,eAAe,UAAU,GAAG,UAAU,EAAE,IACxC,YAAY,UAAU,GAAG,OAAO,EAAE,EACpC;MACA,IAAI,GAAG,MAAM,QAAQ,KAAK,YAAU;MACpC,IAAI,GAAG,cAAc,QAAQ,KAAK,oBAAkB;MACpD,IAAI,GAAG,UAAU,GAAG,OAAO,SAAS,GAAG;OACrC,QAAQ,KAAK,eAAe,QAAQ,KAAK,GAAG,EAAE,kBAAkB,GAAG,OAAO,OAAO,GAAG;OACpF,KAAK,MAAM,MAAM,GAAG,QAAQ;QAC1B,MAAM,UAAU;SACd,SAAS,UAAU,GAAG,IAAI,EAAE;SAC5B,eAAe,UAAU,GAAG,UAAU,EAAE;SACxC,YAAY,UAAU,GAAG,OAAO,EAAE;QACpC;QACA,IAAI,GAAG,cAAc,QAAQ,KAAK,iBAAiB,UAAU,GAAG,YAAY,EAAE,EAAE;QAChF,IAAI,GAAG,OAAO,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,GAAG,EAAE;QACrD,QAAQ,KACN,UAAU,QAAQ,KAAK,GAAG,EAAE,wBAAwB,GAAG,QAAQ,OAAO,GACxE;QACA,KAAK,MAAM,MAAM,GAAG,SAAS;SAC3B,MAAM,UAAU,CAAC,eAAe,UAAU,GAAG,UAAU,EAAE,EAAE;SAC3D,IAAI,GAAG,OAAO,QAAQ,KAAK,aAAW;SACtC,QAAQ,KAAK,gBAAgB,QAAQ,KAAK,GAAG,EAAE,GAAG;QACpD;QACA,QAAQ,KAAK,yBAAyB;OACxC;OACA,QAAQ,KAAK,wBAAwB;MACvC,OACE,QAAQ,KAAK,eAAe,QAAQ,KAAK,GAAG,EAAE,GAAG;KAErD;KACA,QAAQ,KAAK,gBAAgB;KAC7B,EAAE,KAAK,QAAQ,KAAK,EAAE,CAAC;IACzB;IACA,EAAE,KAAK,mBAAmB;GAC5B,OACE,EAAE,KAAK,mBAAmB,QAAQ,KAAK,GAAG,EAAE,GAAG;EAEnD;EACA,EAAE,KAAK,qBAAqB;CAC9B;CAGA,IAAI,cAAc,QAAQ,aAAa,KAAK,SAAS,GAAG;EACtD,EAAE,KAAK,gBAAgB,aAAa,KAAK,OAAO,GAAG;EACnD,KAAK,MAAM,KAAK,aAAa,MAAM;GACjC,MAAM,SAAmB,CACvB,eAAe,UAAU,EAAE,UAAU,EAAE,IACvC,UAAU,UAAU,EAAE,KAAK,EAAE,EAC/B;GACA,IAAI,EAAE,SAAS,OAAO,KAAK,YAAY,UAAU,EAAE,OAAO,EAAE,EAAE;GAC9D,IAAI,EAAE,eAAe,OAAO,KAAK,kBAAkB,UAAU,EAAE,aAAa,EAAE,EAAE;GAChF,IAAI,EAAE,cAAc,OAAO,KAAK,iBAAiB,UAAU,EAAE,YAAY,EAAE,EAAE;GAC7E,IAAI,EAAE,QAAQ,OAAO,KAAK,WAAW,UAAU,EAAE,MAAM,EAAE,EAAE;GAC3D,IAAI,EAAE,MAAM,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;GACrD,IAAI,EAAE,QAAQ,OAAO,KAAK,WAAW,UAAU,EAAE,MAAM,EAAE,EAAE;GAC3D,IAAI,EAAE,OAAO,OAAO,KAAK,UAAU,UAAU,EAAE,KAAK,EAAE,EAAE;GACxD,IAAI,EAAE,QAAQ,OAAO,KAAK,WAAW,UAAU,EAAE,MAAM,EAAE,EAAE;GAC3D,IAAI,EAAE,MAAM,OAAO,KAAK,SAAS,UAAU,EAAE,IAAI,EAAE,EAAE;GACrD,EAAE,KAAK,QAAQ,OAAO,KAAK,GAAG,EAAE,GAAG;EACrC;EACA,EAAE,KAAK,SAAS;CAClB;CAGA,IAAI,cAAc,iBAAiB,aAAa,cAAc,SAAS,GAAG;EACxE,EAAE,KAAK,yBAAyB,aAAa,cAAc,OAAO,GAAG;EACrE,KAAK,MAAM,MAAM,aAAa,eAC5B,EAAE,KAAK,uBAAuB,UAAU,GAAG,IAAI,EAAE,aAAa,UAAU,GAAG,OAAO,EAAE,IAAI;EAE1F,EAAE,KAAK,kBAAkB;CAC3B;CAGA,IAAI,cAAc,wBAAwB,aAAa,qBAAqB,SAAS,GAAG;EACtF,EAAE,KAAK,gBAAgB,aAAa,qBAAqB,OAAO,GAAG;EACnE,KAAK,MAAM,KAAK,aAAa,sBAAsB;GACjD,MAAM,SAAmB,CAAC;GAC1B,IAAI,EAAE,iBAAiB,KAAA,GAAW,OAAO,KAAK,iBAAiB,EAAE,aAAa,EAAE;GAChF,IAAI,EAAE,cAAc,KAAA,GAAW,OAAO,KAAK,cAAc,EAAE,UAAU,EAAE;GACvE,EAAE,KAAK,QAAQ,OAAO,KAAK,GAAG,EAAE,GAAG;EACrC;EACA,EAAE,KAAK,SAAS;CAClB;CAGA,IAAI,cAAc,cAAc,aAAa,WAAW,SAAS,GAAG;EAClE,EAAE,KAAK,sBAAsB,aAAa,WAAW,OAAO,GAAG;EAC/D,KAAK,MAAM,KAAK,aAAa,YAAY;GACvC,MAAM,SAAmB;IACvB,SAAS,UAAU,EAAE,IAAI,EAAE;IAC3B,eAAe,UAAU,EAAE,UAAU,EAAE;IACvC,YAAY,UAAU,EAAE,OAAO,EAAE;GACnC;GACA,IAAI,EAAE,SAAS,OAAO,KAAK,eAAa;GACxC,EAAE,KAAK,cAAc,OAAO,KAAK,GAAG,EAAE,GAAG;EAC3C;EACA,EAAE,KAAK,eAAe;CACxB;CAGA,MAAM,KAAK;CACX,MAAM,aAAa,IAAI,WAAW,GAAG,QAAQ,SAAS;CACtD,MAAM,UAAU,IAAI,QAAQ,GAAG,KAAK,SAAS;CAC7C,MAAM,QAAQ,IAAI,iBAAiB,GAAG,cAAc,SAAS;CAC7D,MAAM,QAAQ,IAAI,cAAc,GAAG,WAAW,SAAS;CACvD,IAAI,cAAc,WAAW,SAAS,OAAO;EAC3C,EAAE,KAAK,cAAc;EACrB,IAAI,YAAY;GACd,MAAM,WAAqB,CAAC,mBAAmB,GAAI,QAAS,OAAO,GAAG;GACtE,KAAK,MAAM,OAAO,GAAI,SAAU;IAC9B,MAAM,aACH,IAAI,iBAAiB,KAAA,IAAY,QAAQ,IAAI,aAAa,KAAK,OAC/D,IAAI,kBAAkB,KAAA,IAAY,QAAQ,IAAI,cAAc,KAAK,OACjE,IAAI,YAAY,cAAY;IAC/B,IAAI,IAAI,SAAS,KAAK,SAAS,KAAK,KAAK,UAAU,GAAG;SACjD,IAAI,IAAI,SAAS,KACpB,SAAS,KAAK,SAAS,UAAU,OAAO,IAAI,SAAS,EAAE,CAAC,EAAE,GAAG,UAAU,GAAG;SACvE,IAAI,IAAI,UAAU,KAAA,GACrB,SAAS,KAAK,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,GAAG,UAAU,GAAG;GAC/D;GACA,SAAS,KAAK,YAAY;GAC1B,EAAE,KAAK,SAAS,KAAK,EAAE,CAAC;EAC1B;EACA,IAAI,SAAS;GACX,EAAE,KAAK,gBAAgB,GAAI,KAAM,OAAO,GAAG;GAC3C,KAAK,MAAM,KAAK,GAAI,MAAO;IACzB,MAAM,SAAmB,CACvB,YAAY,EAAE,QAAQ,IACtB,kBAAkB,UAAU,EAAE,aAAa,EAAE,EAC/C;IACA,IAAI,EAAE,UAAU,KAAA,GAAW,OAAO,KAAK,UAAU,EAAE,MAAM,EAAE;IAC3D,IAAI,EAAE,YAAY,EAAE,aAAa,QAAQ,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;IAC/E,IAAI,EAAE,aAAa,OAAO,KAAK,mBAAiB;IAChD,MAAM,WAAW,SACf,QAAQ,KAAK,SAAS,IAClB,gBAAgB,KAAK,OAAO,IAAI,KAC7B,KAAK,QACJ,IAAI,SAAS,IAAI,MAAM,SAAS,IAC5B,QAAQ,IAAI,MAAM,KAAK,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,UACvD,QACN,CAAC,CACA,KAAK,EAAE,EAAE,WACZ;IACN,MAAM,YACJ,EAAE,eAAe,EAAE,YAAY,SAAS,IACpC,gBAAgB,EAAE,YACf,KAAK,QACJ,IAAI,SAAS,IAAI,MAAM,SAAS,IAC5B,QAAQ,IAAI,MAAM,KAAK,MAAM,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,UACvD,QACN,CAAC,CACA,KAAK,EAAE,EAAE,kBACZ;IACN,MAAM,QAAQ,QAAQ,EAAE,IAAI,IAAI;IAChC,IAAI,OAAO,EAAE,KAAK,QAAQ,OAAO,KAAK,GAAG,EAAE,GAAG,MAAM,OAAO;SACtD,EAAE,KAAK,QAAQ,OAAO,KAAK,GAAG,EAAE,GAAG;GAC1C;GACA,EAAE,KAAK,SAAS;EAClB;EACA,IAAI,OAAO;GACT,EAAE,KAAK,yBAAyB,GAAI,cAAe,OAAO,GAAG;GAC7D,KAAK,MAAM,MAAM,GAAI,eAAgB;IACnC,MAAM,UAAoB,CAAC;IAC3B,IAAI,GAAG,SAAS,QAAQ,KAAK,YAAY,UAAU,GAAG,OAAO,EAAE,EAAE;IACjE,IAAI,GAAG,QAAQ,QAAQ,KAAK,WAAW,UAAU,GAAG,MAAM,EAAE,EAAE;IAC9D,EAAE,KAAK,iBAAiB,QAAQ,KAAK,GAAG,EAAE,GAAG;GAC/C;GACA,EAAE,KAAK,kBAAkB;EAC3B;EACA,IAAI,OAAO;GACT,EAAE,KAAK,sBAAsB,GAAI,WAAY,OAAO,GAAG;GACvD,KAAK,MAAM,KAAK,GAAI,YAAa;IAC/B,MAAM,SACJ,EAAE,QAAQ,EAAE,KAAK,SAAS,IACtB,gBAAgB,EAAE,KAAK,OAAO,IAAI,EAAE,KAAK,KAAK,QAA+B,IAAI,SAAS,IAAI,MAAM,SAAS,IAAI,QAAQ,IAAI,MAAM,KAAK,MAAc,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,UAAU,QAAS,CAAC,CAAC,KAAK,EAAE,EAAE,WAC9M;IACN,IAAI,QAAQ,EAAE,KAAK,eAAe,UAAU,EAAE,GAAG,EAAE,IAAI,OAAO,SAAS;SAClE,EAAE,KAAK,eAAe,UAAU,EAAE,GAAG,EAAE,IAAI;GAClD;GACA,EAAE,KAAK,eAAe;EACxB;EACA,EAAE,KAAK,eAAe;CACxB;CAEA,EAAE,KAAK,yBAAyB;CAChC,OAAO,EAAE,KAAK,EAAE;AAClB;AAIA,SAAS,2BAA2B,YAAqC;CACvE,MAAM,gBAAgB,WAAW,WAAW,KAAK,GAAG,MAAM,eAAe,WAAW,SAAS,CAAC,CAAC;CAC/F,MAAM,iBAAwC,WAAW,WAAW,KAAK,GAAG,MAAM;EAChF,IAAI,cAAc,IAAI,uBAAO,IAAI,IAAoB;EACrD,MAAM,SAAS,oBAAoB,WAAW,SAAS,CAAC;EACxD,MAAM,sBAAM,IAAI,IAAoB;EACpC,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK,IAAI,IAAI,OAAO,OAAO,EAAE,GAAG,CAAC;EACpE,OAAO;CACT,CAAC;CAED,MAAM,IAAc,CAAC;CACrB,EAAE,KACA,+FAA+F,WAAW,QAAQ,OAAO,GAC3H;CAEA,KAAK,MAAM,OAAO,WAAW,SAAS;EACpC,EAAE,KAAK,KAAK;EACZ,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;GACnC,MAAM,MAAM,IAAI;GAChB,IAAI,QAAQ,MACV,EAAE,KAAK,MAAM;QACR,IAAI,eAAe,MACxB,EAAE,KAAK,SAAS,IAAI,YAAY,CAAC,CAAC,QAAQ,aAAa,GAAG,EAAE,IAAI;QAC3D,IAAI,cAAc,IACvB,EAAE,KAAK,SAAS,IAAI,IAAI;QAExB,EAAE,KAAK,SAAS,eAAe,EAAE,EAAE,IAAI,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI;EAEjE;EACA,EAAE,KAAK,MAAM;CACf;CAEA,EAAE,KAAK,sBAAsB;CAC7B,OAAO,EAAE,KAAK,EAAE;AAClB;;;;;;;;;;AC9rBA,MAAa,oBAAoB;CAC/B,MAAM;CACN,KAAK;CACL,KAAK;CACL,KAAK;CACL,SAAS;CACT,OAAO;CACP,YAAY;CACZ,SAAS;CACT,KAAK;CACL,QAAQ;AACV;AAMA,MAAa,YAAY;CACvB,WAAW;CACX,KAAK;CACL,aAAa;AACf;AAqHA,SAAS,WAAW,UAAyE;CAC3F,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,QAAQ,GAAG;EAC7C,IAAI,MAAM,KAAA,GAAW;EACrB,MAAM,KAAK,IAAI,EAAE,IAAI,OAAO,MAAM,WAAW,UAAU,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE;CAC1E;CACA,OAAO,MAAM,KAAK,EAAE;AACtB;AAIA,MAAa,YAA4C;CACvD,MAAM;CAEN,UAAU,GAAG,MAAM;EACjB,MAAM,IAAc,CAAC;EAGrB,MAAM,YAAmE;GACvE,IAAI,EAAE;GACN,MAAM,EAAE,QAAQ,EAAE;GAClB,aAAa,EAAE;GACf,KAAK,EAAE;EACT;EACA,IAAI,EAAE,SAAS,UAAU,UAAU,EAAE;EACrC,IAAI,EAAE,aAAa,EAAE,cAAc,aACjC,UAAU,YAAY,EAAE;EAE1B,IAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,mBAAmB,GACzD,UAAU,iBAAiB,EAAE;EAE/B,IAAI,EAAE,WAAW,UAAU,YAAY;EACvC,IAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,iBAAiB,GACvD,UAAU,iBAAiB,EAAE;EAE/B,IAAI,EAAE,mBAAmB,OACvB,UAAU,iBAAiB;EAE7B,IAAI,EAAE,gBAAgB,UAAU,iBAAiB;EACjD,IAAI,EAAE,WAAW,UAAU,YAAY;EACvC,IAAI,EAAE,iBAAiB,KAAA,GAAW,UAAU,eAAe,EAAE;EAC7D,IAAI,EAAE,mBAAmB,KAAA,GAAW,UAAU,iBAAiB,EAAE;EACjE,IAAI,EAAE,cAAc,KAAA,GAAW,UAAU,YAAY,EAAE;EACvD,IAAI,EAAE,mBAAmB,KAAA,GAAW,UAAU,iBAAiB,EAAE;EACjE,IAAI,EAAE,yBAAyB,KAAA,GAC7B,UAAU,uBAAuB,EAAE;EACrC,IAAI,EAAE,qBAAqB,KAAA,GAAW,UAAU,mBAAmB,EAAE;EACrE,IAAI,EAAE,yBAAyB,KAAA,GAC7B,UAAU,uBAAuB,EAAE;EACrC,IAAI,EAAE,oBAAoB,UAAU,qBAAqB,EAAE;EAC3D,IAAI,EAAE,eAAe,UAAU,gBAAgB,EAAE;EACjD,IAAI,EAAE,oBAAoB,UAAU,qBAAqB,EAAE;EAE3D,EAAE,KACA,gUAIkF,WAAW,SAAS,EAAE,EAC1G;EAGA,IAAI,EAAE,eAAe,KAAA,GACnB,EAAE,KAAK,oBAAoB,EAAE,UAAU,CAAC;EAI1C,EAAE,KAAK,wBAAwB,EAAE,QAAQ,OAAO,GAAG;EACnD,KAAK,MAAM,CAAC,GAAG,QAAQ,EAAE,QAAQ,QAAQ,GAAG;GAC1C,MAAM,WAAkE;IACtE,IAAI,IAAI;IACR,MAAM,IAAI;GACZ;GAEA,MAAM,QAAkB,CAAC;GAGzB,IAAI,IAAI,4BAA4B,KAAA,GAAW;IAC7C,MAAM,SAAS,IAAI,+BAA+B,iBAAe;IACjE,MAAM,KACJ,2BAA2B,OAAO,GAAG,UAAU,IAAI,uBAAuB,EAAE,2BAC9E;GACF;GAGA,IAAI,IAAI,qBAAqB,KAAA,GAAW;IACtC,MAAM,SAAS,IAAI,wBAAwB,iBAAe;IAC1D,MAAM,KACJ,oBAAoB,OAAO,GAAG,UAAU,IAAI,gBAAgB,EAAE,oBAChE;GACF;GAEA,IAAI,IAAI,sBAAsB,KAAA,KAAa,IAAI,sBAAsB,kBAAkB,MACrF,SAAS,oBAAoB,IAAI;GAEnC,IAAI,IAAI,mBAAmB,KAAA,GACzB,SAAS,iBAAiB,IAAI;GAEhC,IAAI,IAAI,YAAY,SAAS,aAAa,IAAI;GAC9C,IAAI,IAAI,sBAAsB,KAAA,GAAW,SAAS,oBAAoB,IAAI;GAC1E,IAAI,IAAI,mBAAmB,KAAA,GAAW,SAAS,iBAAiB,IAAI;GACpE,IAAI,IAAI,cAAc,KAAA,GAAW,SAAS,YAAY,IAAI;GAC1D,IAAI,IAAI,mBAAmB,KAAA,GAAW,SAAS,iBAAiB,IAAI;GACpE,IAAI,IAAI,oBAAoB,SAAS,qBAAqB,IAAI;GAC9D,IAAI,IAAI,eAAe,SAAS,gBAAgB,IAAI;GACpD,IAAI,IAAI,oBAAoB,SAAS,qBAAqB,IAAI;GAE9D,IAAI,IAAI,aAAa;IACnB,MAAM,KAAK,IAAI;IACf,MAAM,UAAU,CAAC,UAAU,GAAG,MAAM,IAAI,UAAU,UAAU,GAAG,KAAK,EAAE,EAAE;IACxE,IAAI,GAAG,cAAc,QAAQ,KAAK,oBAAkB;IACpD,QAAQ,KAAK,gBAAgB,UAAU,GAAG,WAAW,EAAE,EAAE;IACzD,MAAM,KAAK,gBAAgB,QAAQ,KAAK,GAAG,EAAE,GAAG;GAClD;GAEA,IAAI,MAAM,SAAS,GACjB,EAAE,KAAK,eAAe,WAAW,QAAQ,EAAE,GAAG,MAAM,KAAK,EAAE,EAAE,eAAe;QAE5E,EAAE,KAAK,eAAe,WAAW,QAAQ,EAAE,GAAG;EAElD;EACA,EAAE,KAAK,iBAAiB;EAGxB,IAAI,EAAE,OAAO;GACX,MAAM,IAAI,EAAE;GACZ,MAAM,aAAoE,CAAC;GAC3E,IAAI,EAAE,SAAS,KAAA,GAAW,WAAW,OAAO,EAAE;GAC9C,IAAI,EAAE,iBAAiB,WAAW,kBAAkB;GACpD,IAAI,EAAE,gBAAgB,WAAW,iBAAiB;GAClD,IAAI,EAAE,mBAAmB,OAAO,WAAW,iBAAiB;GAC5D,IAAI,EAAE,mBAAmB,WAAW,oBAAoB;GACxD,EAAE,KAAK,kBAAkB,WAAW,UAAU,EAAE,GAAG;EACrD;EAEA,EAAE,KAAK,UAAU;EACjB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAgC,CAAC;EAIvC,MAAM,KAAK,QAAQ,IAAI,IAAI;EAC3B,IAAI,OAAO,KAAA,GAAW,OAAO,KAAK;EAClC,IAAI,KAAK,IAAI,MAAM,GAAG,OAAO,OAAO,KAAK,IAAI,MAAM;EACnD,IAAI,KAAK,IAAI,aAAa,GAAG,OAAO,cAAc,KAAK,IAAI,aAAa;EACxE,IAAI,KAAK,IAAI,SAAS,GAAG,OAAO,UAAU,KAAK,IAAI,SAAS;EAC5D,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,MAAM,KAAK,IAAI,KAAK;EAChD,MAAM,iBAAiB,QAAQ,IAAI,gBAAgB;EACnD,IAAI,mBAAmB,KAAA,GAAW,OAAO,iBAAiB;EAC1D,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAC1D,MAAM,iBAAiB,QAAQ,IAAI,gBAAgB;EACnD,IAAI,mBAAmB,KAAA,GAAW,OAAO,iBAAiB;EAC1D,IAAI,OAAO,KAAK,IAAI,gBAAgB,CAAC,MAAM,KAAK,OAAO,iBAAiB;EACxE,IAAI,KAAK,IAAI,WAAW,GAAG,OAAO,YAAY,KAAK,IAAI,WAAW;EAClE,IAAI,WAAW,KAAK,IAAI,gBAAgB,CAAC,GAAG,OAAO,iBAAiB;EACpE,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,GAAG,OAAO,YAAY;EAC1D,MAAM,eAAe,QAAQ,IAAI,cAAc;EAC/C,IAAI,iBAAiB,KAAA,GAAW,OAAO,eAAe;EAGtD,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MAAM,OAAO,aAAa,gBAAgB,IAAI;EAGlD,MAAM,SAAS,UAAU,IAAI,cAAc;EAC3C,IAAI,QAAQ;GACV,MAAM,UAAgC,CAAC;GACvC,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GAAG;IACzC,IAAI,MAAM,SAAS,eAAe;IAElC,MAAM,MAAmC,CAAC;IAC1C,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK;IAClC,IAAI,KAAK,OAAO,mBAAmB,GACjC,IAAI,oBAAoB,KAAK,OAAO,mBAAmB;IACzD,IAAI,KAAK,OAAO,gBAAgB,GAAG,IAAI,iBAAiB,KAAK,OAAO,gBAAgB;IACpF,MAAM,QAAQ,UAAU,OAAO,yBAAyB;IACxD,IAAI,OAAO;KACT,IAAI,0BAA0B,OAAO,KAAK;KAC1C,IAAI,WAAW,KAAK,OAAO,OAAO,CAAC,GAAG,IAAI,+BAA+B;IAC3E;IACA,MAAM,QAAQ,UAAU,OAAO,kBAAkB;IACjD,IAAI,OAAO;KACT,IAAI,mBAAmB,OAAO,KAAK;KACnC,IAAI,WAAW,KAAK,OAAO,OAAO,CAAC,GAAG,IAAI,wBAAwB;IACpE;IACA,IAAI,KAAK,OAAO,YAAY,GAAG,IAAI,aAAa,KAAK,OAAO,YAAY;IACxE,MAAM,QAAQ,QAAQ,OAAO,mBAAmB;IAChD,IAAI,UAAU,KAAA,GAAW,IAAI,oBAAoB;IACjD,MAAM,UAAU,QAAQ,OAAO,gBAAgB;IAC/C,IAAI,YAAY,KAAA,GAAW,IAAI,iBAAiB;IAChD,MAAM,SAAS,QAAQ,OAAO,WAAW;IACzC,IAAI,WAAW,KAAA,GAAW,IAAI,YAAY;IAC1C,MAAM,UAAU,QAAQ,OAAO,gBAAgB;IAC/C,IAAI,YAAY,KAAA,GAAW,IAAI,iBAAiB;IAChD,IAAI,KAAK,OAAO,oBAAoB,GAClC,IAAI,qBAAqB,KAAK,OAAO,oBAAoB;IAC3D,IAAI,KAAK,OAAO,eAAe,GAAG,IAAI,gBAAgB,KAAK,OAAO,eAAe;IACjF,IAAI,KAAK,OAAO,oBAAoB,GAClC,IAAI,qBAAqB,KAAK,OAAO,oBAAoB;IAC3D,MAAM,QAAQ,UAAU,OAAO,aAAa;IAC5C,IAAI,OAAO;KACT,IAAI,cAAc;MAChB,OAAO,QAAQ,OAAO,OAAO,KAAK;MAClC,OAAO,KAAK,OAAO,OAAO,KAAK;MAC/B,aAAa,KAAK,OAAO,aAAa,KAAK;KAC7C;KACA,IAAI,WAAW,KAAK,OAAO,cAAc,CAAC,GAAG,IAAI,YAAY,eAAe;IAC9E;IACA,QAAQ,KAAK,GAAyB;GACxC;GACA,OAAO,UAAU;EACnB;EAGA,MAAM,OAAO,UAAU,IAAI,gBAAgB;EAC3C,IAAI,MAAM;GACR,MAAM,QAAwC,CAAC;GAC/C,IAAI,KAAK,MAAM,MAAM,GAAG,MAAM,OAAO,KAAK,MAAM,MAAM;GACtD,IAAI,WAAW,KAAK,MAAM,iBAAiB,CAAC,GAAG,MAAM,kBAAkB;GACvE,IAAI,WAAW,KAAK,MAAM,gBAAgB,CAAC,GAAG,MAAM,iBAAiB;GACrE,IAAI,WAAW,KAAK,MAAM,gBAAgB,CAAC,GAAG,MAAM,iBAAiB;GACrE,IAAI,WAAW,KAAK,MAAM,mBAAmB,CAAC,GAAG,MAAM,oBAAoB;GAC3E,OAAO,QAAQ;EACjB;EAGA,MAAM,UAAU,QAAQ,IAAI,gBAAgB;EAC5C,IAAI,YAAY,KAAA,GAAW,OAAO,iBAAiB;EACnD,MAAM,SAAS,QAAQ,IAAI,WAAW;EACtC,IAAI,WAAW,KAAA,GAAW,OAAO,YAAY;EAC7C,MAAM,UAAU,QAAQ,IAAI,gBAAgB;EAC5C,IAAI,YAAY,KAAA,GAAW,OAAO,iBAAiB;EACnD,MAAM,WAAW,QAAQ,IAAI,sBAAsB;EACnD,IAAI,aAAa,KAAA,GAAW,OAAO,uBAAuB;EAC1D,MAAM,UAAU,QAAQ,IAAI,kBAAkB;EAC9C,IAAI,YAAY,KAAA,GAAW,OAAO,mBAAmB;EACrD,MAAM,WAAW,QAAQ,IAAI,sBAAsB;EACnD,IAAI,aAAa,KAAA,GAAW,OAAO,uBAAuB;EAC1D,IAAI,KAAK,IAAI,oBAAoB,GAAG,OAAO,qBAAqB,KAAK,IAAI,oBAAoB;EAC7F,IAAI,KAAK,IAAI,eAAe,GAAG,OAAO,gBAAgB,KAAK,IAAI,eAAe;EAC9E,IAAI,KAAK,IAAI,oBAAoB,GAAG,OAAO,qBAAqB,KAAK,IAAI,oBAAoB;EAE7F,OAAO;CACT;AACF;;;;;;;;ACpYA,SAAgB,kBAAkB,MAAyC;CAEzE,MAAM,QAAkB,CACtB,qoBAFe,KAAK,cAAc,iBAAiB,KAAK,YAAY,KAAK,GAUkB,EAC7F;CAIA,MAAM,KAAK,KAAK;CAChB,IAAI,IAAI;EACN,MAAM,UAAoB,CAAC;EAC3B,IAAI,GAAG,SAAS,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;EACtD,IAAI,GAAG,eAAe,KAAA,GAAW,QAAQ,KAAK,eAAe,GAAG,WAAW,EAAE;EAC7E,IAAI,GAAG,iBAAiB,KAAA,GAAW,QAAQ,KAAK,iBAAiB,GAAG,aAAa,EAAE;EACnF,IAAI,GAAG,aAAa,KAAA,GAAW,QAAQ,KAAK,aAAa,GAAG,SAAS,EAAE;EACvE,MAAM,KAAK,gBAAgB,QAAQ,KAAK,GAAG,EAAE,GAAG;CAClD,OACE,MAAM,KAAK,sFAA8E;CAI3F,IAAI,KAAK,aAAa;EACpB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAoB,CAAC;EAC3B,IAAI,GAAG,qBAAqB,QAAQ,KAAK,2BAAyB;EAClE,IAAI,GAAG,UAAU,QAAQ,KAAK,aAAa,UAAU,GAAG,QAAQ,EAAE,EAAE;EACpE,IAAI,GAAG,qBAAqB;GAC1B,QAAQ,KAAK,wBAAwB,UAAU,GAAG,mBAAmB,EAAE,EAAE;GACzE,IAAI,GAAG,cAAc,KAAA,GAAW;IAC9B,MAAM,UAAU,mBAAmB,GAAG,mBAAmB;IACzD,QAAQ,KAAK,kBAAkB,UAAU,QAAQ,aAAa,EAAE,EAAE;IAClE,QAAQ,KAAK,cAAc,UAAU,QAAQ,SAAS,EAAE,EAAE;IAC1D,QAAQ,KAAK,cAAc,UAAU,QAAQ,SAAS,EAAE,EAAE;IAC1D,QAAQ,KAAK,cAAc,QAAQ,UAAU,EAAE;GACjD;EACF;EACA,IAAI,GAAG,eAAe,QAAQ,KAAK,kBAAkB,UAAU,GAAG,aAAa,EAAE,EAAE;EACnF,IAAI,GAAG,WAAW,QAAQ,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,EAAE;EACvE,IAAI,GAAG,WAAW,QAAQ,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,EAAE;EACvE,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;EAC1E,IAAI,QAAQ,SAAS,GACnB,MAAM,KAAK,gBAAgB,QAAQ,KAAK,GAAG,EAAE,GAAG;CAEpD;CAGA,IAAI,KAAK,YAAY;EACnB,MAAM,OAAO,KAAK;EAClB,MAAM,YAAsB,CAAC;EAC7B,IAAI,KAAK,UAAU,UAAU,KAAK,gBAAc;EAChD,IAAI,KAAK,wBAAwB,KAAA,GAC/B,UAAU,KAAK,wBAAwB,KAAK,oBAAoB,EAAE;EACpE,IAAI,KAAK,aAAa,UAAU,KAAK,gBAAgB,UAAU,KAAK,WAAW,EAAE,EAAE;EACnF,IAAI,KAAK,oBAAoB,UAAU,KAAK,0BAAwB;EACpE,IAAI,KAAK,mBAAmB,UAAU,KAAK,yBAAuB;EAClE,IAAI,KAAK,eAAe,UAAU,KAAK,qBAAmB;EAC1D,IAAI,KAAK,YAAY,UAAU,KAAK,kBAAgB;EACpD,IAAI,KAAK,UAAU,UAAU,KAAK,aAAa,UAAU,KAAK,QAAQ,EAAE,EAAE;EAC1E,IAAI,KAAK,4BAA4B,UAAU,KAAK,kCAAgC;EACpF,IAAI,KAAK,mBAAmB,UAAU,KAAK,yBAAuB;EAClE,IAAI,KAAK,sBAAsB,OAAO,UAAU,KAAK,yBAAuB;EAC5E,IAAI,KAAK,2BAA2B,OAAO,UAAU,KAAK,8BAA4B;EACtF,IAAI,KAAK,aAAa,UAAU,KAAK,gBAAgB,UAAU,KAAK,WAAW,EAAE,EAAE;EACnF,IAAI,KAAK,sBAAsB,UAAU,KAAK,4BAA0B;EACxE,IAAI,KAAK,cAAc,UAAU,KAAK,oBAAkB;EACxD,IAAI,KAAK,oBAAoB,UAAU,KAAK,0BAAwB;EACpE,IAAI,KAAK,yBAAyB,OAAO,UAAU,KAAK,4BAA0B;EAClF,IAAI,KAAK,uBAAuB,UAAU,KAAK,6BAA2B;EAC1E,MAAM,KAAK,cAAc,UAAU,SAAS,IAAI,IAAI,UAAU,KAAK,GAAG,MAAM,GAAG,GAAG;CACpF,OACE,MAAM,KAAK,eAAe;CAI5B,IAAI,KAAK,YAAY;EACnB,MAAM,OAAO,KAAK;EAClB,MAAM,YAAsB,CAAC;EAC7B,IAAI,KAAK,eAAe,UAAU,KAAK,qBAAmB;EAC1D,IAAI,KAAK,aAAa,UAAU,KAAK,mBAAiB;EACtD,IAAI,KAAK,cAAc,UAAU,KAAK,oBAAkB;EACxD,IAAI,KAAK,kBAAkB;GACzB,UAAU,KAAK,qBAAqB,aAAa,KAAK,gBAAgB,EAAE,EAAE;GAC1E,IAAI,KAAK,sBAAsB,KAAA,GAAW;IACxC,MAAM,YAAY,mBAAmB,KAAK,gBAAgB;IAC1D,UAAU,KAAK,0BAA0B,UAAU,UAAU,aAAa,EAAE,EAAE;IAC9E,UAAU,KAAK,sBAAsB,UAAU,UAAU,SAAS,EAAE,EAAE;IACtE,UAAU,KAAK,sBAAsB,UAAU,UAAU,SAAS,EAAE,EAAE;IACtE,UAAU,KAAK,sBAAsB,UAAU,UAAU,EAAE;GAC7D;EACF;EACA,IAAI,KAAK,uBACP,UAAU,KAAK,0BAA0B,UAAU,KAAK,qBAAqB,EAAE,EAAE;EACnF,IAAI,KAAK,mBACP,UAAU,KAAK,sBAAsB,UAAU,KAAK,iBAAiB,EAAE,EAAE;EAC3E,IAAI,KAAK,mBACP,UAAU,KAAK,sBAAsB,UAAU,KAAK,iBAAiB,EAAE,EAAE;EAC3E,IAAI,KAAK,sBAAsB,KAAA,GAC7B,UAAU,KAAK,sBAAsB,KAAK,kBAAkB,EAAE;EAChE,IAAI,KAAK,mBAAmB;GAC1B,UAAU,KAAK,sBAAsB,aAAa,KAAK,iBAAiB,EAAE,EAAE;GAC5E,IAAI,KAAK,uBAAuB,KAAA,GAAW;IACzC,MAAM,aAAa,mBAAmB,KAAK,iBAAiB;IAC5D,UAAU,KAAK,2BAA2B,UAAU,WAAW,aAAa,EAAE,EAAE;IAChF,UAAU,KAAK,uBAAuB,UAAU,WAAW,SAAS,EAAE,EAAE;IACxE,UAAU,KAAK,uBAAuB,UAAU,WAAW,SAAS,EAAE,EAAE;IACxE,UAAU,KAAK,uBAAuB,WAAW,UAAU,EAAE;GAC/D;EACF;EACA,IAAI,KAAK,wBACP,UAAU,KAAK,2BAA2B,UAAU,KAAK,sBAAsB,EAAE,EAAE;EACrF,IAAI,KAAK,oBACP,UAAU,KAAK,uBAAuB,UAAU,KAAK,kBAAkB,EAAE,EAAE;EAC7E,IAAI,KAAK,oBACP,UAAU,KAAK,uBAAuB,UAAU,KAAK,kBAAkB,EAAE,EAAE;EAC7E,IAAI,KAAK,uBAAuB,KAAA,GAC9B,UAAU,KAAK,uBAAuB,KAAK,mBAAmB,EAAE;EAClE,IAAI,KAAK,8BACP,UAAU,KACR,iCAAiC,UAAU,KAAK,4BAA4B,EAAE,EAChF;EACF,IAAI,KAAK,+BACP,UAAU,KACR,kCAAkC,UAAU,KAAK,6BAA6B,EAAE,EAClF;EACF,IAAI,UAAU,SAAS,GACrB,MAAM,KAAK,uBAAuB,UAAU,KAAK,GAAG,EAAE,GAAG;CAE7D;CAGA,IAAI,KAAK,UAAU;EACjB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAoB,CAAC;EAC3B,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;OAC/D,QAAQ,KAAK,eAAa;EAC/B,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,GAAG,QAAQ,EAAE;OAC/D,QAAQ,KAAK,eAAa;EAC/B,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,KAAK,gBAAgB,GAAG,YAAY,EAAE;OAC3E,QAAQ,KAAK,uBAAqB;EACvC,IAAI,GAAG,iBAAiB,KAAA,GAAW,QAAQ,KAAK,iBAAiB,GAAG,aAAa,EAAE;OAC9E,QAAQ,KAAK,wBAAsB;EACxC,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,GAAG,UAAU,EAAE;EAC1E,IAAI,GAAG,2BAA2B,OAAO,QAAQ,KAAK,8BAA4B;EAClF,IAAI,GAAG,eAAe,KAAA,GAAW,QAAQ,KAAK,eAAe,GAAG,WAAW,EAAE;EAC7E,IAAI,GAAG,yBAAyB,OAAO,QAAQ,KAAK,4BAA0B;EAC9E,IAAI,GAAG,kBAAkB,OAAO,QAAQ,KAAK,qBAAmB;EAChE,IAAI,GAAG,uBAAuB,OAAO,QAAQ,KAAK,0BAAwB;EAC1E,IAAI,GAAG,aAAa,KAAA,GAAW,QAAQ,KAAK,aAAa,GAAG,SAAS,EAAE;EACvE,IAAI,GAAG,cAAc,GAAG,eAAe,WAAW,QAAQ,KAAK,eAAe,GAAG,WAAW,EAAE;EAC9F,MAAM,KAAK,4BAA4B,QAAQ,KAAK,GAAG,EAAE,eAAe;CAC1E,OACE,MAAM,KACJ,iHACF;CAGF,MAAM,KAAK,UAAU;CACrB,KAAK,MAAM,KAAK,KAAK,QAAQ;EAC3B,MAAM,YAAY,EAAE,SAAS,EAAE,UAAU,YAAY,WAAW,EAAE,MAAM,KAAK;EAC7E,MAAM,KACJ,gBAAgB,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,UAAU,EAAE,IAAI,GAAG,UAAU,GACxF;CACF;CACA,MAAM,KAAK,WAAW;CAGtB,MAAM,iBAAiB,KAAK,kBAAkB,CAAC;CAC/C,IAAI,eAAe,SAAS,GAAG;EAC7B,MAAM,UAAoB,CAAC,yCAAyC;EACpE,KAAK,MAAM,QAAQ,gBACjB,QAAQ,KAAK,wBAAwB,UAAU,IAAI,EAAE,IAAI;EAE3D,QAAQ,KAAK,mBAAmB;EAChC,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC;CAC7B;CAGA,MAAM,KAAK,sBAAsB;CAGjC,IAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;EACrD,MAAM,UAAoB,CAAC,gBAAgB;EAC3C,KAAK,MAAM,MAAM,KAAK,cAAc;GAClC,MAAM,UAAoB,CAAC,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;GACzD,IAAI,GAAG,YAAY,KAAA,GAAW,QAAQ,KAAK,YAAY,UAAU,GAAG,OAAO,EAAE,EAAE;GAC/E,IAAI,GAAG,eAAe,KAAA,GAAW,QAAQ,KAAK,eAAe,UAAU,GAAG,UAAU,EAAE,EAAE;GACxF,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,KAAK,gBAAgB,UAAU,GAAG,WAAW,EAAE,EAAE;GAC3F,IAAI,GAAG,SAAS,KAAA,GAAW,QAAQ,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE,EAAE;GACtE,IAAI,GAAG,cAAc,KAAA,GAAW,QAAQ,KAAK,cAAc,UAAU,GAAG,SAAS,EAAE,EAAE;GACrF,IAAI,GAAG,iBAAiB,KAAA,GAAW,QAAQ,KAAK,iBAAiB,GAAG,aAAa,EAAE;GACnF,IAAI,GAAG,QAAQ,QAAQ,KAAK,cAAY;GACxC,IAAI,GAAG,UAAU,QAAQ,KAAK,gBAAc;GAC5C,IAAI,GAAG,aAAa,QAAQ,KAAK,mBAAiB;GAClD,IAAI,GAAG,KAAK,QAAQ,KAAK,WAAS;GAClC,IAAI,GAAG,oBAAoB,KAAA,GAAW,QAAQ,KAAK,oBAAoB,GAAG,gBAAgB,EAAE;GAC5F,IAAI,GAAG,gBAAgB,KAAA,GAAW,QAAQ,KAAK,gBAAgB,UAAU,GAAG,WAAW,EAAE,EAAE;GAC3F,IAAI,GAAG,iBAAiB,QAAQ,KAAK,uBAAqB;GAC1D,IAAI,GAAG,mBAAmB,QAAQ,KAAK,yBAAuB;GAC9D,QAAQ,KAAK,gBAAgB,QAAQ,KAAK,GAAG,EAAE,GAAG,UAAU,GAAG,KAAK,EAAE,eAAe;EACvF;EACA,QAAQ,KAAK,iBAAiB;EAC9B,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC;CAC7B;CAGA,IAAI,KAAK,QAAQ;EACf,MAAM,KAAK,KAAK;EAChB,MAAM,UAAoB,CAAC;EAC3B,QAAQ,KAAK,WAAW,GAAG,UAAU,OAAO,EAAE;EAC9C,IAAI,GAAG,UAAU,QAAQ,KAAK,aAAa,UAAU,GAAG,QAAQ,EAAE,EAAE;EACpE,IAAI,GAAG,gBAAgB,QAAQ,KAAK,sBAAoB;EACxD,IAAI,GAAG,eAAe,OAAO,QAAQ,KAAK,kBAAgB;EAC1D,IAAI,GAAG,eAAe,QAAQ,KAAK,qBAAmB;EACtD,IAAI,GAAG,mBAAmB,OAAO,QAAQ,KAAK,sBAAoB;EAClE,IAAI,GAAG,0BAA0B,KAAA,GAC/B,QAAQ,KAAK,0BAA0B,GAAG,sBAAsB,EAAE;EACpE,IAAI,GAAG,SAAS,QAAQ,KAAK,eAAa;EAC1C,IAAI,GAAG,iBAAiB,KAAA,GAAW,QAAQ,KAAK,iBAAiB,GAAG,aAAa,EAAE;EACnF,IAAI,GAAG,iBAAiB,KAAA,GAAW,QAAQ,KAAK,iBAAiB,GAAG,aAAa,EAAE;EACnF,IAAI,GAAG,SAAS,QAAQ,KAAK,YAAY,UAAU,GAAG,OAAO,EAAE,EAAE;EACjE,IAAI,GAAG,kBAAkB,OAAO,QAAQ,KAAK,qBAAmB;EAChE,IAAI,GAAG,eAAe,QAAQ,KAAK,qBAAmB;EACtD,MAAM,KAAK,WAAW,QAAQ,KAAK,GAAG,EAAE,GAAG;CAC7C,OACE,MAAM,KAAK,kDAA8C;CAI3D,IAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;EACnD,MAAM,KAAK,uBAAuB;EAClC,KAAK,MAAM,KAAK,KAAK,aAAa;GAChC,MAAM,SAAmB;IACvB,SAAS,UAAU,EAAE,IAAI,EAAE;IAC3B,SAAS,UAAU,EAAE,IAAI,EAAE;IAC3B,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,aAAa;IAChC,kBAAkB,EAAE,cAAc;GACpC;GACA,IAAI,EAAE,YAAY,KAAA,GAAW,OAAO,KAAK,YAAY,EAAE,QAAQ,EAAE;GACjE,IAAI,EAAE,YAAY,KAAA,GAAW,OAAO,KAAK,YAAY,EAAE,QAAQ,EAAE;GACjE,IAAI,EAAE,mBAAmB,OAAO,OAAO,KAAK,sBAAoB;GAChE,IAAI,EAAE,kBAAkB,OAAO,OAAO,KAAK,qBAAmB;GAC9D,IAAI,EAAE,yBAAyB,OAAO,OAAO,KAAK,4BAA0B;GAC5E,IAAI,EAAE,uBAAuB,OAAO,OAAO,KAAK,0BAAwB;GACxE,IAAI,EAAE,kBAAkB,OAAO,OAAO,KAAK,qBAAmB;GAC9D,IAAI,EAAE,aAAa,KAAA,GAAW,OAAO,KAAK,aAAa,EAAE,SAAS,EAAE;GACpE,IAAI,EAAE,wBAAwB,OAAO,OAAO,KAAK,2BAAyB;GAC1E,IAAI,EAAE,yBAAyB,OAAO,OAAO,KAAK,4BAA0B;GAC5E,IAAI,EAAE,cAAc,OAAO,KAAK,oBAAkB;GAClD,IAAI,EAAE,WAAW,OAAO,KAAK,iBAAe;GAC5C,IAAI,EAAE,WAAW,OAAO,KAAK,iBAAe;GAC5C,IAAI,EAAE,YAAY,OAAO,KAAK,kBAAgB;GAC9C,IAAI,EAAE,kBAAkB,KAAA,GAAW,OAAO,KAAK,kBAAkB,EAAE,cAAc,EAAE;GACnF,IAAI,EAAE,iBAAiB,OAAO,KAAK,uBAAqB;GACxD,IAAI,EAAE,UAAU,OAAO,KAAK,gBAAc;GAC1C,IAAI,EAAE,cAAc,OAAO,KAAK,iBAAiB,UAAU,EAAE,YAAY,EAAE,EAAE;GAC7E,MAAM,KAAK,uBAAuB,OAAO,KAAK,GAAG,EAAE,GAAG;EACxD;EACA,MAAM,KAAK,wBAAwB;CACrC;CAEA,MAAM,cAAc,KAAK,eAAe,CAAC;CACzC,IAAI,YAAY,SAAS,GAAG;EAC1B,MAAM,KAAK,eAAe;EAC1B,KAAK,MAAM,MAAM,aACf,MAAM,KAAK,wBAAwB,GAAG,QAAQ,UAAU,GAAG,IAAI,IAAI;EAErE,MAAM,KAAK,gBAAgB;CAC7B;CAGA,IAAI,KAAK,YAAY;EACnB,MAAM,MAAM,KAAK;EACjB,MAAM,WAAqB,CAAC;EAC5B,IAAI,IAAI,OAAO,SAAS,KAAK,aAAW;EACxC,IAAI,IAAI,QAAQ,IAAI,SAAS,OAAO,SAAS,KAAK,SAAS,IAAI,KAAK,EAAE;EACtE,IAAI,SAAS,SAAS,GACpB,MAAM,KAAK,eAAe,SAAS,KAAK,GAAG,EAAE,GAAG;CAEpD;CAGA,IAAI,KAAK,iBAAiB,KAAK,cAAc,SAAS,GAAG;EACvD,MAAM,WAAqB,CAAC,iBAAiB;EAC7C,KAAK,MAAM,OAAO,KAAK,eAAe;GACpC,MAAM,WAAqB,CAAC;GAC5B,IAAI,IAAI,cAAc,SAAS,KAAK,iBAAiB,UAAU,IAAI,YAAY,EAAE,EAAE;GACnF,IAAI,IAAI,MAAM,SAAS,KAAK,SAAS,UAAU,IAAI,IAAI,EAAE,EAAE;GAC3D,IAAI,IAAI,KAAK,SAAS,KAAK,QAAQ,UAAU,IAAI,GAAG,EAAE,EAAE;GACxD,SAAS,KAAK,iBAAiB,SAAS,KAAK,GAAG,EAAE,GAAG;EACvD;EACA,SAAS,KAAK,kBAAkB;EAChC,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;CAC9B;CAGA,IAAI,KAAK,eAAe;EACtB,MAAM,KAAK,KAAK;EAChB,MAAM,UAAoB,CAAC;EAC3B,IAAI,GAAG,QAAQ,OAAO,QAAQ,KAAK,WAAS;EAC5C,IAAI,GAAG,YAAY,OAAO,QAAQ,KAAK,eAAa;EACpD,IAAI,GAAG,kBAAkB,OAAO,QAAQ,KAAK,qBAAmB;EAChE,IAAI,GAAG,KAAK,QAAQ,KAAK,WAAS;EAClC,IAAI,GAAG,UAAU,QAAQ,KAAK,gBAAc;EAC5C,IAAI,GAAG,oBAAoB,GAAG,qBAAqB,WACjD,QAAQ,KAAK,qBAAqB,GAAG,iBAAiB,EAAE;EAC1D,IAAI,GAAG,QAAQ,KAAA,KAAa,GAAG,QAAQ,IAAI,QAAQ,KAAK,QAAQ,GAAG,IAAI,EAAE;EACzE,IAAI,GAAG,aAAa,KAAA,GAAW,QAAQ,KAAK,aAAa,GAAG,SAAS,EAAE;EACvE,IAAI,GAAG,cAAc,QAAQ,KAAK,iBAAiB,UAAU,GAAG,YAAY,EAAE,EAAE;EAChF,MAAM,KAAK,kBAAkB,QAAQ,KAAK,GAAG,EAAE,GAAG;CACpD;CAGA,IAAI,KAAK,gBAAgB;EACvB,MAAM,MAAM,KAAK;EACjB,MAAM,WAAqB,CAAC;EAC5B,IAAI,IAAI,gBAAgB,OAAO,SAAS,KAAK,mBAAiB;EAC9D,IAAI,IAAI,WAAW,SAAS,KAAK,iBAAe;EAChD,IAAI,IAAI,iBAAiB,SAAS,KAAK,uBAAqB;EAC5D,IAAI,IAAI,YAAY,SAAS,KAAK,kBAAgB;EAClD,IAAI,SAAS,SAAS,GACpB,MAAM,KAAK,mBAAmB,SAAS,KAAK,GAAG,EAAE,GAAG;CAExD;CAGA,IAAI,KAAK,qBAAqB,KAAK,kBAAkB,SAAS,GAAG;EAC/D,MAAM,WAAqB,CAAC,6BAA6B,KAAK,kBAAkB,OAAO,GAAG;EAC1F,KAAK,MAAM,OAAO,KAAK,mBAAmB;GACxC,MAAM,WAAqB,CAAC,SAAS,UAAU,IAAI,GAAG,EAAE,EAAE;GAC1D,IAAI,IAAI,iBAAiB,SAAS,KAAK,oBAAoB,UAAU,IAAI,eAAe,EAAE,EAAE;GAC5F,IAAI,IAAI,eAAe,SAAS,KAAK,qBAAmB;GACxD,IAAI,IAAI,OAAO,SAAS,KAAK,UAAU,UAAU,IAAI,KAAK,EAAE,EAAE;GAC9D,IAAI,IAAI,cAAc,SAAS,KAAK,iBAAiB,UAAU,IAAI,YAAY,EAAE,EAAE;GACnF,SAAS,KAAK,qBAAqB,SAAS,KAAK,GAAG,EAAE,GAAG;EAC3D;EACA,SAAS,KAAK,sBAAsB;EACpC,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;CAC9B;CAGA,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;EAC7C,MAAM,UAAoB,CAAC,oBAAoB,KAAK,SAAS,OAAO,GAAG;EACvE,KAAK,MAAM,MAAM,KAAK,UAAU;GAC9B,MAAM,SAAS,GAAG,QAAQ;GAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC;GAC3B,IAAI,MAAM,SAAS,GAAG;IACpB,MAAM,YAAsB,CAAC;IAC7B,KAAK,MAAM,KAAK,OAAO;KACrB,MAAM,UAAoB,CAAC;KAC3B,KAAK,MAAM,SAAS,EAAE,UAAU,CAAC,GAAG;MAClC,MAAM,UAAoB,CAAC,MAAM,UAAU,MAAM,KAAK,EAAE,KAAK;MAC7D,KAAK,MAAM,OAAO,MAAM,gBAAgB,CAAC,GACvC,QAAQ,KAAK,QAAQ,UAAU,GAAG,EAAE,OAAO;MAE7C,KAAK,MAAM,MAAM,MAAM,QAAQ,CAAC,GAC9B,QAAQ,KAAK,UAAU,UAAU,GAAG,SAAS,EAAE,OAAO,GAAG,WAAW,IAAI;MAE1E,MAAM,SACJ,MAAM,aAAa,MAAM,cAAc,MACnC,OAAO,UAAU,MAAM,SAAS,EAAE,KAClC;MACN,QAAQ,KAAK,MAAM,OAAO,GAAG,QAAQ,KAAK,EAAE,EAAE,MAAM;KACtD;KACA,UAAU,KAAK,gBAAgB,UAAU,EAAE,KAAK,EAAE,IAAI,QAAQ,KAAK,EAAE,EAAE,QAAQ;IACjF;IACA,QAAQ,KAAK,kBAAkB,OAAO,IAAI,UAAU,KAAK,EAAE,EAAE,WAAW;GAC1E,OACE,QAAQ,KAAK,kBAAkB,OAAO,IAAI;EAE9C;EACA,QAAQ,KAAK,aAAa;EAC1B,MAAM,KAAK,QAAQ,KAAK,EAAE,CAAC;CAC7B;CAEA,MAAM,KAAK,aAAa;CACxB,OAAO,MAAM,KAAK,EAAE;AACtB;;AAKA,SAAgB,mBAAmB,YAA0C;CAC3E,IAAI,WAAW,WAAW,GAAG,OAAO;CACpC,MAAM,IAAc,CAAC,sBAAsB,WAAW,OAAO,GAAG;CAChE,KAAK,MAAM,MAAM,YACf,EAAE,KAAK,oBAAoB,GAAG,IAAI,IAAI;CAExC,EAAE,KAAK,eAAe;CACtB,OAAO,EAAE,KAAK,EAAE;AAClB;;AAGA,SAAgB,2BAA2B,MAAiC;CAC1E,IAAI,KAAK,WAAW,GAAG,OAAO;CAC9B,MAAM,IAAc,CAAC,sBAAsB;CAC3C,KAAK,MAAM,OAAO,MAChB,EAAE,KAAK,4BAA4B,IAAI,IAAI,IAAI;CAEjD,EAAE,KAAK,uBAAuB;CAC9B,OAAO,EAAE,KAAK,EAAE;AAClB;;;;;;;;ACjYA,MAAa,eAA4D;CACvE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,kBAAkB,IAAI;CAC/B;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAA6C,CAAC;EAGpD,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe;GACjB,MAAM,KAAyB,CAAC;GAChC,MAAM,UAAU,KAAK,eAAe,SAAS;GAC7C,IAAI,SAAS,GAAG,UAAU;GAC1B,MAAM,aAAa,QAAQ,eAAe,YAAY;GACtD,IAAI,eAAe,KAAA,GAAW,GAAG,aAAa;GAC9C,MAAM,eAAe,QAAQ,eAAe,cAAc;GAC1D,IAAI,iBAAiB,KAAA,GAAW,GAAG,eAAe;GAClD,MAAM,WAAW,QAAQ,eAAe,UAAU;GAClD,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW;GAC1C,OAAO,cAAc;EACvB;EAGA,MAAM,WAAW,UAAU,IAAI,QAAQ;EACvC,IAAI,UAAU;GACZ,MAAM,SAA4B,CAAC;GACnC,KAAK,MAAM,KAAK,SAAS,YAAY,CAAC,GAAG;IACvC,IAAI,EAAE,SAAS,SAAS;IACxB,MAAM,OAAO,KAAK,GAAG,MAAM,KAAK;IAChC,MAAM,UAAU,QAAQ,GAAG,SAAS,KAAK;IACzC,MAAM,MAAO,EAAE,aAAa,WAAkC;IAC9D,MAAM,QAAQ,KAAK,GAAG,OAAO;IAC7B,OAAO,KAAK;KAAE;KAAM;KAAS;KAAK;IAAM,CAAC;GAC3C;GACA,OAAO,SAAS;EAClB;EAGA,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe;GACjB,MAAM,SAAgC,CAAC;GACvC,KAAK,MAAM,MAAM,cAAc,YAAY,CAAC,GAAG;IAC7C,IAAI,GAAG,SAAS,cAAc;IAC9B,OAAO,KAAK;KACV,SAAS,QAAQ,IAAI,SAAS,KAAK;KACnC,KAAM,GAAG,aAAa,WAAsB;IAC9C,CAAC;GACH;GACA,OAAO,cAAc;EACvB;EAGA,MAAM,SAAS,UAAU,IAAI,oBAAoB;EACjD,IAAI,QAAQ,YAAY;GACtB,MAAM,OAAkC,CAAC;GACzC,IAAI,WAAW,KAAK,QAAQ,eAAe,CAAC,GAAG,KAAK,gBAAgB;GACpE,IAAI,WAAW,KAAK,QAAQ,aAAa,CAAC,GAAG,KAAK,cAAc;GAChE,IAAI,WAAW,KAAK,QAAQ,cAAc,CAAC,GAAG,KAAK,eAAe;GAClE,IAAI,KAAK,QAAQ,kBAAkB,GACjC,KAAK,mBAAmB,KAAK,QAAQ,kBAAkB;GACzD,IAAI,KAAK,QAAQ,uBAAuB,GACtC,KAAK,wBAAwB,KAAK,QAAQ,uBAAuB;GACnE,IAAI,KAAK,QAAQ,mBAAmB,GAClC,KAAK,oBAAoB,KAAK,QAAQ,mBAAmB;GAC3D,IAAI,KAAK,QAAQ,mBAAmB,GAClC,KAAK,oBAAoB,KAAK,QAAQ,mBAAmB;GAC3D,IAAI,KAAK,QAAQ,mBAAmB,GAClC,KAAK,oBAAoB,QAAQ,QAAQ,mBAAmB;GAC9D,OAAO,aAAa;EACtB;EAGA,MAAM,cAAc,UAAU,IAAI,WAAW;EAC7C,IAAI,aAAa;GACf,MAAM,OAAO,UAAU,aAAa,cAAc;GAClD,IAAI,MAAM,YAAY;IACpB,MAAM,KAA0B,CAAC;IACjC,MAAM,KAAK,QAAQ,MAAM,SAAS;IAClC,IAAI,OAAO,KAAA,GAAW,GAAG,UAAU;IACnC,MAAM,KAAK,QAAQ,MAAM,SAAS;IAClC,IAAI,OAAO,KAAA,GAAW,GAAG,UAAU;IACnC,MAAM,KAAK,QAAQ,MAAM,aAAa;IACtC,IAAI,OAAO,KAAA,GAAW,GAAG,cAAc;IACvC,MAAM,KAAK,QAAQ,MAAM,cAAc;IACvC,IAAI,OAAO,KAAA,GAAW,GAAG,eAAe;IACxC,MAAM,KAAK,QAAQ,MAAM,WAAW;IACpC,IAAI,OAAO,KAAA,GAAW,GAAG,YAAY;IACrC,IAAI,OAAO,KAAK,MAAM,wBAAwB,CAAC,MAAM,KAAK,GAAG,yBAAyB;IACtF,MAAM,KAAK,QAAQ,MAAM,YAAY;IACrC,IAAI,OAAO,KAAA,GAAW,GAAG,aAAa;IACtC,IAAI,OAAO,KAAK,MAAM,sBAAsB,CAAC,MAAM,KAAK,GAAG,uBAAuB;IAClF,IAAI,OAAO,KAAK,MAAM,oBAAoB,CAAC,MAAM,KAAK,GAAG,qBAAqB;IAC9E,IAAI,OAAO,KAAK,MAAM,eAAe,CAAC,MAAM,KAAK,GAAG,gBAAgB;IACpE,MAAM,KAAK,QAAQ,MAAM,UAAU;IACnC,IAAI,OAAO,KAAA,GAAW,GAAG,WAAW;IACpC,MAAM,MAAM,KAAK,MAAM,YAAY;IACnC,IAAI,QAAQ,KAAA,GAAW,GAAG,aAAa;IACvC,OAAO,WAAW;GACpB;EACF;EAGA,MAAM,WAAW,UAAU,IAAI,QAAQ;EACvC,IAAI,UAAU,YAAY;GACxB,MAAM,OAAqC,CAAC;GAC5C,MAAM,SAAS,QAAQ,UAAU,QAAQ;GACzC,IAAI,WAAW,KAAA,GAAW,KAAK,SAAS;GACxC,IAAI,KAAK,UAAU,UAAU,GAAG,KAAK,WAAW,KAAK,UAAU,UAAU;GACzE,IAAI,WAAW,KAAK,UAAU,gBAAgB,CAAC,GAAG,KAAK,iBAAiB;GACxE,IAAI,OAAO,KAAK,UAAU,gBAAgB,CAAC,MAAM,KAAK,KAAK,iBAAiB;GAC5E,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,UAAU,KAAK,UAAU,SAAS;GACtE,IAAI,OAAO,KAAK,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,aAAa;GACpE,IAAI,WAAW,KAAK,UAAU,eAAe,CAAC,GAAG,KAAK,gBAAgB;GACtE,MAAM,MAAM,QAAQ,UAAU,uBAAuB;GACrD,IAAI,QAAQ,KAAA,GAAW,KAAK,wBAAwB;GACpD,IAAI,WAAW,KAAK,UAAU,SAAS,CAAC,GAAG,KAAK,UAAU;GAC1D,MAAM,KAAK,QAAQ,UAAU,cAAc;GAC3C,IAAI,OAAO,KAAA,GAAW,KAAK,eAAe;GAC1C,MAAM,KAAK,QAAQ,UAAU,cAAc;GAC3C,IAAI,OAAO,KAAA,GAAW,KAAK,eAAe;GAC1C,IAAI,OAAO,KAAK,UAAU,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;GAC1E,IAAI,WAAW,KAAK,UAAU,eAAe,CAAC,GAAG,KAAK,gBAAgB;GACtE,OAAO,SAAS;EAClB;EAGA,MAAM,gBAAgB,UAAU,IAAI,qBAAqB;EACzD,IAAI,eAAe;GACjB,MAAM,QAAqC,CAAC;GAC5C,KAAK,MAAM,KAAK,cAAc,YAAY,CAAC,GAAG;IAC5C,IAAI,EAAE,SAAS,sBAAsB;IACrC,MAAM,OAAkC;KACtC,MAAM,KAAK,GAAG,MAAM,KAAK;KACzB,MAAM,KAAK,GAAG,MAAM,KAAK;KACzB,aAAa,QAAQ,GAAG,aAAa,KAAK;KAC1C,cAAc,QAAQ,GAAG,cAAc,KAAK;KAC5C,eAAe,QAAQ,GAAG,eAAe,KAAK;IAChD;IACA,MAAM,KAAK,QAAQ,GAAG,SAAS;IAC/B,IAAI,OAAO,KAAA,GAAW,KAAK,UAAU;IACrC,MAAM,KAAK,QAAQ,GAAG,SAAS;IAC/B,IAAI,OAAO,KAAA,GAAW,KAAK,UAAU;IACrC,IAAI,OAAO,KAAK,GAAG,gBAAgB,CAAC,MAAM,KAAK,KAAK,iBAAiB;IACrE,IAAI,OAAO,KAAK,GAAG,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;IACnE,IAAI,OAAO,KAAK,GAAG,sBAAsB,CAAC,MAAM,KAAK,KAAK,uBAAuB;IACjF,IAAI,OAAO,KAAK,GAAG,oBAAoB,CAAC,MAAM,KAAK,KAAK,qBAAqB;IAC7E,IAAI,OAAO,KAAK,GAAG,eAAe,CAAC,MAAM,KAAK,KAAK,gBAAgB;IACnE,MAAM,WAAW,QAAQ,GAAG,UAAU;IACtC,IAAI,aAAa,KAAA,GAAW,KAAK,WAAW;IAC5C,IAAI,OAAO,KAAK,GAAG,qBAAqB,CAAC,MAAM,KAAK,KAAK,sBAAsB;IAC/E,IAAI,OAAO,KAAK,GAAG,sBAAsB,CAAC,MAAM,KAAK,KAAK,uBAAuB;IACjF,IAAI,WAAW,KAAK,GAAG,cAAc,CAAC,GAAG,KAAK,eAAe;IAC7D,IAAI,WAAW,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,YAAY;IACvD,IAAI,WAAW,KAAK,GAAG,WAAW,CAAC,GAAG,KAAK,YAAY;IACvD,IAAI,WAAW,KAAK,GAAG,YAAY,CAAC,GAAG,KAAK,aAAa;IACzD,MAAM,KAAK,QAAQ,GAAG,eAAe;IACrC,IAAI,OAAO,KAAA,GAAW,KAAK,gBAAgB;IAC3C,IAAI,WAAW,KAAK,GAAG,iBAAiB,CAAC,GAAG,KAAK,kBAAkB;IACnE,IAAI,WAAW,KAAK,GAAG,UAAU,CAAC,GAAG,KAAK,WAAW;IACrD,IAAI,KAAK,GAAG,cAAc,GAAG,KAAK,eAAe,KAAK,GAAG,cAAc;IACvE,MAAM,KAAK,IAAI;GACjB;GACA,IAAI,MAAM,SAAS,GAAG,OAAO,cAAc;EAC7C;EAGA,MAAM,gBAAgB,UAAU,IAAI,aAAa;EACjD,IAAI,eAAe,YAAY;GAC7B,MAAM,KAAyB,CAAC;GAChC,IAAI,WAAW,KAAK,eAAe,qBAAqB,CAAC,GAAG,GAAG,sBAAsB;GACrF,IAAI,KAAK,eAAe,UAAU,GAAG,GAAG,WAAW,KAAK,eAAe,UAAU;GACjF,IAAI,KAAK,eAAe,qBAAqB,GAC3C,GAAG,sBAAsB,KAAK,eAAe,qBAAqB;GACpE,IAAI,KAAK,eAAe,eAAe,GACrC,GAAG,gBAAgB,KAAK,eAAe,eAAe;GACxD,IAAI,KAAK,eAAe,WAAW,GAAG,GAAG,YAAY,KAAK,eAAe,WAAW;GACpF,IAAI,KAAK,eAAe,WAAW,GAAG,GAAG,YAAY,KAAK,eAAe,WAAW;GACpF,MAAM,KAAK,QAAQ,eAAe,WAAW;GAC7C,IAAI,OAAO,KAAA,GAAW,GAAG,YAAY;GACrC,OAAO,cAAc;EACvB;EAGA,MAAM,kBAAkB,UAAU,IAAI,eAAe;EACrD,IAAI,iBAAiB,YAAY;GAC/B,MAAM,KAA2B,CAAC;GAClC,IAAI,OAAO,KAAK,iBAAiB,KAAK,CAAC,MAAM,KAAK,GAAG,MAAM;GAC3D,IAAI,OAAO,KAAK,iBAAiB,SAAS,CAAC,MAAM,KAAK,GAAG,UAAU;GACnE,IAAI,OAAO,KAAK,iBAAiB,eAAe,CAAC,MAAM,KAAK,GAAG,gBAAgB;GAC/E,IAAI,WAAW,KAAK,iBAAiB,KAAK,CAAC,GAAG,GAAG,MAAM;GACvD,IAAI,WAAW,KAAK,iBAAiB,UAAU,CAAC,GAAG,GAAG,WAAW;GACjE,IAAI,KAAK,iBAAiB,kBAAkB,GAC1C,GAAG,mBAAmB,KAAK,iBAAiB,kBAAkB;GAChE,MAAM,MAAM,QAAQ,iBAAiB,KAAK;GAC1C,IAAI,QAAQ,KAAA,GAAW,GAAG,MAAM;GAChC,MAAM,WAAW,QAAQ,iBAAiB,UAAU;GACpD,IAAI,aAAa,KAAA,GAAW,GAAG,WAAW;GAC1C,IAAI,KAAK,iBAAiB,cAAc,GACtC,GAAG,eAAe,KAAK,iBAAiB,cAAc;GACxD,OAAO,gBAAgB;EACzB;EAGA,MAAM,iBAAiB,UAAU,IAAI,gBAAgB;EACrD,IAAI,gBAAgB,YAAY;GAC9B,MAAM,MAAqC,CAAC;GAC5C,IAAI,OAAO,KAAK,gBAAgB,aAAa,CAAC,MAAM,KAAK,IAAI,cAAc;GAC3E,IAAI,WAAW,KAAK,gBAAgB,WAAW,CAAC,GAAG,IAAI,YAAY;GACnE,IAAI,WAAW,KAAK,gBAAgB,iBAAiB,CAAC,GAAG,IAAI,kBAAkB;GAC/E,IAAI,WAAW,KAAK,gBAAgB,YAAY,CAAC,GAAG,IAAI,aAAa;GACrE,OAAO,iBAAiB;EAC1B;EAGA,MAAM,SAAS,UAAU,IAAI,YAAY;EACzC,IAAI,QAAQ,YAAY;GACtB,MAAM,OAAkC,CAAC;GACzC,IAAI,WAAW,KAAK,QAAQ,UAAU,CAAC,GAAG,KAAK,WAAW;GAC1D,MAAM,MAAM,QAAQ,QAAQ,qBAAqB;GACjD,IAAI,QAAQ,KAAA,GAAW,KAAK,sBAAsB;GAClD,IAAI,KAAK,QAAQ,aAAa,GAAG,KAAK,cAAc,KAAK,QAAQ,aAAa;GAC9E,IAAI,WAAW,KAAK,QAAQ,oBAAoB,CAAC,GAAG,KAAK,qBAAqB;GAC9E,IAAI,WAAW,KAAK,QAAQ,mBAAmB,CAAC,GAAG,KAAK,oBAAoB;GAC5E,IAAI,WAAW,KAAK,QAAQ,eAAe,CAAC,GAAG,KAAK,gBAAgB;GACpE,IAAI,WAAW,KAAK,QAAQ,YAAY,CAAC,GAAG,KAAK,aAAa;GAC9D,IAAI,KAAK,QAAQ,UAAU,GAAG,KAAK,WAAW,KAAK,QAAQ,UAAU;GACrE,IAAI,WAAW,KAAK,QAAQ,4BAA4B,CAAC,GACvD,KAAK,6BAA6B;GACpC,IAAI,WAAW,KAAK,QAAQ,mBAAmB,CAAC,GAAG,KAAK,oBAAoB;GAC5E,IAAI,OAAO,KAAK,QAAQ,mBAAmB,CAAC,MAAM,KAAK,KAAK,oBAAoB;GAChF,IAAI,OAAO,KAAK,QAAQ,wBAAwB,CAAC,MAAM,KACrD,KAAK,yBAAyB;GAChC,IAAI,KAAK,QAAQ,aAAa,GAAG,KAAK,cAAc,KAAK,QAAQ,aAAa;GAC9E,IAAI,WAAW,KAAK,QAAQ,sBAAsB,CAAC,GAAG,KAAK,uBAAuB;GAClF,IAAI,WAAW,KAAK,QAAQ,cAAc,CAAC,GAAG,KAAK,eAAe;GAClE,IAAI,WAAW,KAAK,QAAQ,oBAAoB,CAAC,GAAG,KAAK,qBAAqB;GAC9E,IAAI,OAAO,KAAK,QAAQ,sBAAsB,CAAC,MAAM,KAAK,KAAK,uBAAuB;GACtF,IAAI,WAAW,KAAK,QAAQ,uBAAuB,CAAC,GAAG,KAAK,wBAAwB;GACpF,OAAO,aAAa;EACtB;EAGA,MAAM,OAAO,UAAU,IAAI,gBAAgB;EAC3C,IAAI,MAAM;GACR,MAAM,QAAkB,CAAC;GACzB,KAAK,MAAM,MAAM,KAAK,YAAY,CAAC,GACjC,IAAI,GAAG,SAAS,mBAAmB,KAAK,IAAI,MAAM,GAChD,MAAM,KAAK,KAAK,IAAI,MAAM,CAAE;GAGhC,IAAI,MAAM,SAAS,GAAG,OAAO,iBAAiB;EAChD;EAGA,MAAM,QAAQ,UAAU,IAAI,mBAAmB;EAC/C,IAAI,OAAO;GACT,MAAM,OAAkC,CAAC;GACzC,KAAK,MAAM,MAAM,MAAM,YAAY,CAAC,GAAG;IACrC,IAAI,GAAG,SAAS,oBAAoB;IACpC,MAAM,MAA+B,EACnC,KAAM,GAAG,aAAa,WAAsB,GAC9C;IACA,IAAI,KAAK,IAAI,iBAAiB,GAAG,IAAI,kBAAkB,KAAK,IAAI,iBAAiB;IACjF,IAAI,WAAW,KAAK,IAAI,eAAe,CAAC,GAAG,IAAI,gBAAgB;IAC/D,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,QAAQ,KAAK,IAAI,OAAO;IACnD,IAAI,KAAK,IAAI,cAAc,GAAG,IAAI,eAAe,KAAK,IAAI,cAAc;IACxE,KAAK,KAAK,GAAG;GACf;GACA,IAAI,KAAK,SAAS,GAAG,OAAO,oBAAoB;EAClD;EAGA,MAAM,OAAO,UAAU,IAAI,UAAU;EACrC,IAAI,MAAM;GACR,MAAM,WAA6B,CAAC;GACpC,KAAK,MAAM,MAAM,KAAK,YAAY,CAAC,GAAG;IACpC,IAAI,GAAG,SAAS,WAAW;IAC3B,MAAM,UAA0B,CAAC;IACjC,MAAM,UAAU,KAAK,IAAI,MAAM;IAC/B,IAAI,SAAS,QAAQ,OAAO;IAC5B,MAAM,QAA0B,CAAC;IACjC,KAAK,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG;KACjC,IAAI,EAAE,SAAS,QAAQ;KACvB,MAAM,OAAuB,EAAE,OAAO,KAAK,GAAG,OAAO,KAAK,GAAG;KAC7D,MAAM,SAA4B,CAAC;KACnC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC,GAAG;MACjC,IAAI,GAAG,SAAS,MAAM;MACtB,MAAM,MAAM,UAAU,IAAI,GAAG;MAC7B,MAAM,QAAyB,EAAE,OAAO,OAAO,KAAK,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE;MAC/E,MAAM,OAAO,KAAK,IAAI,GAAG;MACzB,IAAI,MAAM,MAAM,YAAY;MAC5B,MAAM,OAAiB,CAAC;MACxB,MAAM,OAA6B,CAAC;MACpC,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG;OACrC,IAAI,MAAM,SAAS,OAAO,KAAK,KAAK,OAAO,MAAM,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC;OAC3E,IAAI,MAAM,SAAS,MAAM;QACvB,MAAM,MAA0B;SAC9B,WAAW,KAAK,OAAO,GAAG,KAAK;SAC/B,YAAY,QAAQ,OAAO,GAAG,KAAK;QACrC;QACA,KAAK,KAAK,GAAG;OACf;MACF;MACA,IAAI,KAAK,SAAS,GAAG,MAAM,eAAe;MAC1C,IAAI,KAAK,SAAS,GAAG,MAAM,OAAO;MAClC,OAAO,KAAK,KAAK;KACnB;KACA,IAAI,OAAO,SAAS,GAAG,KAAK,SAAS;KACrC,MAAM,KAAK,IAAI;IACjB;IACA,IAAI,MAAM,SAAS,GAAG,QAAQ,QAAQ;IACtC,SAAS,KAAK,OAAO;GACvB;GACA,IAAI,SAAS,SAAS,GAAG,OAAO,WAAW;EAC7C;EAGA,MAAM,iBAAiB,UAAU,IAAI,cAAc;EACnD,IAAI,gBAAgB;GAClB,MAAM,QAA8B,CAAC;GACrC,KAAK,MAAM,KAAK,eAAe,YAAY,CAAC,GAAG;IAC7C,IAAI,EAAE,SAAS,eAAe;IAC9B,MAAM,SAAS,EAAE,YAAY,CAAC,EAAA,CAAG,KAAK,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE;IACjE,MAAM,KAAyB;KAAE,MAAM,KAAK,GAAG,MAAM,KAAK;KAAI;IAAM;IACpE,IAAI,KAAK,GAAG,SAAS,MAAM,KAAA,GAAW,GAAG,UAAU,KAAK,GAAG,SAAS;IACpE,IAAI,KAAK,GAAG,YAAY,MAAM,KAAA,GAAW,GAAG,aAAa,KAAK,GAAG,YAAY;IAC7E,IAAI,KAAK,GAAG,aAAa,MAAM,KAAA,GAAW,GAAG,cAAc,KAAK,GAAG,aAAa;IAChF,IAAI,KAAK,GAAG,MAAM,MAAM,KAAA,GAAW,GAAG,OAAO,KAAK,GAAG,MAAM;IAC3D,IAAI,KAAK,GAAG,WAAW,MAAM,KAAA,GAAW,GAAG,YAAY,KAAK,GAAG,WAAW;IAC1E,MAAM,eAAe,QAAQ,GAAG,cAAc;IAC9C,IAAI,iBAAiB,KAAA,GAAW,GAAG,eAAe;IAClD,IAAI,WAAW,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,SAAS;IAC/C,IAAI,WAAW,KAAK,GAAG,UAAU,CAAC,GAAG,GAAG,WAAW;IACnD,IAAI,WAAW,KAAK,GAAG,aAAa,CAAC,GAAG,GAAG,cAAc;IACzD,IAAI,WAAW,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,MAAM;IACzC,MAAM,kBAAkB,QAAQ,GAAG,iBAAiB;IACpD,IAAI,oBAAoB,KAAA,GAAW,GAAG,kBAAkB;IACxD,IAAI,KAAK,GAAG,aAAa,MAAM,KAAA,GAAW,GAAG,cAAc,KAAK,GAAG,aAAa;IAChF,IAAI,WAAW,KAAK,GAAG,iBAAiB,CAAC,GAAG,GAAG,kBAAkB;IACjE,IAAI,WAAW,KAAK,GAAG,mBAAmB,CAAC,GAAG,GAAG,oBAAoB;IACrE,MAAM,KAAK,EAAE;GACf;GACA,IAAI,MAAM,SAAS,GAAG,OAAO,eAAe;EAC9C;EAGA,MAAM,eAAe,UAAU,IAAI,YAAY;EAC/C,IAAI,cAAc,YAAY;GAC5B,MAAM,MAAiC,CAAC;GACxC,IAAI,WAAW,KAAK,cAAc,OAAO,CAAC,GAAG,IAAI,QAAQ;GACzD,MAAM,OAAO,KAAK,cAAc,MAAM;GACtC,IAAI,QAAQ,SAAS,OAAO,IAAI,OAAO;GACvC,OAAO,aAAa;EACtB;EAGA,MAAM,kBAAkB,UAAU,IAAI,eAAe;EACrD,IAAI,iBAAiB;GACnB,MAAM,QAA+B,CAAC;GACtC,KAAK,MAAM,KAAK,gBAAgB,YAAY,CAAC,GAAG;IAC9C,IAAI,EAAE,SAAS,gBAAgB;IAC/B,MAAM,OAA4B,CAAC;IACnC,MAAM,KAAK,KAAK,GAAG,cAAc;IACjC,IAAI,IAAI,KAAK,eAAe;IAC5B,MAAM,IAAI,KAAK,GAAG,MAAM;IACxB,IAAI,GAAG,KAAK,OAAO;IACnB,MAAM,IAAI,KAAK,GAAG,KAAK;IACvB,IAAI,GAAG,KAAK,MAAM;IAClB,MAAM,KAAK,IAAI;GACjB;GACA,IAAI,MAAM,SAAS,GAAG,OAAO,gBAAgB;EAC/C;EAGA,IAAI,GAAG,aAAa,gBAClB,OAAO,cAAc,KAAK,IAAI,aAAa;EAG7C,OAAO;CACT;AACF;;;;;;;;;;;;AC/VA,MAAa,kBAAwD;CACnE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,mKAEF;EAGA,IAAI,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;GACpD,MAAM,aAAuB,CAAC;GAC9B,IAAI,KAAK,UAAU,WAAW,KAAK,YAAY,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,EAAE,GAAG;GAChF,MAAM,UAAoB,CAAC;GAC3B,IAAI,KAAK,WAAW,QAAQ,KAAK,kBAAgB;GACjD,IAAI,KAAK,UAAU,QAAQ,KAAK,cAAc,UAAU,KAAK,QAAQ,EAAE,EAAE;GACzE,EAAE,KAAK,WAAW,QAAQ,KAAK,EAAE,EAAE,GAAG,WAAW,KAAK,EAAE,EAAE,WAAW;EACvE;EAGA,IAAI,KAAK,iBAAiB;GACxB,MAAM,KAAK,KAAK;GAChB,MAAM,UAAoB,CAAC;GAC3B,IAAI,GAAG,SAAS,QAAQ,KAAK,cAAc;GAC3C,IAAI,GAAG,SAAS,QAAQ,KAAK,cAAc;GAC3C,IAAI,GAAG,WAAW,QAAQ,KAAK,gBAAgB;GAC/C,IAAI,QAAQ,SAAS,GACnB,EAAE,KAAK,mBAAmB,QAAQ,KAAK,EAAE,EAAE,GAAG;EAElD;EAGA,IAAI,KAAK,aAAa;GACpB,MAAM,KAAK,KAAK;GAChB,EAAE,KACA,eAAe,MAAM;IACnB,MAAM,cAAc,GAAG,QAAQ,EAAG;IAClC,OAAO,cAAc,GAAG,SAAS,EAAG;IACpC,KAAK,cAAc,GAAG,OAAO,GAAI;IACjC,QAAQ,cAAc,GAAG,UAAU,GAAI;IACvC,QAAQ,cAAc,GAAG,UAAU,EAAG;IACtC,QAAQ,cAAc,GAAG,UAAU,EAAG;GACxC,CAAC,EAAE,GACL;EACF;EAGA,IAAI,KAAK,WAAW;GAClB,MAAM,KAAK,KAAK;GAChB,EAAE,KACA,aAAa,MAAM;IACjB,WAAW,GAAG;IACd,aAAa,GAAG;IAChB,eAAe,GAAG;IAClB,aAAa,GAAG;IAChB,QAAQ,GAAG;GACb,CAAC,EAAE,GACL;EACF;EAEA,IAAI,KAAK,QAAQ,EAAE,KAAK,KAAK,MAAM;EAEnC,EAAE,KAAK,gBAAgB;EACvB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAsC,CAAC;EAG7C,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,IAAI,WAAW,KAAK,WAAW,WAAW,CAAC,GAAG,OAAO,YAAY;GACjE,IAAI,KAAK,WAAW,UAAU,GAAG,OAAO,WAAW,KAAK,WAAW,UAAU;GAC7E,MAAM,OAAO,UAAU,WAAW,UAAU;GAC5C,IAAI,QAAQ,KAAK,MAAM,KAAK,GAAG,OAAO,WAAW,KAAK,MAAM,KAAK;EACnE;EAGA,MAAM,OAAO,UAAU,IAAI,iBAAiB;EAC5C,IAAI,MAAM;GACR,MAAM,KAA4C,CAAC;GACnD,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,GAAG,GAAG,UAAU;GACpD,IAAI,WAAW,KAAK,MAAM,SAAS,CAAC,GAAG,GAAG,UAAU;GACpD,IAAI,WAAW,KAAK,MAAM,WAAW,CAAC,GAAG,GAAG,YAAY;GACxD,OAAO,kBAAkB;EAC3B;EAGA,MAAM,OAAO,UAAU,IAAI,aAAa;EACxC,IAAI,MAAM;GACR,MAAM,KAAsC,CAAC;GAC7C,MAAM,KAAK,QAAQ,MAAM,MAAM;GAC/B,IAAI,OAAO,KAAA,GAAW,GAAG,OAAO;GAChC,MAAM,KAAK,QAAQ,MAAM,OAAO;GAChC,IAAI,OAAO,KAAA,GAAW,GAAG,QAAQ;GACjC,MAAM,KAAK,QAAQ,MAAM,KAAK;GAC9B,IAAI,OAAO,KAAA,GAAW,GAAG,MAAM;GAC/B,MAAM,KAAK,QAAQ,MAAM,QAAQ;GACjC,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,MAAM,KAAK,QAAQ,MAAM,QAAQ;GACjC,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,MAAM,KAAK,QAAQ,MAAM,QAAQ;GACjC,IAAI,OAAO,KAAA,GAAW,GAAG,SAAS;GAClC,OAAO,cAAc;EACvB;EAGA,MAAM,OAAO,UAAU,IAAI,WAAW;EACtC,IAAI,MAAM;GACR,MAAM,KAAoC,CAAC;GAC3C,MAAM,KAAK,QAAQ,MAAM,WAAW;GACpC,IAAI,OAAO,KAAA,GAAW,GAAG,YAAY;GACrC,MAAM,SAAS,KAAK,MAAM,aAAa;GACvC,IAAI,QAAQ,GAAG,cAAc;GAC7B,MAAM,OAAO,QAAQ,MAAM,eAAe;GAC1C,IAAI,SAAS,KAAA,GAAW,GAAG,gBAAgB;GAC3C,MAAM,OAAO,QAAQ,MAAM,aAAa;GACxC,IAAI,SAAS,KAAA,GAAW,GAAG,cAAc;GACzC,MAAM,SAAS,QAAQ,MAAM,QAAQ;GACrC,IAAI,WAAW,KAAA,GAAW,GAAG,SAAS;GACtC,OAAO,YAAY;EACrB;EAGA,MAAM,QAAQ,UAAU,IAAI,QAAQ;EACpC,IAAI,OAAO,OAAO,SAAS,iBAAiB,KAAK;EAEjD,OAAO;CACT;AACF;;;;;;;;;;;;ACrEA,MAAa,cAAgD;CAC3D,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,mGAAmG,UAAU,KAAK,mBAAmB,EAAE,GACzI;EACA,KAAK,MAAM,KAAK,KAAK,SAAS;GAC5B,MAAM,QAAkB,CAAC,OAAO,UAAU,EAAE,EAAE,EAAE,EAAE;GAClD,IAAI,EAAE,cAAc,KAAA,GAAW,MAAM,KAAK,cAAc,UAAU,EAAE,SAAS,EAAE,EAAE;GACjF,IAAI,EAAE,cAAc,KAAA,GAAW,MAAM,KAAK,cAAc,UAAU,EAAE,SAAS,EAAE,EAAE;GACjF,IAAI,EAAE,mBAAmB,KAAA,GACvB,MAAM,KAAK,mBAAmB,UAAU,EAAE,cAAc,EAAE,EAAE;GAC9D,IAAI,EAAE,SAAS,EAAE,KAAK,WAAW,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,QAAQ,UAAU;QACnE,EAAE,KAAK,WAAW,MAAM,KAAK,GAAG,EAAE,GAAG;EAC5C;EACA,KAAK,MAAM,KAAK,KAAK,MAAM;GACzB,MAAM,QAAkB;IACtB,OAAO,EAAE,GAAG;IACZ,SAAS,UAAU,EAAE,IAAI,EAAE;IAC3B,gBAAgB,UAAU,EAAE,WAAW,EAAE;IACzC,aAAa,UAAU,EAAE,QAAQ,EAAE;IACnC,qCAAqC,EAAE,mCAAmC,IAAI,EAAE;IAChF,YAAY,EAAE,UAAU,IAAI,EAAE;IAC9B,WAAW,EAAE,SAAS,IAAI,EAAE;IAC5B,yBAAyB,EAAE,uBAAuB,IAAI,EAAE;IACxD,mBAAmB,EAAE,iBAAiB,IAAI,EAAE;GAC9C;GACA,IAAI,EAAE,aAAa;IACjB,MAAM,IAAI,EAAE;IACZ,MAAM,SAAmB,CAAC;IAC1B,IAAI,EAAE,oBAAoB,KAAA,GACxB,OAAO,KAAK,oBAAoB,UAAU,EAAE,eAAe,EAAE,EAAE;IACjE,IAAI,EAAE,aAAa,OAAO,KAAK,mBAAiB;IAChD,IAAI,EAAE,iBAAiB,KAAA,GAAW,OAAO,KAAK,iBAAiB,EAAE,aAAa,EAAE;IAChF,IAAI,EAAE,oBAAoB,KAAA,GACxB,OAAO,KAAK,oBAAoB,UAAU,EAAE,eAAe,EAAE,EAAE;IACjE,OAAO,KAAK,wBAAwB,EAAE,oBAAoB,EAAE;IAC5D,EAAE,KAAK,QAAQ,MAAM,KAAK,GAAG,EAAE,gBAAgB,OAAO,KAAK,GAAG,EAAE,SAAS;GAC3E,OACE,EAAE,KAAK,QAAQ,MAAM,KAAK,GAAG,EAAE,GAAG;EAEtC;EACA,EAAE,KAAK,YAAY;EACnB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,UAA2B,CAAC;EAClC,MAAM,OAAqB,CAAC;EAC5B,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAClC,IAAI,MAAM,SAAS,UAAU;GAC3B,MAAM,IAA4B,EAAE,IAAI,KAAK,OAAO,IAAI,KAAK,GAAG;GAChE,IAAI,KAAK,OAAO,WAAW,MAAM,KAAA,GAAW,EAAE,YAAY,KAAK,OAAO,WAAW;GACjF,IAAI,KAAK,OAAO,WAAW,MAAM,KAAA,GAAW,EAAE,YAAY,KAAK,OAAO,WAAW;GACjF,IAAI,KAAK,OAAO,gBAAgB,MAAM,KAAA,GACpC,EAAE,iBAAiB,KAAK,OAAO,gBAAgB;GACjD,MAAM,SAAS,MAAM,YAAY,CAAC,EAAA,CAAG,KAAK,MAAM,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;GAC5E,IAAI,OAAO,EAAE,UAAU;GACvB,QAAQ,KAAK,CAAkB;EACjC,OAAO,IAAI,MAAM,SAAS,OAAO;GAC/B,MAAM,IAAyB;IAC7B,IAAI,QAAQ,OAAO,IAAI,KAAK;IAC5B,MAAM,KAAK,OAAO,MAAM,KAAK;IAC7B,aAAa,KAAK,OAAO,aAAa,KAAK;IAC3C,UAAU,KAAK,OAAO,UAAU,KAAK;GACvC;GACA,IAAI,WAAW,KAAK,OAAO,kCAAkC,CAAC,GAC5D,EAAE,mCAAmC;GACvC,IAAI,WAAW,KAAK,OAAO,SAAS,CAAC,GAAG,EAAE,UAAU;GACpD,IAAI,WAAW,KAAK,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS;GAClD,IAAI,WAAW,KAAK,OAAO,sBAAsB,CAAC,GAAG,EAAE,uBAAuB;GAC9E,IAAI,WAAW,KAAK,OAAO,gBAAgB,CAAC,GAAG,EAAE,iBAAiB;GAClE,MAAM,MAAM,UAAU,OAAO,aAAa;GAC1C,IAAI,KAAK;IACP,MAAM,IAAwB,EAAE,qBAAqB,EAAE;IACvD,IAAI,KAAK,KAAK,iBAAiB,MAAM,KAAA,GACnC,EAAE,kBAAkB,KAAK,KAAK,iBAAiB;IACjD,IAAI,WAAW,KAAK,KAAK,aAAa,CAAC,GAAG,EAAE,cAAc;IAC1D,MAAM,MAAM,QAAQ,KAAK,cAAc;IACvC,IAAI,QAAQ,KAAA,GAAW,EAAE,eAAe;IACxC,IAAI,KAAK,KAAK,iBAAiB,MAAM,KAAA,GACnC,EAAE,kBAAkB,KAAK,KAAK,iBAAiB;IACjD,MAAM,OAAO,QAAQ,KAAK,qBAAqB;IAC/C,IAAI,SAAS,KAAA,GAAW,EAAE,sBAAsB;IAChD,EAAE,cAAc;GAClB;GACA,KAAK,KAAK,CAAe;EAC3B;EAEF,OAAO;GACL,qBAAqB,KAAK,IAAI,qBAAqB,KAAK;GACxD;GACA;EACF;CACF;AACF;AAEA,MAAa,qBAA8D;CACzE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,sFACF;EACA,KAAK,MAAM,KAAK,KAAK,OAAO;GAC1B,MAAM,KAAK,EAAE;GACb,MAAM,UAAoB,CAAC,OAAO,GAAG,GAAG,EAAE;GAC1C,IAAI,GAAG,eAAe,KAAA,GAAW,QAAQ,KAAK,eAAe,UAAU,GAAG,UAAU,EAAE,EAAE;GACxF,EAAE,KACA,sBAAsB,EAAE,GAAG,OAAO,UAAU,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,eAC1E,QAAQ,KAAK,GAAG,EAAE,iBACf,GAAG,MAAM,MAAM,WAAW,UAAU,GAAG,MAAM,KAAK,EAAE,iBAAiB,UAAU,GAAG,MAAM,WAAW,EAAE,gCAE1H;EACF;EACA,EAAE,KAAK,mBAAmB;EAC1B,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAa,MAAM;EACvB,MAAM,QAAgC,CAAC;EACvC,KAAK,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG;GACnC,IAAI,IAAI,SAAS,iBAAiB;GAClC,MAAM,OAAO,UAAU,KAAK,WAAW;GACvC,IAAI,CAAC,MAAM;GACX,MAAM,UAAU,UAAU,MAAM,OAAO;GACvC,IAAI,CAAC,SAAS;GACd,MAAM,KAAwC,EAAE,IAAI,QAAQ,MAAM,IAAI,KAAK,EAAE;GAC7E,IAAI,KAAK,MAAM,YAAY,MAAM,KAAA,GAAW,GAAG,aAAa,KAAK,MAAM,YAAY;GACnF,GAAG,QAAQ;IACT,OAAO,QAAQ,SAAS,OAAO,KAAK;IACpC,OAAO,KAAK,SAAS,OAAO,KAAK;IACjC,aAAa,KAAK,SAAS,aAAa,KAAK;GAC/C;GACA,MAAM,KAAK;IACT,IAAI,QAAQ,KAAK,IAAI,KAAK;IAC1B,WAAW,KAAK,KAAK,GAAG,KAAK;IAC7B,cAAc,QAAQ,KAAK,cAAc,KAAK;IAC9C,WAAW;GACb,CAAC;EACH;EACA,OAAO,EAAE,MAAM;CACjB;AACF;;;;;;;;;ACpPA,SAAS,oBAAoB,IAAuC;CAClE,MAAM,WAAkC,CAAC;CACzC,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG;EACrC,IAAI,MAAM,SAAS,WAAW;EAC9B,IAAI,MAAM,SAAS,QAAQ;GACzB,MAAM,OAAqC;IACzC,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,GAAG;IACzC,YAAa,KAAK,OAAO,KAAK,KAAK;IACnC,WAAW,KAAK,OAAO,IAAI,KAAK;GAClC;GACA,SAAS,OAAO,UAAU,MAAO,KAAK,QAAQ,CAAE;GAChD,SAAS,OAAO,UAAU,MAAO,KAAK,QAAQ,CAAE;GAChD,SAAS,OAAO,MAAM,MAAO,KAAK,QAAQ,CAAE;GAC5C,SAAS,OAAO,OAAO,MAAO,KAAK,eAAe,CAAE;GACpD,SAAS,OAAO,OAAO,MAAO,KAAK,mBAAmB,CAAE;GACxD,QAAQ,OAAO,OAAO,MAAO,KAAK,cAAc,CAAE;GAClD,QAAQ,OAAO,MAAM,MAAO,KAAK,YAAY,CAAE;GAC/C,QAAQ,OAAO,QAAQ,MAAO,KAAK,MAAM,CAAE;GAC3C,SAAS,KAAK;IAAE,MAAM;IAAQ,MAAM;GAA4B,CAAC;EACnE,OAAO,IAAI,MAAM,SAAS,OAAO;GAC/B,MAAM,SAAS,WAAW,KAAK;GAC/B,IAAI,QAAQ,SAAS,cAAc,SAAS,KAAK;IAAE,MAAM;IAAc,MAAM,OAAO;GAAK,CAAC;EAC5F,OAAO,IAAI,MAAM,SAAS,QAAQ;GAChC,MAAM,SAAS,WAAW,KAAK;GAC/B,IAAI,QAAQ,SAAS,cAAc,SAAS,KAAK;IAAE,MAAM;IAAc,MAAM,OAAO;GAAK,CAAC;EAC5F;CACF;CACA,OAAO;AACT;AAEA,SAAS,aAAa,IAAwB;CAC5C,MAAM,UAAU,OAAO,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAChD,KAAK,CAAC,GAAG,OAAO,IAAI,EAAE,IAAI,UAAU,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAClD,KAAK,EAAE;CACV,MAAM,QAAQ,GAAG,WACb,GAAG,SACA,KAAK,MAAM;EACV,IAAI,EAAE,SAAS,QAAQ,OAAO,UAAU,OAAO,EAAE,UAAU,CAAC,CAAC,EAAE,CAAe,KAAK,EAAE;EACrF,IAAI,EAAE,SAAS,WAAW,OAAO,aAAa,CAAe;EAC7D,OAAO;CACT,CAAC,CAAC,CACD,KAAK,EAAE,IACV;CACJ,OAAO,IAAI,GAAG,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,KAAK;AACpD;;AAGA,SAAS,cAAc,IAAuB,MAAkC;CAC9E,MAAM,QAAQ,UAAU,MAAM,KAAA,GAAW,IAAI;CAC7C,OAAO,QAAQ,aAAa,KAAK,IAAI,KAAA;AACvC;AAEA,SAAS,UAAU,IAAgB,MAAmC;CACpE,MAAM,IAAI,KAAK,IAAI,IAAI;CACvB,IAAI,MAAM,KAAA,GAAW,OAAO,KAAA;CAE5B,OAAO,WAAW,CAAC,KAAK;AAC1B;AAEA,SAAgB,WAAW,IAA2C;CACpE,QAAQ,GAAG,MAAX;EACE,KAAK,OAAO;GACV,MAAM,IAAuC;IAC3C,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IAClC,SAAS,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IACtC,KAAK,KAAK,IAAI,KAAK,KAAK;IACxB,QAAS,KAAK,IAAI,QAAQ,KAAK;GACjC;GACA,MAAM,YAAY,UAAU,IAAI,KAAK;GACrC,IAAI,WAAW,EAAE,YAAY;GAC7B,MAAM,OAAO,UAAU,IAAI,MAAM;GACjC,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,MAAM,WAAW,oBAAoB,EAAE;GACvC,IAAI,SAAS,SAAS,GAAG,EAAE,WAAW;GACtC,OAAO;IAAE,MAAM;IAAa,MAAM;GAA8B;EAClE;EACA,KAAK,MAAM;GACT,MAAM,IAAkC;IACtC,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IAClC,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,QAAQ,KAAK,IAAI,QAAQ,KAAK;IAC9B,aAAa,KAAK,IAAI,aAAa,KAAK;GAC1C;GACA,MAAM,gBAAgB,KAAK,IAAI,eAAe;GAC9C,IAAI,kBAAkB,KAAA,GAAW,EAAE,gBAAgB,OAAO,aAAa;GACvE,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,MAAM,WAAW,oBAAoB,EAAE;GACvC,IAAI,SAAS,SAAS,GAAG,EAAE,WAAW;GACtC,OAAO;IAAE,MAAM;IAAQ,MAAM;GAAyB;EACxD;EACA,KAAK,OACH,OAAO;GACL,MAAM;GACN,MAAM;IACJ,MAAM,KAAK,IAAI,MAAM,KAAK;IAC1B,QAAS,KAAK,IAAI,QAAQ,KAAK;GACjC;EACF;EACF,KAAK,QAAQ;GACX,MAAM,IAAyC;IAC7C,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IAClC,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,SAAS,KAAK,IAAI,SAAS,KAAK;IAChC,SAAS,KAAK,IAAI,SAAS,KAAK;GAClC;GACA,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,OAAO;IAAE,MAAM;IAAe,MAAM;GAAgC;EACtE;EACA,KAAK,OAAO;GACV,MAAM,IAAyC;IAC7C,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IAClC,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,MAAM,KAAK,IAAI,MAAM,KAAK;IAC1B,eAAe,OAAO,KAAK,IAAI,eAAe,KAAK,GAAG;GACxD;GACA,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,OAAO;IAAE,MAAM;IAAe,MAAM;GAAgC;EACtE;EACA,KAAK,OAAO;GACV,MAAM,IAAwC;IAC5C,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IAClC,SAAS,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IACtC,YAAY,cAAc,IAAI,IAAI,KAAK;GACzC;GACA,MAAM,YAAY,UAAU,IAAI,MAAM;GACtC,IAAI,WAAW,EAAE,YAAY;GAC7B,MAAM,QAAQ,UAAU,IAAI,OAAO;GACnC,IAAI,OAAO,EAAE,QAAQ;GACrB,MAAM,QAAQ,UAAU,IAAI,GAAG;GAC/B,IAAI,OAAO,EAAE,QAAQ;GACrB,MAAM,SAAS,UAAU,IAAI,KAAK;GAClC,IAAI,QAAQ,EAAE,SAAS;GACvB,MAAM,WAAW,KAAK,IAAI,UAAU;GACpC,IAAI,aAAa,KAAA,GAAW,EAAE,WAAW,OAAO,QAAQ;GACxD,MAAM,cAAc,UAAU,IAAI,aAAa;GAC/C,IAAI,aAAa,EAAE,cAAc;GACjC,MAAM,iBAAiB,UAAU,IAAI,gBAAgB;GACrD,IAAI,gBAAgB,EAAE,iBAAiB;GACvC,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,MAAM,cAAc,UAAU,IAAI,OAAO;GACzC,IAAI,aAAa,EAAE,cAAc;GACjC,MAAM,YAAY,UAAU,IAAI,wBAAwB;GACxD,IAAI,WAAW,EAAE,yBAAyB;GAC1C,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,MAAM,KAAK,cAAc,IAAI,IAAI;GACjC,IAAI,IAAI,EAAE,aAAa;GACvB,MAAM,OAAO,cAAc,IAAI,MAAM;GACrC,IAAI,MAAM,EAAE,YAAY;GACxB,MAAM,OAAO,cAAc,IAAI,MAAM;GACrC,IAAI,MAAM,EAAE,YAAY;GACxB,OAAO;IAAE,MAAM;IAAc,MAAM;GAA+B;EACpE;EACA,KAAK,QAAQ;GACX,MAAM,IAAwC;IAC5C,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,OAAO,KAAK,IAAI,OAAO,KAAK;GAC9B;GACA,MAAM,QAAQ,UAAU,IAAI,OAAO;GACnC,IAAI,OAAO,EAAE,QAAQ;GACrB,MAAM,QAAQ,UAAU,IAAI,GAAG;GAC/B,IAAI,OAAO,EAAE,QAAQ;GACrB,MAAM,QAAQ,KAAK,IAAI,OAAO;GAC9B,IAAI,UAAU,KAAA,GAAW,EAAE,QAAQ,OAAO,KAAK;GAC/C,MAAM,SAAS,KAAK,IAAI,QAAQ;GAChC,IAAI,WAAW,KAAA,GAAW,EAAE,SAAS,OAAO,MAAM;GAClD,MAAM,SAAS,cAAc,IAAI,KAAK;GACtC,IAAI,QAAQ,EAAE,SAAS;GACvB,OAAO;IAAE,MAAM;IAAc,MAAM;GAA+B;EACpE;EACA,KAAK,OAAO;GACV,MAAM,IAA4C;IAChD,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,KAAK,KAAK,IAAI,KAAK,KAAK;GAC1B;GAEA,MAAM,YAAY,OAAO,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAClD,QAAQ,CAAC,OAAO,MAAM,aAAa,MAAM,KAAK,CAAC,CAC/C,KAAK,CAAC,GAAG,OAAO,IAAI,EAAE,IAAI,UAAU,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAClD,KAAK,EAAE;GACV,IAAI,WAAW,EAAE,gBAAgB;GACjC,OAAO;IAAE,MAAM;IAAkB,MAAM;GAAmC;EAC5E;EACA,KAAK,OAAO;GACV,MAAM,IAAyC;IAC7C,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG;IAClC,MAAM,KAAK,IAAI,MAAM,KAAK;GAC5B;GACA,MAAM,eAAe,KAAK,IAAI,cAAc;GAC5C,IAAI,iBAAiB,KAAA,GAAW,EAAE,eAAe,OAAO,YAAY;GACpE,SAAS,IAAI,eAAe,MAAO,EAAE,aAAa,CAAE;GACpD,SAAS,IAAI,aAAa,MAAO,EAAE,WAAW,CAAE;GAChD,SAAS,IAAI,gBAAgB,MAAO,EAAE,cAAc,CAAE;GACtD,QAAQ,IAAI,oBAAoB,MAAO,EAAE,kBAAkB,CAAE;GAC7D,QAAQ,IAAI,uBAAuB,MAAO,EAAE,qBAAqB,CAAE;GACnE,QAAQ,IAAI,gBAAgB,MAAO,EAAE,cAAc,CAAE;GACrD,QAAQ,IAAI,mBAAmB,MAAO,EAAE,iBAAiB,CAAE;GAC3D,SAAS,IAAI,WAAW,MAAO,EAAE,SAAS,CAAE;GAC5C,SAAS,IAAI,cAAc,MAAO,EAAE,YAAY,CAAE;GAClD,QAAQ,IAAI,eAAe,MAAO,EAAE,aAAa,CAAE;GACnD,QAAQ,IAAI,kBAAkB,MAAO,EAAE,gBAAgB,CAAE;GACzD,QAAQ,IAAI,gBAAgB,MAAO,EAAE,cAAc,CAAE;GACrD,QAAQ,IAAI,mBAAmB,MAAO,EAAE,iBAAiB,CAAE;GAC3D,QAAQ,IAAI,SAAS,MAAO,EAAE,OAAO,CAAE;GACvC,QAAQ,IAAI,YAAY,MAAO,EAAE,UAAU,CAAE;GAC7C,QAAQ,IAAI,cAAc,MAAO,EAAE,YAAY,CAAE;GACjD,QAAQ,IAAI,iBAAiB,MAAO,EAAE,eAAe,CAAE;GACvD,QAAQ,IAAI,YAAY,MAAO,EAAE,UAAU,CAAE;GAC7C,QAAQ,IAAI,eAAe,MAAO,EAAE,aAAa,CAAE;GACnD,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,MAAM,UAAU,UAAU,IAAI,SAAS;GACvC,IAAI,SAAS,EAAE,UAAU,OAAO,OAAO,KAAK;GAC5C,MAAM,aAAa,UAAU,IAAI,YAAY;GAC7C,IAAI,YAAY,EAAE,aAAa,OAAO,UAAU,KAAK;GACrD,OAAO;IAAE,MAAM;IAAe,MAAM;GAAgC;EACtE;EACA,KAAK,QAAQ;GACX,MAAM,IAAqC;IACzC,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,MAAM,KAAK,IAAI,MAAM,KAAK;IAC1B,MAAM,KAAK,IAAI,MAAM,KAAK;IAC1B,QAAQ,KAAK,IAAI,QAAQ,KAAK;GAChC;GACA,MAAM,SAAS,KAAK,IAAI,QAAQ;GAChC,IAAI,QAAQ,EAAE,SAAS;GACvB,SAAS,IAAI,eAAe,MAAO,EAAE,aAAa,CAAE;GACpD,SAAS,IAAI,QAAQ,MAAO,EAAE,MAAM,CAAE;GACtC,SAAS,IAAI,cAAc,MAAO,EAAE,YAAY,CAAE;GAClD,SAAS,IAAI,iBAAiB,MAAO,EAAE,eAAe,CAAE;GACxD,QAAQ,IAAI,cAAc,MAAO,EAAE,YAAY,CAAE;GACjD,QAAQ,IAAI,cAAc,MAAO,EAAE,YAAY,CAAE;GACjD,OAAO;IAAE,MAAM;IAAW,MAAM;GAA4B;EAC9D;EACA,KAAK,OACH,OAAO;GACL,MAAM;GACN,MAAM;IACJ,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;IAC1C,KAAK,KAAK,IAAI,KAAK,KAAK;IACxB,SAAS,OAAO,KAAK,IAAI,SAAS,KAAK,GAAG;GAC5C;EACF;EACF,KAAK,QAAQ;GACX,MAAM,IAAsC,EAAE,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK,GAAG,EAAE;GAClF,MAAM,OAAO,UAAU,IAAI,IAAI;GAC/B,IAAI,MAAM,EAAE,OAAO;GACnB,MAAM,WAAW,UAAU,IAAI,IAAI;GACnC,IAAI,UAAU,EAAE,WAAW;GAC3B,MAAM,UAAU,KAAK,IAAI,SAAS;GAClC,IAAI,YAAY,KAAA,GAAW,EAAE,UAAU,OAAO,OAAO;GACrD,OAAO;IAAE,MAAM;IAAY,MAAM;GAA6B;EAChE;EACA,SACE;CACJ;AACF;AAIA,SAAgB,SAAS,IAAgB,MAAc,KAAiC;CAGtF,IAAI,WAFQ,KAAK,IAAI,IAEJ,CAAC,GAAG,IAAI,IAAI;AAC/B;AAEA,SAAgB,QAAQ,IAAgB,MAAc,KAAgC;CACpF,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,IAAI,QAAQ,KAAA,GAAW,IAAI,OAAO,GAAG,CAAC;AACxC;AAEA,SAAgB,QAAQ,IAAgB,MAAc,KAAgC;CACpF,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,IAAI,QAAQ,KAAA,GAAW,IAAI,GAAG;AAChC;;;;;;;;ACxTA,MAAM,OAAO;AACb,MAAM,OAAO;AAIb,SAAS,UAAU,MAAmE;CACpF,IAAI,IAAI,SAAS,KAAK,IAAI;CAC1B,IAAI,KAAK,MAAM,KAAK;CACpB,IAAI,KAAK,UAAU,KAAK;CACxB,OAAO;AACT;AAEA,SAAS,cAAc,GAAgC;CACrD,IAAI,IAAI,WAAW,EAAE,MAAM,SAAS,EAAE,WAAW,QAAQ,UAAU,EAAE,SAAS,EAAE;CAChF,IAAI,EAAE,OAAO,KAAK;CAClB,IAAI,EAAE,OAAO,KAAK;CAClB,IAAI,EAAE,OAAO,KAAK;CAClB,IAAI,EAAE,cAAc,KAAK;CACzB,IAAI,EAAE,kBAAkB,KAAK;CAC7B,IAAI,EAAE,gBAAgB,KAAA,GAAW,KAAK,QAAQ,UAAU,EAAE,WAAW,EAAE;CACvE,IAAI,EAAE,cAAc,KAAA,GAAW,KAAK,OAAO,UAAU,EAAE,SAAS,EAAE;CAClE,IAAI,EAAE,QAAQ,KAAA,GAAW,KAAK,SAAS,EAAE,IAAI;CAC7C,OAAO,QAAQ,EAAE;AACnB;AAEA,SAAS,wBAAwB,UAAqD;CACpF,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO,SACJ,KAAK,UAAU;EACd,QAAQ,MAAM,MAAd;GACE,KAAK,QACH,OAAO,cAAc,MAAM,IAAI;GACjC,KAAK,cACH,OAAO,eAAe;IAAE,MAAM;IAAc,MAAM,MAAM;GAAK,CAAC;GAChE,KAAK,cACH,OAAO,eAAe;IAAE,MAAM;IAAc,MAAM,MAAM;GAAK,CAAC;EAClE;CACF,CAAC,CAAC,CACD,KAAK,EAAE;AACZ;AAEA,SAAgB,eAAe,OAA8B;CAC3D,QAAQ,MAAM,MAAd;EACE,KAAK,aAAa;GAChB,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,UAAU,CAAC,IAAI,SAAS,EAAE,QAAQ,SAAS,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO;GACzF,IAAI,EAAE,WAAW,KAAK;GACtB,IAAI,EAAE,MAAM,KAAK;GACjB,OAAO,OAAO,EAAE,GAAG,wBAAwB,EAAE,QAAQ,EAAE;EACzD;EACA,KAAK,QAAQ;GACX,MAAM,IAAI,MAAM;GAChB,IAAI,IACF,UAAU,CAAC,IACX,aAAa,EAAE,QAAQ,YAAY,UAAU,EAAE,MAAM,EAAE,iBAAiB,UAAU,EAAE,WAAW,EAAE;GACnG,IAAI,EAAE,kBAAkB,KAAA,GAAW,KAAK,mBAAmB,EAAE,cAAc;GAC3E,OAAO,MAAM,EAAE,GAAG,wBAAwB,EAAE,QAAQ,EAAE;EACxD;EACA,KAAK,cAAc;GACjB,MAAM,IAAI,MAAM;GAChB,OAAO,cAAc,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO;EAC9D;EACA,KAAK,eAAe;GAClB,MAAM,IAAI,MAAM;GAChB,OAAO,QAAQ,UAAU,CAAC,EAAE,YAAY,EAAE,QAAQ,aAAa,UAC7D,EAAE,OACJ,EAAE,aAAa,UAAU,EAAE,OAAO,EAAE;EACtC;EACA,KAAK,eAAe;GAClB,MAAM,IAAI,MAAM;GAChB,OAAO,OAAO,UAAU,CAAC,EAAE,YAAY,EAAE,QAAQ,UAAU,UACzD,EAAE,IACJ,EAAE,mBAAmB,EAAE,cAAc;EACvC;EACA,KAAK,cAAc;GACjB,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,UAAU,CAAC,IAAI,SAAS,EAAE,QAAQ;GAC1C,IAAI,EAAE,WAAW,KAAK;GACtB,IAAI,EAAE,OAAO,KAAK;GAClB,IAAI,EAAE,OAAO,KAAK;GAClB,IAAI,EAAE,QAAQ,KAAK;GACnB,IAAI,EAAE,aAAa,KAAA,GAAW,KAAK,cAAc,EAAE,SAAS;GAC5D,IAAI,EAAE,aAAa,KAAK;GACxB,IAAI,EAAE,gBAAgB,KAAK;GAC3B,IAAI,EAAE,UAAU,KAAK;GACrB,IAAI,EAAE,aAAa,KAAK;GACxB,IAAI,EAAE,wBAAwB,KAAK;GACnC,MAAM,WAAW;IAAC,EAAE,cAAc;IAAI,EAAE;IAAY,EAAE,aAAa;IAAI,EAAE,aAAa;GAAE,CAAC,CACtF,OAAO,OAAO,CAAC,CACf,KAAK,EAAE;GACV,OAAO,OAAO,EAAE,GAAG,SAAS;EAC9B;EACA,KAAK,cAAc;GACjB,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,aAAa,EAAE,QAAQ,WAAW,UAAU,EAAE,KAAK,EAAE;GAC7D,IAAI,EAAE,OAAO,KAAK;GAClB,IAAI,EAAE,OAAO,KAAK;GAClB,IAAI,EAAE,UAAU,KAAA,GAAW,KAAK,WAAW,EAAE,MAAM;GACnD,IAAI,EAAE,WAAW,KAAA,GAAW,KAAK,YAAY,EAAE,OAAO;GACtD,OAAO,QAAQ,EAAE,GAAG,EAAE,UAAU,GAAG;EACrC;EACA,KAAK,kBAAkB;GACrB,MAAM,IAAI,MAAM;GAChB,OAAO,iBAAiB,EAAE,QAAQ,SAAS,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,iBAAiB,GAAG;EACvF;EACA,KAAK,eAAe;GAClB,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,UAAU,CAAC,IAAI,UAAU,UAAU,EAAE,IAAI,EAAE;GACnD,IAAI,EAAE,iBAAiB,KAAA,GAAW,KAAK,kBAAkB,EAAE,aAAa;GACxE,IAAI,EAAE,YAAY,KAAK;GACvB,IAAI,EAAE,UAAU,KAAK;GACrB,IAAI,EAAE,aAAa,KAAK;GACxB,IAAI,EAAE,oBAAoB,KAAA,GAAW,KAAK,qBAAqB,EAAE,gBAAgB;GACjF,IAAI,EAAE,uBAAuB,KAAA,GAAW,KAAK,wBAAwB,EAAE,mBAAmB;GAC1F,IAAI,EAAE,gBAAgB,KAAA,GAAW,KAAK,iBAAiB,EAAE,YAAY;GACrE,IAAI,EAAE,mBAAmB,KAAA,GAAW,KAAK,oBAAoB,EAAE,eAAe;GAC9E,IAAI,EAAE,QAAQ,KAAK;GACnB,IAAI,EAAE,WAAW,KAAK;GACtB,MAAM,WAAW,GAAuB,SACtC,MAAM,KAAA,IAAY,IAAI,KAAK,IAAI,UAAU,CAAC,EAAE,KAAK;GACnD,KAAK,QAAQ,EAAE,YAAY,YAAY,IAAI,QAAQ,EAAE,eAAe,eAAe;GACnF,KAAK,QAAQ,EAAE,aAAa,aAAa,IAAI,QAAQ,EAAE,gBAAgB,gBAAgB;GACvF,KAAK,QAAQ,EAAE,MAAM,MAAM,IAAI,QAAQ,EAAE,SAAS,SAAS;GAC3D,KAAK,QAAQ,EAAE,WAAW,WAAW,IAAI,QAAQ,EAAE,cAAc,cAAc;GAC/E,KAAK,QAAQ,EAAE,SAAS,SAAS,IAAI,QAAQ,EAAE,YAAY,YAAY;GACvE,MAAM,WAAW,CACf,EAAE,YAAY,KAAA,IAAY,YAAY,UAAU,EAAE,OAAO,EAAE,cAAc,IACzE,EAAE,eAAe,KAAA,IAAY,eAAe,UAAU,EAAE,UAAU,EAAE,iBAAiB,EACvF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,EAAE;GACV,OAAO,OAAO,EAAE,GAAG,SAAS;EAC9B;EACA,KAAK,WAAW;GACd,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,aAAa,EAAE,QAAQ,UAAU,UAAU,EAAE,IAAI,EAAE,UAAU,UACnE,EAAE,IACJ,EAAE,YAAY,EAAE,UAAU,MAAM,YAAY,UAAU,EAAE,MAAM,EAAE;GAChE,IAAI,EAAE,YAAY,KAAK;GACvB,IAAI,EAAE,KAAK,KAAK;GAChB,IAAI,EAAE,WAAW,KAAK;GACtB,IAAI,EAAE,cAAc,KAAK;GACzB,IAAI,EAAE,cAAc,KAAA,GAAW,KAAK,eAAe,EAAE,UAAU;GAC/D,IAAI,EAAE,cAAc,KAAA,GAAW,KAAK,eAAe,EAAE,UAAU;GAC/D,OAAO,QAAQ,EAAE;EACnB;EACA,KAAK,mBAAmB;GACtB,MAAM,IAAI,MAAM;GAChB,OAAO,iBAAiB,EAAE,QAAQ,SAAS,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ;EACrF;EACA,KAAK,YAAY;GACf,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,UAAU,CAAC;GACnB,IAAI,EAAE,YAAY,KAAA,GAAW,KAAK,aAAa,EAAE,QAAQ;GACzD,OAAO,QAAQ,EAAE;EACnB;CACF;AACF;;;ACxJA,SAAS,gBAAgB,GAAgC;CACvD,MAAM,WAAW,EAAE,SAAS,KAAK,OAAO,iBAAiB,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE;CACzE,MAAM,cACJ,EAAE,YAAY,EAAE,SAAS,SAAS,IAC9B,wBAAwB,EAAE,SAAS,OAAO,IAAI,EAAE,SAC7C,KAAK,MAAM,kBAAkB,EAAE,IAAI,CAAC,CACpC,KAAK,EAAE,EAAE,mBACZ;CACN,IAAI,QACF,UAAU,UAAU,EAAE,IAAI,EAAE,cAAc,UAAU,EAAE,QAAQ,EAAE,gBAChD,EAAE,WAAW,cAAc,UAAU,EAAE,QAAQ,EAAE,UACvD,UAAU,EAAE,GAAG,EAAE;CAC7B,IAAI,EAAE,WAAW,KAAA,GAAW,SAAS,YAAY,EAAE,OAAO;CAC1D,IAAI,EAAE,WAAW,KAAA,GAAW,SAAS,YAAY,EAAE,OAAO;CAC1D,OAAO,UAAU,MAAM,sBAAsB,EAAE,SAAS,OAAO,IAAI,SAAS,eAAe,YAAY;AACzG;AAEA,SAAS,YAAY,IAAqC;CASxD,MAAM,SAA8B;EAAE,MARzB,KAAK,IAAI,MAAM,KAAK;EAQW,UAP3B,KAAK,IAAI,UAAU,KAAK;EAOa,UANrC,KAAK,IAAI,UAAU,KAAK;EAMuB,KAJpD,OAAO,GAAG,aAAa,WAAW,GAAG,aAAa,SAAS,EAIL;EAAG,YAHlD,OAAO,KAAK,IAAI,YAAY,KAAK,GAG0B;EAAG,UADhE,SADE,UAAU,IAAI,YACE,GAAG,SAAS,CAAC,CAAC,KAAK,MAAM,OAAO,KAAK,GAAG,KAAK,KAAK,GAAG,CACA;CAAE;CAC1F,MAAM,eAAe,UAAU,IAAI,cAAc;CACjD,IAAI,cAAc;EAChB,MAAM,WAAW,SAAS,cAAc,UAAU,CAAC,CAAC,KAAK,MAAM,OAAO,KAAK,GAAG,KAAK,KAAK,GAAG,CAAC;EAC5F,IAAI,SAAS,SAAS,GAAG,OAAO,WAAW;CAC7C;CACA,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS,OAAO,MAAM;CACvD,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS,OAAO,MAAM;CACvD,OAAO;AACT;AAEA,MAAa,sBAAgE;CAC3E,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,IAAI,KAAK,QAAQ,WAAW,GAAG,OAAO,KAAA;EACtC,IAAI,QAAQ,WAAW,KAAK,aAAa,KAAK,UAAU,UAAU,KAAK,IAAI,EAAE;EAC7E,IAAI,KAAK,UAAU,SAAS,cAAc,UAAU,KAAK,QAAQ,EAAE;EACnE,IAAI,KAAK,WAAW,KAAA,GAAW,SAAS,YAAY,KAAK,SAAS,IAAI,EAAE;EACxE,IAAI,KAAK,kBAAkB,KAAA,GAAW,SAAS,mBAAmB,KAAK,gBAAgB,IAAI,EAAE;EAC7F,IAAI,KAAK,YAAY,KAAA,GAAW,SAAS,aAAa,KAAK,UAAU,IAAI,EAAE;EAC3E,IAAI,KAAK,mBAAmB,KAAA,GAC1B,SAAS,oBAAoB,KAAK,iBAAiB,IAAI,EAAE;EAC3D,IAAI,KAAK,cAAc,KAAA,GAAW,SAAS,eAAe,KAAK,YAAY,IAAI,EAAE;EACjF,IAAI,KAAK,eAAe,KAAA,GAAW,SAAS,gBAAgB,KAAK,WAAW;EAC5E,IAAI,KAAK,YAAY,KAAA,GAAW,SAAS,aAAa,KAAK,QAAQ;EACnE,IAAI,KAAK,sBAAsB,KAAA,GAC7B,SAAS,uBAAuB,KAAK,oBAAoB,IAAI,EAAE;EACjE,IAAI,KAAK,cAAc,KAAA,GAAW,SAAS,eAAe,KAAK,YAAY,IAAI,EAAE;EACjF,IAAI,KAAK,oBAAoB,KAAA,GAAW,SAAS,qBAAqB,KAAK,gBAAgB;EAC3F,OAAO,WAAW,MAAM,GAAG,KAAK,QAAQ,IAAI,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE;CACxE;CAEA,MAAM,IAAI,MAAM;EAGd,MAAM,SAA0C;GAAE,MAFrC,KAAK,IAAI,MAAM,KAAK;GAEuB,SADxC,SAAS,IAAI,QAAQ,CAAC,CAAC,IAAI,WACmB;EAAE;EAChE,MAAM,WAAW,KAAK,IAAI,UAAU;EACpC,IAAI,aAAa,KAAA,GAAW,OAAO,WAAW;EAC9C,SAAS,IAAI,WAAW,MAAO,OAAO,SAAS,CAAE;EACjD,SAAS,IAAI,kBAAkB,MAAO,OAAO,gBAAgB,CAAE;EAC/D,SAAS,IAAI,YAAY,MAAO,OAAO,UAAU,CAAE;EACnD,SAAS,IAAI,mBAAmB,MAAO,OAAO,iBAAiB,CAAE;EACjE,SAAS,IAAI,cAAc,MAAO,OAAO,YAAY,CAAE;EACvD,QAAQ,IAAI,eAAe,MAAO,OAAO,aAAa,CAAE;EACxD,QAAQ,IAAI,YAAY,MAAO,OAAO,UAAU,CAAE;EAClD,SAAS,IAAI,sBAAsB,MAAO,OAAO,oBAAoB,CAAE;EACvE,SAAS,IAAI,cAAc,MAAO,OAAO,YAAY,CAAE;EACvD,QAAQ,IAAI,oBAAoB,MAAO,OAAO,kBAAkB,CAAE;EAClE,OAAO;CACT;AACF;;;ACjFA,MAAa,YAA4C;CACvD,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,IAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,GAAG,OAAO,KAAA;EACnD,MAAM,QAAQ,KAAK,MAChB,KACE,MACC,mBAAmB,UAAU,EAAE,IAAI,EAAE,UAAU,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAChE,UAAU,EAAE,QAAQ,EAAE,IACxC,CAAC,CACA,KAAK,EAAE;EACV,OAAO,iBAAiB,KAAK,WAAW,KAAK,MAAM,OAAO,IAAI,MAAM;CACtE;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,QAAQ,SAAS,IAAI,UAAU,CAAC,CAAC,KAAK,OAAO;GACjD,MAAM,KAAK,GAAG,MAAM,KAAK;GACzB,MAAM,KAAK,GAAG,MAAM,KAAK;GACzB,IAAI,OAAO,KAAK,GAAG,IAAI,KAAK,GAAG;GAC/B,UAAU,KAAK,GAAG,UAAU,KAAK;EACnC,EAAE;EACF,MAAM,SAAgC,CAAC;EACvC,IAAI,MAAM,SAAS,GAAG,OAAO,QAAQ;EACrC,OAAO;CACT;AACF;;;ACdA,MAAa,kBAAwD;CACnE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,IAAI,KAAK,UAAU,WAAW,GAAG,OAAO,KAAA;EACxC,OAAO,qBAAqB,KAAK,IAAI,KAAK,UAAU,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE;CACnF;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,YAA6C,CAAC;EACpD,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG;GACrC,IAAI,MAAM,SAAS,WAAW;GAC9B,MAAM,QAAQ,WAAW,KAAmB;GAC5C,IAAI,OAAO,UAAU,KAAK,KAAK;EACjC;EACA,OAAO,EAAE,UAAU;CACrB;AACF;;;;;;;;ACNA,IAAa,mBAAb,MAAsD;CACpD,gBAAgB,IAAI,cAAc;CAClC,SAAS,IAAI,OAAO;CACpB,QAAQ,IAAI,MAAiB;CAC7B,SAAS,IAAI,gBAAgB;CAC7B,eAAe,IAAI,cAAc;CACjC,iBAAwC,CAAC;CACzC,8BAAsB,IAAI,IAA4B;CAItD,gBAAuB,MAAwB,QAAgB,OAAwB;EACrF,OAAO,MAAM,KAAK,aAAa,IAAI,MAAM,MAAM;CACjD;CAEA,SAAgB,MAAkB,MAAsB;EAWtD,OAAO,IAPO,KAAK,MAAM,SAAS,MAAM,OAAO,cAAc;GAC3D;GACA;GACA;GACA,OAAO;GACP,QAAQ;EACV,EACe,CAAC,CAAC,SAAS;CAC5B;CAEA,aAAoB,KAAa,QAA+B;EAG9D,IAAI,OAAO,UAAU,KAAA,GACnB,MAAM,IAAI,MAAM,6DAA6D;EAE/E,KAAK,YAAY,IAAI,KAAK;GAAE;GAAK,KAAK,OAAO,OAAO;GAAI,SAAS,OAAO;EAAQ,CAAC;CACnF;;;;CAKA,YAAmB,MAA0B;EAC3C,OAAO,KAAK,OAAO,YAAY,IAAI;CACrC;;CAGA,IAAW,aAA+B;EACxC,OAAO,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC;CACtC;AACF;;;;;;;AAUA,IAAa,kBAAb,MAAoD;CAOxC;;CALV;;CAEA;CAEA,YACE,MACA,eACA;EAFQ,KAAA,OAAA;EAGR,KAAK,gBAAgB,iBAAiB,CAAC;CACzC;CAEA,oBAA2B,KAAiC;EAC1D,MAAM,SAAS,KAAK,KAAK,IAAI,IAAI,4BAA4B;EAC7D,IAAI,CAAC,QAAQ,UAAU,OAAO,KAAA;EAC9B,KAAK,MAAM,SAAS,OAAO,UAAU;GACnC,IAAI,MAAM,SAAS,gBAAgB;GACnC,IAAI,MAAM,aAAa,UAAU,KAAK;IACpC,MAAM,SAAS,MAAM,WAAW;IAChC,IAAI,CAAC,QAAQ,OAAO,KAAA;IACpB,OAAO,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM;GAC1D;EACF;CAEF;;;;;CAMA,oBAA2B,QAAgB,KAAiC;EAC1E,MAAM,WAAW,mBAAmB,MAAM;EAC1C,MAAM,OAAO,KAAK,KAAK,IAAI,IAAI,QAAQ;EACvC,IAAI,CAAC,MAAM,UAAU,OAAO,KAAA;EAC5B,KAAK,MAAM,SAAS,KAAK,UAAU;GACjC,IAAI,MAAM,SAAS,gBAAgB;GACnC,IAAI,MAAM,aAAa,UAAU,KAAK;IACpC,MAAM,SAAS,MAAM,WAAW;IAChC,IAAI,CAAC,QAAQ,OAAO,KAAA;IACpB,OAAO,0BAA0B,QAAQ,MAAM;GACjD;EACF;CAEF;;;;;CAMA,uBACE,QACA,cACwC;EACxC,MAAM,WAAW,mBAAmB,MAAM;EAC1C,MAAM,OAAO,KAAK,KAAK,IAAI,IAAI,QAAQ;EACvC,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC;EAC7B,MAAM,SAAiD,CAAC;EACxD,KAAK,MAAM,SAAS,KAAK,UAAU;GACjC,IAAI,MAAM,SAAS,gBAAgB;GACnC,MAAM,OAAO,MAAM,aAAa;GAChC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,YAAY,GAAG;GAC3C,MAAM,MAAM,MAAM,aAAa;GAC/B,MAAM,SAAS,MAAM,aAAa;GAClC,IAAI,OAAO,QACT,OAAO,KAAK;IAAE;IAAK,QAAQ,0BAA0B,QAAQ,MAAM;GAAE,CAAC;EAE1E;EACA,OAAO;CACT;CAEA,QAAe,MAAmC;EAChD,OAAO,KAAK,KAAK,IAAI,IAAI,IAAI;CAC/B;CAEA,OAAc,MAAsC;EAClD,OAAO,KAAK,KAAK,IAAI,OAAO,IAAI;CAClC;;;;;;CAOA,aAAoB,YAA8C;EAChE,MAAM,KAAK,KAAK;EAChB,IAAI,CAAC,IAAI,OAAO,KAAA;EAChB,MAAM,EAAE,SAAS,OAAO,OAAO,SAAS,qBAAqB;EAC7D,IAAI,CAAC,WAAW,cAAc,QAAQ,QAAQ,OAAO,KAAA;EACrD,MAAM,KAAK,QAAQ;EACnB,IAAI,CAAC,IAAI,OAAO,KAAA;EAChB,MAAM,SAAuB,CAAC;EAE9B,MAAM,SAAS,GAAG;EAClB,IAAI,WAAW,KAAA,KAAa,SAAS,SAAS,MAAM,QAAQ,OAAO,OAAO,MAAM;EAChF,MAAM,SAAS,GAAG;EAClB,IAAI,WAAW,KAAA,KAAa,SAAS,SAAS,MAAM,QAAQ,OAAO,OAAO,MAAM;EAChF,MAAM,WAAW,GAAG;EACpB,IAAI,aAAa,KAAA,KAAa,WAAW,WAAW,QAAQ,QAC1D,OAAO,SAAS,QAAQ;EAC1B,MAAM,WAAW,GAAG;EACpB,IAAI,aAAa,KAAA,KAAa,kBAAkB;GAC9C,MAAM,OAAO,iBAAiB,IAAI,QAAQ;GAC1C,IAAI,SAAS,KAAA,GAAW,OAAO,SAAS;EAC1C;EACA,IAAI,GAAG,WAAW,OAAO,YAAY,GAAG;EACxC,IAAI,GAAG,YAAY,OAAO,aAAa,GAAG;EAC1C,IAAI,GAAG,aAAa,OAAO,cAAc,GAAG;EAC5C,IAAI,GAAG,aAAa,OAAO,cAAc,GAAG;EAE5C,OAAO;CACT;AACF;;;;;;;;ACtHA,SAAS,aAAa,OAA2B;CAC/C,OAAO,MAAM,MAAM,GAAG,MAAM;EAG1B,OAFa,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK,EAE1C,IADG,SAAS,EAAE,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK,EACnC;CACnB,CAAC;AACH;;;;;AAMA,MAAM,0BAAwC,EAAE,eAAe,CAAC,WAAW,EAAE;;;;AAK7E,SAAgB,UAAU,MAA8B;CAEtD,MAAM,MAAM,aADE,aAAa,IACE,CAAC;CAE9B,MAAM,WAAW,IAAI,IAAI,iBAAiB;CAC1C,MAAM,SAAS,IAAI,IAAI,eAAe;CACtC,MAAM,gBAAgB,IAAI,IAAI,sBAAsB;CAGpD,MAAM,aAAuB,CAAC;CAC9B,MAAM,SAAmB,CAAC;CAC1B,MAAM,WAAqB,CAAC;CAC5B,MAAM,QAAkB,CAAC;CACzB,IAAI;CAEJ,MAAM,SAAS,IAAI,IAAI,4BAA4B;CACnD,IAAI,QACF,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GAAG;EACzC,IAAI,MAAM,SAAS,gBAAgB;EACnC,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK;EACpC,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK;EACxC,IAAI,CAAC,QAAQ;EAEb,IAAI,KAAK,SAAS,YAAY,GAC5B,WAAW,KAAK,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM,QAAQ;OACpE,IAAI,KAAK,SAAS,QAAQ,GAC/B,QAAQ,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM;CAE7D;CAEF,aAAa,UAAU;CAGvB,SAAS,KAAK,GAAG,IAAI,KAAK,cAAc,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC,CAAC;CAC3E,OAAO,KAAK,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC,CAAC;CACvE,MAAM,KAAK,GAAG,IAAI,KAAK,WAAW,CAAC;CACnC,aAAa,QAAQ;CACrB,aAAa,MAAM;CAGnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,WAAW,IAAI,IAAI,aAAa;CACtC,IAAI,UACF,KAAK,MAAM,SAAS,SAAS,YAAY,CAAC,GAAG;EAC3C,IAAI,MAAM,SAAS,gBAAgB;EACnC,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK;EACpC,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK;EACxC,IAAI,KAAK,SAAS,kBAAkB,GAAG,YAAY;OAC9C,IAAI,KAAK,SAAS,sBAAsB,GAAG,WAAW;OACtD,IAAI,KAAK,SAAS,oBAAoB,GAAG,cAAc;CAC9D;CAGF,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;GAAE;GAAY;GAAQ;GAAO;EAAS;EAChD;EACA;EACA;CACF;AACF;;AAKA,SAAS,0BAA0B,QAA2C;CAC5E,MAAM,UAAoB,CAAC;CAC3B,KAAK,MAAM,SAAS,OAAO,SACzB,IAAI,OAAO,UAAU,UACnB,QAAQ,KAAK,KAAK;MACb,IAAI,MAAM,QAAQ,MAAM,KAAK,SAAS,GAE3C,QAAQ,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;CAGvD,OAAO;AACT;;;;;;AAOA,SAAgB,cAAc,MAAiC;CAC7D,MAAM,OAAO,UAAU,IAAI;CAE3B,MAAM,OAAiC,CAAC;CAGxC,IAAI,KAAK,WAAW;EAClB,MAAM,cAAc,KAAK,IAAI,IAAI,KAAK,SAAS;EAC/C,IAAI,aAAa;GACf,MAAM,KAAK,sBAAsB,WAAW;GAC5C,IAAI,GAAG,OAAO,KAAK,QAAQ,GAAG;GAC9B,IAAI,GAAG,SAAS,KAAK,UAAU,GAAG;GAClC,IAAI,GAAG,SAAS,KAAK,UAAU,GAAG;GAClC,IAAI,GAAG,UAAU,KAAK,WAAW,GAAG;GACpC,IAAI,GAAG,aAAa,KAAK,cAAc,GAAG;GAC1C,IAAI,GAAG,gBAAgB,KAAK,iBAAiB,GAAG;GAChD,IAAI,GAAG,aAAa,KAAA,GAAW,KAAK,WAAW,GAAG;GAClD,IAAI,GAAG,aAAa,KAAK,cAAc,GAAG;GAC1C,IAAI,GAAG,SAAS,KAAK,UAAU,GAAG;GAClC,IAAI,GAAG,UAAU,KAAK,WAAW,GAAG;EACtC;CACF;CAGA,IAAI,KAAK,UAAU;EACjB,MAAM,aAAa,KAAK,IAAI,IAAI,KAAK,QAAQ;EAC7C,IAAI,YAAY;GACd,MAAM,KAAK,kBAAkB,MAAM,YAAY,CAAC,CAAgB;GAChE,IAAI,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG,KAAK,gBAAgB;EAC7D;CACF;CAGA,IAAI,KAAK,aAAa;EACpB,MAAM,gBAAgB,KAAK,IAAI,IAAI,KAAK,WAAW;EACnD,IAAI,eAAe;GACjB,MAAM,KAAK,qBAAqB,MAAM,eAAe,CAAC,CAAgB;GACtE,IAAI,GAAG,YAAY,QAAQ,KAAK,mBAAmB,GAAG;EACxD;CACF;CAGA,IAAI,UAAoB,CAAC;CACzB,IAAI,KAAK,eAEP,UAAU,0BADK,kBAAkB,MAAM,KAAK,eAAe,CAAC,CACnB,CAAC;CAI5C,MAAM,cAAc,IAAI,gBAAgB,MAAM,OAAO;CAMrD,MAAM,mCAAmB,IAAI,IAAsC;CACnE,KAAK,MAAM,OAAO,KAAK,IAAI,KAAK,gBAAgB,GAAG;EACjD,IAAI,CAAC,IAAI,SAAS,sBAAsB,GAAG;EAC3C,MAAM,QAAQ,KAAK,IAAI,IAAI,GAAG;EAC9B,IAAI,CAAC,OAAO;EACZ,iBAAiB,IAAI,KAAK,kBAAkB,MAAM,OAAO,WAAW,CAAC;CACvE;CAEA,MAAM,qCAAqB,IAAI,IAAoB;CACnD,MAAM,gBAAgB,KAAK,WAAW,UAAU,KAAK,UAAU,aAAa,IAAI,KAAA;CAChF,KAAK,MAAM,MAAM,eAAe,YAAY,CAAC,GAAG;EAC9C,IAAI,GAAG,SAAS,cAAc;EAC9B,MAAM,UAAU,KAAK,IAAI,SAAS;EAClC,MAAM,MAAM,KAAK,IAAI,MAAM;EAC3B,IAAI,YAAY,KAAA,KAAa,QAAQ,KAAA,GAAW;EAChD,MAAM,SAAS,YAAY,oBAAoB,GAAG;EAClD,IAAI,QAAQ,mBAAmB,IAAI,OAAO,OAAO,GAAG,MAAM;CAC5D;CAGA,IAAI,KAAK,QAAQ;EACf,MAAM,eAAe,WAAW,MAAM,KAAK,QAAQ,WAAW;EAC9D,YAAY,eAAe;EAM3B,IAAI,aAAa,MAAM,KAAK,OAAO,aAAa;EAChD,IAAI,aAAa,QAAQ,KAAK,SAAS,aAAa;EACpD,IAAI,aAAa,kBAAkB,KAAK,aAAa,aAAa;EAClE,IAAI,aAAa,cAAc,KAAK,eAAe,aAAa;EAChE,IAAI,aAAa,iBAAiB,KAAK,kBAAkB,aAAa;EACtE,IAAI,aAAa,iBAAiB,aAChC,KAAK,cAAc,aAAa,gBAAgB;CACpD;CAIA,IAAI,KAAK,OAAO;EACd,MAAM,UAAU,KAAK,IAAI,IAAI,KAAK,KAAK;EACvC,IAAI,SAAS;GACX,MAAM,eAAe,UAAU,MAAM,SAAS,WAAW;GACzD,IAAI,cAAc,KAAK,QAAQ;EACjC;CACF;CAGA,IAAI,aAAuB,CAAC;CAC5B,IAAI,KAAK,UAAU;EACjB,MAAM,SAAS,aAAa,MAAM,KAAK,UAAU,WAAW;EAC5D,IAAI,OAAO,QAAQ,aAAa,OAAO,OAAO,KAAK,MAAM,EAAE,IAAI;EAG/D,IAAI,OAAO,YAAY,KAAK,qBAAqB,OAAO;EACxD,IAAI,OAAO,UAAU,KAAK,WAAW,OAAO;EAC5C,IAAI,OAAO,QAAQ,KAAK,SAAS,OAAO;EACxC,IAAI,OAAO,aAAa,KAAK,sBAAsB,OAAO;EAC1D,IAAI,OAAO,gBAAgB,KAAK,iBAAiB,OAAO;EACxD,IAAI,OAAO,gBAAgB,KAAK,iBAAiB,OAAO;EACxD,IAAI,OAAO,eAAe,KAAK,gBAAgB,OAAO;EACtD,IAAI,OAAO,aAAa,KAAK,cAAc,OAAO;EAClD,IAAI,OAAO,YAAY,KAAK,aAAa,OAAO;EAChD,IAAI,OAAO,UAAU,KAAK,WAAW,OAAO;EAC5C,IAAI,OAAO,mBAAmB,KAAK,oBAAoB,OAAO;EAC9D,IAAI,OAAO,cAAc,KAAK,eAAe,OAAO;CACtD;CAKA,MAAM,aAAiC,CAAC;CACxC,KAAK,MAAM,CAAC,GAAG,WAAW,KAAK,WAAW,QAAQ,GAAG;EACnD,MAAM,OAAO,KAAK,IAAI,IAAI,QAAQ,uBAAuB;EACzD,IAAI,CAAC,MAAM;EAEX,MAAM,SAAS,cAAc,MAAM,MAAM,WAAW;EACpD,IAAI,WAAW,IAAI,OAAO,OAAO,WAAW;EAK5C,MAAM,cAAc,YAAY,uBAAuB,QAAQ,WAAW;EAC1E,KAAK,MAAM,MAAM,aAAa;GAC5B,MAAM,YAAY,KAAK,IAAI,IAAI,GAAG,MAAM;GACxC,IAAI,CAAC,WAAW;GAChB,MAAM,cAAc,aAAa,MAAM,WAAW,WAAW;GAC7D,IAAI,YAAY,UAAU;IACxB,OAAO,WAAW,YAAY;IAC9B;GACF;EACF;EAIA,MAAM,UAAU,YAAY,uBAAuB,QAAQ,aAAa;EACxE,KAAK,MAAM,MAAM,SAAS;GACxB,MAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,MAAM;GACpC,IAAI,CAAC,OAAO;GACZ,iBAAiB,OAAO,UAAU,aAAa,MAAM,OAAO,WAAW,CAAC;GACxE;EACF;EAGA,MAAM,cAAc,YAAY,uBAAuB,QAAQ,UAAU;EACzE,KAAK,MAAM,MAAM,aAAa;GAC5B,MAAM,YAAY,KAAK,IAAI,IAAI,GAAG,MAAM;GACxC,IAAI,CAAC,WAAW;GAChB,MAAM,cAAc,YAAY,MAAM,WAAW,WAAW;GAK5D,IAAI,YAAY,QAAQ;IACtB,MAAM,SAA2B,CAAC;IAClC,KAAK,MAAM,SAAS,YAAY,QAAQ;KACtC,MAAM,YAAY,YAAY,oBAAoB,GAAG,QAAQ,MAAM,GAAG;KACtE,MAAM,MAAM,YAAY,KAAK,IAAI,OAAO,SAAS,IAAI,KAAA;KACrD,MAAM,MAAM,WAAW,MAAM,GAAG,CAAC,CAAC,IAAI;KACtC,IAAI,CAAC,OAAQ,QAAQ,SAAS,QAAQ,UAAU,QAAQ,OAAQ;KAChE,OAAO,KAAK;MACV,MAAM;MACN,MAAM,QAAQ,QAAQ,QAAQ;MAC9B,KAAK,MAAM;MACX,KAAK,MAAM;MACX,MAAM,MAAM;MACZ,aAAa,MAAM;MACnB,OAAO,MAAM;MACb,QAAQ,MAAM;KAChB,CAAC;IACH;IACA,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;GACzC;GACA,IAAI,YAAY,QAAQ;IACtB,MAAM,SAAkC,CAAC;IACzC,KAAK,MAAM,UAAU,YAAY,QAAQ;KACvC,MAAM,YAAY,YAAY,oBAAoB,GAAG,QAAQ,OAAO,GAAG;KACvE,MAAM,UAAU,YAAY,KAAK,IAAI,IAAI,SAAS,IAAI,KAAA;KACtD,IAAI,CAAC,SAAS;KACd,MAAM,aAAa,eAAe,MAAM,SAAS,WAAW;KAC5D,OAAO,KAAK;MAAE,GAAG;MAAY,KAAK,OAAO;MAAK,KAAK,OAAO;KAAI,CAAC;IACjE;IACA,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;GACzC;GAEA,IAAI,YAAY,QAAQ,OAAO,SAAS,YAAY;GACpD,IAAI,YAAY,YAAY,OAAO,aAAa,YAAY;GAC5D,IAAI,YAAY,QAAQ,OAAO,SAAS,YAAY;GACpD;EACF;EAGA,MAAM,YAAY,YAAY,uBAAuB,QAAQ,QAAQ;EACrE,IAAI,UAAU,SAAS,GAAG;GACxB,MAAM,SAAyB,CAAC;GAChC,KAAK,MAAM,MAAM,WAAW;IAC1B,MAAM,UAAU,KAAK,IAAI,IAAI,GAAG,MAAM;IACtC,IAAI,CAAC,SAAS;IACd,MAAM,YAAY,UAAU,MAAM,SAAS,WAAW;IACtD,OAAO,KAAK,SAAS;GACvB;GACA,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACzC;EAGA,MAAM,iBAAiB,YAAY,uBAAuB,QAAQ,aAAa;EAC/E,IAAI,eAAe,SAAS,GAAG;GAC7B,MAAM,cAAmC,CAAC;GAC1C,KAAK,MAAM,OAAO,gBAAgB;IAChC,MAAM,OAAO,KAAK,IAAI,IAAI,IAAI,MAAM;IACpC,IAAI,CAAC,MAAM;IACX,YAAY,KAAK,eAAe,MAAM,MAAM,WAAW,CAAC;GAC1D;GACA,IAAI,YAAY,SAAS,GAAG,OAAO,cAAc;EACnD;EAGA,MAAM,oBAAoB,YAAY,uBAAuB,QAAQ,mBAAmB;EACxF,IAAI,kBAAkB,SAAS,GAAG;GAChC,MAAM,iBAAyC,CAAC;GAChD,KAAK,MAAM,OAAO,mBAAmB;IACnC,MAAM,OAAO,KAAK,IAAI,IAAI,IAAI,MAAM;IACpC,IAAI,CAAC,MAAM;IACX,eAAe,KAAK,GAAG,mBAAmB,MAAM,MAAM,WAAW,CAAC,CAAC,KAAK;GAC1E;GACA,IAAI,eAAe,SAAS,GAAG,OAAO,iBAAiB;EACzD;EAKA,MAAM,YAAY,YAAY,uBAAuB,QAAQ,aAAa;EAC1E,IAAI,UAAU,SAAS,GAAG;GACxB,MAAM,cAAmC,CAAC;GAC1C,KAAK,MAAM,MAAM,WAAW;IAC1B,MAAM,UAAU,KAAK,IAAI,IAAI,GAAG,MAAM;IACtC,IAAI,CAAC,SAAS;IACd,MAAM,YAAY,eAAe,MAAM,SAAS,WAAW;IAC3D,MAAM,QAAQ,iBAAiB,IAAI,mBAAmB,IAAI,UAAU,WAAW,EAAE,KAAK,EAAE;IACxF,MAAM,MAAM,OAAO,iBAAiB;IACpC,IAAI,CAAC,SAAS,CAAC,KAAK;IACpB,MAAM,cAAc,MAAM,eAAe,CAAC,EAAA,CAAG,KAAK,MAAM,EAAE,QAAQ,EAAE;IACpE,MAAM,QAAQ,UAAU,aAAa,CAAC,EAAA,CACnC,KAAK,MAAM,WAAW,EAAE,CAAC,CACzB,QAAQ,SAAyB,SAAS,EAAE;IAC/C,MAAM,QAAQ,UAAU,cAAc,CAAC,EAAA,CACpC,QAAQ,MAAM,EAAE,QAAQ,KAAA,CAAS,CAAC,CAClC,KAAK,OAAO;KACX,OAAO,WAAW,EAAE,QAAS;KAC7B,GAAI,EAAE,WAAW,EAAE,WAAW,EAAE,SAAgC,IAAI,CAAC;KACrE,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,EAAE;IACJ,IAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;IAC5C,MAAM,KAAwB;KAAE,QAAQ;KAAK;KAAM;IAAK;IACxD,IAAI,UAAU,MAAM,GAAG,OAAO,UAAU;IACxC,IAAI,MAAM,iBAAiB,OAAO,GAAG,cAAc,MAAM,gBAAgB;IACzE,IAAI,UAAU,UAAU,GAAG,WAAW,UAAU;IAChD,MAAM,WAAW,UAAU,aAAa,CAAC,EAAA,CACtC,KAAK,MAAM,WAAW,EAAE,CAAC,CACzB,QAAQ,SAAyB,SAAS,EAAE;IAC/C,IAAI,QAAQ,SAAS,GAAG,GAAG,UAAU;IACrC,IAAI,UAAU,iBAAiB,GAAG,QAAQ,UAAU;IACpD,IAAI,UAAU,YAAY,GAAG,aAAa;IAC1C,IAAI,UAAU,mBAAmB,GAAG,oBAAoB,UAAU;IAClE,IAAI,UAAU,cAAc,GAAG,eAAe,UAAU;IACxD,IAAI,UAAU,WAAW,GAAG,YAAY;IACxC,IAAI,UAAU,gBAAgB,GAAG,iBAAiB,UAAU;IAC5D,IAAI,UAAU,gBAAgB,OAAO,GAAG,cAAc;IACtD,IAAI,UAAU,WAAW,GAAG,YAAY,UAAU;IAClD,IAAI,UAAU,KAAK,GAAG,MAAM,UAAU;IACtC,IAAI,UAAU,cAAc,OAAO,GAAG,YAAY;IAClD,IAAI,UAAU,UAAU,GAAG,WAAW;IACtC,YAAY,KAAK,EAAE;GACrB;GACA,IAAI,YAAY,SAAS,GAAG,OAAO,cAAc;EACnD;EAGA,MAAM,aAAa,OAAO;EAC1B,IAAI;QACG,MAAM,MAAM,YACf,IAAI,GAAG,OAAO,SAAS,YAAY;IACjC,MAAM,WAAW,YAAY,oBAAoB,QAAQ,GAAG,OAAO,GAAG;IACtE,IAAI,UAAU,GAAG,OAAO,MAAM;GAChC;;EAIJ,WAAW,KAAK,MAA0B;CAC5C;CAEA,KAAK,aAAa;CAGlB,MAAM,kBAAkB,KAAK,IAAI,KAAK,iBAAiB,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC;CACzF,IAAI,gBAAgB,SAAS,GAAG;EAC9B,MAAM,cAAmC,CAAC;EAC1C,KAAK,MAAM,CAAC,GAAG,WAAW,gBAAgB,QAAQ,GAAG;GACnD,MAAM,OAAO,KAAK,IAAI,IAAI,MAAM;GAChC,IAAI,CAAC,MAAM;GACX,MAAM,SAAS,eAAe,MAAM,MAAM,WAAW;GACrD,IAAI,WAAW,WAAW,SAAS,IAAI,OAAO,OAAO,WAAW,WAAW,SAAS;GAGpF,MAAM,gBAAgB,YAAY,uBAAuB,QAAQ,UAAU;GAC3E,OAAO,KAAK,MAAM,MAAM,eAAe;IACrC,MAAM,YAAY,KAAK,IAAI,IAAI,GAAG,MAAM;IACxC,IAAI,CAAC,WAAW;IAChB,MAAM,cAAc,YAAY,MAAM,WAAW,WAAW;IAC5D,KAAK,MAAM,UAAU,YAAY,UAAU,CAAC,GAAG;KAC7C,MAAM,YAAY,YAAY,oBAAoB,GAAG,QAAQ,OAAO,GAAG;KACvE,MAAM,UAAU,YAAY,KAAK,IAAI,IAAI,SAAS,IAAI,KAAA;KACtD,IAAI,CAAC,SAAS;KACd,MAAM,KAAK,eAAe,MAAM,SAAS,WAAW;KACpD,OAAO,QAAQ;MACb,MAAM,GAAG;MACT,GAAI,GAAG,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;MACpD,GAAI,GAAG,aAAa,EAAE,YAAY,CAAC,GAAG,GAAG,UAAU,EAAE,IAAI,CAAC;MAC1D,QAAS,GAAG,OAA6B,KAAK,OAAO;OACnD,MAAM,EAAE;OACR,QAAQ,CAAC,GAAG,EAAE,MAAM;MACtB,EAAE;KACJ;KACA,MAAM;IACR;GACF;GACA,YAAY,KAAK,MAAM;EACzB;EACA,IAAI,YAAY,SAAS,GAAG,KAAK,cAAc;CACjD;CAGA,MAAM,mBAAmB,KAAK,IAAI,KAAK,kBAAkB,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC;CAC3F,IAAI,iBAAiB,SAAS,GAAG;EAC/B,MAAM,eAAqC,CAAC;EAC5C,KAAK,MAAM,UAAU,kBAAkB;GACrC,MAAM,OAAO,KAAK,IAAI,IAAI,MAAM;GAChC,IAAI,CAAC,MAAM;GACX,MAAM,SAAS,gBAAgB,MAAM,MAAM,WAAW;GACtD,aAAa,KAAK,MAAM;EAC1B;EACA,IAAI,aAAa,SAAS,GAAG,KAAK,eAAe;CACnD;CAGA,IAAI,iBAAiB,OAAO,GAC1B,KAAK,cAAc,CAAC,GAAG,iBAAiB,OAAO,CAAC;CAGlD,MAAM,qBAAqB,KAAK,IAC7B,KAAK,gBAAgB,CAAC,CACtB,QAAQ,MAAM,EAAE,SAAS,mBAAmB,CAAC;CAChD,IAAI,mBAAmB,SAAS,GAAG;EACjC,MAAM,oBAAoD,CAAC;EAC3D,KAAK,MAAM,WAAW,oBAAoB;GACxC,MAAM,QAAQ,KAAK,IAAI,IAAI,OAAO;GAClC,IAAI,CAAC,OAAO;GACZ,MAAM,UAAU,sBAAsB,MAAM,OAAO,WAAW;GAC9D,kBAAkB,KAAK,OAAO;EAChC;EACA,IAAI,kBAAkB,SAAS,GAAG,KAAK,oBAAoB;CAC7D;CAGA,MAAM,cAAc,KAAK,IAAI,IAAI,kBAAkB;CACnD,IAAI,aAAa;EACf,MAAM,WAAW,cAAc,MAAM,aAAa,WAAW;EAC7D,IAAI,SAAS,OAAO,KAAK,YAAY,SAAS;CAChD;CAGA,MAAM,gBAAgB,KAAK,IAAI,IAAI,oBAAoB;CACvD,IAAI,eAAe;EACjB,MAAM,WAAW,gBAAgB,MAAM,eAAe,WAAW;EACjE,IAAI,SAAS,YAAY,SAAS,GAAG,KAAK,cAAc,SAAS;CACnE;CAGA,MAAM,aAAa,KAAK,IAAI,IAAI,iBAAiB;CACjD,IAAI,YAEF,KAAK,WADgB,aAAa,MAAM,YAAY,WACzB;CAI7B,MAAM,YAAY,KAAK,IAAI,IAAI,gBAAgB;CAC/C,IAAI,WACF,KAAK,UAAU,YAAY,MAAM,WAAW,WAAW;CAIzD,MAAM,eAAe,KAAK,IAAI,KAAK,mBAAmB,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,MAAM,CAAC;CACxF,IAAI,aAAa,SAAS,GAAG;EAC3B,MAAM,gBAAuC,CAAC;EAC9C,KAAK,MAAM,UAAU,cAAc;GACjC,MAAM,OAAO,KAAK,IAAI,IAAI,MAAM;GAChC,IAAI,CAAC,MAAM;GACX,MAAM,SAAS,iBAAiB,MAAM,MAAM,WAAW;GAIvD,IAAI,OAAO,cAAc;IACvB,MAAM,WAAW,mBAAmB,MAAM;IAC1C,MAAM,SAAS,KAAK,IAAI,IAAI,QAAQ;IACpC,IAAI,QACF,KAAK,MAAM,SAAS,OAAO,YAAY,CAAC,GAAG;KACzC,IAAI,MAAM,SAAS,gBAAgB;KAEnC,IAAI,EADS,KAAK,OAAO,MAAM,KAAK,GAAA,CAC1B,SAAS,mBAAmB,GAAG;KACzC,MAAM,SAAS,KAAK,OAAO,QAAQ;KACnC,IAAI,QAAQ;MACV,OAAO,aAAa,SAAS;MAC7B;KACF;IACF;GAEJ;GAEA,cAAc,KAAK,MAAM;EAC3B;EACA,IAAI,cAAc,SAAS,GAAG,KAAK,gBAAgB;CACrD;CAIA,MAAM,YAAY,KAAK,IAAI,IAAI,4BAA4B;CAC3D,IAAI;CACJ,IAAI;CACJ,IAAI,WACF,KAAK,MAAM,SAAS,UAAU,YAAY,CAAC,GAAG;EAC5C,IAAI,MAAM,SAAS,gBAAgB;EACnC,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK;EACpC,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK;EACxC,IAAI,KAAK,SAAS,kBAAkB,GAAG,mBAAmB;OACrD,IAAI,KAAK,SAAS,QAAQ,GAAG,cAAc;CAClD;CAEF,IAAI,kBAAkB;EACpB,MAAM,cAAc,iBAAiB,WAAW,GAAG,IAC/C,iBAAiB,MAAM,CAAC,IACxB,MAAM;EACV,MAAM,YAAY,KAAK,IAAI,IAAI,WAAW;EAC1C,IAAI,WAAW;GACb,MAAM,UAAU,oBAAoB,MAAM,WAAW,WAAW;GAChE,MAAM,OAA6B,CAAC;GACpC,MAAM,mBAAmB,KAAK,IAAI,IAAI,mBAAmB,WAAW,CAAC;GACrE,IAAI,kBACF,KAAK,MAAM,SAAS,iBAAiB,YAAY,CAAC,GAAG;IACnD,IAAI,MAAM,SAAS,gBAAgB;IACnC,IAAI,EAAE,KAAK,OAAO,MAAM,KAAK,GAAA,CAAI,SAAS,cAAc,GAAG;IAC3D,MAAM,IAAI,KAAK,OAAO,QAAQ;IAC9B,IAAI,CAAC,GAAG;IACR,MAAM,QAAQ,KAAK,IAAI,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,GAAG;IACrE,IAAI,OAAO,KAAK,KAAK,gBAAgB,MAAM,OAAO,WAAW,CAAC;GAChE;GAEF,MAAM,cAAqC;IAAE;IAAS;GAAK;GAC3D,IAAI,aAAa;IACf,MAAM,UAAU,KAAK,IAAI,IACvB,YAAY,WAAW,GAAG,IAAI,YAAY,MAAM,CAAC,IAAI,MAAM,aAC7D;IACA,IAAI,SAAS;KACX,MAAM,QAAQ,UAAU,MAAM,SAAS,WAAW;KAClD,IAAI,MAAM,OAAO,YAAY,QAAQ;IACvC;GACF;GACA,KAAK,cAAc;EACrB;CACF;CAEA,OAAO;AACT;;;;;;;;;;;;;;;;;AC/nBA,MAAMC,YAAU,IAAI,YAAY;AAqChC,MAAM,yBACJ;AACF,MAAM,qBACJ;AACF,MAAM,oBACJ;AACF,MAAM,eACJ;AACF,MAAM,wBACJ;AACF,MAAM,mBAAmB;;;;;;AAOzB,MAAM,gBAA6B;CACjC,2BAA2B,KAAA;CAC3B,eAAe,KAAA;CACf,cAAc,KAAA;AAChB;;AAGA,MAAM,mBAAmB,UAAgD;CACvE,IAAI,OAAO,UAAU,WAAW,OAAO,QAAQ,SAAS;CACxD,IAAI,iBAAiB,MAAM,OAAO,MAAM,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;CACvE,OAAO,OAAO,KAAK;AACrB;;;;;;AAOA,MAAa,gBAAgB,OAA0C,EACrE,YACA,MACA,cACA,aACA,gBACA,YACA,UACA,wBAAwB;CAAE,OAAO;CAAM,KAAK;AAAK,QACM;CACvD,MAAM,EAAE,OAAO,QAAQ;CACvB,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,GAC7B,MAAM,IAAI,MAAM,0DAA0D;CAG5E,MAAM,aAAa,UAAU,aAAa,IAAI,CAAC;CAE/C,MAAM,yBAAS,IAAI,IAAqB;CACxC,MAAM,4BAAY,IAAI,IAAwB;CAG9C,MAAM,2BAAW,IAAI,IAAoB;CAGzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,GAClD,IAAI,IAAI,SAAS,MAAM,KAAK,IAAI,SAAS,OAAO,GAC9C,OAAO,IAAI,KAAK,OAAO,UAAU,KAAK,CAAC,CAAC;MAExC,UAAU,IAAI,KAAK,KAAK;CAM5B,MAAM,2BAAW,IAAI,IAAyB;CAC9C,IAAI,cACF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,YAAY,GACpD,SAAS,IAAI,GAAG,QAAQ,MAAM,OAAO,KAAK;CAG9C,IAAI,aACF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,GACnD,SAAS,IAAI,KAAK,KAAK;CAI3B,MAAM,gBAAgB,OAAO,IAAI,sBAAsB;CACvD,MAAM,oBAAoB,qBAAqB,aAAa;CAE5D,MAAM,gBAAgB,OAAO,KAAK,UAAU,CAAC,CAAC,QAC3C,MAAM,EAAE,WAAW,qBAAqB,KAAK,EAAE,SAAS,MAAM,CACjE;CAGA,KAAK,MAAM,SAAS,eAAe;EACjC,MAAM,KAAK,OAAO,IAAI,KAAK;EAC3B,IAAI,IAAI,kBAAkB,IAAI,UAAU,iBAAiB;CAC3D;CAIA,IAAI,eAAe,mBAAmB,eAAe,QAAQ;CAC7D,KAAK,MAAM,SAAS,eAAe;EACjC,MAAM,KAAK,OAAO,IAAI,KAAK;EAC3B,IAAI,CAAC,IAAI;EACT,4BAA4B,IAAI,QAAQ;EAExC,kBAAkB,IAAI,QAAQ;CAChC;CAIA,IAAI,YAAY;EACd,MAAM,gBAAgB,qBAAqB,MAAM;EACjD,IAAI,WAAW,SACb,KAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,WAAW,OAAO,GAC5D,sBAAsB,QAAQ,MAAM,QAAQ,aAAa;EAG7D,IAAI,WAAW,QACb,KAAK,MAAM,UAAU,WAAW,QAC9B,qBAAqB,QAAQ,QAAQ,aAAa;EAGtD,qBAAqB,QAAQ,aAAa;CAC5C;CAGA,IAAI,UACF,KAAK,MAAM,CAAC,WAAW,gBAAgB,OAAO,QAAQ,QAAQ,GAC5D,oBAAoB,QAAQ,UAAU,WAAW,WAAW;CAKhE,MAAM,QAAoC,CAAC;CAC3C,KAAK,MAAM,CAAC,KAAK,UAAU,QACzB,MAAM,OACJ,QAAQ,uBAAuB,iBAC3BA,UAAQ,OAAO,wBAAwB,4BAA4B,OAAO,cAAc,CAAC,IACzFA,UAAQ,OAAO,UAAU,KAAK,CAAC;CAEvC,KAAK,MAAM,CAAC,KAAK,UAAU,WACzB,MAAM,OAAO;CAEf,KAAK,MAAM,CAAC,KAAK,UAAU,UACzB,MAAM,OAAOA,UAAQ,OAAO,KAAK;CAGnC,OAAO,MAAM,cAAc,OAAO,YAAY,cAAc,IAAI;AAClE;;AAGA,SAAS,qBAAqB,KAA+C;CAC3E,MAAM,sBAAM,IAAI,IAAoB;CACpC,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI,WAAW;CAC7C,IAAI,MAAM;CACV,KAAK,MAAM,MAAM,MAAM,YAAY,CAAC,GAAG;EACrC,IAAI,GAAG,SAAS,MAAM;EACtB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;EAC5B;CACF;CACA,OAAO;AACT;;;;;AAMA,SAAS,kBACP,IACA,UACA,mBACM;CACN,MAAM,OAAO,GAAG,OAAO,KAAK,GAAG,WAAW;CAC1C,MAAM,YAAY,QAAQ,eAAe,MAAM,WAAW;CAC1D,IAAI,CAAC,WAAW;CAEhB,KAAK,MAAM,OAAO,UAAU,YAAY,CAAC,GAAG;EAC1C,IAAI,UAAU,GAAG,MAAM,OAAO;EAC9B,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,GAAG;GACrC,IAAI,UAAU,IAAI,MAAM,KAAK;GAC7B,MAAM,OAAO,kBAAkB,MAAM,iBAAiB;GACtD,IAAI,SAAS,KAAA,GAAW;GAExB,KAAK,MAAM,CAAC,aAAa,UAAU,UAAU;IAC3C,IAAI,OAAO,UAAU,UAAU;IAC/B,IAAI,SAAS,aAAa;KACxB,mBAAmB,MAAM,KAAK;KAC9B;IACF;GACF;EACF;CACF;AACF;;AAGA,SAAS,kBACP,MACA,mBACoB;CACpB,MAAM,IAAI,KAAK,aAAa;CAC5B,IAAI,MAAM,aAAa;EACrB,MAAM,OAAO,eAAe,MAAM,IAAI;EACtC,OAAO,OAAO,YAAY,IAAI,IAAI,KAAA;CACpC;CACA,IAAI,MAAM,KAAK;EAEb,MAAM,MADI,eAAe,MAAM,GACnB,CAAC,EAAE,WAAW,EAAE,EAAE;EAC9B,MAAM,MAAM,OAAO,GAAG;EACtB,OAAO,OAAO,MAAM,GAAG,IAAI,KAAA,IAAY,kBAAkB,IAAI,GAAG;CAClE;AAEF;;AAGA,SAAS,mBAAmB,MAAe,OAA2C;CACpF,MAAM,QAAQ,KAAK,eAAe,KAAK,aAAa,CAAC;CACrD,IAAI;CACJ,IAAI,OAAO,UAAU,WAAW;EAC9B,MAAM,OAAO;EACb,QAAQ,QAAQ,MAAM;CACxB,OAAO,IAAI,iBAAiB,MAAM;EAChC,OAAO,MAAM;EACb,QAAQ,OAAO,mBAAmB,KAAK,CAAC;CAC1C,OAAO;EACL,OAAO,MAAM;EACb,QAAQ,OAAO,KAAK;CACtB;CACA,KAAK,WAAW,CAAC;EAAE,MAAM;EAAW,MAAM;EAAK,UAAU,CAAC;GAAE,MAAM;GAAQ,MAAM;EAAM,CAAC;CAAE,CAAC;AAC5F;;AAGA,SAAS,mBAAmB,KAAc,UAA0C;CAClF,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI,WAAW;CAC7C,IAAI,CAAC,MAAM;CAEX,KAAK,MAAM,MAAM,KAAK,YAAY,CAAC,GAAG;EACpC,IAAI,GAAG,SAAS,MAAM;EAGtB,MAAM,IAAI,eAAe,IAAI,GAAG;EAChC,IAAI,GACF,iBAAiB,GAAG,QAAQ;OAG5B,KAAK,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG;GACjC,IAAI,EAAE,SAAS,KAAK;GACpB,MAAM,KAAK,eAAe,GAAG,GAAG;GAChC,IAAI,IAAI,iBAAiB,IAAI,QAAQ;EACvC;CAEJ;AACF;;AAGA,SAAS,4BAA4B,IAAa,UAA0C;CAC1F,MAAM,OAAO,GAAG,OAAO,KAAK,GAAG,WAAW;CAC1C,IAAI,CAAC,MAAM;CAEX,MAAM,YAAY,eAAe,MAAM,WAAW;CAClD,IAAI,CAAC,WAAW;CAEhB,KAAK,MAAM,OAAO,UAAU,YAAY,CAAC,GAAG;EAC1C,IAAI,UAAU,GAAG,MAAM,OAAO;EAC9B,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,GAAG;GACrC,IAAI,UAAU,IAAI,MAAM,KAAK;GAG7B,MAAM,OAAO,eAAe,MAAM,IAAI;GACtC,IAAI,MAAM;IACR,MAAM,IAAI,eAAe,MAAM,GAAG;IAClC,IAAI,GAAG,iBAAiB,GAAG,QAAQ;GACrC;EACF;CACF;AACF;AAEA,MAAM,sBAAsB,IAAI,IAAI;CAClC;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;AAQD,SAAS,kBAAkB,IAAa,UAA0C;CAChF,MAAM,OAAO,GAAG,OAAO,KAAK,GAAG,WAAW;CAC1C,IAAI,CAAC,MAAM;CACX,MAAM,eAAe,eAAe,MAAM,cAAc;CACxD,IAAI,CAAC,cAAc;CAEnB,KAAK,MAAM,QAAQ,aAAa,YAAY,CAAC,GAAG;EAC9C,IAAI,KAAK,SAAS,aAAa,CAAC,oBAAoB,IAAI,UAAU,IAAI,CAAC,GAAG;EAC1E,MAAM,WAAW,KAAK,WAAW;EACjC,IAAI,CAAC,YAAY,OAAO,SAAS,SAAS,UAAU;EAEpD,IAAI,WAAW,SAAS;EACxB,KAAK,MAAM,CAAC,aAAa,UAAU,UAAU;GAC3C,IAAI,CAAC,SAAS,SAAS,WAAW,GAAG;GACrC,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,gBAAgB,KAAK;GACzE,WAAW,SAAS,MAAM,WAAW,CAAC,CAAC,KAAK,OAAO;EACrD;EACA,IAAI,aAAa,SAAS,MACxB,KAAK,SAAU,KAAK;GAAE,GAAG;GAAU,MAAM;EAAS;CAEtD;AACF;;AAGA,SAAS,iBAAiB,KAAc,UAA0C;CAChF,MAAM,WAAW,IAAI,WAAW;CAChC,MAAM,OAAO,UAAU;CACvB,IAAI,OAAO,SAAS,UAAU;CAE9B,IAAI,WAAW;CACf,KAAK,MAAM,CAAC,aAAa,UAAU,UAAU;EAC3C,IAAI,CAAC,SAAS,SAAS,WAAW,GAAG;EACrC,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,gBAAgB,KAAK;EACzE,WAAW,SAAS,MAAM,WAAW,CAAC,CAAC,KAAK,OAAO;CACrD;CACA,IAAI,aAAa,QAAQ,IAAI,UAC3B,IAAI,SAAS,KAAK;EAAE,GAAG;EAAU,MAAM;CAAS;AAEpD;;AAGA,SAAS,YAAY,IAAqB;CACxC,IAAI,MAAM;CACV,KAAK,MAAM,SAAS,GAAG,YAAY,CAAC,GAClC,IAAI,MAAM,SAAS,QACjB,OAAO,MAAM,QAAQ;MAChB,IAAI,MAAM,SAAS,WACxB,OAAO,YAAY,KAAK;CAG5B,OAAO;AACT;AAEA,SAAS,UAAU,IAAqB;CACtC,MAAM,OAAO,GAAG,QAAQ;CACxB,MAAM,WAAW,KAAK,QAAQ,GAAG;CACjC,OAAO,YAAY,IAAI,KAAK,MAAM,WAAW,CAAC,IAAI;AACpD;AAEA,SAAS,eAAe,QAAiB,MAAmC;CAC1E,QAAQ,OAAO,YAAY,CAAC,EAAA,CAAG,MAAM,OAAO,UAAU,EAAE,MAAM,IAAI;AACpE;;AAKA,SAAS,OAAO,KAA+C;CAC7D,OAAO,QAAQ,IAAI,OAAO,MAAM,IAAI,WAAW;AACjD;;AAGA,SAAS,YAAY,MAAc,aAAqC,CAAC,GAAY;CACnF,OAAO;EAAE,MAAM;EAAW;EAAM;EAAY,UAAU,CAAC;CAAE;AAC3D;;AAGA,SAAS,yBAAkC;CACzC,OAAO;EACL,aAAa,EAAE,YAAY;GAAE,UAAU;GAAS,YAAY;GAAO,SAAS;EAAM,EAAE;EACpF,UAAU,CACR;GACE,YAAY,EAAE,OAAO,+DAA+D;GACpF,UAAU,CAAC;GACX,MAAM;GACN,MAAM;EACR,CACF;CACF;AACF;;AAGA,SAAS,oBAAoB,QAAsC;CACjE,IAAI,OAAO;CACX,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG;EAC/B,MAAM,IAAI,IAAI,MAAM,mCAAmC;EACvD,IAAI,GAAG,OAAO,KAAK,IAAI,MAAM,OAAO,EAAE,EAAE,CAAC;CAC3C;CACA,OAAO,OAAO;AAChB;;AAGA,SAAS,YAAY,UAAuC;CAC1D,OAAO,cAAc,UAAU,SAAS,WAAW,CAAC;AACtD;;AAGA,SAAS,iBAAiB,UAA+B,KAAiC;CACxF,KAAK,MAAM,SAAS,UAAU,YAAY,CAAC,GACzC,IAAI,UAAU,KAAK,MAAM,kBAAkB,OAAO,MAAM,aAAa,KAAK,MAAM,KAAK;EACnF,MAAM,SAAS,MAAM,aAAa;EAClC,OAAO,WAAW,KAAA,IAAY,OAAO,MAAM,IAAI,KAAA;CACjD;AAGJ;;AAGA,SAAS,qBAAqB,QAA6C;CACzE,MAAM,KAAK,IAAI,cAAc;CAC7B,MAAM,UAAU,OAAO,OAAO,IAAI,sBAAsB,CAAC;CACzD,IAAI,SACF,GAAG,YAAY,kBAAkB,MAAM,SAAS,aAAa,CAAC,CAAC,OAAO;CAExE,OAAO;AACT;;AAGA,SAAS,qBAAqB,QAA8B,IAAyB;CACnF,IAAI,GAAG,UAAU,GAAG;CACpB,OAAO,IACL,wBACA,OAAO,0DAA0D,GAAG,UAAU,GAAG,CACnF;AACF;;;;;AAMA,SAAS,qBACP,QACA,QACA,eACM;CACN,MAAM,OAAO,oBAAoB,MAAM;CACvC,MAAM,YAAY,sBAAsB,KAAK;CAC7C,MAAM,YAAY,OAAO,QAAQ,QAAQ;CAGzC,OAAO,IAAI,WAAW,OAAOC,mBAAkB,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;CAG1E,MAAM,SAAS,OAAO,OAAO,IAAI,iBAAiB,CAAC;CACnD,MAAM,WAAW,UAAU,eAAe,QAAQ,QAAQ;CAC1D,MAAM,SAAS,OAAO,IAAI,4BAA4B,KAAK,uBAAuB;CAClF,OAAO,IAAI,8BAA8B,MAAM;CAC/C,MAAM,SAAS,yBAAyB,MAAM;CAE9C,IAAI,UAEF,CADY,SAAS,aAAa,SAAS,WAAW,CAAC,GAAA,CACnD,KACF,YAAY,SAAS;EACnB,MAAM;EACN,SAAS,OAAO,YAAY,QAAQ,CAAC;EACrC,QAAQ,MAAM;CAChB,CAAC,CACH;CAEF,mBAAmB,QAAQ,QAAQ,oBAAoB,mBAAmB,KAAK,KAAK;CAGpF,MAAM,eAAe,OAAO,IAAI,qBAAqB;CACrD,IAAI,cACF,eAAe,cAAc,IAAI,aAAa,sBAAsB;AAExE;;AAGA,SAAS,iBAAiB,QAA8B,MAAsB;CAC5E,MAAM,SAAS,OAAO,OAAO,IAAI,iBAAiB,CAAC;CAGnD,MAAM,WAFW,UAAU,eAAe,QAAQ,QAAQ,EAAA,EAC9B,YAAY,CAAC,EAAA,CAAG,QAAQ,MAAM,UAAU,CAAC,MAAM,OACrD,CAAC,CAAC,MAAM,MAAM,OAAO,EAAE,aAAa,OAAO,MAAM,IAAI;CAC3E,IAAI,CAAC,QAAQ,aAAa,SACxB,MAAM,IAAI,MAAM,sCAAsC,KAAK,EAAE;CAE/D,MAAM,YAAY,iBAChB,OAAO,OAAO,IAAI,4BAA4B,CAAC,GAC/C,OAAO,OAAO,WAAW,OAAO,CAClC;CACA,IAAI,CAAC,WACH,MAAM,IAAI,MAAM,6BAA6B,KAAK,gCAAgC;CAEpF,IAAI,UAAU,WAAW,GAAG,GAAG,OAAO,UAAU,MAAM,CAAC;CACvD,OAAO,UAAU,WAAW,KAAK,IAAI,YAAY,MAAM;AACzD;;;;;;AAOA,SAAS,sBACP,QACA,MACA,QACA,eACM;CACN,MAAM,YAAY,iBAAiB,QAAQ,IAAI;CAC/C,OAAO,IAAI,WAAW,OAAOA,mBAAkB,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;AAC5E;;AAGA,SAAS,WAAW,UAA0B;CAC5C,MAAM,QAAQ,SAAS,YAAY,GAAG;CACtC,OAAO,GAAG,SAAS,UAAU,GAAG,KAAK,EAAE,SAAS,SAAS,UAAU,QAAQ,CAAC,EAAE;AAChF;;AAGA,SAAS,cACP,UACA,MAC4C;CAC5C,KAAK,MAAM,SAAS,UAAU,YAAY,CAAC,GACzC,IAAI,UAAU,KAAK,MAAM,kBAAkB,OAAO,MAAM,aAAa,OAAO,MAAM,MAAM;EACtF,MAAM,SAAS,MAAM,aAAa;EAClC,IAAI,WAAW,KAAA,GACb,OAAO;GAAE,IAAI,OAAO,MAAM,aAAa,KAAK;GAAG,QAAQ,OAAO,MAAM;EAAE;CAE1E;AAGJ;;AAGA,SAAS,mBAAmB,QAAsC;CAChE,IAAI,OAAO;CACX,KAAK,MAAM,OAAO,OAAO,KAAK,GAAG;EAC/B,MAAM,IAAI,IAAI,MAAM,0BAA0B;EAC9C,IAAI,GAAG,OAAO,KAAK,IAAI,MAAM,OAAO,EAAE,EAAE,CAAC;CAC3C;CACA,OAAO,OAAO;AAChB;;;;;;AAOA,SAAS,oBAAoB,QAAiB,KAAmB;CAC/D,MAAM,MAAM,OAAO,aAAa,OAAO,WAAW,CAAC;CACnD,IAAI,IAAI,MAAM,MAAM,UAAU,CAAC,MAAM,eAAe,GAAG;CACvD,MAAM,SAAS,YAAY,iBAAiB,EAAE,QAAQ,IAAI,CAAC;CAC3D,MAAM,cAAc,IAAI,IAAI;EAC1B;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,IAAI,WAAW,IAAI;CACnB,KAAK,MAAM,CAAC,GAAG,OAAO,IAAI,QAAQ,GAChC,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC,GAAG;EAClC,WAAW;EACX;CACF;CAEF,IAAI,OAAO,UAAU,GAAG,MAAM;AAChC;;AAGA,MAAM,iBAAiB,CAAC;;;;;;;AAQxB,SAAS,oBACP,QACA,UACA,WACA,aACM;CACN,MAAM,YAAY,iBAAiB,QAAQ,SAAS;CACpD,MAAM,YAAY,WAAW,SAAS;CACtC,MAAM,SAAS,OAAO,IAAI,SAAS,KAAK,uBAAuB;CAC/D,OAAO,IAAI,WAAW,MAAM;CAG5B,MAAM,mBAAmB,cAAc,OAAO,MAAM,GAAG,iBAAiB;CACxE,MAAM,cAAc,cAAc,OAAO,MAAM,GAAG,YAAY;CAE9D,MAAM,YAAY,mBACd,QAAQ,iBAAiB,OAAO,MAAM,qBAAqB,KAAK,CAAC,EAAA,CAAG,EAAE,KACtE,mBAAmB,MAAM,IACzB,mBAAmB,MAAM;CAC7B,MAAM,eAAe,cAAc,UAAU;CAG7C,MAAM,UAAU,cACZ,eAAe,YAAY,OAAO,MAAM,YAAY,OAAO,YAAY,GAAG,IAAI,CAAC,MAC/E,yBAAyB,UAAU;CAGvC,MAAM,eAAe,OAAO,OAAO,IAAI,YAAY,CAAC;CACpD,IAAI,SAAS;CACb,IAAI,cACF,SAAS,CAAC,GAAG,aAAa,MAAM,cAAc,aAAa,CAAC,CAAC,UAAU,GAAG,WAAW;CAGvF,MAAM,cAAc,aAAa,UAAU,EAAE,UAAU,OAAO,GAAG,cAAc;CAC/E,IAAI,aACF,OAAO,IACL,cACA,OAAO,0DAA0D,aAAa,CAChF;CAEF,MAAM,SAAS,aAAa,UAAU,EAAE,UAAU,OAAO,GAAG,cAAc;CAC1E,IAAI,QACF,SAAS,IAAI,SAAS,0DAA0D,QAAQ;CAI1F,IAAI,CAAC,kBAEH,mBAAmB,QADT,yBAAyB,MACR,GAAG,mBAAmB,cAAc,UAAU,KAAK;CAEhF,IAAI;CACJ,IAAI,aACF,YAAY,YAAY;MACnB;EACL,MAAM,IAAI,yBAAyB,MAAM;EACzC,mBAAmB,QAAQ,GAAG,cAAc,yBAAyB,UAAU,KAAK;EACpF,YAAY,MAAM;CACpB;CAGA,MAAM,SAAS,OAAO,OAAO,IAAI,SAAS,CAAC;CAC3C,IAAI,QAAQ,oBAAoB,QAAQ,SAAS;CAGjD,MAAM,eAAe,OAAO,IAAI,qBAAqB;CACrD,IAAI,cAAc;EAChB,IAAI,CAAC,cACH,eAAe,cAAc,IAAI,gBAAgB,qBAAqB;EAExE,kBAAkB,cAAc,kBAAkB,KAAK;CACzD;AACF;;;;;;;;;;;AClpBA,MAAM,WAAW;;;AAIjB,MAAMC,+BAA6B,qBAAqB,UAAU;;;;AAKlE,MAAM,2BAAmD;CACvD,GAAG;CACH,KAAK;AACP;;AAGA,MAAM,UAAU,IAAI,YAAY;;;;AAKhC,SAAgB,gBACd,SACA,YAA4B,CAAC,GAC7B,aAAqB,GACX;CACV,MAAM,MAAM,IAAI,iBAAiB;CACjC,MAAM,UAA0D,CAAC;CAEjE,MAAM,mBAAmB,QAAQ,cAAc,CAAC;CAChD,MAAM,oBAAoB,QAAQ,eAAe,CAAC;CAClD,MAAM,qBAAqB,QAAQ,gBAAgB,CAAC;CACpD,MAAM,sBAAsB,CAAC,CAAC,QAAQ,oBAAoB,QAAQ,iBAAiB,SAAS;CAG5F,QAAQ,gBAAgB;EACtB,MAAM,WAAW,6BAA6B,OAAO;EACrD,MAAM;CACR;CAGA,QAAQ,mBAAmB;EACzB,MAAM,YAAY,kBAAkB,UAAU,QAAQ,iBAAiB,CAAC,GAAG,GAAG,KAAK;EACnF,MAAM;CACR;CAGA,IAAI,qBACF,QAAQ,sBAAsB;EAC5B,MACE,YACC,qBAAqB,UAAU,EAAE,YAAY,QAAQ,oBAAoB,CAAC,EAAE,GAAG,GAAG,KAAK;EAC1F,MAAM;CACR;CAKF,QAAQ,uBAAuB;EAC7B,MAAM,WAFS,uBAAuB,mBAAmB,mBAEjC,CAAC,CAAC,UAAU;EACpC,MAAM;CACR;CAGA,KAAK,MAAM,OAAO,QAAQ,QAAQ,CAAC,GACjC,IAAI,YAAY,GAAG;CAKrB,IAAI,QAAQ,QAAQ,IAAI,OAAO,UAAU,QAAQ,MAAM;CACvD,IAAI,QAAQ,aAAa,IAAI,OAAO,eAAe,QAAQ,WAAW;CACtE,IAAI,QAAQ,YAAY,IAAI,OAAO,oBAAoB,QAAQ,UAAU;CACzE,IAAI,QAAQ,cAAc,IAAI,OAAO,gBAAgB,QAAQ,YAAY;CACzE,IAAI,QAAQ,iBAAiB,IAAI,OAAO,cAAc,QAAQ,eAAe;CAG7E,2BACE,IAAI,cACJ,iBAAiB,QACjB,kBAAkB,QAClB,mBAAmB,MACrB;CAGA,MAAM,SAA4B,CAAC;CACnC,IAAI,UAAU;CACd,IAAI,MAAM;CACV,KAAK,MAAM,MAAM,kBACf,OAAO,KAAK;EACV,MAAM,GAAG,QAAQ,QAAQ;EACzB,SAAS;EACT,KAAK,MAAM;CACb,CAAC;CAEH,KAAK,MAAM,MAAM,mBACf,OAAO,KAAK;EACV,MAAM,GAAG,QAAQ,QAAQ;EACzB,SAAS;EACT,KAAK,MAAM;CACb,CAAC;CAEH,KAAK,MAAM,MAAM,oBACf,OAAO,KAAK;EACV,MAAM,GAAG,QAAQ,SAAS;EAC1B,SAAS;EACT,KAAK,MAAM;CACb,CAAC;CAIH,IAAI,iBAAiB;CACrB,IAAI,iBAAiB;CACrB,IAAI,iBAAiB;CACrB,IAAI,sBAAsB;CAC1B,IAAI,iBAAiB;CACrB,IAAI,sBAAsB;CAC1B,IAAI,0BAA0B;CAC9B,MAAM,oCAAoB,IAAI,IAAmD;CACjF,MAAM,YAAwB,CAAC;CAC/B,MAAM,gBAAsC,CAAC;CAE7C,MAAM,YAA8B;EAAE,eAAe,IAAI;EAAe,QAAQ,IAAI;CAAO;CAE3F,KAAK,MAAM,CAAC,GAAG,WAAW,iBAAiB,QAAQ,GAAG;EACpD,MAAM,UAAU,OAAO,UAAU,CAAC;EAClC,MAAM,YAAY,OAAO,UAAU,CAAC;EACpC,MAAM,YAAY,OAAO,UAAU,CAAC;EACpC,MAAM,gBAAgB,OAAO,cAAc,CAAC;EAC5C,MAAM,YAAY,OAAO,UAAU,CAAC;EACpC,MAAM,SAAS,OAAO,cAAc,CAAC;EACrC,MAAM,YAAY,OAAO,QAAQ,QAAQ,IAAI;EAG7C,IAAI,WAAWC,mBAAkB,QAAQ,SAAS;EAGlD,MAAM,WAAW,IAAI;EACrB,MAAM,SAAS,OAAO,QAAQ,CAAC;EAC/B,KAAK,MAAM,CAAC,IAAI,YAAY,OAAO,QAAQ,GAAG;GAC5C,MAAM,YAAY,QAAQ,aAAa,KAAK;GAC5C,IAAI,CAAC,QAAQ,OAAO;GACpB,KAAK,MAAM,CAAC,IAAI,SAAS,QAAQ,MAAM,QAAQ,GAAG;IAChD,IAAI,CAAC,KAAK,SAAS;IACnB,MAAM,MAAM,KAAK,aAAa,eAAe,KAAK,CAAC,IAAI;IACvD,UAAU,KAAK;KACb,WAAW;KACX,YAAY;KACZ,OAAO,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,SAAS;IACnE,CAAC;GACH;EACF;EAEA,MAAM,WACJ,QAAQ,SAAS,KACjB,UAAU,SAAS,KACnB,UAAU,SAAS,KACnB,cAAc,SAAS,KACvB,UAAU,SAAS;EACrB,MAAM,wBAAwB,OAAO,MAAM,MAAM,EAAE,OAAO,SAAS,UAAU;EAC7E,MAAM,cAAc,OAAO,YAAY,CAAC;EACxC,MAAM,cAAc,YAAY,SAAS;EACzC,MAAM,YAAY,OAAO,eAAe,CAAC;EACzC,MAAM,YAAY,UAAU,SAAS;EACrC,MAAM,YAAY,OAAO,UAAU,CAAC;EACpC,MAAM,YAAY,UAAU,SAAS;EACrC,MAAM,iBAAiB,OAAO,eAAe,CAAC;EAC9C,MAAM,iBAAiB,eAAe,SAAS;EAC/C,MAAM,oBAAoB,OAAO,kBAAkB,CAAC;EACpD,MAAM,QAAQ,OAAO;EAGrB,IAAI;EACJ,IAAI,UAAU;EAEd,IACE,YACA,yBACA,eACA,aACA,aACA,kBACA,kBAAkB,SAAS,KAC3B,OAEA,SAAS,IAAI,cAAc;EAG7B,IAAI,uBACF,KAAK,MAAM,MAAM,QAAQ;GACvB,IAAI,GAAG,OAAO,SAAS,YAAY;GACnC,MAAM,MAAM,EAAE;GACd,OAAQ,gBACN,KACA,iFACA,GAAG,OAAO,KACV,UACF;EACF;EAGF,IAAI,UAAU;GACZ,MAAM,gBAAyC,CAAC;GAChD,MAAM,gBAAsC,CAAC;GAC7C,MAAM,cAAc,IAAI,cAAc;GACtC,IAAI,MAAM;GAGV,KAAK,MAAM,OAAO,SAAS;IACzB,MAAM,MAAM,IAAI,SAAS,QAAQ,SAAS;IAC1C,MAAM,WAAW,aAAa,IAAI,MAAM,EAAE,UAAU,SAAS,CAAC;IAC9D,MAAM,QAAQ,IAAI,MAAM,SAAS,UAAU,MAAM,cAAc;KAC7D;KACA,MAAM;KACN,MAAM;KACN,OAAO;KACP,QAAQ;IACV,EAAE;IAEF,YAAY,gBACV,KACA,6EACA,YAAY,MAAM,UACpB;IAEA,cAAc,KAAK;KACjB,KAAK,IAAI;KACT,KAAK,IAAI;KACT,KAAK,MAAM;KACX,GAAG,+BAA+B,GAAG;IACvC,CAAC;IACD;IACA;GACF;GAGA,KAAK,MAAM,SAAS,WAAW;IAC7B,MAAM,WAAW,SAAS;IAC1B,IAAI,OAAO,SAAS,UAAU;KAC5B,KAAK;KACL,eAAe,eAAe,UAAU,OAAO,GAAG,KAAK;IACzD,CAAC;IAED,YAAY,gBACV,KACA,6EACA,kBAAkB,iBAAiB,EAAE,KACvC;IAEA,cAAc,KAAK;KACjB,KAAK,MAAM;KACX,KAAK,MAAM;KACX,KAAK,MAAM;IACb,CAAC;IACD;IACA;GACF;GAIA,MAAM,gBAAgB,IAAI,WAAW;GAarC,IAAI,qBAZe,YAAY,UAC7B;IACE,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,YAAY;IACZ,QAAQ;GACV,GACA,GAIgC;GAClC,KAAK,MAAM,KAAK,IAAI,WAAW,MAAM,aAAa,GAAG;IACnD,YAAY,gBACV,KACA,iFACA,EAAE,KACF,UACF;IACA,qBAAqB,mBAClB,MAAM,gBAAgB,EAAE,IAAI,GAAG,CAAC,CAChC,KAAK,YAAY,IAAI,EAAE;IAC1B;GACF;GACA,MAAM,aAAa,IAAI;GACvB,QAAQ,UAAU,OAAO;IACvB,MAAM,0DAA0D;IAChE,MAAM,sBAAsB,WAAW;GACzC;GAGA,QAAQ,cAAc,OAAO;IAC3B,MAAM,WAAW,YAAY,UAAU;IACvC,MAAM,4BAA4B,WAAW;GAC/C;GAGA,MAAM,aAAa,EAAE;GAErB,WACE,SAAS,MAAM,GAAG,GAAkB,IAAI,qBAAqB,WAAW;GAG1E,OAAQ,gBACN,YACA,+EACA,sBAAsB,WAAW,KACnC;EACF;EAGA,IAAI,aAAa;GACf,MAAM,cAAc,IAAI;GAGxB,MAAM,cAAc,aAAa,UAAU,EAAE,UAAU,YAAY,GAAG,GAAG;GACzE,QAAQ,WAAW,OAAO;IACxB,MAAM,0DAA0D;IAChE,MAAM,cAAc,YAAY;GAClC;GAGA,MAAM,SAAS,aAAa,UAAU,EAAE,UAAU,YAAY,GAAG,GAAG;GACpE,QAAQ,aAAa,OAAO;IAC1B,MAAM,0DAA0D;IAChE,MAAM,yBAAyB,YAAY;GAC7C;GAGA,MAAM,cAAc,EAAE;GACtB,OAAQ,gBACN,aACA,gFACA,cAAc,YAAY,KAC5B;GAEA,MAAM,SAAS,EAAE;GACjB,OAAQ,gBACN,QACA,kFACA,yBAAyB,YAAY,KACvC;GAIA,WACE,SAAS,MAAM,GAAG,GAAkB,IAAI,2BAA2B,OAAO;EAC9E;EAGA,IAAI,OAAO;GACT,MAAM,MAAM,MAAM,SAAS,QAAQ,SAAS,MAAM;GAClD,MAAM,WAAW,aAAa,MAAM,MAAM,EAAE,UAAU,SAAS,CAAC;GAChE,MAAM,QAAQ,IAAI,MAAM,SAAS,UAAU,MAAM,cAAc;IAC7D;IACA,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;GACV,EAAE;GACF;GACA,MAAM,QAAQ,EAAE;GAChB,OAAQ,gBACN,OACA,6EACA,YAAY,MAAM,UACpB;GACA,WAAW,SAAS,QAAQ,6BAA6B,qBAAqB,MAAM,IAAI;EAC1F;EAGA,IAAI,WACF,KAAK,MAAM,MAAM,WAAW;GAC1B;GACA,MAAM,WAAW;GAGjB,MAAM,cAAc,GAAG,eAAe;GACtC,MAAM,cAAc,iBAAiB,WAClC,QAAQ,GAAG,QAAQ,QAAQ,iBAAiB,QAAQ,EAAE,IAAI,SAAS,WACtE;GACA,IAAI,gBAAgB,IAAI;GACxB,MAAM,WAAW,iBAAiB;GAClC,IAAI,CAAC,UAAU;GAGf,MAAM,aAAa,uBADA,SAAS,QAAQ,CAAC,GACiB,GAAG,MAAM;GAG/D,MAAM,WAAW,GAAG,YAAY,GAAG,GAAG;GACtC,IAAI;GACJ,IAAI;GACJ,MAAM,WAAW,kBAAkB,IAAI,QAAQ;GAC/C,IAAI,UAAU;IACZ,UAAU,SAAS;IACnB,WAAW,SAAS;GACtB,OAAO;IACL;IACA,WAAW;IACX,UAAU;IACV,kBAAkB,IAAI,UAAU;KAAE;KAAS;IAAS,CAAC;IAGrD,MAAM,eAAe,IAAI,cAAc;IACvC,aAAa,gBACX,GACA,yFACA,wBACF;IAEA,MAAM,cACJ,kEACA,kBAAkB,UAChB;KACE,WAAW,GAAG,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,SAAS;KACjD;KACA;KACA,YAAY;IACd,GACA,GACF;IAEF,QAAQ,gBAAgB,cAAc;KACpC,MAAM;KACN,MAAM,qCAAqC,SAAS;IACtD;IACA,QAAQ,oBAAoB,cAAc;KACxC,MAAM,WAAW,aAAa,UAAU;KACxC,MAAM,2CAA2C,SAAS;IAC5D;IAGA,MAAM,kBACJ,kEACA,sBAAsB,UAAU,EAAE,WAAW,GAAG,GAAG;IACrD,QAAQ,oBAAoB,cAAc;KACxC,MAAM;KACN,MAAM,kCAAkC,SAAS;IACnD;IAGA,MAAM,aAAa,IAAI,aAAa,oBAAoB;IACxD,IAAI,aAAa,gBACf,YACA,4FACA,kCAAkC,SAAS,KAC7C;IACA,IAAI,eAAe,KAAK;KAAE;KAAS,KAAK,MAAM;IAAa,CAAC;GAC9D;GAGA,MAAM,gBACJ,WAAW,eAAe,UAAU;IAAE,SAAS;IAAI;IAAY;GAAQ,GAAG,GAAG;GAC/E,QAAQ,aAAa,cAAc;IACjC,MAAM;IACN,MAAM,4BAA4B,SAAS;GAC7C;GAGA,MAAM,SAAS,IAAI,cAAc;GACjC,OAAO,gBACL,GACA,4FACA,qCAAqC,SAAS,KAChD;GACA,QAAQ,iBAAiB,cAAc;IACrC,MAAM,WAAW,OAAO,UAAU;IAClC,MAAM,kCAAkC,SAAS;GACnD;GAGA,MAAM,QAAQ,EAAE;GAChB,OAAQ,gBACN,OACA,kFACA,4BAA4B,SAAS,KACvC;EACF;EAIF,MAAM,eAAqC,CAAC;EAC5C,IAAI,WACF,KAAK,MAAM,OAAO,WAAW;GAC3B;GACA,MAAM,WAAW;GAGjB,MAAM,cACJ,kEACA,UAAU,UAAU;IAAE,GAAG;IAAK,IAAI,IAAI,MAAM;GAAS,GAAG,GAAG;GAC7D,QAAQ,QAAQ,cAAc;IAC5B,MAAM;IACN,MAAM,kBAAkB,SAAS;GACnC;GAGA,MAAM,SAAS,EAAE;GACjB,OAAQ,gBACN,QACA,6EACA,kBAAkB,SAAS,KAC7B;GAEA,aAAa,KAAK,EAAE,KAAK,MAAM,SAAS,CAAC;GACzC,cAAc,KAAK,EAAE,KAAK,MAAM,SAAS,CAAC;EAC5C;EAIF,IAAI,gBACF,KAAK,MAAM,MAAM,gBAAgB;GAC/B;GACA,QAAQ,aAAa,yBAAyB;IAC5C,MAAM,WAAW,eAAe,UAAU,IAAI,GAAG;IACjD,MAAM,4BAA4B,oBAAoB;GACxD;GACA,MAAM,QAAQ,EAAE;GAChB,OAAQ,gBACN,OACA,kFACA,4BAA4B,oBAAoB,KAClD;EACF;EAIF,IAAI,kBAAkB,SAAS,GAAG;GAChC;GACA,QAAQ,mBAAmB,6BAA6B;IACtD,MAAM,WAAW,mBAAmB,UAAU,EAAE,OAAO,kBAAkB,GAAG,GAAG;IAC/E,MAAM,6BAA6B,wBAAwB;GAC7D;GACA,MAAM,SAAS,EAAE;GACjB,OAAQ,gBACN,QACA,wFACA,6BAA6B,wBAAwB,KACvD;EACF;EAGA,IAAI,WAAW;GACb,MAAM,WAAW,qBACf,WACA,kBACA,IAAI,eACJ,SACF;GACA,IAAI,SAAS,UAAU,SAAS,GAAG;IAEjC,WAAW,SAAS,QAAQ,0CAA0C,SAAS,SAAS;IAExF,IAAI,CAAC,SAAS,SAAS,YAAY,GACjC,WAAW,SAAS,QAClB,eACA,mBAAmB,SAAS,aAAa,eAC3C;GAEJ;EACF;EAGA,IAAI,aAAa,SAAS,GAAG;GAC3B,MAAM,gBAAgB,mBAAmB,YAAY;GAErD,WAAW,SAAS,MAAM,GAAG,GAAkB,IAAI,gBAAgB;EACrE;EAGA,IAAI,QACF,QAAQ,gBAAgB,OAAO;GAC7B,MAAM,WAAW,OAAO,UAAU;GAClC,MAAM,4BAA4B,IAAI,EAAE;EAC1C;EAGF,QAAQ,YAAY,OAAO;GACzB,MAAM;GACN,MAAM,sBAAsB,IAAI,EAAE;EACpC;CACF;CAGA,KAAK,MAAM,CAAC,GAAG,WAAW,kBAAkB,QAAQ,GAAG;EAErD,MAAM,WAAW,OAAO;EACxB,MAAM,mBAAmB,IAAI,OAAO,MAAM;EAC1C,MAAM,aAAa,YAAY;EAC/B,IAAI,OAAO,SAAS,YAAY;GAC9B,KAAK;GACL,eACE,eAAe,UACb;IACE,MAAM,SAAS;IASf,OAAO,SAAS;IAChB,YAAY,SAAS;IACrB,QAAQ,SAAS;GACnB,GACA,GACF,KAAK;EACT,CAAC;EAGD,MAAM,SAAS,IAAI,cAAc;EACjC,MAAM,eAAe,IAAI;EACzB,OAAO,gBACL,GACA,+EACA,sBAAsB,aAAa,KACrC;EAGA,MAAM,gBAAgB,IAAI,cAAc;EACxC,cAAc,gBACZ,GACA,6EACA,kBAAkB,mBAAmB,EAAE,KACzC;EAkBA,MAAM,eAAe,gBAAgB,OAAO,aAAa,KAAK,aAAaC,OAAK,IAZjE,WACb;GACE,YAAY;GACZ,KAAK;GACL,KAAK;GACL,WAAW;GACX,WAAW;GACX,UAAU;GACV,UAAU;EACZ,GACA,GAXY,gBAAgB,GAAG,KAAA,GAAW,SAAS,IAAI,KAAK,QAAQ,SAAS,MAWtE,EAAE,cAE8E,EAAE;EAE3F,QAAQ,oBAAoB,OAAO;GACjC,MAAM;GACN,MAAM,sBAAsB,aAAa;EAC3C;EACA,QAAQ,wBAAwB,OAAO;GACrC,MAAM,WAAW,cAAc,UAAU;GACzC,MAAM,4BAA4B,aAAa;EACjD;EAEA,QAAQ,iBAAiB,OAAO;GAC9B,MAAM,WAAW,OAAO,UAAU;GAClC,MAAM,6BAA6B,IAAI,EAAE;EAC3C;EACA,QAAQ,aAAa,OAAO;GAC1B,MAAM,WAAW,eAAe,UAAU;IAAE,GAAG;IAAQ,YAAY;GAAO,GAAG,GAAG;GAChF,MAAM,uBAAuB,IAAI,EAAE;EACrC;CACF;CAGA,KAAK,MAAM,CAAC,GAAG,WAAW,mBAAmB,QAAQ,GACnD,QAAQ,cAAc,OAAO;EAC3B,MAAM,WAAW,gBAAgB,UAAU,QAAQ,GAAG;EACtD,MAAM,wBAAwB,IAAI,EAAE;CACtC;CAIF,IAAI,QACF,aAAa,UACX;EACE;EACA,aAAa,IAAI;EACjB,YAAY,QAAQ;EACpB,aAAa,QAAQ;EACrB,gBAAgB,QAAQ;EACxB,gBAAgB,QAAQ;EACxB,eAAe,QAAQ;EACvB,aAAa,QAAQ;EACrB,UAAU,QAAQ;EAClB,mBAAmB,QAAQ;EAC3B,cAAc,QAAQ;EACtB,YAAY,QAAQ;EACpB,QAAQ,QAAQ;EAChB,UAAU,QAAQ;CACpB,GACA,GACF,KAAK;CAGP,IAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;EACzD,MAAM,OAAO,IAAI,aAAa,oBAAoB;EAClD,IAAI,aAAa,gBACf,MACA,mFACA,iBACF;EACA,QAAQ,iBAAiB;GACvB,MAAM,WAAW,gBAAgB,UAAU,EAAE,aAAa,QAAQ,YAAY,GAAG,GAAG;GACpF,MAAM;EACR;CACF;CAGA,IAAI,QAAQ,YAAY,mBAAmB,QAAQ,QAAQ,GAAG;EAC5D,MAAM,OAAO,IAAI,aAAa,oBAAoB;EAClD,IAAI,aAAa,gBACf,MACA,gFACA,cACF;EACA,QAAQ,cAAc;GACpB,MAAM,WAAW,aAAa,UAAU,QAAQ,UAAU,GAAG;GAC7D,MAAM;EACR;CACF;CAGA,IAAI,QAAQ,SAAS;EACnB,MAAM,OAAO,IAAI,aAAa,oBAAoB;EAClD,IAAI,aAAa,gBACf,MACA,+EACA,aACF;EACA,QAAQ,aAAa;GACnB,MAAM,WAAW,YAAY,UAAU,QAAQ,SAAS,GAAG;GAC3D,MAAM;EACR;CACF;CAGA,MAAM,WAAW,QAAQ,iBAAiB,CAAC;CAC3C,IAAI,SAAS,SAAS,GAAG;EACvB,MAAM,UAA6B,CAAC;EACpC,KAAK,IAAI,KAAK,GAAG,KAAK,SAAS,QAAQ,MAAM;GAC3C,MAAM,QAAQ,KAAK;GACnB,MAAM,QAAQ,IAAI,aAAa,oBAAoB;GACnD,IAAI,aAAa,gBACf,OACA,oFACA,6BAA6B,MAAM,KACrC;GAGA,MAAM,SAAS,SAAS;GACxB,IAAI,CAAC,QAAQ;GACb,IAAI;GACJ,IAAI,OAAO,cAAc,QAAQ;IAC/B,MAAM,SAAS,IAAI,cAAc;IACjC,OAAO,gBACL,GACA,wFACA,OAAO,aAAa,QACpB,eAAe,QACjB;IACA,UAAU;IACV,QAAQ,mBAAmB,WAAW;KACpC,MAAM,WAAW,OAAO,UAAU;KAClC,MAAM,sCAAsC,MAAM;IACpD;GACF;GAGA,QAAQ,eAAe,WAAW;IAChC,MAAM,WAAW,iBAAiB,UAAU;KAAE,GAAG;KAAQ;IAAQ,GAAG,GAAG;IACvE,MAAM,gCAAgC,MAAM;GAC9C;GAEA,QAAQ,KAAK,EAAE,KAAK,MAAM,QAAQ,CAAC;EACrC;EAGA,MAAM,aAAa,2BAA2B,OAAO;EACrD,QAAQ,MAAM,QAAQ,wBAAwB,UAAU;CAC1D,OACE,QAAQ,MAAM,QAAQ,wBAAwB,EAAE;CAGlD,QAAQ,cAAc;EACpB,MAAM,0DAA0D;EAChE,MAAM;CACR;CAGA,IAAI,IAAI,cAAc,QAAQ,GAE5B,QAAQ,mBAAmB;EACzB,MAAM,0DAFM,kBAAkB,UAAU,IAAI,cAAc,oBAAoB,GAAG,GAEb;EACpE,MAAM;CACR;CAKF,QAAQ,YAAY;EAClB,MAAM,0DAFU,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,GAAG,GAEW;EACxE,MAAM;CACR;CAIA,QAAQ,WAAW;EACjB,MAAM,YAAY,QAAQ,QAAQ,cAAc,QAAQ,OAAO,GAAG,IAAIC,iBAAe;EACrF,MAAM;CACR;CAGA,KAAK,MAAM,CAAC,GAAG,cAAc,IAAI,OAAO,MAAM,QAAQ,GACpD,QAAQ,QAAQ,OAAO;EACrB,MAAM,WAAW,UAAU;EAC3B,MAAM,kBAAkB,IAAI,EAAE;CAChC;CAIF,IAAI,UAAU,SAAS,GAAG;EACxB,QAAQ,eAAe;GACrB,MAAM,cAAc,UAAU,EAAE,OAAO,UAAU,GAAG,GAAG,KAAK;GAC5D,MAAM;EACR;EACA,MAAM,eAAe,IAAI,aAAa,oBAAoB;EAC1D,IAAI,aAAa,gBACf,cACA,iFACA,eACF;CACF;CAIA,IAAI,QAAQ,aAAa;EACvB,MAAM,KAAK,QAAQ;EACnB,MAAM,kBACJ;EACF,MAAM,cACJ;EACF,MAAM,YAAY;EAGlB,QAAQ,qBAAqB;GAC3B,MAAM,YAAY,oBAAoB,UAAU,GAAG,SAAS,GAAG,KAAK;GACpE,MAAM;EACR;EACA,IAAI,aAAa,gBACf,IAAI,aAAa,oBAAoB,GACrC,iBACA,qBACF;EAGA,MAAM,iBAAiB,IAAI,cAAc;EACzC,KAAK,MAAM,CAAC,GAAG,QAAQ,GAAG,KAAK,QAAQ,GAAG;GACxC,QAAQ,cAAc,OAAO;IAC3B,MAAM,YAAY,gBAAgB,UAAU,KAAK,GAAG,KAAK;IACzD,MAAM,wBAAwB,IAAI,EAAE;GACtC;GACA,eAAe,gBAAgB,IAAI,GAAG,aAAa,qBAAqB,IAAI,EAAE,KAAK;EACrF;EACA,QAAQ,yBAAyB;GAC/B,MAAM,WAAW,eAAe,UAAU;GAC1C,MAAM;EACR;EAGA,IAAI,GAAG,OAAO;GACZ,MAAM,WAAW,UAAU,UAAU,GAAG,OAAO,GAAG;GAClD,IAAI,UAAU;IACZ,QAAQ,WAAW;KAAE,MAAM,WAAW;KAAU,MAAM;IAAe;IACrE,IAAI,aAAa,gBACf,IAAI,aAAa,oBAAoB,GACrC,WACA,WACF;GACF;EACF;CACF;CAIA,QAAQ,2BAA2B;EACjC,MAAM,WAAW,IAAI,aAAa,UAAU;EAC5C,MAAM;CACR;CAGA,MAAM,aAAwD,CAAC;CAC/D,KAAK,MAAM,OAAO,IAAI,MAAM,OAC1B,WAAW,KAAK;EAAE,MAAM,IAAI;EAAM,MAAM,YAAY,IAAI;CAAW,CAAC;CAGtE,MAAM,QAAQ,eAAe,SAAS,WAAW,YAAY,UAAU;CAIvE,MAAM,oBAAoB,mBAAmB,OAAO,KAAK,KAAK,GAAG;EAC/D,SAASH;EACT,mBAAmB;CACrB,CAAC;CACD,MAAM,yBAAyB,QAAQ,OACrC,YAAY,iBAAiB,UAAU,mBAAmB,GAAG,KAAK,GACpE;CACA,OAAO;AACT;AAIA,SAAS,2BACP,MACA,SACA,SACA,UAAkB,GACZ;CACN,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAC3B,KAAK,gBACH,OACA,iFACA,mBAAmB,IAAI,EAAE,KAC3B;CAEF,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAC3B,KAAK,gBACH,OACA,kFACA,oBAAoB,IAAI,EAAE,KAC5B;CAEF,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,KAC3B,KAAK,gBACH,OACA,mFACA,qBAAqB,IAAI,EAAE,KAC7B;CAEF,KAAK,gBACH,OACA,8EACA,YACF;CACA,KAAK,gBACH,OACA,6EACA,kBACF;CACA,KAAK,gBACH,OACA,qFACA,mBACF;AACF;AAEA,SAAS,mBAAmB,UAAoC;CAC9D,QACG,SAAS,OAAO,UAAU,KAAK,MAC/B,SAAS,SAAS,UAAU,KAAK,MACjC,SAAS,KAAK,UAAU,KAAK,MAC7B,SAAS,gBAAgB,UAAU,KAAK,MACxC,SAAS,cAAc,UAAU,KAAK,MACtC,SAAS,eAAe,UAAU,KAAK;AAE5C;AAEA,SAAS,uBAAuB,MAAoB,WAAoC;CACtF,MAAM,QAAQ,UAAU,MAAM,GAAG;CACjC,MAAM,aAAa,MAAM,EAAE,EAAE,MAAM,iBAAiB;CACpD,MAAM,WAAW,MAAM,EAAE,EAAE,MAAM,iBAAiB;CAClD,IAAI,CAAC,YACH,OAAO;EAAE,YAAY,CAAC;EAAG,SAAS,CAAC;CAAE;CAGvC,MAAM,WAAW,SAAS,WAAW,MAAM,KAAK,EAAE,IAAI;CACtD,MAAM,SAAS,WAAW,SAAS,SAAS,MAAM,KAAK,EAAE,IAAI,IAAI;CACjE,MAAM,WAAW,iBAAiB,WAAW,MAAM,GAAG;CACtD,MAAM,SAAS,WAAW,iBAAiB,SAAS,MAAM,GAAG,IAAI;CACjE,MAAM,WAAW,SAAS,WAAW;CAGrC,MAAM,YAAY,KAAK;CACvB,MAAM,aAAuB,CAAC;CAC9B,IAAI,WAAW,OACb,KAAK,IAAI,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,MAAM,QAAQ,KAAK;EACrE,MAAM,KAAK,UAAU,MAAM,EAAE,EAAE;EAC/B,WAAW,KACT,OAAO,OAAO,WACV,KACA,OAAO,OAAO,YAAY,OAAO,OAAO,YACtC,OAAO,EAAE,IACT,MAAM,GACd;CACF;CAIF,MAAM,UAAiC,CAAC;CACxC,KAAK,IAAI,IAAI,WAAW,GAAG,KAAK,QAAQ,KAAK;EAC3C,MAAM,MAAM,KAAK;EACjB,IAAI,CAAC,KAAK,OAAO;EACjB,MAAM,SAA8B,CAAC;EACrC,KAAK,IAAI,IAAI,UAAU,KAAK,QAAQ,KAAK;GACvC,MAAM,MAAM,IAAI,MAAM,EAAE,EAAE;GAC1B,IAAI,OAAO,QAAQ,UACjB,OAAO,KAAK,GAAG;QACV,IAAI,eAAe,MACxB,OAAO,KAAK,IAAI,QAAQ,CAAC;QAEzB,OAAO,KAAK,OAAO,QAAQ,WAAW,MAAM,OAAO,QAAQ,YAAY,OAAO,GAAG,IAAI,EAAE;EAE3F;EACA,IAAI,OAAO,WAAW,UACpB,QAAQ,KAAK,MAAM;CAEvB;CAEA,OAAO;EAAE;EAAY;CAAQ;AAC/B;AAEA,SAAS,iBAAiB,SAAyB;CACjD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,MAAM,MAAM,MAAM,QAAQ,WAAW,CAAC,IAAI;CAE5C,OAAO,MAAM;AACf;AAEA,SAAS,qBACP,WACA,kBACA,eACA,kBAC6C;CAC7C,MAAM,2BAAW,IAAI,IAAsB;CAC3C,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,SAAS;CACb,IAAI,SAAS;CAEb,KAAK,MAAM,MAAM,WAAW;EAE1B,MAAM,YADW,GAAG,YAAY,KAAA,CACN,MAAM,iBAAiB;EACjD,IAAI,CAAC,UAAU;EAEf,MAAM,WAAW,iBAAiB,SAAS,MAAM,GAAG;EACpD,MAAM,WAAW,SAAS,SAAS,MAAM,KAAK,EAAE;EAChD,MAAM,gBAAgB,GAAG;EACzB,MAAM,aAAa,GAAG;EAEtB,MAAM,kBAAkB,GAAG,eAAe;EAC1C,MAAM,cAAc,iBAAiB,WAClC,QAAQ,GAAG,QAAQ,QAAQ,iBAAiB,QAAQ,EAAE,IAAI,SAAS,eACtE;EACA,IAAI,gBAAgB,IAAI;EAGxB,MAAM,aAAa,uBADA,iBAAiB,YAAY,EAAE,QAAQ,CAAC,GACL,GAAG,MAAM;EAC/D,IAAI,WAAW,WAAW,WAAW,GAAG;EAExC,MAAM,SAAS,WAAW;EAC1B,MAAM,kBAAkB,cAAc,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;EAClE,MAAM,mBAAmB,WAAW,KAAK,OAAO,OAAO,QAAQ,GAAG,KAAK,CAAC;EAExE,IAAI,gBAAgB,MAAM,QAAQ,QAAQ,EAAE,GAAG;EAC/C,IAAI,iBAAiB,MAAM,QAAQ,QAAQ,EAAE,GAAG;EAGhD,MAAM,2BAAW,IAAI,IAA+D;EACpF,KAAK,MAAM,UAAU,WAAW,SAAS;GACvC,MAAM,WAAW,gBAAgB,KAAK,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;GACzE,IAAI,QAAQ,SAAS,IAAI,QAAQ;GACjC,IAAI,CAAC,OAAO;IACV,QAAQ;KACN,MAAM,gBAAgB,KAAK,OAAO;MAChC,MAAM,IAAI,OAAO;MACjB,OAAO,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI,OAAO,KAAK,EAAE;KAC5E,CAAC;KACD,QAAQ,iBAAiB,UAAU,CAAC,CAAC;IACvC;IACA,SAAS,IAAI,UAAU,KAAK;GAC9B;GACA,KAAK,MAAM,CAAC,IAAI,OAAO,iBAAiB,QAAQ,GAAG;IACjD,MAAM,MAAM,OAAO;IACnB,IAAI,OAAO,QAAQ,UACjB,MAAM,OAAO,GAAG,EAAE,KAAK,GAAG;GAE9B;EACF;EAIA,MAAM,mBADgB,GAAG,WAAW,CAAC,EAAA,CACC,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;EAElE,MAAM,YAAY,QAAgB,UAAoB;GACpD,IAAI,MAAM,SAAS,IAAI,MAAM;GAC7B,IAAI,CAAC,KAAK;IACR,MAAM,CAAC;IACP,SAAS,IAAI,QAAQ,GAAG;GAC1B;GACA,KAAK,MAAM,KAAK,OAAO,IAAI,KAAK,CAAC;GACjC,SAAS,KAAK,IAAI,QAAQ,MAAM;GAChC,SAAS,KAAK,IAAI,QAAQ,MAAM;EAClC;EAEA,IAAI,gBAAgB,SAAS,KAAK,CAAC,gBAAgB,MAAM,QAAQ,QAAQ,EAAE,GAAG;GAG5E,MAAM,gBAAgB,oBAAoB,WAAW,SAAS,gBAAgB,MAAM,CAAC,CAAC,CAAC,KACpF,MAAO,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,OAAO,CAAC,IAAI,OAAO,KAAK,EAAE,CACrF;GAGA,MAAM,8BAAc,IAAI,IAGtB;GACF,KAAK,MAAM,UAAU,WAAW,SAAS;IACvC,MAAM,SAAS,gBAAgB,KAAK,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;IACvE,MAAM,SAAS,gBAAgB,KAAK,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;IACvE,IAAI,QAAQ,YAAY,IAAI,MAAM;IAClC,IAAI,CAAC,OAAO;KACV,QAAQ;MACN,SAAS,gBAAgB,KAAK,OAAO;OACnC,MAAM,IAAI,OAAO;OACjB,OAAO,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI,OAAO,KAAK,EAAE;MAC5E,CAAC;MACD,yBAAS,IAAI,IAAI;MACjB,WAAW,iBAAiB,UAAU,CAAC,CAAC;KAC1C;KACA,YAAY,IAAI,QAAQ,KAAK;IAC/B;IACA,IAAI,YAAY,MAAM,QAAQ,IAAI,MAAM;IACxC,IAAI,CAAC,WAAW;KACd,YAAY,iBAAiB,UAAU,CAAC,CAAC;KACzC,MAAM,QAAQ,IAAI,QAAQ,SAAS;IACrC;IACA,KAAK,MAAM,CAAC,IAAI,OAAO,iBAAiB,QAAQ,GAAG;KACjD,MAAM,MAAM,OAAO;KACnB,IAAI,OAAO,QAAQ,UAAU;MAC3B,UAAU,GAAG,EAAE,KAAK,GAAG;MACvB,MAAM,UAAU,GAAG,EAAE,KAAK,GAAG;KAC/B;IACF;GACF;GAGA,MAAM,aAAa,cAAc;GAEjC,MAAM,SAAS,YADG,cAAc,SAAS,aAAa,KAChB;GACtC,SAAS,KAAK,IAAI,QAAQ,QAAQ;GAClC,SAAS,KAAK,IAAI,QAAQ,MAAM;GAGhC,MAAM,cAAwB,CAAC;GAC/B,KAAK,MAAM,UAAU,eAAe;IAClC,MAAM,UAAU,iBAAiB,WAAW,YAAY,MAAM,IAAI;IAClE,MAAM,SAAS,cAAc,SAAS,MAAM;IAC5C,YAAY,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;GACjE;GACA,KAAK,MAAM,MAAM,eAAe;IAC9B,MAAM,UAAU,iBAAiB,WAAW,YAAY,MAAM,IAAI;IAClE,MAAM,SAAS,cAAc,SAAS,EAAE;IACxC,YAAY,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;GACjE;GAEA;IACE,MAAM,UAAU,iBAAiB,WAAW,YAAY,MAAM,IAAI;IAElE,MAAM,MAAM,WAAW;IACvB,MAAM,WAAW,IAAI,aAAa;IAClC,MAAM,SAAS,IAAI,QAAQ,GAAG,aAAa,QAAQ,QAAQ,SAAS,MAAM,IAAI;IAC9E,MAAM,SAAS,cAAc,SAAS,MAAM;IAC5C,YAAY,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;GACjE;GACA,SAAS,UAAU,WAAW;GAG9B,IAAI,aAAa,WAAW;GAC5B,KAAK,MAAM,GAAG,UAAU,aAAa;IACnC,MAAM,QAAkB,CAAC;IAEzB,KAAK,MAAM,CAAC,IAAI,WAAW,MAAM,QAAQ,QAAQ,GAAG;KAClD,MAAM,UAAU,iBAAiB,WAAW,EAAE,IAAI;KAClD,MAAM,SAAS,cAAc,SAAS,OAAO,MAAM,CAAC;KACpD,MAAM,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;IAC3D;IAEA,KAAK,MAAM,CAAC,IAAI,WAAW,cAAc,QAAQ,GAAG;KAClD,MAAM,YAAY,MAAM,QAAQ,IAAI,MAAM;KAE1C,MAAM,UAAU,iBAAiB,YADf,cAAc,SAAS,GACY,IAAI;KACzD,MAAM,WAAW,WAAW,EAAE,CAAE,aAAa;KAC7C,MAAM,SAAS,YAAY,UAAU,UAAU,MAAM,CAAC,GAAG,QAAQ,IAAI;KACrE,MAAM,KAAK,SAAS,QAAQ,OAAO,OAAO,SAAS;IACrD;IAEA;KAEE,MAAM,UAAU,iBAAiB,YADf,cAAc,SAAS,WACY,IAAI;KACzD,MAAM,WAAW,WAAW,EAAE,CAAE,aAAa;KAC7C,MAAM,SAAS,UAAU,MAAM,UAAU,MAAM,CAAC,GAAG,QAAQ;KAC3D,MAAM,KAAK,SAAS,QAAQ,OAAO,OAAO,SAAS;IACrD;IACA,SAAS,YAAY,KAAK;IAC1B;GACF;GAGA,MAAM,UAAoB,CAAC;GAC3B,MAAM,WAAW,cAAc,SAAS,aAAa;GACrD,QAAQ,KACN,SAAS,iBAAiB,QAAQ,IAAI,WAAW,aAAa,SAAS,SACzE;GACA,KAAK,MAAM,CAAC,IAAI,WAAW,cAAc,QAAQ,GAAG;IAClD,MAAM,WAAW,WAAW,EAAE,CAAE,aAAa;IAC7C,MAAM,eAAyB,CAAC;IAChC,MAAM,SAAS,iBAAiB;IAChC,KAAK,MAAM,UAAU,WAAW,SAE9B,IADkB,gBAAgB,KAAK,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAC3D,MAAM,UAAU,WAAW,KAAA,GAAW;KAChD,MAAM,MAAM,OAAO;KACnB,IAAI,OAAO,QAAQ,UAAU,aAAa,KAAK,GAAG;IACpD;IAGF,MAAM,UAAU,iBAAiB,YADf,cAAc,SAAS,GACY,IAAI;IACzD,MAAM,SAAS,UAAU,cAAc,QAAQ;IAC/C,QAAQ,KAAK,SAAS,QAAQ,OAAO,OAAO,SAAS;GACvD;GAEA;IACE,MAAM,WAAW,WAAW,EAAE,CAAE,aAAa;IAC7C,MAAM,SAAS,iBAAiB;IAChC,MAAM,YAAY,WAAW,QAC1B,KAAK,MAAO,WAAW,KAAA,IAAY,EAAE,UAAU,KAAA,CAAU,CAAC,CAC1D,QAAQ,MAAmB,OAAO,MAAM,QAAQ;IAEnD,MAAM,UAAU,iBAAiB,YADf,cAAc,SAAS,WACY,IAAI;IACzD,MAAM,SAAS,UAAU,WAAW,QAAQ;IAC5C,QAAQ,KAAK,SAAS,QAAQ,OAAO,OAAO,SAAS;GACvD;GACA,SAAS,YAAY,OAAO;EAC9B,OAAO;GAEL,MAAM,SAAS,WAAW,cAAc,SAAS,WAAW,SAAS;GACrE,SAAS,KAAK,IAAI,QAAQ,QAAQ;GAClC,SAAS,KAAK,IAAI,QAAQ,MAAM;GAGhC,MAAM,cAAwB,CAAC;GAC/B,KAAK,MAAM,UAAU,eAAe;IAClC,MAAM,UAAU,iBAAiB,WAAW,YAAY,MAAM,IAAI;IAClE,MAAM,SAAS,cAAc,SAAS,MAAM;IAC5C,YAAY,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;GACjE;GACA,KAAK,MAAM,MAAM,YAAY;IAC3B,MAAM,UAAU,iBAAiB,WAAW,YAAY,MAAM,IAAI;IAClE,MAAM,WAAW,GAAG,aAAa;IACjC,MAAM,SAAS,GAAG,QAAQ,GAAG,aAAa,QAAQ,QAAQ,SAAS,MAAM,GAAG;IAC5E,MAAM,SAAS,cAAc,SAAS,MAAM;IAC5C,YAAY,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;GACjE;GACA,SAAS,UAAU,WAAW;GAG9B,IAAI,aAAa,WAAW;GAC5B,KAAK,MAAM,GAAG,UAAU,UAAU;IAChC,MAAM,QAAkB,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,QAAQ,MAAM,KAAK,QAAQ,GAAG;KAC5C,MAAM,UAAU,iBAAiB,WAAW,EAAE,IAAI;KAClD,MAAM,SAAS,cAAc,SAAS,OAAO,GAAG,CAAC;KACjD,MAAM,KAAK,SAAS,QAAQ,aAAa,OAAO,SAAS;IAC3D;IACA,KAAK,MAAM,CAAC,IAAI,OAAO,WAAW,QAAQ,GAAG;KAE3C,MAAM,UAAU,iBAAiB,YADf,cAAc,SAAS,GACY,IAAI;KACzD,MAAM,WAAW,GAAG,aAAa;KACjC,MAAM,SAAS,UAAU,MAAM,OAAO,OAAO,CAAC,GAAG,QAAQ;KACzD,MAAM,KAAK,SAAS,QAAQ,OAAO,OAAO,SAAS;IACrD;IACA,SAAS,YAAY,KAAK;IAC1B;GACF;GAGA,MAAM,UAAoB,CAAC;GAC3B,MAAM,WAAW,cAAc,SAAS,aAAa;GACrD,QAAQ,KACN,SAAS,iBAAiB,QAAQ,IAAI,WAAW,aAAa,SAAS,SACzE;GACA,KAAK,MAAM,CAAC,IAAI,OAAO,WAAW,QAAQ,GAAG;IAE3C,MAAM,UAAU,iBAAiB,YADf,cAAc,SAAS,GACY,IAAI;IACzD,MAAM,WAAW,GAAG,aAAa;IACjC,MAAM,QAAQ,iBAAiB;IAI/B,MAAM,SAAS,UAHG,WAAW,QAC1B,KAAK,MAAO,UAAU,KAAA,IAAY,EAAE,SAAS,KAAA,CAAU,CAAC,CACxD,QAAQ,MAAmB,OAAO,MAAM,QACV,GAAG,QAAQ;IAC5C,QAAQ,KAAK,SAAS,QAAQ,OAAO,OAAO,SAAS;GACvD;GACA,SAAS,YAAY,OAAO;EAC9B;CACF;CAEA,IAAI,SAAS,SAAS,GAAG,OAAO;EAAE,WAAW;EAAI,cAAc;CAAG;CAGlE,MAAM,QAAkB,CAAC,aAAa;CACtC,MAAM,aAAa,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;CACrE,KAAK,MAAM,CAAC,QAAQ,UAAU,YAAY;EACxC,MAAM,KAAK,WAAW,OAAO,0BAA0B;EACvD,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK,CAAC;EACnC,MAAM,KAAK,QAAQ;CACrB;CACA,MAAM,KAAK,cAAc;CAIzB,MAAM,eAAe,GAFD,iBAAiB,WAAW,WAAW,IAAI,MAE7B,IADd,WAAW,WAAW,IAAI,OACI,GAAG,iBAAiB,MAAM,IAAI;CAChF,OAAO;EAAE,WAAW,MAAM,KAAK,EAAE;EAAG;CAAa;AACnD;;AAGA,SAAS,iBAAiB,KAAqB;CAC7C,OAAO,eAAe,MAAM,CAAC;AAC/B;;;;;;;;;;;;;;;;;;;;;;;;ACl0CA,MAAM,iBAAiB;AAEvB,MAAM,6BAA6B,qBAAqB,UAAU;;AAGlE,MAAM,gBAAqC,IAAI,IAAI;CAEjD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAGD,MAAM,iBAAsC,IAAI,IAAI;CAAC;CAAQ;CAAQ;AAAW,CAAC;;;;;;;AAQjF,SAAgB,kBAAkB,SAAmC;CACnE,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,GACnC,IAAI,CAAC,cAAc,IAAI,GAAG,GAAG,OAAO;CAEtC,KAAK,MAAM,MAAM,QAAQ,cAAc,CAAC,GACtC,KAAK,MAAM,OAAO,OAAO,KAAK,EAAE,GAC9B,IAAI,CAAC,eAAe,IAAI,GAAG,GAAG,OAAO;CAGzC,OAAO;AACT;;;;;;AAOA,SAAgB,eACd,SACA,QACA,cAAkC,CAAC,GAC7B;CACN,MAAM,WAAW,YAAY,OAAO;CACpC,MAAM,MAAM,IAAI,iBAAiB;CACjC,MAAM,UAAU,IAAI,YAAY;CAChC,MAAM,SAAS,IAAI,gBAAgB,QAAQ,QAAQ;CAEnD,MAAM,aAAa,QAAQ,cAAc,CAAC;CAC1C,MAAM,aAAa,WAAW,KAAK,GAAG,MAAM,sBAAsB,IAAI,EAAE,KAAK;CAC7E,MAAM,sBAAsB,CAAC,CAAC,QAAQ,kBAAkB;CAIxD,MAAM,YAAY;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;CACL;CACA,IAAI,qBAAqB,UAAU,KAAK,qBAAqB;CAE7D,MAAM,eAAe,MAAc,QAAsB;EACvD,MAAM,OAAO,OAAO,QAAQ,MAAM,QAAQ;EAC1C,KAAK,KAAK,QAAQ,OAAO,GAAG,CAAC;EAC7B,KAAK,IAAI;CACX;CAEA,YACE,uBACA,yBACG,iBAAiB,UAChB,mBAAmB,WAAW;EAC5B,SAAS;EAET,mBAAmB,CAAC;CACtB,CAAC,GACD,GACF,KAAK,GACT;CACA,YACE,eACA,wBACE,uBAAuB,mBAAmB,mBAAmB,CAAC,CAAC,UAAU,CAC7E;CACA,YAAY,qBAAqB,wBAAwB,6BAA6B,OAAO,CAAC;CAC9F,YACE,oBACA,yBAAyB,kBAAkB,UAAU,QAAQ,iBAAiB,CAAC,GAAG,GAAG,KAAK,GAC5F;CACA,IAAI,qBACF,YACE,uBACA,yBACG,qBAAqB,UAAU,EAAE,YAAY,QAAQ,oBAAoB,CAAC,EAAE,GAAG,GAAG,KAAK,GAC5F;CAIF,MAAM,SAA4B,WAAW,KAAK,IAAI,OAAO;EAC3D,MAAM,GAAG,QAAQ,QAAQ,IAAI;EAC7B,SAAS,IAAI;EACb,KAAK,MAAM,IAAI;CACjB,EAAE;CACF,YACE,mBACA,yBACG,aAAa,UACZ;EACE;EACA,YAAY,QAAQ;EACpB,cAAc,QAAQ;EACtB,gBAAgB,QAAQ;EACxB,gBAAgB,QAAQ;EACxB,eAAe,QAAQ;EACvB,aAAa,QAAQ;EACrB,UAAU,QAAQ;CACpB,GACA,GACF,KAAK,GACT;CACA,MAAM,SAAS,IAAI,cAAc;CACjC,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KACjC,OAAO,gBACL,OACA,iFACA,mBAAmB,IAAI,EAAE,KAC3B;CAEF,OAAO,gBACL,OACA,8EACA,YACF;CACA,OAAO,gBACL,OACA,6EACA,kBACF;CACA,YAAY,8BAA8B,wBAAwB,OAAO,UAAU,CAAC;CAIpF,KAAK,MAAM,CAAC,GAAG,OAAO,WAAW,QAAQ,GAAG;EAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC;EACzB,MAAM,OAAO,OAAO,QAAQ,WAAW,IAAK,QAAQ;EACpD,KAAK,KACH,QAAQ,OACN,iKAEF,CACF;EACA,MAAM,SAAS,GAAG,aAAa,eAAe,IAAI;EAClD,IAAI,QAAQ,KAAK,KAAK,QAAQ,OAAO,mBAAmB,OAAO,IAAI,CAAC;EACpE,KAAK,KAAK,QAAQ,OAAO,aAAa,CAAC;EAEvC,MAAM,MAAgB,CAAC;EACvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,gBAAgB;GAChE,oBACE,KAAK,MAAM,OAAO,QAAQ,cAAc,GACxC,KACA,KAAA,GACA,IAAI,QACJ,QAAQ,CACV;GACA,KAAK,KAAK,QAAQ,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;GACtC,IAAI,SAAS;EACf;EACA,KAAK,KAAK,QAAQ,OAAO,0BAA0B,CAAC;EACpD,KAAK,IAAI;CACX;CAGA,YACE,iBACA,yBAAyB,WAAW,UAAU,EAAE,QAAQ,IAAI,OAAO,GAAG,GAAG,KAAK,GAChF;CACA,YAAY,uBAAuB,wBAAwBI,iBAAe,CAAC;CAE3E,OAAO,IAAI;AACb;;AAGA,SAAS,eAAe,MAAwC;CAC9D,MAAM,SAAS,KAAK;CACpB,IAAI,SAAS;CACb,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,SAAS,IAAI,MAAM,SAAS,QAAQ,SAAS,IAAI,MAAM;CAEjE,OAAO,SAAS,KAAK,SAAS,IAAI,MAAM,eAAe,MAAM,IAAI,WAAW,KAAA;AAC9E;;;;;;;;;ACxPA,MAAM,SAAS,aAA8B;CAC3C,UAAU,SAAS,WAAW,eAAe,gBAAgB,SAAS,WAAW,UAAU;CAC3F,UAAU,cAAc;AAC1B,CAAC;;;;;;;;;;;;;;;;;;;AAoBD,SAAgB,iBACd,SACA,eAC0B;CAC1B,OAAO,OAAO,KAAK,SAAS,aAAa;AAC3C;;;;AAKA,SAAgB,qBACd,SACA,eACiB;CACjB,OAAO,OAAO,SAAS,SAAS,aAAa;AAC/C;;;;;;;;;;AAWA,SAAgB,uBACd,SACA,eAC4B;CAC5B,IAAI,CAAC,kBAAkB,OAAO,GAC5B,OAAO,OAAO,SAAS,SAAS,aAAa;CAE/C,OAAO,IAAI,eAA2B,EACpC,MAAM,YAAY;EAChB,IAAI;GACF,eACE,UACC,KAAK,OAAO,UAAU;IACrB,IAAI,KAAK;KACP,WAAW,MAAM,GAAG;KACpB;IACF;IACA,WAAW,QAAQ,KAAK;IACxB,IAAI,OAAO,WAAW,MAAM;GAC9B,GACA,eAAe,WACjB;EACF,SAAS,KAAK;GACZ,WAAW,MAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;EACtE;CACF,EACF,CAAC;AACH"}