{"version":3,"file":"context-DqcvNJ7Y.mjs","names":["R_NS"],"sources":["../src/parts/styles.ts","../src/parts/calc-chain.ts","../src/parts/chartsheet.ts","../src/parts/drawing.ts","../src/parts/external-link.ts","../src/parts/pivot/pivot-utils.ts","../src/parts/pivot-table.ts","../src/parts/pivot-cache.ts","../src/parts/table.ts","../src/parts/workbook.ts","../src/parts/revision-log.ts","../src/parts/content-types.ts","../src/context.ts"],"sourcesContent":["/**\n * Styles component — generates xl/styles.xml.\n *\n * XLSX uses an index-based style system: cells reference style entries\n * via the `s` attribute, which is an index into `cellXfs`.\n *\n * @module\n */\nimport type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, findChild, attr, attrNum, stringify } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\n// ── Sub-style option interfaces ──\n\nexport interface FontOptions {\n  bold?: boolean;\n  italic?: boolean;\n  underline?: boolean;\n  strike?: boolean;\n  size?: number;\n  color?: string;\n  font?: string;\n  /** Character set (CT_Font/charset @val) */\n  charset?: number;\n  /** Font family (CT_Font/family @val) */\n  family?: number;\n  /** Condense (macOS, CT_Font/condense) */\n  condense?: boolean;\n  /** Extend (macOS, CT_Font/extend) */\n  extend?: boolean;\n  /** Vertical alignment: superscript/subscript (CT_Font/vertAlign @val) */\n  vertAlign?: \"superscript\" | \"subscript\" | \"baseline\";\n  /** Font scheme (CT_Font/scheme @val) */\n  scheme?: \"major\" | \"minor\" | \"none\";\n  /** Font shadow (CT_Font/shadow) */\n  shadow?: boolean;\n  /** Font outline (CT_Font/outline) */\n  outline?: boolean;\n}\n\n/** Gradient stop (CT_GradientStop) */\nexport interface GradientStopOptions {\n  /** Position (0.0–1.0) */\n  position: number;\n  /** RGB color hex without alpha, e.g. \"FF0000\" */\n  color: string;\n}\n\nexport interface FillOptions {\n  type?: \"solid\" | \"pattern\" | \"gradient\";\n  color?: string;\n  patternType?: string;\n  /** Background color for pattern fill (CT_PatternFill/bgColor) */\n  bgColor?: string;\n  /** Background color indexed (CT_Color @indexed) */\n  colorIndexed?: number;\n  /** Gradient stops (CT_GradientFill/stop) */\n  stops?: GradientStopOptions[];\n  /** Gradient type (CT_GradientFill @type) */\n  gradientType?: \"linear\" | \"path\";\n  /** Gradient degree for linear (CT_GradientFill @degree) */\n  gradientDegree?: number;\n  /** Gradient left position for path (CT_GradientFill @left) */\n  gradientLeft?: number;\n  /** Gradient right position for path (CT_GradientFill @right) */\n  gradientRight?: number;\n  /** Gradient top position for path (CT_GradientFill @top) */\n  gradientTop?: number;\n  /** Gradient bottom position for path (CT_GradientFill @bottom) */\n  gradientBottom?: number;\n}\n\nexport interface BorderOptions {\n  style?: \"thin\" | \"medium\" | \"thick\" | \"dotted\" | \"dashed\" | \"hair\" | \"none\";\n  color?: string;\n}\n\nexport interface BorderSideOptions {\n  top?: BorderOptions;\n  bottom?: BorderOptions;\n  left?: BorderOptions;\n  right?: BorderOptions;\n  diagonal?: BorderOptions;\n  /** Diagonal up (CT_Border @diagonalUp) — on the parent border element */\n  diagonalUp?: boolean;\n  /** Diagonal down (CT_Border @diagonalDown) — on the parent border element */\n  diagonalDown?: boolean;\n  /** Leading edge border (CT_Border/start, for RTL support) */\n  start?: BorderOptions;\n  /** Trailing edge border (CT_Border/end, for RTL support) */\n  end?: BorderOptions;\n  /** Vertical inner border (CT_Border/vertical, for cell range borders) */\n  vertical?: BorderOptions;\n  /** Horizontal inner border (CT_Border/horizontal, for cell range borders) */\n  horizontal?: BorderOptions;\n}\n\nexport interface AlignmentOptions {\n  horizontal?: \"left\" | \"center\" | \"right\" | \"fill\" | \"justify\";\n  vertical?: \"top\" | \"center\" | \"bottom\";\n  wrapText?: boolean;\n  textRotation?: number;\n  indent?: number;\n  /** Relative indent (CT_CellAlignment @relativeIndent) */\n  relativeIndent?: number;\n  /** Justify last line (CT_CellAlignment @justifyLastLine) */\n  justifyLastLine?: boolean;\n  /** Shrink to fit (CT_CellAlignment @shrinkToFit) */\n  shrinkToFit?: boolean;\n  /** Reading order (CT_CellAlignment @readingOrder) */\n  readingOrder?: number;\n}\n\nexport interface StyleOptions {\n  font?: FontOptions;\n  fill?: FillOptions;\n  border?: BorderSideOptions;\n  numFmt?: string;\n  alignment?: AlignmentOptions;\n  /** Quote prefix (CT_Xf @quotePrefix) */\n  quotePrefix?: boolean;\n  /** Pivot button (CT_Xf @pivotButton) */\n  pivotButton?: boolean;\n  /** Apply protection (CT_Xf @applyProtection) */\n  applyProtection?: boolean;\n  /** Cell protection (CT_CellProtection) */\n  protection?: CellProtectionOptions;\n}\n\n/** Cell-level protection settings (CT_CellProtection) */\nexport interface CellProtectionOptions {\n  /** Cell is locked (CT_CellProtection @locked) */\n  locked?: boolean;\n  /** Cell formula is hidden (CT_CellProtection @hidden) */\n  hidden?: boolean;\n}\n\n/** Indexed color entry (CT_RgbColor) */\nexport interface IndexedColorOptions {\n  /** RGB hex value, e.g. \"FF000000\" */\n  rgb: string;\n}\n\n/** Colors palette (CT_Colors) */\nexport interface ColorsOptions {\n  /** Indexed color palette (CT_IndexedColors) */\n  indexedColors?: IndexedColorOptions[];\n  /** Most recently used colors (CT_MRUColors) */\n  mruColors?: string[];\n}\n\n/** Differential format — used by conditional formatting to specify what changes. */\nexport interface DxfOptions {\n  font?: FontOptions;\n  fill?: FillOptions;\n  border?: BorderSideOptions;\n  numFmt?: string;\n}\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: FillOptions): 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/** Table style element type (ST_TableStyleType). */\nexport type TableStyleElementType =\n  | \"wholeTable\"\n  | \"headerRow\"\n  | \"totalRow\"\n  | \"firstColumn\"\n  | \"lastColumn\"\n  | \"firstRowStripe\"\n  | \"secondRowStripe\"\n  | \"firstColumnStripe\"\n  | \"secondColumnStripe\"\n  | \"firstHeaderCell\"\n  | \"lastHeaderCell\"\n  | \"firstTotalCell\"\n  | \"lastTotalCell\"\n  | \"subtotalRow1\"\n  | \"subtotalRow2\"\n  | \"subtotalRow3\"\n  | \"subtotalColumn1\"\n  | \"subtotalColumn2\"\n  | \"subtotalColumn3\"\n  | \"blankRow\"\n  | \"firstColumnSubheading\"\n  | \"secondColumnSubheading\"\n  | \"thirdColumnSubheading\"\n  | \"firstRowSubheading\"\n  | \"secondRowSubheading\"\n  | \"thirdRowSubheading\"\n  | \"pageFieldLabels\"\n  | \"pageFieldValues\";\n\n/** Table style element (CT_TableStyleElement). */\nexport interface TableStyleElementOptions {\n  /** Element type */\n  type: TableStyleElementType;\n  /** Differential format index (dxf) */\n  dxfId?: number;\n  /** Button style (for pivot tables) */\n  button?: boolean;\n}\n\n/** Custom table/pivot table style (CT_TableStyle). */\n/** Style sheet extension (CT_Extension) */\nexport interface StyleExtensionOptions {\n  /** Extension URI (required) */\n  uri: string;\n  /** Extension content (raw XML fragment) */\n  content?: string;\n}\n\nexport interface CustomTableStyleOptions {\n  /** Style name (must be unique) */\n  name: string;\n  /** Pivot style (vs table style) */\n  pivot?: boolean;\n  /** Table style elements */\n  elements?: TableStyleElementOptions[];\n}\n\n/** Custom cell style (CT_CellStyle) */\nexport interface CustomCellStyleOptions {\n  /** Style name */\n  name: string;\n  /** XF index to apply */\n  xfId: number;\n  /** Built-in ID */\n  builtinId?: number;\n  /** Custom built-in (CT_CellStyle @customBuiltin) */\n  customBuiltin?: boolean;\n  /** Outline level (CT_CellStyle @iLevel) */\n  iLevel?: number;\n  /** Hidden style (CT_CellStyle @hidden) */\n  hidden?: boolean;\n}\n\n/** Cell XF entry exposed by Styles.toDescriptorOptions(). */\nexport interface CellXfEntry {\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\n/** Snapshot of Styles internal state for descriptor-based XML generation. */\nexport interface StylesState {\n  customNumFmts: ReadonlyMap<string, number>;\n  fonts: FontOptions[];\n  fills: FillOptions[];\n  borders: BorderSideOptions[];\n  cellXfs: CellXfEntry[];\n  dxfs: DxfOptions[];\n  colors?: ColorsOptions;\n  tableStyles?: CustomTableStyleOptions[];\n  customCellStyles?: CustomCellStyleOptions[];\n  styleExtensions?: StyleExtensionOptions[];\n}\n\n/**\n * Indexed XF reference produced by {@link stylesDesc}.parse — index-based\n * (fontId/fillId/…) rather than resolved objects, consumed by callers that\n * resolve indices into fonts/fills/borders arrays.\n */\nexport interface IndexedXfEntry {\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}\n\n/** Table styles block (CT_TableStyles) produced by {@link stylesDesc}.parse. */\nexport interface TableStylesInfo {\n  count?: number;\n  defaultTableStyle?: string;\n  defaultPivotStyle?: string;\n  tableStyles?: CustomTableStyleOptions[];\n}\n\n/** Result of {@link stylesDesc}.parse (xl/styles.xml → structured data). */\nexport interface StylesParseResult {\n  /** Reverse map numFmtId → formatCode, for O(1) lookup in resolveStyle. */\n  customNumFmtById?: Map<number, string>;\n  fonts?: FontOptions[];\n  fills?: FillOptions[];\n  borders?: BorderSideOptions[];\n  cellStyleXfs?: IndexedXfEntry[];\n  cellXfs?: IndexedXfEntry[];\n  customCellStyles?: CustomCellStyleOptions[];\n  dxfs?: DxfOptions[];\n  tableStylesInfo?: TableStylesInfo;\n  colors?: ColorsOptions;\n  styleExtensions?: StyleExtensionOptions[];\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: FillOptions[] = [\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  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   * 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?: FillOptions): 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\n    p.push(\n      '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>',\n    );\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.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.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// ── Descriptor Types ──\n\nexport interface StylesDocOptions {\n  /** The Styles accumulator instance (for stringify). */\n  styles: Styles;\n}\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    // numFmts\n    const numFmtsEl = findChild(el, \"numFmts\");\n    if (numFmtsEl) {\n      const numFmtById = new Map<number, string>();\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      const fonts: FontOptions[] = [];\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      const fills: FillOptions[] = [];\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      const borders: BorderSideOptions[] = [];\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\n    const cellStyleXfsEl = findChild(el, \"cellStyleXfs\");\n    if (cellStyleXfsEl) {\n      const xfs: IndexedXfEntry[] = [];\n      for (const xf of cellStyleXfsEl.elements ?? []) {\n        if (xf.name !== \"xf\") continue;\n        const style: IndexedXfEntry = {};\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) style.fontId = fontId;\n        if (fillId !== undefined) style.fillId = fillId;\n        if (borderId !== undefined) style.borderId = borderId;\n        if (numFmtId !== undefined) style.numFmtId = numFmtId;\n        xfs.push(style);\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        if (attr(xf, \"quotePrefix\") === \"1\") style.quotePrefix = true;\n        if (attr(xf, \"pivotButton\") === \"1\") 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 (attr(cs, \"customBuiltin\") === \"1\") style.customBuiltin = true;\n        if (attr(cs, \"hidden\") === \"1\") 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 (attr(tse, \"pivot\") === \"1\") 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 (attr(tsee, \"button\") === \"1\") 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 rgb = attr(c, \"rgb\");\n            if (rgb) mru.push(rgb.length === 8 ? rgb.slice(2) : rgb);\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// ── Parse helpers ──\n\nfunction 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        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\nfunction parseFill(el: XmlElement): FillOptions {\n  const patternFill = findChild(el, \"patternFill\");\n  if (patternFill) {\n    const result: FillOptions = {};\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: FillOptions = { type: \"gradient\" };\n    const gType = attr(gradientFill, \"type\");\n    if (gType) result.gradientType = gType as FillOptions[\"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: GradientStopOptions[] = [];\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\nfunction parseBorder(el: XmlElement): BorderSideOptions {\n  const result: BorderSideOptions = {};\n  if (attr(el, \"diagonalUp\") === \"1\") result.diagonalUp = true;\n  if (attr(el, \"diagonalDown\") === \"1\") 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\nfunction 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 (attr(el, \"wrapText\") === \"1\") 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 (attr(el, \"justifyLastLine\") === \"1\") result.justifyLastLine = true;\n  if (attr(el, \"shrinkToFit\") === \"1\") result.shrinkToFit = true;\n  const readingOrder = attrNum(el, \"readingOrder\");\n  if (readingOrder !== undefined) result.readingOrder = readingOrder;\n  return result;\n}\n\nfunction parseProtection(el: XmlElement): CellProtectionOptions {\n  const result: Partial<CellProtectionOptions> = {};\n  const locked = attr(el, \"locked\");\n  if (locked !== undefined) result.locked = locked !== \"0\";\n  const hidden = attr(el, \"hidden\");\n  if (hidden !== undefined) result.hidden = hidden !== \"0\";\n  return result as CellProtectionOptions;\n}\n\nfunction 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 * Calculation Chain types and descriptor.\n *\n * Reference: OOXML transitional, sml.xsd, CT_CalcChain / CT_CalcCell\n *\n * @module\n */\n\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}\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      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        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 type { UniversalMeasure } from \"@office-open/core\";\nimport { convertToInch } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, findChild } 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  /** 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) {\n      const prAttrs: string[] = [];\n      if (opts.tabColor) prAttrs.push(`<tabColor${attrs({ rgb: opts.tabColor })}/>`);\n      const spAttr = opts.published ? ' published=\"1\"' : \"\";\n      p.push(`<sheetPr${spAttr}>${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    // sheetPr\n    const sheetPr = findChild(el, \"sheetPr\");\n    if (sheetPr) {\n      if (sheetPr.attributes?.[\"published\"] === \"1\") result.published = true;\n      const tabColor = findChild(sheetPr, \"tabColor\");\n      if (tabColor?.attributes?.[\"rgb\"]) result.tabColor = String(tabColor.attributes[\"rgb\"]);\n    }\n\n    // sheetView\n    const sheetViews = findChild(el, \"sheetViews\");\n    if (sheetViews) {\n      const sv = findChild(sheetViews, \"sheetView\");\n      if (sv?.attributes?.[\"zoomToFit\"] === \"1\") result.zoomToFit = true;\n    }\n\n    return result as ChartsheetDescriptorOptions;\n  },\n};\n","/**\n * XLSX Drawing — image and chart anchor types and descriptor.\n *\n * Generates xl/drawings/drawing{n}.xml using the spreadsheetDrawing\n * namespace for anchoring images and charts to worksheet cells.\n *\n * @module\n */\n\nimport { convertToEmu } from \"@office-open/core\";\nimport type { UniversalMeasure } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { findChild } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\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\nexport interface DrawingImageOptions {\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  /** Relationship ID for the image */\n  rId: string;\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  /** Image width in EMU (a:ext cx, default 400000). */\n  extentCx?: number | UniversalMeasure;\n  /** Image height in EMU (a:ext cy, 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 DrawingChartOptions {\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\nexport interface DrawingOptions {\n  images?: DrawingImageOptions[];\n  charts?: DrawingChartOptions[];\n}\n\n// ── Constants ──\n\nconst XDR_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst A_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst C_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\n\nconst DEFAULT_EXTENT_CX = 400000;\nconst DEFAULT_EXTENT_CY = 300000;\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    if (images.length === 0 && charts.length === 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));\n      id++;\n    }\n\n    for (const chart of charts) {\n      p.push(stringifyChart(chart, id));\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: DrawingImageOptions[] = [];\n    const charts: DrawingChartOptions[] = [];\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      }\n    }\n\n    if (images.length > 0) result.images = images;\n    if (charts.length > 0) result.charts = charts;\n    return result as DrawingOptions;\n  },\n};\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\nfunction clientDataXml(img: { locksWithSheet?: boolean; printsWithSheet?: boolean }): string {\n  const locks = img.locksWithSheet !== false ? 1 : 0;\n  const prints = img.printsWithSheet !== false ? 1 : 0;\n  return `<clientData fLocksWithSheet=\"${locks}\" fPrintsWithSheet=\"${prints}\"/>`;\n}\n\nfunction picXml(rId: string, id: number, cx: number, cy: number): string {\n  return (\n    `<pic><nvPicPr><cNvPr id=\"${id}\" name=\"Picture ${id}\"/><cNvPicPr preferRelativeResize=\"1\"/></nvPicPr>` +\n    `<blipFill><a:blip r:embed=\"${rId}\"/><a:stretch><a:fillRect/></a:stretch></blipFill>` +\n    `<spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm>` +\n    `<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></spPr></pic>`\n  );\n}\n\nfunction stringifyImage(img: DrawingImageOptions, id: number): string {\n  const anchorType = img.anchorType ?? ANCHOR_TYPES.twoCell;\n  const cx = convertToEmu(img.extentCx ?? DEFAULT_EXTENT_CX);\n  const cy = convertToEmu(img.extentCy ?? DEFAULT_EXTENT_CY);\n  const pic = picXml(img.rId, id, cx, cy);\n  const clientData = clientDataXml(img);\n\n  if (anchorType === ANCHOR_TYPES.absolute) {\n    const x = convertToEmu(img.absoluteX ?? 0);\n    const y = convertToEmu(img.absoluteY ?? 0);\n    return (\n      `<absoluteAnchor><pos x=\"${x}\" y=\"${y}\"/><ext cx=\"${cx}\" cy=\"${cy}\"/>` +\n      `${pic}${clientData}</absoluteAnchor>`\n    );\n  }\n\n  const from = markerXml(img.col, img.colOffset ?? 0, img.row, img.rowOffset ?? 0);\n\n  if (anchorType === ANCHOR_TYPES.oneCell) {\n    return (\n      `<oneCellAnchor><from>${from}</from><ext cx=\"${cx}\" cy=\"${cy}\"/>` +\n      `${pic}${clientData}</oneCellAnchor>`\n    );\n  }\n\n  // twoCell\n  const editAs = img.editAs ?? EDIT_AS_TYPES.oneCell;\n  const to = markerXml(\n    img.toCol ?? img.col + 1,\n    img.toColOffset ?? 0,\n    img.toRow ?? img.row + 1,\n    img.toRowOffset ?? 0,\n  );\n  return (\n    `<twoCellAnchor editAs=\"${editAs}\"><from>${from}</from><to>${to}</to>` +\n    `${pic}${clientData}</twoCellAnchor>`\n  );\n}\n\nfunction 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  return (\n    `<twoCellAnchor editAs=\"oneCell\"><from>${from}</from><to>${to}</to>` +\n    `<graphicFrame><nvGraphicFramePr><cNvPr id=\"${id}\" name=\"Chart ${id}\"/>` +\n    `<cNvGraphicFramePr><a:graphicFrameLocks noGrp=\"1\"/></cNvGraphicFramePr></nvGraphicFramePr>` +\n    `<xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/></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=\"${chart.rId}\"/>` +\n    `</a:graphicData></a:graphic></graphicFrame>${clientData}</twoCellAnchor>`\n  );\n}\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\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\nfunction parseImageAnchor(anchor: XmlElement, pic: XmlElement, name: string): DrawingImageOptions {\n  const result: DrawingImageOptions = {\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  // Client data (lock/print flags) — applies to all anchor types.\n  const clientData = findChild(anchor, \"clientData\");\n  if (clientData?.attributes) {\n    if (clientData.attributes[\"fLocksWithSheet\"] !== undefined) {\n      result.locksWithSheet = clientData.attributes[\"fLocksWithSheet\"] !== \"0\";\n    }\n    if (clientData.attributes[\"fPrintsWithSheet\"] !== undefined) {\n      result.printsWithSheet = clientData.attributes[\"fPrintsWithSheet\"] !== \"0\";\n    }\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    return result;\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    return result;\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  return result;\n}\n\nfunction 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 = clientData.attributes[\"fLocksWithSheet\"] !== \"0\";\n    }\n    if (clientData.attributes[\"fPrintsWithSheet\"] !== undefined) {\n      result.printsWithSheet = clientData.attributes[\"fPrintsWithSheet\"] !== \"0\";\n    }\n  }\n  return result;\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}\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  /** OLE link configuration (CT_OleLink) */\n  oleLink?: OleLinkOptions;\n  /** Relationship ID for the OLE link (set by compiler) */\n  oleRId?: string;\n}\n\nexport interface OleItemOptions {\n  /** OLE item name (required) */\n  name: string;\n  /** Whether to advise events */\n  advise?: boolean;\n  /** Whether preferred */\n  prefer?: boolean;\n}\n\nexport interface OleLinkOptions {\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.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    // oleLink (CT_OleLink)\n    if (opts.oleLink) {\n      const oleRId = opts.oleRId ? ` r:id=\"${escapeXml(opts.oleRId)}\"` : \"\";\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.advise) itemAttrs.push('advise=\"1\"');\n          if (item.prefer) itemAttrs.push('prefer=\"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}>${oleChildren.join(\"\")}</oleLink>`);\n      } else {\n        p.push(`<oleLink${oleRId}/>`);\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              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    // 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\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?.[\"advise\"]) item.advise = true;\n          if (child.attributes?.[\"prefer\"]) item.prefer = 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 * 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  /** 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  /** 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}\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 */\n  i1?: number;\n  /** Index for page field 2 */\n  i2?: number;\n  /** Index for page field 3 */\n  i3?: number;\n  /** Index for page field 4 */\n  i4?: 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}\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  /** 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  /** 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 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 type { CustomDescriptor, WriteContext } from \"@office-open/core/descriptor\";\nimport { attrs, escapeXml, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\nimport { findChild, attr, attrNum } from \"@office-open/xml\";\n\nimport type {\n  PivotTableOptions,\n  PivotSourceData,\n  PivotDataField,\n  PivotHierarchyOptions,\n  PivotAreaOptions,\n  PivotFieldOverrideOptions,\n  PivotAreaReferenceOptions,\n} from \"./pivot/pivot-utils\";\nimport { collectUniqueValues } from \"./pivot/pivot-utils\";\n\n// ── Types ──\n\nexport interface PivotTableDescriptorOptions {\n  options: PivotTableOptions;\n  sourceData: PivotSourceData;\n  cacheId: number;\n}\n\n/** Parsed pivotField (CT_PivotField) — index-based, inspect-only. */\nexport interface PivotFieldParseResult {\n  axis?: string;\n  showAll?: boolean;\n  dataField?: boolean;\n  hierarchy?: string;\n  dragToRow?: boolean;\n  dragToCol?: boolean;\n  dragToPage?: boolean;\n  dragToData?: boolean;\n  dragOff?: boolean;\n  showDropDowns?: boolean;\n  insertBlankRow?: boolean;\n  showPropCell?: boolean;\n  showPropTip?: boolean;\n  showPropAsCaption?: boolean;\n  compact?: boolean;\n  outline?: boolean;\n  subtotalTop?: boolean;\n  includeNewItemsInFilter?: boolean;\n}\n\n/** Parsed dataField (CT_DataField). */\nexport interface DataFieldParseResult {\n  name?: string;\n  fld?: number;\n  subtotal?: string;\n  showDataAs?: string;\n  baseField?: number;\n  baseItem?: number;\n  numFmtId?: string;\n}\n\n/** Parsed pageField (CT_PageField). */\nexport interface PageFieldParseResult {\n  fld?: number;\n  hier?: number;\n  cap?: string;\n}\n\n/** Parsed format entry (CT_Format). */\nexport interface PivotFormatParseResult {\n  action?: string;\n  dxfId?: number;\n  pivotArea?: Partial<PivotAreaOptions>;\n}\n\n/** Parsed chartFormat (CT_ChartFormat). */\nexport interface ChartFormatParseResult {\n  chart?: number;\n  format?: number;\n  series?: boolean;\n  pivotArea?: Partial<PivotAreaOptions>;\n}\n\n/** Parsed pivotHierarchy (CT_PivotHierarchy). */\nexport interface PivotHierarchyParseResult {\n  outline?: boolean;\n  multipleItemSelectionAllowed?: boolean;\n  subtotalTop?: boolean;\n  showInFieldList?: boolean;\n  dragToRow?: boolean;\n  dragToCol?: boolean;\n  dragToPage?: boolean;\n  dragToData?: boolean;\n  dragOff?: boolean;\n  includeNewItemsInFilter?: boolean;\n  caption?: string;\n}\n\n/** Parsed pivotFilter (CT_PivotFilter). */\nexport interface PivotFilterParseResult {\n  fld?: number;\n  type?: string;\n  id?: number;\n  mpFld?: number;\n  evalOrder?: number;\n}\n\n/** Parsed row/col hierarchyUsage entry (CT_RowColHierarchyUsage). */\nexport interface HierarchyUsageParseResult {\n  hierarchyUsage: number;\n}\n\n/** Parsed calculatedItem (CT_CalculatedItem). */\nexport interface CalculatedItemParseResult {\n  field?: number;\n  formula?: string;\n  pivotArea?: Partial<PivotAreaOptions>;\n}\n\n/** Parsed calculatedMember (CT_CalculatedMember). */\nexport interface CalculatedMemberParseResult {\n  name?: string;\n  mdx?: string;\n  memberName?: string;\n  hierarchy?: string;\n  parent?: string;\n  solveOrder?: number;\n  set?: boolean;\n}\n\n/**\n * Structured output of {@link pivotTableDesc}.parse — CT_pivotTableDefinition as\n * parsed (index-based pivotFields/dataFields, flat attributes). This is the\n * CT-layer shape, NOT {@link PivotTableOptions} (the name-based user shape),\n * so it cannot be fed straight back into stringify; the compiler regenerates a\n * pivot table from `sourceData` + user `PivotTableOptions` instead.\n */\nexport interface PivotTableParseResult {\n  name?: string;\n  cacheId?: number;\n  dataOnRows?: boolean;\n  showHeaders?: boolean;\n  showEmptyRow?: boolean;\n  showEmptyCol?: boolean;\n  grandTotalCaption?: string;\n  errorCaption?: string;\n  showError?: boolean;\n  missingCaption?: string;\n  showMissing?: boolean;\n  pageStyle?: string;\n  pivotTableStyle?: string;\n  tag?: string;\n  showItems?: boolean;\n  editData?: boolean;\n  disableFieldList?: boolean;\n  showCalcMbrs?: boolean;\n  visualTotals?: boolean;\n  showMultipleLabel?: boolean;\n  showDataDropDown?: boolean;\n  showDrill?: boolean;\n  printDrill?: boolean;\n  showMemberPropertyTips?: boolean;\n  showDataTips?: boolean;\n  enableWizard?: boolean;\n  enableDrill?: boolean;\n  enableFieldProperties?: boolean;\n  pageWrap?: number;\n  pageOverThenDown?: boolean;\n  subtotalHiddenItems?: boolean;\n  fieldPrintTitles?: boolean;\n  mergeItem?: boolean;\n  showDropZones?: boolean;\n  published?: boolean;\n  gridDropZones?: boolean;\n  multipleFieldFilters?: boolean;\n  rowHeaderCaption?: string;\n  colHeaderCaption?: string;\n  fieldListSortAscending?: boolean;\n  mdxSubqueries?: boolean;\n  customListSort?: boolean;\n  asteriskTotals?: boolean;\n  dataPosition?: number;\n  immersive?: boolean;\n  vacatedStyle?: string;\n  dataCaption?: string;\n  location?: string;\n  locationRowPageCount?: number;\n  locationColPageCount?: number;\n  pivotFields?: PivotFieldParseResult[];\n  dataFields?: DataFieldParseResult[];\n  rowFields?: number[];\n  colFields?: number[];\n  pageFields?: PageFieldParseResult[];\n  formats?: PivotFormatParseResult[];\n  chartFormats?: ChartFormatParseResult[];\n  pivotHierarchies?: PivotHierarchyParseResult[];\n  filters?: PivotFilterParseResult[];\n  rowHierarchiesUsage?: HierarchyUsageParseResult[];\n  colHierarchiesUsage?: HierarchyUsageParseResult[];\n  calculatedItems?: CalculatedItemParseResult[];\n  calculatedMembers?: CalculatedMemberParseResult[];\n  style?: string;\n}\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 (attr(el, \"dataOnRows\") === \"1\") result.dataOnRows = true;\n    if (attr(el, \"showHeaders\") === \"0\") result.showHeaders = false;\n    if (attr(el, \"showEmptyRow\") === \"1\") result.showEmptyRow = true;\n    if (attr(el, \"showEmptyCol\") === \"1\") 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 (attr(el, \"showError\") === \"1\") result.showError = true;\n    if (attr(el, \"missingCaption\")) result.missingCaption = attr(el, \"missingCaption\");\n    if (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 (attr(el, \"showItems\") === \"0\") result.showItems = false;\n    if (attr(el, \"editData\") === \"1\") result.editData = true;\n    if (attr(el, \"disableFieldList\") === \"1\") result.disableFieldList = true;\n    if (attr(el, \"showCalcMbrs\") === \"0\") result.showCalcMbrs = false;\n    if (attr(el, \"visualTotals\") === \"1\") result.visualTotals = true;\n    if (attr(el, \"showMultipleLabel\") === \"0\") result.showMultipleLabel = false;\n    if (attr(el, \"showDataDropDown\") === \"0\") result.showDataDropDown = false;\n    if (attr(el, \"showDrill\") === \"0\") result.showDrill = false;\n    if (attr(el, \"printDrill\") === \"1\") result.printDrill = true;\n    if (attr(el, \"showMemberPropertyTips\") === \"1\") result.showMemberPropertyTips = true;\n    if (attr(el, \"showDataTips\") === \"0\") result.showDataTips = false;\n    if (attr(el, \"enableWizard\") === \"0\") result.enableWizard = false;\n    if (attr(el, \"enableDrill\") === \"0\") result.enableDrill = false;\n    if (attr(el, \"enableFieldProperties\") === \"0\") result.enableFieldProperties = false;\n    const pageWrap = attrNum(el, \"pageWrap\");\n    if (pageWrap !== undefined) result.pageWrap = pageWrap;\n    if (attr(el, \"pageOverThenDown\") === \"1\") result.pageOverThenDown = true;\n    if (attr(el, \"subtotalHiddenItems\") === \"1\") result.subtotalHiddenItems = true;\n    if (attr(el, \"fieldPrintTitles\") === \"1\") result.fieldPrintTitles = true;\n    if (attr(el, \"mergeItem\") === \"1\") result.mergeItem = true;\n    if (attr(el, \"showDropZones\") === \"0\") result.showDropZones = false;\n    if (attr(el, \"published\") === \"1\") result.published = true;\n    if (attr(el, \"gridDropZones\") === \"0\") result.gridDropZones = false;\n    if (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 (attr(el, \"fieldListSortAscending\") === \"1\") result.fieldListSortAscending = true;\n    if (attr(el, \"mdxSubqueries\") === \"1\") result.mdxSubqueries = true;\n    if (attr(el, \"customListSort\") === \"0\") result.customListSort = false;\n    if (attr(el, \"asteriskTotals\") === \"1\") result.asteriskTotals = true;\n    const dataPosition = attrNum(el, \"dataPosition\");\n    if (dataPosition !== undefined) result.dataPosition = dataPosition;\n    if (attr(el, \"immersive\") === \"1\") result.immersive = true;\n    if (attr(el, \"vacatedStyle\")) result.vacatedStyle = attr(el, \"vacatedStyle\");\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 (attr(fEl, \"showAll\") === \"0\") field.showAll = false;\n        else if (attr(fEl, \"showAll\") === \"1\") field.showAll = true;\n        if (attr(fEl, \"dataField\") === \"1\") field.dataField = true;\n        if (attr(fEl, \"hierarchy\")) field.hierarchy = attr(fEl, \"hierarchy\");\n        if (attr(fEl, \"dragToRow\") === \"0\") field.dragToRow = false;\n        if (attr(fEl, \"dragToCol\") === \"0\") field.dragToCol = false;\n        if (attr(fEl, \"dragToPage\") === \"0\") field.dragToPage = false;\n        if (attr(fEl, \"dragToData\") === \"1\") field.dragToData = true;\n        if (attr(fEl, \"dragOff\") === \"0\") field.dragOff = false;\n        if (attr(fEl, \"showDropDowns\") === \"0\") field.showDropDowns = false;\n        if (attr(fEl, \"insertBlankRow\") === \"1\") field.insertBlankRow = true;\n        if (attr(fEl, \"showPropCell\") === \"1\") field.showPropCell = true;\n        if (attr(fEl, \"showPropTip\") === \"1\") field.showPropTip = true;\n        if (attr(fEl, \"showPropAsCaption\") === \"1\") field.showPropAsCaption = true;\n        if (attr(fEl, \"compact\") === \"0\") field.compact = false;\n        if (attr(fEl, \"outline\") === \"1\") field.outline = true;\n        if (attr(fEl, \"subtotalTop\") === \"0\") field.subtotalTop = false;\n        if (attr(fEl, \"includeNewItemsInFilter\") === \"1\") field.includeNewItemsInFilter = 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        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    // 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 (attr(cfEl, \"series\") === \"1\") 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 (attr(hEl, \"outline\") === \"1\") h.outline = true;\n        if (attr(hEl, \"multipleItemSelectionAllowed\") === \"1\")\n          h.multipleItemSelectionAllowed = true;\n        if (attr(hEl, \"subtotalTop\") === \"1\") h.subtotalTop = true;\n        if (attr(hEl, \"showInFieldList\") === \"0\") h.showInFieldList = false;\n        if (attr(hEl, \"dragToRow\") === \"0\") h.dragToRow = false;\n        if (attr(hEl, \"dragToCol\") === \"0\") h.dragToCol = false;\n        if (attr(hEl, \"dragToPage\") === \"0\") h.dragToPage = false;\n        if (attr(hEl, \"dragToData\") === \"1\") h.dragToData = true;\n        if (attr(hEl, \"dragOff\") === \"0\") h.dragOff = false;\n        if (attr(hEl, \"includeNewItemsInFilter\") === \"1\") 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        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 (attr(mEl, \"set\") === \"1\") 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// ── Stringify implementation ──\n\nfunction stringifyPivotTable(o: PivotTableOptions, sd: PivotSourceData, cacheId: number): 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\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  // 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      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.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    parts.push(`<pageField fld=\"${pageIndices[i]}\" hier=\"${i}\"${capAttr}/>`);\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 = colIndexToLetter(letterToColIndex(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              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\nfunction 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    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 letterToColIndex(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\nfunction colIndexToLetter(col: number): string {\n  let result = \"\";\n  let n = col;\n  while (n > 0) {\n    n--;\n    result = String.fromCharCode(65 + (n % 26)) + result;\n    n = Math.floor(n / 26);\n  }\n  return result;\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// ── Parse helpers ──\n\nfunction 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 (attr(el, \"dataOnly\") === \"0\") result.dataOnly = false;\n  if (attr(el, \"labelOnly\") === \"1\") result.labelOnly = true;\n  if (attr(el, \"grandRow\") === \"1\") result.grandRow = true;\n  if (attr(el, \"grandCol\") === \"1\") result.grandCol = true;\n  if (attr(el, \"cacheIndex\") === \"1\") result.cacheIndex = true;\n  if (attr(el, \"outline\") === \"0\") result.outline = false;\n  if (attr(el, \"offset\")) result.offset = attr(el, \"offset\");\n  if (attr(el, \"collapsedLevelsAreSubtotals\") === \"1\") 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 (attr(rEl, \"selected\") === \"0\") ref.selected = false;\n      if (attr(rEl, \"byPosition\") === \"1\") ref.byPosition = true;\n      if (attr(rEl, \"relative\") === \"1\") ref.relative = true;\n      if (attr(rEl, \"defaultSubtotal\") === \"1\") ref.defaultSubtotal = 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 * 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 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 } 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: \"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  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 (attr(el, \"invalid\") === \"1\") result.invalid = true;\n    if (attr(el, \"saveData\") === \"0\") result.saveData = false;\n    if (attr(el, \"optimizeMemory\") === \"1\") result.optimizeMemory = true;\n    if (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 (attr(el, \"backgroundQuery\") === \"1\") result.backgroundQuery = true;\n    const mil = attrNum(el, \"missingItemsLimit\");\n    if (mil !== undefined) result.missingItemsLimit = mil;\n    if (attr(el, \"upgradeOnRefresh\") === \"1\") result.upgradeOnRefresh = true;\n    if (attr(el, \"supportSubquery\") === \"1\") result.supportSubquery = true;\n    if (attr(el, \"supportAdvancedDrill\") === \"1\") result.supportAdvancedDrill = 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 === \"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  }\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.i1 !== undefined) rsAttrs.push(`i1=\"${rs.i1}\"`);\n      if (rs.i2 !== undefined) rsAttrs.push(`i2=\"${rs.i2}\"`);\n      if (rs.i3 !== undefined) rsAttrs.push(`i3=\"${rs.i3}\"`);\n      if (rs.i4 !== undefined) rsAttrs.push(`i4=\"${rs.i4}\"`);\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.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) siAttrs.push('containsDate=\"1\"');\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.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        if (ent.type === \"m\") entParts.push(\"<m/>\");\n        else if (ent.value !== undefined) entParts.push(`<${ent.type} v=\"${ent.value}\"/>`);\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        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 type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { findChild, attr, attrNum, textOf, escapeXml } from \"@office-open/xml\";\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}\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  /** 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  /** 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 reference (defaults to ref) */\n  autoFilter?: string;\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}\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.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.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.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(`<autoFilter ref=\"${escapeXml(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 (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\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, \"ref\")) result.ref = attr(el, \"ref\");\n    const headerRowCount = attrNum(el, \"headerRowCount\");\n    if (headerRowCount !== undefined) result.headerRowCount = headerRowCount;\n    const totalsRowCount = attrNum(el, \"totalsRowCount\");\n    if (totalsRowCount !== undefined) result.totalsRowCount = totalsRowCount;\n    if (attr(el, \"totalsRowShown\") === \"0\") result.totalsRowShown = false;\n    if (attr(el, \"tableType\")) result.tableType = attr(el, \"tableType\") as TableType;\n    if (attr(el, \"insertRowShift\") === \"1\") result.insertRowShift = true;\n    if (attr(el, \"published\") === \"1\") result.published = true;\n\n    // Auto filter\n    const afEl = findChild(el, \"autoFilter\");\n    if (afEl) result.autoFilter = attr(afEl, \"ref\") ?? \"\";\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 (attr(ccfEl, \"array\") === \"1\") col.calculatedColumnFormulaArray = true;\n        }\n        const trfEl = findChild(colEl, \"totalsRowFormula\");\n        if (trfEl) {\n          col.totalsRowFormula = textOf(trfEl);\n          if (attr(trfEl, \"array\") === \"1\") 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        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 (attr(siEl, \"showFirstColumn\") === \"1\") style.showFirstColumn = true;\n      if (attr(siEl, \"showLastColumn\") === \"1\") style.showLastColumn = true;\n      if (attr(siEl, \"showRowStripes\") === \"1\") style.showRowStripes = true;\n      if (attr(siEl, \"showColumnStripes\") === \"1\") 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 types and descriptor for SpreadsheetML documents.\n *\n * @module\n */\n\nimport { derivePasswordHash } from \"@office-open/core\";\nimport type { CustomDescriptor } from \"@office-open/core/descriptor\";\nimport { findChild, attr, attrNum, escapeXml } from \"@office-open/xml\";\n\nexport interface SheetDefinition {\n  name: string;\n  sheetId: number;\n  rId: string;\n  state?: \"visible\" | \"hidden\" | \"veryHidden\";\n}\n\nexport interface PivotCacheReference {\n  cacheId: number;\n  rId: string;\n}\n\nexport interface TablePartReference {\n  rId: string;\n}\n\n/** Custom workbook view for storing display preferences. */\nexport interface CustomWorkbookViewOptions {\n  /** View name */\n  name: string;\n  /** GUID (e.g. \"{00000000-0000-0000-0000-000000000000}\") */\n  guid: string;\n  /** Window width in twips */\n  windowWidth: number;\n  /** Window height in twips */\n  windowHeight: number;\n  /** Active sheet ID (1-based sheetId) */\n  activeSheetId: number;\n  /** X position of the window */\n  xWindow?: number;\n  /** Y position of the window */\n  yWindow?: number;\n  /** Show formula bar (default true) */\n  showFormulaBar?: boolean;\n  /** Show status bar (default true) */\n  showStatusbar?: boolean;\n  /** Show horizontal scroll (default true) */\n  showHorizontalScroll?: boolean;\n  /** Show vertical scroll (default true) */\n  showVerticalScroll?: boolean;\n  /** Show sheet tabs (default true) */\n  showSheetTabs?: boolean;\n  /** Tab ratio (default 600) */\n  tabRatio?: number;\n  /** Include hidden rows/columns (default true) */\n  includeHiddenRowCol?: boolean;\n  /** Include print settings (default true) */\n  includePrintSettings?: boolean;\n  /** Personal view (default false) */\n  personalView?: boolean;\n  /** Maximized (default false) */\n  maximized?: boolean;\n  /** Minimized (default false) */\n  minimized?: boolean;\n  /** Auto update (CT_CustomWorkbookView @autoUpdate) */\n  autoUpdate?: boolean;\n  /** Merge interval (CT_CustomWorkbookView @mergeInterval) */\n  mergeInterval?: number;\n  /** Changes saved in window (CT_CustomWorkbookView @changesSavedWin) */\n  changesSavedWin?: boolean;\n  /** Only sync (CT_CustomWorkbookView @onlySync) */\n  onlySync?: boolean;\n  /** Show comments (CT_CustomWorkbookView @showComments) */\n  showComments?: string;\n}\n\nexport interface WorkbookProtectionOptions {\n  /** Lock workbook structure (add/delete/rename/move sheets) */\n  lockStructure?: boolean;\n  /** Lock workbook windows */\n  lockWindows?: boolean;\n  /** Lock revisions */\n  lockRevision?: boolean;\n  /** Plain-text password — legacy Excel hash computed automatically */\n  workbookPassword?: string;\n  /** Modern encryption: algorithm name (e.g. \"SHA-512\") */\n  workbookAlgorithmName?: string;\n  /** Modern encryption: base64-encoded hash value */\n  workbookHashValue?: string;\n  /** Modern encryption: base64-encoded salt value */\n  workbookSaltValue?: string;\n  /** Modern encryption: spin count */\n  workbookSpinCount?: number;\n  /** Revisions password (legacy) */\n  revisionsPassword?: string;\n  /** Revisions modern encryption: algorithm name */\n  revisionsAlgorithmName?: string;\n  /** Revisions modern encryption: base64-encoded hash value */\n  revisionsHashValue?: string;\n  /** Revisions modern encryption: base64-encoded salt value */\n  revisionsSaltValue?: string;\n  /** Revisions modern encryption: spin count */\n  revisionsSpinCount?: number;\n  /** Workbook password character set (CT_WorkbookProtection @workbookPasswordCharacterSet) */\n  workbookPasswordCharacterSet?: string;\n  /** Revisions password character set (CT_WorkbookProtection @revisionsPasswordCharacterSet) */\n  revisionsPasswordCharacterSet?: string;\n}\n\n/** Workbook conformance level (CT_Workbook @conformance) */\nexport type WorkbookConformance = \"strict\" | \"transitional\";\n\n/** File recovery properties (CT_FileRecoveryPr) */\nexport interface FileRecoveryPropertiesOptions {\n  /** Enable auto-recover (default true) */\n  autoRecover?: boolean;\n  /** Crash save (default false) */\n  crashSave?: boolean;\n  /** Data extract load (default false) */\n  dataExtractLoad?: boolean;\n  /** Repair load (default false) */\n  repairLoad?: boolean;\n}\n\n/** Web publishing properties (CT_WebPublishing) */\nexport interface WebPublishingOptions {\n  /** Use CSS (default true) */\n  css?: boolean;\n  /** Use thicket format (default true) */\n  thicket?: boolean;\n  /** Use long file names (default true) */\n  longFileNames?: boolean;\n  /** Use VML (default false) */\n  vml?: boolean;\n  /** Allow PNG (default false) */\n  allowPng?: boolean;\n  /** Target screen size (default \"800x600\") */\n  targetScreenSize?: string;\n  /** DPI (default 96) */\n  dpi?: number;\n  /** Code page */\n  codePage?: number;\n  /** Character set */\n  characterSet?: string;\n}\n\n/** File sharing properties (CT_FileSharing) */\nexport interface FileSharingOptions {\n  /** Recommend read-only mode (default false) */\n  readOnlyRecommended?: boolean;\n  /** User name who has the file locked */\n  userName?: string;\n  /** Legacy reservation password (hex) */\n  reservationPassword?: string;\n  /** Modern encryption: algorithm name */\n  algorithmName?: string;\n  /** Modern encryption: base64 hash value */\n  hashValue?: string;\n  /** Modern encryption: base64 salt value */\n  saltValue?: string;\n  /** Modern encryption: spin count */\n  spinCount?: number;\n}\n\n/** Workbook properties (CT_WorkbookPr) */\nexport interface WorkbookPropertiesOptions {\n  /** Use 1904 date system (default false) */\n  date1904?: boolean;\n  /** Default theme version */\n  defaultThemeVersion?: number;\n  /** Show objects: \"all\" | \"placeholders\" | \"none\" */\n  showObjects?: string;\n  /** Hide pivot field list (default false) */\n  hidePivotFieldList?: boolean;\n  /** Allow refresh queries (default false) */\n  allowRefreshQuery?: boolean;\n  /** Filter privacy (default false) */\n  filterPrivacy?: boolean;\n  /** Backup file (default false) */\n  backupFile?: boolean;\n  /** Code name */\n  codeName?: string;\n  /** Show border unselected tables (CT_WorkbookPr @showBorderUnselectedTables) */\n  showBorderUnselectedTables?: boolean;\n  /** Prompted solutions (CT_WorkbookPr @promptedSolutions) */\n  promptedSolutions?: boolean;\n  /** Show ink annotation (CT_WorkbookPr @showInkAnnotation) */\n  showInkAnnotation?: boolean;\n  /** Save external link values (CT_WorkbookPr @saveExternalLinkValues) */\n  saveExternalLinkValues?: boolean;\n  /** Update links mode (CT_WorkbookPr @updateLinks) */\n  updateLinks?: string;\n  /** Show pivot chart filter (CT_WorkbookPr @showPivotChartFilter) */\n  showPivotChartFilter?: boolean;\n  /** Publish items (CT_WorkbookPr @publishItems) */\n  publishItems?: boolean;\n  /** Check compatibility (CT_WorkbookPr @checkCompatibility) */\n  checkCompatibility?: boolean;\n  /** Auto compress pictures (CT_WorkbookPr @autoCompressPictures) */\n  autoCompressPictures?: boolean;\n  /** Refresh all connections (CT_WorkbookPr @refreshAllConnections) */\n  refreshAllConnections?: boolean;\n}\n\n/** Volatile type entry (CT_VolType) */\nexport interface VolTypeOptions {\n  /** Type of volatile dependency (default: \"realTimeData\") */\n  type?: \"realTimeData\" | \"olapFunctions\";\n  /** Main volatile dependencies (CT_VolMain, required) */\n  mains?: VolMainOptions[];\n}\n\n/** Main volatile dependency (CT_VolMain) */\nexport interface VolMainOptions {\n  /** First reference (required) */\n  first: string;\n  /** Volatile topics (CT_VolTopic) */\n  topics?: VolTopicOptions[];\n}\n\n/** Volatile topic (CT_VolTopic) */\nexport interface VolTopicOptions {\n  /** Topic value (required) */\n  value: string;\n  /** Value type (default: \"n\") */\n  valueType?: string;\n  /** String topics (stp elements) */\n  stringTopics?: string[];\n  /** Topic references (CT_VolTopicRef) */\n  refs?: VolTopicRefOptions[];\n}\n\n/** Volatile topic reference (CT_VolTopicRef) */\nexport interface VolTopicRefOptions {\n  /** Cell reference (required) */\n  reference: string;\n  /** Sheet index (required) */\n  sheetIndex: number;\n}\n\n/** Web publish object (CT_WebPublishObject) */\nexport interface WebPublishObjectOptions {\n  /** Relationship ID to the published item */\n  rId: string;\n  /** Destination file name */\n  destinationFile?: string;\n  /** Auto republish (default: false) */\n  autoRepublish?: boolean;\n  /** Title of the published item */\n  title?: string;\n  /** Source object reference */\n  sourceObject?: string;\n  /** App name (default: \"Excel\") */\n  appName?: string;\n}\n\n/** Calculation properties (CT_CalcPr) */\nexport interface CalculationPropertiesOptions {\n  /** Calculation mode: \"manual\" | \"auto\" | \"autoNoTable\" */\n  calcMode?: string;\n  /** Calc ID (default 162913) */\n  calcId?: number;\n  /** Full calc on load (default false) */\n  fullCalcOnLoad?: boolean;\n  /** Calc on save (default true) */\n  calcOnSave?: boolean;\n  /** Force full calc */\n  forceFullCalc?: boolean;\n  /** Concurrent calc (default true) */\n  concurrentCalc?: boolean;\n  /** Concurrent manual count */\n  concurrentManualCount?: number;\n  /** Iterate (default false) */\n  iterate?: boolean;\n  /** Iterate count (default 100) */\n  iterateCount?: number;\n  /** Iterate delta (default 0.001) */\n  iterateDelta?: number;\n  /** Reference mode: \"A1\" | \"R1C1\" */\n  refMode?: string;\n  /** Full precision (default true) */\n  fullPrecision?: boolean;\n  /** Calc completed (CT_CalcPr @calcCompleted) */\n  calcCompleted?: boolean;\n}\n\n/** Workbook view options (CT_BookView) */\nexport interface WorkbookViewOptions {\n  /** Active tab index (0-based) */\n  activeTab?: number;\n  /** Auto filter date grouping (default true) */\n  autoFilterDateGrouping?: boolean;\n  /** First sheet tab */\n  firstSheet?: number;\n  /** Show horizontal scroll (default true) */\n  showHorizontalScroll?: boolean;\n  /** Show sheet tabs (default true) */\n  showSheetTabs?: boolean;\n  /** Show vertical scroll (default true) */\n  showVerticalScroll?: boolean;\n  /** Tab ratio (default 600) */\n  tabRatio?: number;\n  /** Window width in twips */\n  windowWidth?: number;\n  /** Window height in twips */\n  windowHeight?: number;\n  /** X position of the window */\n  xWindow?: number;\n  /** Y position of the window */\n  yWindow?: number;\n}\n\n// ── Descriptor Types ──\n\nexport interface WorkbookDescriptorOptions {\n  sheets: SheetDefinition[];\n  pivotCaches?: PivotCacheReference[];\n  protection?: WorkbookProtectionOptions;\n  customViews?: CustomWorkbookViewOptions[];\n  fileRecoveryPr?: FileRecoveryPropertiesOptions;\n  functionGroups?: string[];\n  webPublishing?: WebPublishingOptions;\n  fileSharing?: FileSharingOptions;\n  workbookPr?: WorkbookPropertiesOptions;\n  calcPr?: CalculationPropertiesOptions;\n  bookView?: WorkbookViewOptions;\n  volTypes?: VolTypeOptions[];\n  webPublishObjects?: WebPublishObjectOptions[];\n  conformance?: WorkbookConformance;\n}\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    // 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 (attr(protEl, \"lockStructure\") === \"1\") prot.lockStructure = true;\n      if (attr(protEl, \"lockWindows\") === \"1\") prot.lockWindows = true;\n      if (attr(protEl, \"lockRevision\") === \"1\") 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 (attr(bvEl, \"autoFilterDateGrouping\") === \"0\") bv.autoFilterDateGrouping = false;\n        const fs = attrNum(bvEl, \"firstSheet\");\n        if (fs !== undefined) bv.firstSheet = fs;\n        if (attr(bvEl, \"showHorizontalScroll\") === \"0\") bv.showHorizontalScroll = false;\n        if (attr(bvEl, \"showVerticalScroll\") === \"0\") bv.showVerticalScroll = false;\n        if (attr(bvEl, \"showSheetTabs\") === \"0\") bv.showSheetTabs = false;\n        const tr = attrNum(bvEl, \"tabRatio\");\n        if (tr !== undefined) bv.tabRatio = tr;\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 (attr(calcPrEl, \"fullCalcOnLoad\") === \"1\") calc.fullCalcOnLoad = true;\n      if (attr(calcPrEl, \"concurrentCalc\") === \"0\") calc.concurrentCalc = false;\n      if (attr(calcPrEl, \"refMode\")) calc.refMode = attr(calcPrEl, \"refMode\");\n      if (attr(calcPrEl, \"calcOnSave\") === \"0\") calc.calcOnSave = false;\n      if (attr(calcPrEl, \"forceFullCalc\") === \"1\") calc.forceFullCalc = true;\n      const cmc = attrNum(calcPrEl, \"concurrentManualCount\");\n      if (cmc !== undefined) calc.concurrentManualCount = cmc;\n      if (attr(calcPrEl, \"iterate\") === \"1\") 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 (attr(calcPrEl, \"fullPrecision\") === \"0\") calc.fullPrecision = false;\n      if (attr(calcPrEl, \"calcCompleted\") === \"1\") 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 (attr(v, \"showFormulaBar\") === \"0\") view.showFormulaBar = false;\n        if (attr(v, \"showStatusbar\") === \"0\") view.showStatusbar = false;\n        if (attr(v, \"showHorizontalScroll\") === \"0\") view.showHorizontalScroll = false;\n        if (attr(v, \"showVerticalScroll\") === \"0\") view.showVerticalScroll = false;\n        if (attr(v, \"showSheetTabs\") === \"0\") view.showSheetTabs = false;\n        const tabRatio = attrNum(v, \"tabRatio\");\n        if (tabRatio !== undefined) view.tabRatio = tabRatio;\n        if (attr(v, \"includeHiddenRowCol\") === \"0\") view.includeHiddenRowCol = false;\n        if (attr(v, \"includePrintSettings\") === \"0\") view.includePrintSettings = false;\n        if (attr(v, \"personalView\") === \"1\") view.personalView = true;\n        if (attr(v, \"maximized\") === \"1\") view.maximized = true;\n        if (attr(v, \"minimized\") === \"1\") view.minimized = true;\n        if (attr(v, \"autoUpdate\") === \"1\") view.autoUpdate = true;\n        const mi = attrNum(v, \"mergeInterval\");\n        if (mi !== undefined) view.mergeInterval = mi;\n        if (attr(v, \"changesSavedWin\") === \"1\") view.changesSavedWin = true;\n        if (attr(v, \"onlySync\") === \"1\") 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 (attr(fileSharingEl, \"readOnlyRecommended\") === \"1\") 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 (attr(webPublishingEl, \"css\") === \"0\") wp.css = false;\n      if (attr(webPublishingEl, \"thicket\") === \"0\") wp.thicket = false;\n      if (attr(webPublishingEl, \"longFileNames\") === \"0\") wp.longFileNames = false;\n      if (attr(webPublishingEl, \"vml\") === \"1\") wp.vml = true;\n      if (attr(webPublishingEl, \"allowPng\") === \"1\") 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 (attr(fileRecoveryEl, \"autoRecover\") === \"0\") frp.autoRecover = false;\n      if (attr(fileRecoveryEl, \"crashSave\") === \"1\") frp.crashSave = true;\n      if (attr(fileRecoveryEl, \"dataExtractLoad\") === \"1\") frp.dataExtractLoad = true;\n      if (attr(fileRecoveryEl, \"repairLoad\") === \"1\") 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 (attr(wbPrEl, \"date1904\") === \"1\") 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 (attr(wbPrEl, \"hidePivotFieldList\") === \"1\") wbPr.hidePivotFieldList = true;\n      if (attr(wbPrEl, \"allowRefreshQuery\") === \"1\") wbPr.allowRefreshQuery = true;\n      if (attr(wbPrEl, \"filterPrivacy\") === \"1\") wbPr.filterPrivacy = true;\n      if (attr(wbPrEl, \"backupFile\") === \"1\") wbPr.backupFile = true;\n      if (attr(wbPrEl, \"codeName\")) wbPr.codeName = attr(wbPrEl, \"codeName\");\n      if (attr(wbPrEl, \"showBorderUnselectedTables\") === \"1\")\n        wbPr.showBorderUnselectedTables = true;\n      if (attr(wbPrEl, \"promptedSolutions\") === \"1\") wbPr.promptedSolutions = true;\n      if (attr(wbPrEl, \"showInkAnnotation\") === \"0\") wbPr.showInkAnnotation = false;\n      if (attr(wbPrEl, \"saveExternalLinkValues\") === \"0\") wbPr.saveExternalLinkValues = false;\n      if (attr(wbPrEl, \"updateLinks\")) wbPr.updateLinks = attr(wbPrEl, \"updateLinks\");\n      if (attr(wbPrEl, \"showPivotChartFilter\") === \"1\") wbPr.showPivotChartFilter = true;\n      if (attr(wbPrEl, \"publishItems\") === \"1\") wbPr.publishItems = true;\n      if (attr(wbPrEl, \"checkCompatibility\") === \"1\") wbPr.checkCompatibility = true;\n      if (attr(wbPrEl, \"autoCompressPictures\") === \"0\") wbPr.autoCompressPictures = false;\n      if (attr(wbPrEl, \"refreshAllConnections\") === \"1\") 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 (attr(wo, \"autoRepublish\") === \"1\") obj.autoRepublish = true;\n        if (attr(wo, \"title\")) obj.title = attr(wo, \"title\");\n        if (attr(wo, \"sourceObject\")) obj.sourceObject = attr(wo, \"sourceObject\");\n        if (attr(wo, \"appName\")) obj.appName = attr(wo, \"appName\");\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    // 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// ── Stringify helpers ──\n\nfunction 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    '<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    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  // Calculation properties\n  if (opts.calcPr) {\n    const cp = opts.calcPr;\n    const cpAttrs: string[] = [];\n    cpAttrs.push(`calcId=\"${cp.calcId ?? 162913}\"`);\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=\"162913\"/>');\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  // Web publishing (after pivotCaches, 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/** Legacy Excel password hash (XOR-based) */\nfunction 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 * 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 { attr, escapeXml, findChild, children, textOf } from \"@office-open/xml\";\nimport type { Element as XmlElement } from \"@office-open/xml\";\n\nconst S_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst R_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\n\n// ── Revision row/column action (ST_rwColActionType, sml.xsd:2076) ──\n\nexport type RowColumnAction = \"insertRow\" | \"deleteRow\" | \"insertCol\" | \"deleteCol\";\n\n/** Revision action for comments / custom views (ST_RevisionAction, sml.xsd:2084). */\nexport type RevisionAction = \"add\" | \"delete\";\n\n// ════════════════════════════════════════════════════════════════════════════\n// Revision Headers — xl/revisionHeaders.xml (CT_RevisionHeaders)\n// ════════════════════════════════════════════════════════════════════════════\n\n/** One header entry (CT_RevisionHeader, sml.xsd:1898). */\nexport interface RevisionHeaderEntry {\n  /** Unique GUID for this revision (required, ST_Guid). */\n  guid: string;\n  /** Date/time of the revision (required, xsd:dateTime). */\n  dateTime: string;\n  /** User who made the revision (required, ST_Xstring). */\n  userName: string;\n  /** Relationship ID pointing to the revision log file (required, r:id). */\n  rId: string;\n  /** Max sheet ID at the time of revision (required). */\n  maxSheetId: number;\n  /** Sheet ID map entries (required, ≥1). */\n  sheetIds: number[];\n  /** Reviewed revision IDs (reviewedList.reviewed[].rId, optional). */\n  reviewed?: number[];\n  /** Minimum revision ID (optional). */\n  minRId?: number;\n  /** Maximum revision ID (optional). */\n  maxRId?: number;\n}\n\n/** Options for xl/revisionHeaders.xml (CT_RevisionHeaders, sml.xsd:1860). */\nexport interface RevisionHeadersOptions {\n  /** Unique GUID for the headers collection (required). */\n  guid: string;\n  /** Revision header entries (required, ≥1). */\n  headers: RevisionHeaderEntry[];\n  /** Last GUID (optional). */\n  lastGuid?: string;\n  /** Shared workbook (default true). */\n  shared?: boolean;\n  /** Disk revisions (default false). */\n  diskRevisions?: boolean;\n  /** History kept (default true). */\n  history?: boolean;\n  /** Track revisions (default true). */\n  trackRevisions?: boolean;\n  /** Exclusive (default false). */\n  exclusive?: boolean;\n  /** Revision ID counter (default 0). */\n  revisionId?: number;\n  /** Version (default 1). */\n  version?: number;\n  /** Keep change history (default true). */\n  keepChangeHistory?: boolean;\n  /** Protected (default false). */\n  protected?: boolean;\n  /** Preserve history days (default 30). */\n  preserveHistory?: number;\n}\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// ════════════════════════════════════════════════════════════════════════════\n// Users — xl/users.xml (CT_Users, sml.xsd:2100)\n// ════════════════════════════════════════════════════════════════════════════\n\n/** One shared-workbook user (CT_SharedUser, sml.xsd:2106). */\nexport interface SharedUserOptions {\n  /** GUID (required, ST_Guid). */\n  guid: string;\n  /** User name (required, ST_Xstring). */\n  name: string;\n  /** User ID (required). */\n  id: number;\n  /** Date/time of last edit (required, xsd:dateTime). */\n  dateTime: string;\n}\n\n/** Options for xl/users.xml (CT_Users, sml.xsd:2100). */\nexport interface UsersOptions {\n  /** Shared-user entries (optional, ≤256). */\n  users?: SharedUserOptions[];\n}\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// ════════════════════════════════════════════════════════════════════════════\n// Revision Log — xl/revisions/revisionN.xml (CT_Revisions, sml.xsd:1877)\n// ════════════════════════════════════════════════════════════════════════════\n\n// AG_RevData (sml.xsd:1893): rId required, ua (undo), ra (rejected).\n// Present on: rrc, rm, rsnm, ris, rcc, rdn, rcft. Absent on: rcv, rfmt, raf, rcmt, rqt.\n\n/** Row/column insert/delete (CT_RevisionRowColumn, sml.xsd:1943). */\nexport interface RevisionRowColumnOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Sheet ID (sId, required). */\n  sheetId: number;\n  /** Affected range (required, ST_Ref). */\n  ref: string;\n  /** Insertion/deletion action (required). */\n  action: RowColumnAction;\n  /** End of list (eol, default false). */\n  endOfList?: boolean;\n  /** Edge tracking (default false). */\n  edge?: boolean;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n  /** Nested undo/rcc/rfmt children verbatim (optional). */\n  childrenXml?: string;\n}\n\n/** Cell move (CT_RevisionMove, sml.xsd:1956). */\nexport interface RevisionMoveOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Source range (required, ST_Ref). */\n  source: string;\n  /** Destination range (required, ST_Ref). */\n  destination: string;\n  /** Source sheet ID (default 0). */\n  sourceSheetId?: number;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n  /** Nested undo/rcc/rfmt children verbatim (optional). */\n  childrenXml?: string;\n}\n\n/** Custom view add/delete (CT_RevisionCustomView, sml.xsd:1968 — no AG_RevData). */\nexport interface RevisionCustomViewOptions {\n  /** GUID (required, ST_Guid). */\n  guid: string;\n  /** Action (required). */\n  action: RevisionAction;\n}\n\n/** Sheet rename (CT_RevisionSheetRename, sml.xsd:1972). */\nexport interface RevisionSheetRenameOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Old sheet name (required, ST_Xstring). */\n  oldName: string;\n  /** New sheet name (required, ST_Xstring). */\n  newName: string;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n}\n\n/** Sheet insertion (CT_RevisionInsertSheet, sml.xsd:1981). */\nexport interface RevisionInsertSheetOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Sheet name (required, ST_Xstring). */\n  name: string;\n  /** Sheet position (required). */\n  sheetPosition: number;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n}\n\n/** Cell value change (CT_RevisionCellChange, sml.xsd:1987). */\nexport interface RevisionCellChangeOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Sheet ID (sId, required). */\n  sheetId: number;\n  /** Has old differential format (odxf attr, default false). */\n  hasOldDxf?: boolean;\n  /** XF differential format (xfDxf, default false). */\n  xfDxf?: boolean;\n  /** Has style (s, default false). */\n  style?: boolean;\n  /** Has differential format (dxf attr, default false). */\n  hasDxf?: boolean;\n  /** Number format ID (optional). */\n  numFmtId?: number;\n  /** Quote prefix (default false). */\n  quotePrefix?: boolean;\n  /** Old quote prefix (default false). */\n  oldQuotePrefix?: boolean;\n  /** Phonetic (ph, default false). */\n  phonetic?: boolean;\n  /** Old phonetic (default false). */\n  oldPhonetic?: boolean;\n  /** End of list formula update (default false). */\n  endOfListFormulaUpdate?: boolean;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n  /** Old cell (oc) verbatim CT_Cell XML (optional). */\n  oldCellXml?: string;\n  /** New cell (nc) verbatim CT_Cell XML (required). */\n  newCellXml: string;\n  /** Old differential format (odxf) verbatim CT_Dxf XML (optional). */\n  oldDxfXml?: string;\n  /** New differential format (ndxf) verbatim CT_Dxf XML (optional). */\n  newDxfXml?: string;\n}\n\n/** Formatting change (CT_RevisionFormatting, sml.xsd:2008 — no AG_RevData). */\nexport interface RevisionFormattingOptions {\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Sequence of cell refs (sqref, required). */\n  sqref: string;\n  /** XF differential format (default false). */\n  xfDxf?: boolean;\n  /** Has style (s, default false). */\n  style?: boolean;\n  /** Start index (optional). */\n  start?: number;\n  /** Length (optional). */\n  length?: number;\n  /** Differential format (dxf) verbatim CT_Dxf XML (optional). */\n  dxfXml?: string;\n}\n\n/** Auto formatting (CT_RevisionAutoFormatting, sml.xsd:2020 — no AG_RevData). */\nexport interface RevisionAutoFormattingOptions {\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Affected range (required, ST_Ref). */\n  ref: string;\n  /** AG_AutoFormat attributes verbatim (optional, e.g. format/align/...). */\n  autoFormatXml?: string;\n}\n\n/** Defined name change (CT_RevisionDefinedName, sml.xsd:2038). */\nexport interface RevisionDefinedNameOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Defined name (required, ST_Xstring). */\n  name: string;\n  /** Local sheet ID (optional; -1 or omitted = workbook-global). */\n  localSheetId?: number;\n  /** Custom view (default false). */\n  customView?: boolean;\n  /** New formula expression (optional). */\n  formula?: string;\n  /** Old formula expression (optional). */\n  oldFormula?: string;\n  /** Is function (default false). */\n  function?: boolean;\n  /** Old function flag (default false). */\n  oldFunction?: boolean;\n  /** Function group ID (optional). */\n  functionGroupId?: number;\n  /** Old function group ID (optional). */\n  oldFunctionGroupId?: number;\n  /** Shortcut key (optional, unsignedByte). */\n  shortcutKey?: number;\n  /** Old shortcut key (optional, unsignedByte). */\n  oldShortcutKey?: number;\n  /** Hidden (default false). */\n  hidden?: boolean;\n  /** Old hidden flag (default false). */\n  oldHidden?: boolean;\n  /** Custom menu (optional). */\n  customMenu?: string;\n  /** Old custom menu (optional). */\n  oldCustomMenu?: string;\n  /** Description (optional). */\n  description?: string;\n  /** Old description (optional). */\n  oldDescription?: string;\n  /** Help text (optional). */\n  help?: string;\n  /** Old help text (optional). */\n  oldHelp?: string;\n  /** Status bar text (optional). */\n  statusBar?: string;\n  /** Old status bar text (optional). */\n  oldStatusBar?: string;\n  /** Comment (optional). */\n  comment?: string;\n  /** Old comment (optional). */\n  oldComment?: string;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n}\n\n/** Comment revision (CT_RevisionComment, sml.xsd:2025 — no AG_RevData). */\nexport interface RevisionCommentOptions {\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Cell reference (required, ST_CellRef). */\n  cell: string;\n  /** GUID (required, ST_Guid). */\n  guid: string;\n  /** Action (default add). */\n  action?: RevisionAction;\n  /** Always show (default false). */\n  alwaysShow?: boolean;\n  /** Old comment flag (default false). */\n  old?: boolean;\n  /** Hidden row (default false). */\n  hiddenRow?: boolean;\n  /** Hidden column (default false). */\n  hiddenColumn?: boolean;\n  /** Author (required, ST_Xstring). */\n  author: string;\n  /** Old text length (default 0). */\n  oldLength?: number;\n  /** New text length (default 0). */\n  newLength?: number;\n}\n\n/** Query table field change (CT_RevisionQueryTableField, sml.xsd:2071 — no AG_RevData). */\nexport interface RevisionQueryTableFieldOptions {\n  /** Sheet ID (required). */\n  sheetId: number;\n  /** Affected range (required, ST_Ref). */\n  ref: string;\n  /** Field ID (required). */\n  fieldId: number;\n}\n\n/** Conflict (CT_RevisionConflict, sml.xsd:2067). */\nexport interface RevisionConflictOptions {\n  /** Revision ID (AG_RevData rId, required). */\n  rId: number;\n  /** Revision was performed by an undo (ua). */\n  undo?: boolean;\n  /** Revision was rejected (ra). */\n  rejected?: boolean;\n  /** Sheet ID (optional). */\n  sheetId?: number;\n}\n\n/** Discriminated union of all CT_Revisions choice elements (sml.xsd:1877-1891). */\nexport type RevisionEntry =\n  | { type: \"rowColumn\"; data: RevisionRowColumnOptions }\n  | { type: \"move\"; data: RevisionMoveOptions }\n  | { type: \"customView\"; data: RevisionCustomViewOptions }\n  | { type: \"sheetRename\"; data: RevisionSheetRenameOptions }\n  | { type: \"insertSheet\"; data: RevisionInsertSheetOptions }\n  | { type: \"cellChange\"; data: RevisionCellChangeOptions }\n  | { type: \"formatting\"; data: RevisionFormattingOptions }\n  | { type: \"autoFormatting\"; data: RevisionAutoFormattingOptions }\n  | { type: \"definedName\"; data: RevisionDefinedNameOptions }\n  | { type: \"comment\"; data: RevisionCommentOptions }\n  | { type: \"queryTableField\"; data: RevisionQueryTableFieldOptions }\n  | { type: \"conflict\"; data: RevisionConflictOptions };\n\n/** Options for xl/revisions/revisionN.xml (CT_Revisions, sml.xsd:1877). */\nexport interface RevisionLogOptions {\n  /** Revision entries (the CT_Revisions choice sequence). */\n  revisions: RevisionEntry[];\n}\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 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}>${d.childrenXml ?? \"\"}</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}>${d.childrenXml ?? \"\"}</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\n// ── Per-revision parse ──\n\n/** Serializes an element's children back to a raw XML string (for rawXml passthrough). */\nfunction childrenToXml(el: XmlElement | null): string {\n  if (!el || !el.elements) return \"\";\n  // Re-emit element children verbatim via their name + attributes + text + nested.\n  return el.elements\n    .filter((c) => c.type === \"element\")\n    .map((c) => elementToXml(c as XmlElement))\n    .join(\"\");\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  return v === \"1\" || v === \"true\";\n}\n\nfunction 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 childrenXml = childrenToXml(el);\n      if (childrenXml) d.childrenXml = childrenXml;\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 childrenXml = childrenToXml(el);\n      if (childrenXml) d.childrenXml = childrenXml;\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\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: RevisionEntry[] = [];\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// ── Attribute readers (set-callback style keeps parse paths on concrete types) ──\n\nfunction readBool(el: XmlElement, name: string, set: (v: boolean) => void): void {\n  const raw = attr(el, name);\n  if (raw === \"1\" || raw === \"true\") set(true);\n}\n\nfunction 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\nfunction 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 * Content Types module for XLSX packages.\n *\n * @module\n */\n\nconst XLSX_MAIN = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\";\nconst XLSX_WORKSHEET = \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\";\nconst XLSX_CHARTSHEET =\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\";\nconst XLSX_STYLES = \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\";\nconst XLSX_SHARED_STRINGS =\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\";\nconst XLSX_THEME = \"application/vnd.openxmlformats-officedocument.theme+xml\";\nconst XLSX_CHART = \"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\";\nconst CUSTOM_PROPS = \"application/vnd.openxmlformats-officedocument.custom-properties+xml\";\n\ntype EntryType = \"Default\" | \"Override\";\n\ninterface ContentEntry {\n  type: EntryType;\n  contentType: string;\n  key: string;\n}\n\nconst STATIC_ENTRIES: ContentEntry[] = [\n  {\n    type: \"Default\",\n    contentType: \"application/vnd.openxmlformats-package.relationships+xml\",\n    key: \"rels\",\n  },\n  { type: \"Default\", contentType: \"application/xml\", key: \"xml\" },\n  { type: \"Override\", contentType: XLSX_MAIN, key: \"/xl/workbook.xml\" },\n  {\n    type: \"Override\",\n    contentType: \"application/vnd.openxmlformats-package.core-properties+xml\",\n    key: \"/docProps/core.xml\",\n  },\n  {\n    type: \"Override\",\n    contentType: \"application/vnd.openxmlformats-officedocument.extended-properties+xml\",\n    key: \"/docProps/app.xml\",\n  },\n];\n\n// Pre-compiled static XML fragment (module-level constant)\nconst STATIC_XML = STATIC_ENTRIES.map((e) =>\n  e.type === \"Default\"\n    ? `<Default ContentType=\"${e.contentType}\" Extension=\"${e.key}\"/>`\n    : `<Override ContentType=\"${e.contentType}\" PartName=\"${e.key}\"/>`,\n).join(\"\");\n\nexport class ContentTypes {\n  private dynamicEntries: ContentEntry[] = [];\n\n  public addWorksheet(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: XLSX_WORKSHEET,\n      key: `/xl/worksheets/sheet${index}.xml`,\n    });\n  }\n\n  public addChartsheet(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: XLSX_CHARTSHEET,\n      key: `/xl/chartsheets/sheet${index}.xml`,\n    });\n  }\n\n  public addStyles(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: XLSX_STYLES,\n      key: \"/xl/styles.xml\",\n    });\n  }\n\n  public addSharedStrings(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: XLSX_SHARED_STRINGS,\n      key: \"/xl/sharedStrings.xml\",\n    });\n  }\n\n  public addTheme(index: number = 1): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: XLSX_THEME,\n      key: `/xl/theme/theme${index}.xml`,\n    });\n  }\n\n  public addCustomProperties(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: CUSTOM_PROPS,\n      key: \"/docProps/custom.xml\",\n    });\n  }\n\n  public addChart(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: XLSX_CHART,\n      key: `/xl/charts/chart${index}.xml`,\n    });\n  }\n\n  public addDrawing(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.drawing+xml\",\n      key: `/xl/drawings/drawing${index}.xml`,\n    });\n  }\n\n  public addComments(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\",\n      key: `/xl/comments${index}.xml`,\n    });\n  }\n\n  public addVmlDrawing(): void {\n    if (this.dynamicEntries.some((e) => e.type === \"Default\" && e.key === \"vml\")) return;\n    this.dynamicEntries.push({\n      type: \"Default\",\n      contentType: \"application/vnd.openxmlformats-officedocument.vmlDrawing\",\n      key: \"vml\",\n    });\n  }\n\n  public addImageType(extension: \"png\" | \"jpeg\"): void {\n    const contentType = extension === \"png\" ? \"image/png\" : \"image/jpeg\";\n    if (this.dynamicEntries.some((e) => e.type === \"Default\" && e.key === extension)) return;\n    this.dynamicEntries.push({ type: \"Default\", contentType, key: extension });\n  }\n\n  public addPivotTable(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\",\n      key: `/xl/pivotTables/pivotTable${index}.xml`,\n    });\n  }\n\n  public addPivotCacheDefinition(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType:\n        \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\",\n      key: `/xl/pivotCache/pivotCacheDefinition${index}.xml`,\n    });\n  }\n\n  public addPivotCacheRecords(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType:\n        \"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\",\n      key: `/xl/pivotCache/pivotCacheRecords${index}.xml`,\n    });\n  }\n\n  public addTable(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\",\n      key: `/xl/tables/table${index}.xml`,\n    });\n  }\n\n  public addExternalLink(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\",\n      key: `/xl/externalLinks/externalLink${index}.xml`,\n    });\n  }\n\n  public addCalcChain(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\",\n      key: \"/xl/calcChain.xml\",\n    });\n  }\n\n  public addDialogsheet(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\",\n      key: `/xl/dialogsheets/sheet${index}.xml`,\n    });\n  }\n\n  public addRevisionHeaders(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType:\n        \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\",\n      key: \"/xl/revisionHeaders.xml\",\n    });\n  }\n\n  public addRevisionLog(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\",\n      key: `/xl/revisions/revision${index}.xml`,\n    });\n  }\n\n  public addUsers(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.users+xml\",\n      key: \"/xl/users.xml\",\n    });\n  }\n\n  public addQueryTable(index: number): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\",\n      key: `/xl/queryTables/queryTable${index}.xml`,\n    });\n  }\n\n  public addMetadata(): void {\n    this.dynamicEntries.push({\n      type: \"Override\",\n      contentType: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\",\n      key: \"/xl/metadata.xml\",\n    });\n  }\n\n  public serialize(): string {\n    const p: string[] = [\n      '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">',\n      STATIC_XML,\n    ];\n    for (const e of this.dynamicEntries) {\n      if (e.type === \"Default\") {\n        p.push(`<Default ContentType=\"${e.contentType}\" Extension=\"${e.key}\"/>`);\n      } else {\n        p.push(`<Override ContentType=\"${e.contentType}\" PartName=\"${e.key}\"/>`);\n      }\n    }\n    p.push(\"</Types>\");\n    return p.join(\"\");\n  }\n}\n","/**\n * XLSX compile context — write and read contexts for the descriptor pipeline.\n *\n * @module\n */\n\nimport { ChartCollection, Relationships, type RelationshipType } from \"@office-open/core\";\nimport type { ReadContext, WriteContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { ContentTypes } from \"@parts/content-types\";\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 class XlsxWriteContext implements WriteContext {\n  sharedStrings = new SharedStrings();\n  styles = new Styles();\n  media = new Media<MediaData>();\n  charts = new ChartCollection();\n  contentTypes = new ContentTypes();\n  workbookRels = new Relationships();\n  pivotCacheRefs: PivotCacheReference[] = [];\n\n  // ── WriteContext stubs (core interface) ──\n\n  public addRelationship(type: RelationshipType, target: string, _mode?: string): string {\n    const id = this.workbookRels.relationshipCount + 1;\n    this.workbookRels.addRelationship(id, type, target);\n    return `rId${id}`;\n  }\n\n  public addMedia(_data: Uint8Array, _type: string): string {\n    // Stub — XLSX media registration goes through Media.addMedia() in compiler.\n    return \"\";\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\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 = wsPathToRelsPath(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 resolveWsTarget(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 = wsPathToRelsPath(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: resolveWsTarget(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// ── Worksheet rels helpers ──\n\n/** Derive rels path from worksheet path. */\nfunction wsPathToRelsPath(wsPath: string): string {\n  // \"xl/worksheets/sheet1.xml\" → \"xl/worksheets/_rels/sheet1.xml.rels\"\n  const idx = wsPath.lastIndexOf(\"/\");\n  const dir = wsPath.substring(0, idx);\n  const file = wsPath.substring(idx + 1);\n  return `${dir}/_rels/${file}.rels`;\n}\n\n/** Resolve a relative target from a worksheet rels file to an absolute archive path. */\nfunction resolveWsTarget(wsPath: string, target: string): string {\n  if (target.startsWith(\"/\")) return target.slice(1);\n  // Target is relative to the worksheet's directory, e.g. \"../comments1.xml\" from \"xl/worksheets/\"\n  const wsDir = wsPath.substring(0, wsPath.lastIndexOf(\"/\"));\n  const parts = target.split(\"/\");\n  const dirParts = wsDir.split(\"/\");\n  for (const part of parts) {\n    if (part === \"..\") {\n      dirParts.pop();\n    } else {\n      dirParts.push(part);\n    }\n  }\n  return dirParts.join(\"/\");\n}\n"],"mappings":";;;;AAiKA,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,GAAwB;CACvC,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;AAgJA,IAAa,SAAb,MAAoB;CAClB,QAA+B,CAC7B;EAAE,MAAM;EAAI,MAAM;CAAU,CAC9B;CACA,2BAAmB,IAAI,IAAoB;CAE3C,QAA+B,CAC7B,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;CAE7C,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;;;;;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,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,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,KACA,wGACF;EAGA,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,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,OAAO,MAAM,KAAK,iBAAiB,EAAE,MAAM,IAAI;EACrD,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;AAWA,MAAa,aAAkF;CAC7F,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,KAAK,OAAO,UAAU;CAC/B;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAA4B,CAAC;EAGnC,MAAM,YAAY,UAAU,IAAI,SAAS;EACzC,IAAI,WAAW;GACb,MAAM,6BAAa,IAAI,IAAoB;GAC3C,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,MAAM,QAAuB,CAAC;GAC9B,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,MAAM,QAAuB,CAAC;GAC9B,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,MAAM,UAA+B,CAAC;GACtC,KAAK,MAAM,KAAK,UAAU,YAAY,CAAC,GAAG;IACxC,IAAI,EAAE,SAAS,UAAU;IACzB,QAAQ,KAAK,YAAY,CAAC,CAAC;GAC7B;GACA,OAAO,UAAU;EACnB;EAGA,MAAM,iBAAiB,UAAU,IAAI,cAAc;EACnD,IAAI,gBAAgB;GAClB,MAAM,MAAwB,CAAC;GAC/B,KAAK,MAAM,MAAM,eAAe,YAAY,CAAC,GAAG;IAC9C,IAAI,GAAG,SAAS,MAAM;IACtB,MAAM,QAAwB,CAAC;IAC/B,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,GAAW,MAAM,SAAS;IACzC,IAAI,WAAW,KAAA,GAAW,MAAM,SAAS;IACzC,IAAI,aAAa,KAAA,GAAW,MAAM,WAAW;IAC7C,IAAI,aAAa,KAAA,GAAW,MAAM,WAAW;IAC7C,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;IACnC,IAAI,KAAK,IAAI,aAAa,MAAM,KAAK,MAAM,cAAc;IACzD,IAAI,KAAK,IAAI,aAAa,MAAM,KAAK,MAAM,cAAc;IAEzD,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,KAAK,IAAI,eAAe,MAAM,KAAK,MAAM,gBAAgB;IAC7D,IAAI,KAAK,IAAI,QAAQ,MAAM,KAAK,MAAM,SAAS;IAC/C,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,KAAK,KAAK,OAAO,MAAM,KAAK,MAAM,QAAQ;IAC9C,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,KAAK,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS;KAClD,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,KAAK,GAAG,KAAK;KACzB,IAAI,KAAK,IAAI,KAAK,IAAI,WAAW,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG;IACzD;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;AAIA,SAAS,UAAU,IAA6B;CAC9C,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;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,SAAS,UAAU,IAA6B;CAC9C,MAAM,cAAc,UAAU,IAAI,aAAa;CAC/C,IAAI,aAAa;EACf,MAAM,SAAsB,CAAC;EAC7B,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,SAAsB,EAAE,MAAM,WAAW;EAC/C,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,QAA+B,CAAC;EACtC,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,SAAS,YAAY,IAAmC;CACtD,MAAM,SAA4B,CAAC;CACnC,IAAI,KAAK,IAAI,YAAY,MAAM,KAAK,OAAO,aAAa;CACxD,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;CAE5D,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,SAAS,eAAe,IAAkC;CACxD,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,KAAK,IAAI,UAAU,MAAM,KAAK,OAAO,WAAW;CACpD,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,KAAK,IAAI,iBAAiB,MAAM,KAAK,OAAO,kBAAkB;CAClE,IAAI,KAAK,IAAI,aAAa,MAAM,KAAK,OAAO,cAAc;CAC1D,MAAM,eAAe,QAAQ,IAAI,cAAc;CAC/C,IAAI,iBAAiB,KAAA,GAAW,OAAO,eAAe;CACtD,OAAO;AACT;AAEA,SAAS,gBAAgB,IAAuC;CAC9D,MAAM,SAAyC,CAAC;CAChD,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS,WAAW;CACrD,MAAM,SAAS,KAAK,IAAI,QAAQ;CAChC,IAAI,WAAW,KAAA,GAAW,OAAO,SAAS,WAAW;CACrD,OAAO;AACT;AAEA,SAAS,cAAc,IAAoC;CACzD,MAAM,MAAM,KAAK,IAAI,KAAK;CAC1B,IAAI,KAEF,OAAO,IAAI,WAAW,IAAI,IAAI,MAAM,CAAC,IAAI;AAG7C;;;ACvsCA,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,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,MAAM,KAAK,IAAI;GACjB;EACF;EACA,OAAO,QAAQ;EACf,OAAO;CACT;AACF;;;AC6BA,MAAa,iBAAgE;CAC3E,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,IAAc,CAClB,kKAEF;EAGA,IAAI,KAAK,YAAY,KAAK,WAAW;GACnC,MAAM,UAAoB,CAAC;GAC3B,IAAI,KAAK,UAAU,QAAQ,KAAK,YAAY,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,EAAE,GAAG;GAC7E,MAAM,SAAS,KAAK,YAAY,qBAAmB;GACnD,EAAE,KAAK,WAAW,OAAO,GAAG,QAAQ,KAAK,EAAE,EAAE,WAAW;EAC1D;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;EAGtD,MAAM,UAAU,UAAU,IAAI,SAAS;EACvC,IAAI,SAAS;GACX,IAAI,QAAQ,aAAa,iBAAiB,KAAK,OAAO,YAAY;GAClE,MAAM,WAAW,UAAU,SAAS,UAAU;GAC9C,IAAI,UAAU,aAAa,QAAQ,OAAO,WAAW,OAAO,SAAS,WAAW,MAAM;EACxF;EAGA,MAAM,aAAa,UAAU,IAAI,YAAY;EAC7C,IAAI;OACS,UAAU,YAAY,WAC5B,CAAC,EAAE,aAAa,iBAAiB,KAAK,OAAO,YAAY;EAAA;EAGhE,OAAO;CACT;AACF;;;;;;;;;;;;AC9IA,MAAa,eAAe;CAC1B,SAAS;CACT,SAAS;CACT,UAAU;AACZ;;AAIA,MAAa,gBAAgB;CAC3B,SAAS;CACT,SAAS;CACT,UAAU;AACZ;AAgEA,MAAM,SAAS;AACf,MAAM,OAAO;AACb,MAAMA,SAAO;AACb,MAAM,QAAQ;AAEd,MAAM,oBAAoB;AAC1B,MAAM,oBAAoB;AAI1B,MAAa,cAAgD;CAC3D,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,MAAM,SAAS,KAAK,UAAU,CAAC;EAC/B,IAAI,OAAO,WAAW,KAAK,OAAO,WAAW,GAAG,OAAO,KAAA;EAEvD,MAAM,IAAc,CAAC,gBAAgB,OAAO,aAAa,KAAK,aAAaA,OAAK,GAAG;EACnF,IAAI,KAAK;EAET,KAAK,MAAM,OAAO,QAAQ;GACxB,EAAE,KAAK,eAAe,KAAK,EAAE,CAAC;GAC9B;EACF;EAEA,KAAK,MAAM,SAAS,QAAQ;GAC1B,EAAE,KAAK,eAAe,OAAO,EAAE,CAAC;GAChC;EACF;EAEA,EAAE,KAAK,SAAS;EAChB,OAAO,EAAE,KAAK,EAAE;CAClB;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAAkC,CAAC;EACzC,MAAM,SAAgC,CAAC;EACvC,MAAM,SAAgC,CAAC;EAEvC,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;GAC9B;EACF;EAEA,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACvC,IAAI,OAAO,SAAS,GAAG,OAAO,SAAS;EACvC,OAAO;CACT;AACF;;AAKA,SAAS,UACP,KACA,QACA,KACA,QACQ;CACR,OAAO,QAAQ,MAAM,EAAE,gBAAgB,aAAa,MAAM,EAAE,gBAAgB,MAAM,EAAE,gBAAgB,aAAa,MAAM,EAAE;AAC3H;AAEA,SAAS,cAAc,KAAsE;CAG3F,OAAO,gCAFO,IAAI,mBAAmB,QAAQ,IAAI,EAEJ,sBAD9B,IAAI,oBAAoB,QAAQ,IAAI,EACuB;AAC5E;AAEA,SAAS,OAAO,KAAa,IAAY,IAAY,IAAoB;CACvE,OACE,4BAA4B,GAAG,kBAAkB,GAAG,8EACtB,IAAI,iGACc,GAAG,QAAQ,GAAG;AAGlE;AAEA,SAAS,eAAe,KAA0B,IAAoB;CACpE,MAAM,aAAa,IAAI,cAAc,aAAa;CAClD,MAAM,KAAK,aAAa,IAAI,YAAY,iBAAiB;CACzD,MAAM,KAAK,aAAa,IAAI,YAAY,iBAAiB;CACzD,MAAM,MAAM,OAAO,IAAI,KAAK,IAAI,IAAI,EAAE;CACtC,MAAM,aAAa,cAAc,GAAG;CAEpC,IAAI,eAAe,aAAa,UAG9B,OACE,2BAHQ,aAAa,IAAI,aAAa,CAGX,EAAE,OAFrB,aAAa,IAAI,aAAa,CAEF,EAAE,cAAc,GAAG,QAAQ,GAAG,KAC/D,MAAM,WAAW;CAIxB,MAAM,OAAO,UAAU,IAAI,KAAK,IAAI,aAAa,GAAG,IAAI,KAAK,IAAI,aAAa,CAAC;CAE/E,IAAI,eAAe,aAAa,SAC9B,OACE,wBAAwB,KAAK,kBAAkB,GAAG,QAAQ,GAAG,KAC1D,MAAM,WAAW;CAYxB,OACE,0BARa,IAAI,UAAU,cAAc,QAQR,UAAU,KAAK,aAPvC,UACT,IAAI,SAAS,IAAI,MAAM,GACvB,IAAI,eAAe,GACnB,IAAI,SAAS,IAAI,MAAM,GACvB,IAAI,eAAe,CAG2C,EAAE,OAC7D,MAAM,WAAW;AAExB;AAEA,SAAS,eAAe,OAA4B,IAAoB;CAEtE,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;CACtC,OACE,yCAAyC,KAAK,aAAa,GAAG,kDAChB,GAAG,gBAAgB,GAAG,qLAGlC,MAAM,uFAC8CA,OAAK,UAAU,MAAM,IAAI,gDACjE,WAAW;AAE7D;AAIA,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;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,SAAS,iBAAiB,QAAoB,KAAiB,MAAmC;CAChG,MAAM,SAA8B;EAClC,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;CAGhD,MAAM,aAAa,UAAU,QAAQ,YAAY;CACjD,IAAI,YAAY,YAAY;EAC1B,IAAI,WAAW,WAAW,uBAAuB,KAAA,GAC/C,OAAO,iBAAiB,WAAW,WAAW,uBAAuB;EAEvE,IAAI,WAAW,WAAW,wBAAwB,KAAA,GAChD,OAAO,kBAAkB,WAAW,WAAW,wBAAwB;CAE3E;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,OAAO;CACT;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,OAAO;CACT;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;CAE5B,OAAO;AACT;AAEA,SAAS,iBACP,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,uBAAuB;EAEvE,IAAI,WAAW,WAAW,wBAAwB,KAAA,GAChD,OAAO,kBAAkB,WAAW,WAAW,wBAAwB;CAE3E;CACA,OAAO;AACT;;;AC5UA,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,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,SAAS,KAAK,SAAS,UAAU,UAAU,KAAK,MAAM,EAAE,KAAK;GACnE,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,QAAQ,UAAU,KAAK,cAAY;KAC5C,IAAI,KAAK,QAAQ,UAAU,KAAK,cAAY;KAC5C,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,OAAO,GAAG,YAAY,KAAK,EAAE,EAAE,WAAW;QAE5D,EAAE,KAAK,WAAW,OAAO,GAAG;EAEhC;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,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,CAAC;GAC7B,IAAI,MAAM,aAAa,SAAS,OAAO,SAAS,OAAO,MAAM,WAAW,OAAO;GAE/E,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,WAAW,KAAK,SAAS;KAChD,IAAI,MAAM,aAAa,WAAW,KAAK,SAAS;KAChD,MAAM,KAAK,IAAI;IACjB;IACA,IAAI,MAAM,SAAS,GAAG,IAAI,WAAW;GACvC;GAEA,OAAO,UAAU;EACnB;EAEA,OAAO;CACT;AACF;;;;ACjMA,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;;;;AAgrBA,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;;;ACjtBA,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,KAAK,IAAI,YAAY,MAAM,KAAK,OAAO,aAAa;EACxD,IAAI,KAAK,IAAI,aAAa,MAAM,KAAK,OAAO,cAAc;EAC1D,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;EAC5D,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;EAC5D,IAAI,KAAK,IAAI,mBAAmB,GAAG,OAAO,oBAAoB,KAAK,IAAI,mBAAmB;EAC1F,IAAI,KAAK,IAAI,cAAc,GAAG,OAAO,eAAe,KAAK,IAAI,cAAc;EAC3E,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EACtD,IAAI,KAAK,IAAI,gBAAgB,GAAG,OAAO,iBAAiB,KAAK,IAAI,gBAAgB;EACjF,IAAI,KAAK,IAAI,aAAa,MAAM,KAAK,OAAO,cAAc;EAC1D,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,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EACtD,IAAI,KAAK,IAAI,UAAU,MAAM,KAAK,OAAO,WAAW;EACpD,IAAI,KAAK,IAAI,kBAAkB,MAAM,KAAK,OAAO,mBAAmB;EACpE,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;EAC5D,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;EAC5D,IAAI,KAAK,IAAI,mBAAmB,MAAM,KAAK,OAAO,oBAAoB;EACtE,IAAI,KAAK,IAAI,kBAAkB,MAAM,KAAK,OAAO,mBAAmB;EACpE,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EACtD,IAAI,KAAK,IAAI,YAAY,MAAM,KAAK,OAAO,aAAa;EACxD,IAAI,KAAK,IAAI,wBAAwB,MAAM,KAAK,OAAO,yBAAyB;EAChF,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;EAC5D,IAAI,KAAK,IAAI,cAAc,MAAM,KAAK,OAAO,eAAe;EAC5D,IAAI,KAAK,IAAI,aAAa,MAAM,KAAK,OAAO,cAAc;EAC1D,IAAI,KAAK,IAAI,uBAAuB,MAAM,KAAK,OAAO,wBAAwB;EAC9E,MAAM,WAAW,QAAQ,IAAI,UAAU;EACvC,IAAI,aAAa,KAAA,GAAW,OAAO,WAAW;EAC9C,IAAI,KAAK,IAAI,kBAAkB,MAAM,KAAK,OAAO,mBAAmB;EACpE,IAAI,KAAK,IAAI,qBAAqB,MAAM,KAAK,OAAO,sBAAsB;EAC1E,IAAI,KAAK,IAAI,kBAAkB,MAAM,KAAK,OAAO,mBAAmB;EACpE,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EACtD,IAAI,KAAK,IAAI,eAAe,MAAM,KAAK,OAAO,gBAAgB;EAC9D,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EACtD,IAAI,KAAK,IAAI,eAAe,MAAM,KAAK,OAAO,gBAAgB;EAC9D,IAAI,KAAK,IAAI,sBAAsB,MAAM,KAAK,OAAO,uBAAuB;EAC5E,IAAI,KAAK,IAAI,kBAAkB,GAAG,OAAO,mBAAmB,KAAK,IAAI,kBAAkB;EACvF,IAAI,KAAK,IAAI,kBAAkB,GAAG,OAAO,mBAAmB,KAAK,IAAI,kBAAkB;EACvF,IAAI,KAAK,IAAI,wBAAwB,MAAM,KAAK,OAAO,yBAAyB;EAChF,IAAI,KAAK,IAAI,eAAe,MAAM,KAAK,OAAO,gBAAgB;EAC9D,IAAI,KAAK,IAAI,gBAAgB,MAAM,KAAK,OAAO,iBAAiB;EAChE,IAAI,KAAK,IAAI,gBAAgB,MAAM,KAAK,OAAO,iBAAiB;EAChE,MAAM,eAAe,QAAQ,IAAI,cAAc;EAC/C,IAAI,iBAAiB,KAAA,GAAW,OAAO,eAAe;EACtD,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EACtD,IAAI,KAAK,IAAI,cAAc,GAAG,OAAO,eAAe,KAAK,IAAI,cAAc;EAC3E,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,KAAK,KAAK,SAAS,MAAM,KAAK,MAAM,UAAU;SAC7C,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,MAAM,UAAU;IACvD,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,MAAM,YAAY;IACtD,IAAI,KAAK,KAAK,WAAW,GAAG,MAAM,YAAY,KAAK,KAAK,WAAW;IACnE,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,MAAM,YAAY;IACtD,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,MAAM,YAAY;IACtD,IAAI,KAAK,KAAK,YAAY,MAAM,KAAK,MAAM,aAAa;IACxD,IAAI,KAAK,KAAK,YAAY,MAAM,KAAK,MAAM,aAAa;IACxD,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,MAAM,UAAU;IAClD,IAAI,KAAK,KAAK,eAAe,MAAM,KAAK,MAAM,gBAAgB;IAC9D,IAAI,KAAK,KAAK,gBAAgB,MAAM,KAAK,MAAM,iBAAiB;IAChE,IAAI,KAAK,KAAK,cAAc,MAAM,KAAK,MAAM,eAAe;IAC5D,IAAI,KAAK,KAAK,aAAa,MAAM,KAAK,MAAM,cAAc;IAC1D,IAAI,KAAK,KAAK,mBAAmB,MAAM,KAAK,MAAM,oBAAoB;IACtE,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,MAAM,UAAU;IAClD,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,MAAM,UAAU;IAClD,IAAI,KAAK,KAAK,aAAa,MAAM,KAAK,MAAM,cAAc;IAC1D,IAAI,KAAK,KAAK,yBAAyB,MAAM,KAAK,MAAM,0BAA0B;IAClF,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,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,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,KAAK,MAAM,QAAQ,MAAM,KAAK,GAAG,SAAS;IAC9C,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,KAAK,KAAK,SAAS,MAAM,KAAK,EAAE,UAAU;IAC9C,IAAI,KAAK,KAAK,8BAA8B,MAAM,KAChD,EAAE,+BAA+B;IACnC,IAAI,KAAK,KAAK,aAAa,MAAM,KAAK,EAAE,cAAc;IACtD,IAAI,KAAK,KAAK,iBAAiB,MAAM,KAAK,EAAE,kBAAkB;IAC9D,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,EAAE,YAAY;IAClD,IAAI,KAAK,KAAK,WAAW,MAAM,KAAK,EAAE,YAAY;IAClD,IAAI,KAAK,KAAK,YAAY,MAAM,KAAK,EAAE,aAAa;IACpD,IAAI,KAAK,KAAK,YAAY,MAAM,KAAK,EAAE,aAAa;IACpD,IAAI,KAAK,KAAK,SAAS,MAAM,KAAK,EAAE,UAAU;IAC9C,IAAI,KAAK,KAAK,yBAAyB,MAAM,KAAK,EAAE,0BAA0B;IAC9E,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,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,KAAK,KAAK,KAAK,MAAM,KAAK,EAAE,MAAM;IACtC,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;AAIA,SAAS,oBAAoB,GAAsB,IAAqB,SAAyB;CAC/F,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;CAE/E,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,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,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,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,KAAK,mBAAmB,YAAY,GAAG,UAAU,EAAE,GAAG,QAAQ,GAAG;CACzE;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,iBAAiB,iBAAiB,QAAQ,IAAI,WAAW,CAElC,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,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,SAAS,kBAAkB,MAAgC;CACzD,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,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,iBAAiB,SAAyB;CACjD,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,MAAM,MAAM,MAAM,QAAQ,WAAW,CAAC,IAAI;CACnF,OAAO;AACT;AAEA,SAAS,iBAAiB,KAAqB;CAC7C,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,GAAG;EACZ;EACA,SAAS,OAAO,aAAa,KAAM,IAAI,EAAG,IAAI;EAC9C,IAAI,KAAK,MAAM,IAAI,EAAE;CACvB;CACA,OAAO;AACT;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;AAIA,SAAS,eAAe,IAA2C;CACjE,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,KAAK,IAAI,UAAU,MAAM,KAAK,OAAO,WAAW;CACpD,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;CACtD,IAAI,KAAK,IAAI,UAAU,MAAM,KAAK,OAAO,WAAW;CACpD,IAAI,KAAK,IAAI,UAAU,MAAM,KAAK,OAAO,WAAW;CACpD,IAAI,KAAK,IAAI,YAAY,MAAM,KAAK,OAAO,aAAa;CACxD,IAAI,KAAK,IAAI,SAAS,MAAM,KAAK,OAAO,UAAU;CAClD,IAAI,KAAK,IAAI,QAAQ,GAAG,OAAO,SAAS,KAAK,IAAI,QAAQ;CACzD,IAAI,KAAK,IAAI,6BAA6B,MAAM,KAAK,OAAO,8BAA8B;CAC1F,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,KAAK,KAAK,UAAU,MAAM,KAAK,IAAI,WAAW;GAClD,IAAI,KAAK,KAAK,YAAY,MAAM,KAAK,IAAI,aAAa;GACtD,IAAI,KAAK,KAAK,UAAU,MAAM,KAAK,IAAI,WAAW;GAClD,IAAI,KAAK,KAAK,iBAAiB,MAAM,KAAK,IAAI,kBAAkB;GAChE,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;;;AC7iCA,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,KAAK,IAAI,SAAS,MAAM,KAAK,OAAO,UAAU;EAClD,IAAI,KAAK,IAAI,UAAU,MAAM,KAAK,OAAO,WAAW;EACpD,IAAI,KAAK,IAAI,gBAAgB,MAAM,KAAK,OAAO,iBAAiB;EAChE,IAAI,KAAK,IAAI,eAAe,MAAM,KAAK,OAAO,gBAAgB;EAC9D,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,KAAK,IAAI,iBAAiB,MAAM,KAAK,OAAO,kBAAkB;EAClE,MAAM,MAAM,QAAQ,IAAI,mBAAmB;EAC3C,IAAI,QAAQ,KAAA,GAAW,OAAO,oBAAoB;EAClD,IAAI,KAAK,IAAI,kBAAkB,MAAM,KAAK,OAAO,mBAAmB;EACpE,IAAI,KAAK,IAAI,iBAAiB,MAAM,KAAK,OAAO,kBAAkB;EAClE,IAAI,KAAK,IAAI,sBAAsB,MAAM,KAAK,OAAO,uBAAuB;EAC5E,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,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;CACxE;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,OAAO,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,GAAG,EAAE;GACrD,IAAI,GAAG,OAAO,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,GAAG,EAAE;GACrD,IAAI,GAAG,OAAO,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,GAAG,EAAE;GACrD,IAAI,GAAG,OAAO,KAAA,GAAW,QAAQ,KAAK,OAAO,GAAG,GAAG,EAAE;GACrD,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,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,QAAQ,KAAK,oBAAkB;GAC5C,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,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,SACpB,IAAI,IAAI,SAAS,KAAK,SAAS,KAAK,MAAM;QACrC,IAAI,IAAI,UAAU,KAAA,GAAW,SAAS,KAAK,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,IAAI;GAEnF,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,EAAE,KAAK,QAAQ,OAAO,KAAK,GAAG,EAAE,GAAG;GACrC;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;;;AC7oBA,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;AAiGA,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,aAAa,EAAE,cAAc,aACjC,UAAU,YAAY,EAAE;EAE1B,IAAI,EAAE,mBAAmB,KAAA,KAAa,EAAE,mBAAmB,GACzD,UAAU,iBAAiB,EAAE;EAE/B,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,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,UAAU,EAAE,UAAU,EAAE,IAAI;EAIzD,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,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;EAGvC,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,KAAK,GAAG,OAAO,MAAM,KAAK,IAAI,KAAK;EAChD,MAAM,iBAAiB,QAAQ,IAAI,gBAAgB;EACnD,IAAI,mBAAmB,KAAA,GAAW,OAAO,iBAAiB;EAC1D,MAAM,iBAAiB,QAAQ,IAAI,gBAAgB;EACnD,IAAI,mBAAmB,KAAA,GAAW,OAAO,iBAAiB;EAC1D,IAAI,KAAK,IAAI,gBAAgB,MAAM,KAAK,OAAO,iBAAiB;EAChE,IAAI,KAAK,IAAI,WAAW,GAAG,OAAO,YAAY,KAAK,IAAI,WAAW;EAClE,IAAI,KAAK,IAAI,gBAAgB,MAAM,KAAK,OAAO,iBAAiB;EAChE,IAAI,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,YAAY;EAGtD,MAAM,OAAO,UAAU,IAAI,YAAY;EACvC,IAAI,MAAM,OAAO,aAAa,KAAK,MAAM,KAAK,KAAK;EAGnD,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,KAAK,OAAO,OAAO,MAAM,KAAK,IAAI,+BAA+B;IACvE;IACA,MAAM,QAAQ,UAAU,OAAO,kBAAkB;IACjD,IAAI,OAAO;KACT,IAAI,mBAAmB,OAAO,KAAK;KACnC,IAAI,KAAK,OAAO,OAAO,MAAM,KAAK,IAAI,wBAAwB;IAChE;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,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,KAAK,MAAM,iBAAiB,MAAM,KAAK,MAAM,kBAAkB;GACnE,IAAI,KAAK,MAAM,gBAAgB,MAAM,KAAK,MAAM,iBAAiB;GACjE,IAAI,KAAK,MAAM,gBAAgB,MAAM,KAAK,MAAM,iBAAiB;GACjE,IAAI,KAAK,MAAM,mBAAmB,MAAM,KAAK,MAAM,oBAAoB;GACvE,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;;;;;;;;ACpBA,MAAa,eAA4D;CACvE,MAAM;CAEN,UAAU,MAAM,MAAM;EACpB,OAAO,kBAAkB,IAAI;CAC/B;CAEA,MAAM,IAAI,MAAM;EACd,MAAM,SAA6C,CAAC;EAGpD,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,KAAK,QAAQ,eAAe,MAAM,KAAK,KAAK,gBAAgB;GAChE,IAAI,KAAK,QAAQ,aAAa,MAAM,KAAK,KAAK,cAAc;GAC5D,IAAI,KAAK,QAAQ,cAAc,MAAM,KAAK,KAAK,eAAe;GAC9D,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,KAAK,MAAM,wBAAwB,MAAM,KAAK,GAAG,yBAAyB;IAC9E,MAAM,KAAK,QAAQ,MAAM,YAAY;IACrC,IAAI,OAAO,KAAA,GAAW,GAAG,aAAa;IACtC,IAAI,KAAK,MAAM,sBAAsB,MAAM,KAAK,GAAG,uBAAuB;IAC1E,IAAI,KAAK,MAAM,oBAAoB,MAAM,KAAK,GAAG,qBAAqB;IACtE,IAAI,KAAK,MAAM,eAAe,MAAM,KAAK,GAAG,gBAAgB;IAC5D,MAAM,KAAK,QAAQ,MAAM,UAAU;IACnC,IAAI,OAAO,KAAA,GAAW,GAAG,WAAW;IACpC,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,KAAK,UAAU,gBAAgB,MAAM,KAAK,KAAK,iBAAiB;GACpE,IAAI,KAAK,UAAU,gBAAgB,MAAM,KAAK,KAAK,iBAAiB;GACpE,IAAI,KAAK,UAAU,SAAS,GAAG,KAAK,UAAU,KAAK,UAAU,SAAS;GACtE,IAAI,KAAK,UAAU,YAAY,MAAM,KAAK,KAAK,aAAa;GAC5D,IAAI,KAAK,UAAU,eAAe,MAAM,KAAK,KAAK,gBAAgB;GAClE,MAAM,MAAM,QAAQ,UAAU,uBAAuB;GACrD,IAAI,QAAQ,KAAA,GAAW,KAAK,wBAAwB;GACpD,IAAI,KAAK,UAAU,SAAS,MAAM,KAAK,KAAK,UAAU;GACtD,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,KAAK,UAAU,eAAe,MAAM,KAAK,KAAK,gBAAgB;GAClE,IAAI,KAAK,UAAU,eAAe,MAAM,KAAK,KAAK,gBAAgB;GAClE,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,KAAK,GAAG,gBAAgB,MAAM,KAAK,KAAK,iBAAiB;IAC7D,IAAI,KAAK,GAAG,eAAe,MAAM,KAAK,KAAK,gBAAgB;IAC3D,IAAI,KAAK,GAAG,sBAAsB,MAAM,KAAK,KAAK,uBAAuB;IACzE,IAAI,KAAK,GAAG,oBAAoB,MAAM,KAAK,KAAK,qBAAqB;IACrE,IAAI,KAAK,GAAG,eAAe,MAAM,KAAK,KAAK,gBAAgB;IAC3D,MAAM,WAAW,QAAQ,GAAG,UAAU;IACtC,IAAI,aAAa,KAAA,GAAW,KAAK,WAAW;IAC5C,IAAI,KAAK,GAAG,qBAAqB,MAAM,KAAK,KAAK,sBAAsB;IACvE,IAAI,KAAK,GAAG,sBAAsB,MAAM,KAAK,KAAK,uBAAuB;IACzE,IAAI,KAAK,GAAG,cAAc,MAAM,KAAK,KAAK,eAAe;IACzD,IAAI,KAAK,GAAG,WAAW,MAAM,KAAK,KAAK,YAAY;IACnD,IAAI,KAAK,GAAG,WAAW,MAAM,KAAK,KAAK,YAAY;IACnD,IAAI,KAAK,GAAG,YAAY,MAAM,KAAK,KAAK,aAAa;IACrD,MAAM,KAAK,QAAQ,GAAG,eAAe;IACrC,IAAI,OAAO,KAAA,GAAW,KAAK,gBAAgB;IAC3C,IAAI,KAAK,GAAG,iBAAiB,MAAM,KAAK,KAAK,kBAAkB;IAC/D,IAAI,KAAK,GAAG,UAAU,MAAM,KAAK,KAAK,WAAW;IACjD,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,KAAK,eAAe,qBAAqB,MAAM,KAAK,GAAG,sBAAsB;GACjF,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,KAAK,iBAAiB,KAAK,MAAM,KAAK,GAAG,MAAM;GACnD,IAAI,KAAK,iBAAiB,SAAS,MAAM,KAAK,GAAG,UAAU;GAC3D,IAAI,KAAK,iBAAiB,eAAe,MAAM,KAAK,GAAG,gBAAgB;GACvE,IAAI,KAAK,iBAAiB,KAAK,MAAM,KAAK,GAAG,MAAM;GACnD,IAAI,KAAK,iBAAiB,UAAU,MAAM,KAAK,GAAG,WAAW;GAC7D,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,KAAK,gBAAgB,aAAa,MAAM,KAAK,IAAI,cAAc;GACnE,IAAI,KAAK,gBAAgB,WAAW,MAAM,KAAK,IAAI,YAAY;GAC/D,IAAI,KAAK,gBAAgB,iBAAiB,MAAM,KAAK,IAAI,kBAAkB;GAC3E,IAAI,KAAK,gBAAgB,YAAY,MAAM,KAAK,IAAI,aAAa;GACjE,OAAO,iBAAiB;EAC1B;EAGA,MAAM,SAAS,UAAU,IAAI,YAAY;EACzC,IAAI,QAAQ,YAAY;GACtB,MAAM,OAAkC,CAAC;GACzC,IAAI,KAAK,QAAQ,UAAU,MAAM,KAAK,KAAK,WAAW;GACtD,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,KAAK,QAAQ,oBAAoB,MAAM,KAAK,KAAK,qBAAqB;GAC1E,IAAI,KAAK,QAAQ,mBAAmB,MAAM,KAAK,KAAK,oBAAoB;GACxE,IAAI,KAAK,QAAQ,eAAe,MAAM,KAAK,KAAK,gBAAgB;GAChE,IAAI,KAAK,QAAQ,YAAY,MAAM,KAAK,KAAK,aAAa;GAC1D,IAAI,KAAK,QAAQ,UAAU,GAAG,KAAK,WAAW,KAAK,QAAQ,UAAU;GACrE,IAAI,KAAK,QAAQ,4BAA4B,MAAM,KACjD,KAAK,6BAA6B;GACpC,IAAI,KAAK,QAAQ,mBAAmB,MAAM,KAAK,KAAK,oBAAoB;GACxE,IAAI,KAAK,QAAQ,mBAAmB,MAAM,KAAK,KAAK,oBAAoB;GACxE,IAAI,KAAK,QAAQ,wBAAwB,MAAM,KAAK,KAAK,yBAAyB;GAClF,IAAI,KAAK,QAAQ,aAAa,GAAG,KAAK,cAAc,KAAK,QAAQ,aAAa;GAC9E,IAAI,KAAK,QAAQ,sBAAsB,MAAM,KAAK,KAAK,uBAAuB;GAC9E,IAAI,KAAK,QAAQ,cAAc,MAAM,KAAK,KAAK,eAAe;GAC9D,IAAI,KAAK,QAAQ,oBAAoB,MAAM,KAAK,KAAK,qBAAqB;GAC1E,IAAI,KAAK,QAAQ,sBAAsB,MAAM,KAAK,KAAK,uBAAuB;GAC9E,IAAI,KAAK,QAAQ,uBAAuB,MAAM,KAAK,KAAK,wBAAwB;GAChF,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,KAAK,IAAI,eAAe,MAAM,KAAK,IAAI,gBAAgB;IAC3D,IAAI,KAAK,IAAI,OAAO,GAAG,IAAI,QAAQ,KAAK,IAAI,OAAO;IACnD,IAAI,KAAK,IAAI,cAAc,GAAG,IAAI,eAAe,KAAK,IAAI,cAAc;IACxE,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,UAAU,KAAK,IAAI,SAAS;IACzD,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,IAAI,GAAG,aAAa,gBAClB,OAAO,cAAc,KAAK,IAAI,aAAa;EAG7C,OAAO;CACT;AACF;AAIA,SAAS,kBAAkB,MAAyC;CAElE,MAAM,QAAkB,CACtB,qoBAFe,KAAK,cAAc,iBAAiB,KAAK,YAAY,KAAK,GAUkB,IAC3F,sFACF;CAGA,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,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,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,6BAA2B;CAIxC,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,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;;AAGA,SAAS,aAAa,UAA0B;CAC9C,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;;;ACv9BA,MAAM,OAAO;AACb,MAAM,OAAO;AAiEb,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;AAwBA,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;AA8RA,SAAS,UAAU,MAAmE;CACpF,IAAI,IAAI,SAAS,KAAK,IAAI;CAC1B,IAAI,KAAK,MAAM,KAAK;CACpB,IAAI,KAAK,UAAU,KAAK;CACxB,OAAO;AACT;AAEA,SAAS,eAAe,OAA8B;CACpD,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,EAAE,eAAe,GAAG;EACzC;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,EAAE,eAAe,GAAG;EACxC;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;;AAKA,SAAS,cAAc,IAA+B;CACpD,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,OAAO;CAEhC,OAAO,GAAG,SACP,QAAQ,MAAM,EAAE,SAAS,SAAS,CAAC,CACnC,KAAK,MAAM,aAAa,CAAe,CAAC,CAAC,CACzC,KAAK,EAAE;AACZ;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;CAC5B,OAAO,MAAM,OAAO,MAAM;AAC5B;AAEA,SAAS,WAAW,IAA2C;CAC7D,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,cAAc,cAAc,EAAE;GACpC,IAAI,aAAa,EAAE,cAAc;GACjC,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,cAAc,cAAc,EAAE;GACpC,IAAI,aAAa,EAAE,cAAc;GACjC,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;AAEA,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,YAA6B,CAAC;EACpC,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;AAIA,SAAS,SAAS,IAAgB,MAAc,KAAiC;CAC/E,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,IAAI,QAAQ,OAAO,QAAQ,QAAQ,IAAI,IAAI;AAC7C;AAEA,SAAS,QAAQ,IAAgB,MAAc,KAAgC;CAC7E,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,IAAI,QAAQ,KAAA,GAAW,IAAI,OAAO,GAAG,CAAC;AACxC;AAEA,SAAS,QAAQ,IAAgB,MAAc,KAAgC;CAC7E,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,IAAI,QAAQ,KAAA,GAAW,IAAI,GAAG;AAChC;;;;;;;;ACl5BA,MAAM,YAAY;AAClB,MAAM,iBAAiB;AACvB,MAAM,kBACJ;AACF,MAAM,cAAc;AACpB,MAAM,sBACJ;AACF,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,eAAe;AA+BrB,MAAM,aAAa;CApBjB;EACE,MAAM;EACN,aAAa;EACb,KAAK;CACP;CACA;EAAE,MAAM;EAAW,aAAa;EAAmB,KAAK;CAAM;CAC9D;EAAE,MAAM;EAAY,aAAa;EAAW,KAAK;CAAmB;CACpE;EACE,MAAM;EACN,aAAa;EACb,KAAK;CACP;CACA;EACE,MAAM;EACN,aAAa;EACb,KAAK;CACP;AAI8B,CAAC,CAAC,KAAK,MACrC,EAAE,SAAS,YACP,yBAAyB,EAAE,YAAY,eAAe,EAAE,IAAI,OAC5D,0BAA0B,EAAE,YAAY,cAAc,EAAE,IAAI,IAClE,CAAC,CAAC,KAAK,EAAE;AAET,IAAa,eAAb,MAA0B;CACxB,iBAAyC,CAAC;CAE1C,aAAoB,OAAqB;EACvC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,uBAAuB,MAAM;EACpC,CAAC;CACH;CAEA,cAAqB,OAAqB;EACxC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,wBAAwB,MAAM;EACrC,CAAC;CACH;CAEA,YAAyB;EACvB,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,mBAAgC;EAC9B,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,SAAgB,QAAgB,GAAS;EACvC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,kBAAkB,MAAM;EAC/B,CAAC;CACH;CAEA,sBAAmC;EACjC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,SAAgB,OAAqB;EACnC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,mBAAmB,MAAM;EAChC,CAAC;CACH;CAEA,WAAkB,OAAqB;EACrC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,uBAAuB,MAAM;EACpC,CAAC;CACH;CAEA,YAAmB,OAAqB;EACtC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,eAAe,MAAM;EAC5B,CAAC;CACH;CAEA,gBAA6B;EAC3B,IAAI,KAAK,eAAe,MAAM,MAAM,EAAE,SAAS,aAAa,EAAE,QAAQ,KAAK,GAAG;EAC9E,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,aAAoB,WAAiC;EACnD,MAAM,cAAc,cAAc,QAAQ,cAAc;EACxD,IAAI,KAAK,eAAe,MAAM,MAAM,EAAE,SAAS,aAAa,EAAE,QAAQ,SAAS,GAAG;EAClF,KAAK,eAAe,KAAK;GAAE,MAAM;GAAW;GAAa,KAAK;EAAU,CAAC;CAC3E;CAEA,cAAqB,OAAqB;EACxC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,6BAA6B,MAAM;EAC1C,CAAC;CACH;CAEA,wBAA+B,OAAqB;EAClD,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aACE;GACF,KAAK,sCAAsC,MAAM;EACnD,CAAC;CACH;CAEA,qBAA4B,OAAqB;EAC/C,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aACE;GACF,KAAK,mCAAmC,MAAM;EAChD,CAAC;CACH;CAEA,SAAgB,OAAqB;EACnC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,mBAAmB,MAAM;EAChC,CAAC;CACH;CAEA,gBAAuB,OAAqB;EAC1C,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,iCAAiC,MAAM;EAC9C,CAAC;CACH;CAEA,eAA4B;EAC1B,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,eAAsB,OAAqB;EACzC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,yBAAyB,MAAM;EACtC,CAAC;CACH;CAEA,qBAAkC;EAChC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aACE;GACF,KAAK;EACP,CAAC;CACH;CAEA,eAAsB,OAAqB;EACzC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,yBAAyB,MAAM;EACtC,CAAC;CACH;CAEA,WAAwB;EACtB,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,cAAqB,OAAqB;EACxC,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK,6BAA6B,MAAM;EAC1C,CAAC;CACH;CAEA,cAA2B;EACzB,KAAK,eAAe,KAAK;GACvB,MAAM;GACN,aAAa;GACb,KAAK;EACP,CAAC;CACH;CAEA,YAA2B;EACzB,MAAM,IAAc,CAClB,kFACA,UACF;EACA,KAAK,MAAM,KAAK,KAAK,gBACnB,IAAI,EAAE,SAAS,WACb,EAAE,KAAK,yBAAyB,EAAE,YAAY,eAAe,EAAE,IAAI,IAAI;OAEvE,EAAE,KAAK,0BAA0B,EAAE,YAAY,cAAc,EAAE,IAAI,IAAI;EAG3E,EAAE,KAAK,UAAU;EACjB,OAAO,EAAE,KAAK,EAAE;CAClB;AACF;;;;;;;;;;;;;;ACtOA,IAAa,mBAAb,MAAsD;CACpD,gBAAgB,IAAI,cAAc;CAClC,SAAS,IAAI,OAAO;CACpB,QAAQ,IAAI,MAAiB;CAC7B,SAAS,IAAI,gBAAgB;CAC7B,eAAe,IAAI,aAAa;CAChC,eAAe,IAAI,cAAc;CACjC,iBAAwC,CAAC;CAIzC,gBAAuB,MAAwB,QAAgB,OAAwB;EACrF,MAAM,KAAK,KAAK,aAAa,oBAAoB;EACjD,KAAK,aAAa,gBAAgB,IAAI,MAAM,MAAM;EAClD,OAAO,MAAM;CACf;CAEA,SAAgB,OAAmB,OAAuB;EAExD,OAAO;CACT;;;;CAKA,YAAmB,MAA0B;EAC3C,OAAO,KAAK,OAAO,YAAY,IAAI;CACrC;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,iBAAiB,MAAM;EACxC,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,gBAAgB,QAAQ,MAAM;GACvC;EACF;CAEF;;;;;CAMA,uBACE,QACA,cACwC;EACxC,MAAM,WAAW,iBAAiB,MAAM;EACxC,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,gBAAgB,QAAQ,MAAM;GAAE,CAAC;EAEhE;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;;AAKA,SAAS,iBAAiB,QAAwB;CAEhD,MAAM,MAAM,OAAO,YAAY,GAAG;CAGlC,OAAO,GAFK,OAAO,UAAU,GAAG,GAEpB,EAAE,SADD,OAAO,UAAU,MAAM,CACV,EAAE;AAC9B;;AAGA,SAAS,gBAAgB,QAAgB,QAAwB;CAC/D,IAAI,OAAO,WAAW,GAAG,GAAG,OAAO,OAAO,MAAM,CAAC;CAEjD,MAAM,QAAQ,OAAO,UAAU,GAAG,OAAO,YAAY,GAAG,CAAC;CACzD,MAAM,QAAQ,OAAO,MAAM,GAAG;CAC9B,MAAM,WAAW,MAAM,MAAM,GAAG;CAChC,KAAK,MAAM,QAAQ,OACjB,IAAI,SAAS,MACX,SAAS,IAAI;MAEb,SAAS,KAAK,IAAI;CAGtB,OAAO,SAAS,KAAK,GAAG;AAC1B"}