@extend-ai/react-xlsx 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +23154 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +776 -0
- package/dist/index.d.ts +776 -0
- package/dist/index.js +23125 -0
- package/dist/index.js.map +1 -0
- package/dist/xlsx-worker.js +4688 -0
- package/dist/xlsx-worker.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/controller.tsx","../src/charts.ts","../src/colors.ts","../src/images.ts","../src/wasm.ts","../src/worker-client.ts","../src/XlsxViewer.tsx","../src/chart-renderer.tsx","../src/surface-regl.tsx"],"sourcesContent":["export { useXlsxViewerController, XlsxFileSizeLimitExceededError } from \"./controller\";\nexport {\n DefaultXlsxToolbar,\n useXlsxViewerCharts,\n useXlsxViewer,\n useXlsxViewerEditing,\n useXlsxViewerImages,\n useXlsxViewerSelection,\n useXlsxViewerZoom,\n useXlsxViewerTables,\n XlsxViewer,\n XlsxViewerProvider\n} from \"./XlsxViewer\";\nexport type {\n UseXlsxViewerControllerOptions,\n XlsxChart,\n XlsxChartAxis,\n XlsxChartDataLabels,\n XlsxChartLoadingRenderProps,\n XlsxChartReference,\n XlsxChartsheet,\n XlsxChartSeries,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxFileTooLargeRenderProps,\n XlsxImage,\n XlsxImageAnchor,\n XlsxImageRect,\n XlsxImageRenderProps,\n XlsxImageResizeHandlePosition,\n XlsxImageSelectionRenderProps,\n XlsxShape,\n XlsxShapeFill,\n XlsxShapeParagraph,\n XlsxShapeStroke,\n XlsxShapeTextBox,\n XlsxShapeTextRun,\n XlsxSheetData,\n XlsxThemePalette,\n XlsxTable,\n XlsxTableColumn,\n XlsxTableHeaderMenuRenderProps,\n XlsxTableSortDirection,\n XlsxTableSortState,\n XlsxWorkbookTab,\n XlsxViewerCharts,\n XlsxViewerController,\n XlsxViewerEditing,\n XlsxViewerImages,\n XlsxViewerProps,\n XlsxViewerProviderProps,\n XlsxViewerSelection,\n XlsxViewerZoom,\n XlsxViewerTables\n} from \"./types\";\n","import * as React from \"react\";\nimport type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8, unzipSync, zipSync } from \"fflate\";\nimport {\n loadWorkbookChartAssets,\n updateWorkbookChartAnchor,\n updateWorkbookChartDefinition,\n type WorkbookChartAssets\n} from \"./charts\";\nimport { resolveWorkbookColor, resolveWorkbookFillStyle } from \"./colors\";\nimport {\n mergeWorkbookImageAssets,\n parseWorkbookImageAssets,\n pxToSheetColumnWidth,\n rectToImageAnchor,\n resolveContentSheetAxisPixels,\n resolveSheetColumnWidthPixels,\n resolveRenderedSheetAxisPixels,\n resolveSheetRowHeightPixels,\n resizeImageRect,\n revokeWorkbookImageAssets,\n updateWorkbookImageAnchor,\n type WorkbookImageAssets,\n type WorkbookImageSheetOrigin,\n type WorkbookTableMetadata\n} from \"./images\";\nimport { getSheetsWasmModule } from \"./wasm\";\nimport { XlsxWorkerClient } from \"./worker-client\";\nimport type {\n UseXlsxViewerControllerOptions,\n XlsxChart,\n XlsxChartsheet,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxClipboardData,\n XlsxConditionalFormatRule,\n XlsxDataValidation,\n XlsxFreezePanes,\n XlsxImage,\n XlsxImageRect,\n XlsxImageResizeHandlePosition,\n XlsxResolvedCellStyle,\n XlsxShape,\n XlsxSheetData,\n XlsxSparkline,\n XlsxThemePalette,\n XlsxTable,\n XlsxTableStyleDefinition,\n XlsxTableSortDirection,\n XlsxTableSortState,\n XlsxViewerController,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst FORMULA_COUNT_THRESHOLD = 1000;\nconst DEFAULT_ROW_HEIGHT = 24;\nconst DEFAULT_COL_WIDTH = 80;\nconst XLSX_MIME_TYPE = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\nconst CSV_MIME_TYPE = \"text/csv;charset=utf-8\";\nconst MIN_COL_WIDTH_PX = 30;\nconst MIN_ROW_HEIGHT_PX = 16;\nconst GRID_HEADER_HEIGHT = 24;\nconst GRID_ROW_HEADER_WIDTH = 40;\nconst HISTORY_LIMIT = 100;\nconst INTERNAL_CLIPBOARD_MIME = \"application/x-react-xlsx-range+json\";\nconst DEFAULT_DEFER_LOADING_ABOVE_BYTES = 0;\nconst DEFAULT_MAX_FILE_SIZE_BYTES = 25 * 1024 * 1024;\nconst MAX_INTERACTIVE_WORKSHEET_XML_BYTES = 200 * 1024 * 1024;\nconst MAX_INTERACTIVE_SHARED_STRINGS_BYTES = 50 * 1024 * 1024;\nconst MAX_INTERACTIVE_TOTAL_XML_BYTES = 256 * 1024 * 1024;\nconst EMU_PER_PIXEL = 9525;\nconst IMAGE_BATCH_ROW_COUNT = 256;\nconst DEFAULT_ZOOM_SCALE = 100;\nconst MIN_ZOOM_SCALE = 10;\nconst MAX_ZOOM_SCALE = 400;\nconst ZOOM_STEP = 10;\nconst DEFAULT_ZOOM_TAB_KEY = \"__default__\";\n\ntype IdleRequestHandle = number;\n\ntype IdleDeadline = {\n didTimeout: boolean;\n timeRemaining: () => number;\n};\n\ntype IdleWindow = Window & {\n cancelIdleCallback?: (handle: IdleRequestHandle) => void;\n requestIdleCallback?: (\n callback: (deadline: IdleDeadline) => void,\n options?: {\n timeout: number;\n }\n ) => IdleRequestHandle;\n};\n\ntype SnapshotHistoryEntry = {\n kind: \"snapshot\";\n activeCell: XlsxCellAddress | null;\n activeSheetIndex: number;\n bytes: Uint8Array;\n selection: XlsxCellRange | null;\n};\n\ntype CellMutationState = {\n formula: string | null;\n value: unknown;\n};\n\ntype CellEditHistoryEntry = {\n kind: \"cell-edit\";\n activeCellAfter: XlsxCellAddress | null;\n activeCellBefore: XlsxCellAddress | null;\n after: CellMutationState;\n before: CellMutationState;\n cell: XlsxCellAddress;\n selectionAfter: XlsxCellRange | null;\n selectionBefore: XlsxCellRange | null;\n sheetIndex: number;\n};\n\ntype RangeCellMutation = {\n after: CellMutationState;\n before: CellMutationState;\n cell: XlsxCellAddress;\n};\n\ntype RangeEditHistoryEntry = {\n kind: \"range-edit\";\n activeCellAfter: XlsxCellAddress | null;\n activeCellBefore: XlsxCellAddress | null;\n mutations: RangeCellMutation[];\n selectionAfter: XlsxCellRange | null;\n selectionBefore: XlsxCellRange | null;\n sheetIndex: number;\n};\n\nfunction clampZoomScale(zoomScale: number) {\n if (!Number.isFinite(zoomScale)) {\n return DEFAULT_ZOOM_SCALE;\n }\n\n return Math.min(MAX_ZOOM_SCALE, Math.max(MIN_ZOOM_SCALE, Math.round(zoomScale)));\n}\n\nfunction resolveDefaultZoomScale(activeTab: XlsxWorkbookTab | null, activeSheet: XlsxSheetData | null) {\n if (activeTab?.kind !== \"sheet\") {\n return DEFAULT_ZOOM_SCALE;\n }\n\n return clampZoomScale(activeSheet?.zoomScale ?? DEFAULT_ZOOM_SCALE);\n}\n\nfunction resolveWorksheetZoomScale(\n worksheet: ReturnType<Workbook[\"getSheet\"]>,\n sheetState?: Record<string, unknown> | null\n) {\n const candidates = [\n typeof sheetState?.zoomScale === \"number\" ? sheetState.zoomScale : undefined,\n typeof worksheet.zoomScale === \"number\" ? worksheet.zoomScale : undefined\n ];\n const value = candidates.find((entry): entry is number => typeof entry === \"number\" && Number.isFinite(entry) && entry > 0);\n return clampZoomScale(value ?? DEFAULT_ZOOM_SCALE);\n}\n\nfunction resolveNextZoomScale(currentZoomScale: number, direction: 1 | -1) {\n if (direction > 0) {\n return Math.min(\n MAX_ZOOM_SCALE,\n currentZoomScale % ZOOM_STEP === 0\n ? currentZoomScale + ZOOM_STEP\n : Math.ceil(currentZoomScale / ZOOM_STEP) * ZOOM_STEP\n );\n }\n\n return Math.max(\n MIN_ZOOM_SCALE,\n currentZoomScale % ZOOM_STEP === 0\n ? currentZoomScale - ZOOM_STEP\n : Math.floor(currentZoomScale / ZOOM_STEP) * ZOOM_STEP\n );\n}\n\ntype WorksheetApiImageInfo = {\n altText?: unknown;\n height?: unknown;\n source?: unknown;\n width?: unknown;\n};\n\ntype WorksheetDirectImageAnchorInfo = {\n fromCol?: unknown;\n fromColOffset?: unknown;\n fromRow?: unknown;\n fromRowOffset?: unknown;\n toCol?: unknown;\n toColOffset?: unknown;\n toRow?: unknown;\n toRowOffset?: unknown;\n};\n\ntype WorksheetDirectImageInfo = {\n anchor?: unknown;\n data?: unknown;\n format?: unknown;\n id?: unknown;\n mediaPath?: unknown;\n name?: unknown;\n widthEmu?: unknown;\n heightEmu?: unknown;\n};\n\ntype WorksheetDirectShapeParagraphRunInfo = {\n bold?: unknown;\n color?: unknown;\n fontFamily?: unknown;\n fontSizePt?: unknown;\n italic?: unknown;\n text?: unknown;\n underline?: unknown;\n};\n\ntype WorksheetDirectShapeParagraphInfo = {\n align?: unknown;\n runs?: unknown;\n};\n\ntype WorksheetDirectShapeTextBoxInfo = {\n horizontalAlign?: unknown;\n insetPx?: {\n bottom?: unknown;\n left?: unknown;\n right?: unknown;\n top?: unknown;\n } | null;\n verticalAlign?: unknown;\n};\n\ntype WorksheetDirectShapeInfo = {\n anchor?: unknown;\n description?: unknown;\n fill?: {\n color?: unknown;\n none?: unknown;\n opacity?: unknown;\n } | null;\n flipH?: unknown;\n flipV?: unknown;\n geometry?: unknown;\n geometryAdjustments?: unknown;\n hyperlink?: unknown;\n id?: unknown;\n name?: unknown;\n paragraphs?: unknown;\n rotationDeg?: unknown;\n scaleX?: unknown;\n scaleY?: unknown;\n stroke?: {\n color?: unknown;\n dash?: unknown;\n headEndType?: unknown;\n none?: unknown;\n opacity?: unknown;\n tailEndType?: unknown;\n widthPx?: unknown;\n } | null;\n svgPath?: unknown;\n svgViewBox?: {\n height?: unknown;\n width?: unknown;\n } | null;\n text?: unknown;\n textBox?: WorksheetDirectShapeTextBoxInfo | null;\n};\n\ntype WorksheetApiRowCell = {\n col?: unknown;\n image?: WorksheetApiImageInfo | null;\n};\n\ntype WorksheetApiRow = {\n cells?: unknown;\n index?: unknown;\n};\n\ntype WorksheetWithRowsBatch = ReturnType<Workbook[\"getSheet\"]> & {\n getRowsBatch?: (startRow: number, maxRows: number, options?: unknown) => unknown;\n};\n\ntype ZipEntryMetadata = {\n compressedSize: number;\n name: string;\n uncompressedSize: number;\n};\n\ntype WorkbookPreflightResult = {\n largestWorksheetXmlBytes: number;\n sharedStringsBytes: number;\n totalWorksheetXmlBytes: number;\n tooLarge: boolean;\n};\n\nfunction formatBinaryBytes(bytes: number) {\n if (!Number.isFinite(bytes) || bytes <= 0) {\n return \"0 B\";\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let value = bytes;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n\n return `${value >= 10 || unitIndex === 0 ? value.toFixed(0) : value.toFixed(1)} ${units[unitIndex]}`;\n}\n\nfunction findZipEndOfCentralDirectoryOffset(bytes: Uint8Array) {\n const minLength = 22;\n if (bytes.byteLength < minLength) {\n return -1;\n }\n\n const searchStart = Math.max(0, bytes.byteLength - (0xffff + minLength));\n for (let offset = bytes.byteLength - minLength; offset >= searchStart; offset -= 1) {\n if (\n bytes[offset] === 0x50 &&\n bytes[offset + 1] === 0x4b &&\n bytes[offset + 2] === 0x05 &&\n bytes[offset + 3] === 0x06\n ) {\n return offset;\n }\n }\n\n return -1;\n}\n\nfunction readZipCentralDirectoryEntries(buffer: ArrayBuffer): ZipEntryMetadata[] | null {\n const bytes = new Uint8Array(buffer);\n const eocdOffset = findZipEndOfCentralDirectoryOffset(bytes);\n if (eocdOffset < 0) {\n return null;\n }\n\n const view = new DataView(buffer, bytes.byteOffset, bytes.byteLength);\n const centralDirectorySize = view.getUint32(eocdOffset + 12, true);\n const centralDirectoryOffset = view.getUint32(eocdOffset + 16, true);\n const decoder = new TextDecoder();\n const entries: ZipEntryMetadata[] = [];\n\n let offset = centralDirectoryOffset;\n const endOffset = centralDirectoryOffset + centralDirectorySize;\n while (offset + 46 <= endOffset && offset + 46 <= bytes.byteLength) {\n if (view.getUint32(offset, true) !== 0x02014b50) {\n return null;\n }\n\n const compressedSize = view.getUint32(offset + 20, true);\n const uncompressedSize = view.getUint32(offset + 24, true);\n const fileNameLength = view.getUint16(offset + 28, true);\n const extraLength = view.getUint16(offset + 30, true);\n const commentLength = view.getUint16(offset + 32, true);\n const fileNameStart = offset + 46;\n const fileNameEnd = fileNameStart + fileNameLength;\n if (fileNameEnd > bytes.byteLength) {\n return null;\n }\n\n entries.push({\n compressedSize,\n name: decoder.decode(bytes.subarray(fileNameStart, fileNameEnd)),\n uncompressedSize\n });\n\n offset = fileNameEnd + extraLength + commentLength;\n }\n\n return entries;\n}\n\nfunction preflightWorkbookBuffer(buffer: ArrayBuffer): WorkbookPreflightResult | null {\n const entries = readZipCentralDirectoryEntries(buffer);\n if (!entries) {\n return null;\n }\n\n let largestWorksheetXmlBytes = 0;\n let totalWorksheetXmlBytes = 0;\n let sharedStringsBytes = 0;\n\n for (const entry of entries) {\n if (/^xl\\/worksheets\\/[^/]+\\.xml$/i.test(entry.name)) {\n largestWorksheetXmlBytes = Math.max(largestWorksheetXmlBytes, entry.uncompressedSize);\n totalWorksheetXmlBytes += entry.uncompressedSize;\n continue;\n }\n\n if (entry.name === \"xl/sharedStrings.xml\") {\n sharedStringsBytes = entry.uncompressedSize;\n }\n }\n\n const tooLarge =\n largestWorksheetXmlBytes > MAX_INTERACTIVE_WORKSHEET_XML_BYTES ||\n sharedStringsBytes > MAX_INTERACTIVE_SHARED_STRINGS_BYTES ||\n totalWorksheetXmlBytes + sharedStringsBytes > MAX_INTERACTIVE_TOTAL_XML_BYTES;\n\n return {\n largestWorksheetXmlBytes,\n sharedStringsBytes,\n tooLarge,\n totalWorksheetXmlBytes\n };\n}\n\nfunction createWorkbookTooLargeError(preflight: WorkbookPreflightResult) {\n return new Error(\n `XLSX is too large to preview interactively. `\n + `Largest worksheet XML: ${formatBinaryBytes(preflight.largestWorksheetXmlBytes)}; `\n + `shared strings: ${formatBinaryBytes(preflight.sharedStringsBytes)}.`\n );\n}\n\nexport class XlsxFileSizeLimitExceededError extends Error {\n fileSizeBytes: number;\n maxFileSizeBytes: number;\n\n constructor(fileSizeBytes: number, maxFileSizeBytes: number) {\n super(\n `XLSX file size ${formatBinaryBytes(fileSizeBytes)} exceeds the configured limit of ${formatBinaryBytes(maxFileSizeBytes)}.`\n );\n this.name = \"XlsxFileSizeLimitExceededError\";\n this.fileSizeBytes = fileSizeBytes;\n this.maxFileSizeBytes = maxFileSizeBytes;\n }\n}\n\ntype HistoryEntry = SnapshotHistoryEntry | CellEditHistoryEntry | RangeEditHistoryEntry;\n\ntype ClipboardMatrixCell = {\n colOffset: number;\n formula: string | null;\n rowOffset: number;\n value: string;\n};\n\ntype ClipboardMerge = {\n colSpan: number;\n colOffset: number;\n rowOffset: number;\n rowSpan: number;\n};\n\ntype ClipboardPayload = {\n cells: ClipboardMatrixCell[];\n cols: number;\n merges: ClipboardMerge[];\n rows: number;\n};\n\nfunction resolveDisplayFileName(src?: string, fileName?: string): string {\n if (typeof fileName === \"string\" && fileName.trim().length > 0) {\n return fileName.trim();\n }\n\n if (!src) {\n return \"Workbook.xlsx\";\n }\n\n const pathWithoutQuery = src.split(\"?\")[0] ?? \"\";\n const pathSegments = pathWithoutQuery.split(\"/\");\n const lastSegment = pathSegments[pathSegments.length - 1] ?? \"\";\n\n if (!lastSegment) {\n return \"Workbook.xlsx\";\n }\n\n try {\n return decodeURIComponent(lastSegment);\n } catch {\n return lastSegment;\n }\n}\n\nfunction buildSheetList(\n workbook: Workbook,\n sheetStatesByWorkbookSheetIndex?: Array<{\n cachedFormulaValues?: Record<string, string>;\n columnWidthCharacterWidthPx?: number;\n colWidthOverridesPx?: Record<number, number>;\n colStyleIds?: Record<number, number>;\n conditionalFormatRules?: XlsxConditionalFormatRule[];\n defaultColWidthPx?: number;\n defaultRowHeightPx?: number;\n hasHorizontalMerges?: boolean;\n hasVerticalMerges?: boolean;\n maxHorizontalMergeEndCol?: number;\n maxVerticalMergeEndRow?: number;\n hiddenCols?: number[];\n hiddenRows?: number[];\n rowHeightOverridesPx?: Record<number, number>;\n rowStyleIds?: Record<number, number>;\n showGridLines: boolean;\n sparklines?: XlsxSparkline[];\n } | null>,\n themePalette?: XlsxThemePalette | null,\n styleById?: Record<number, XlsxResolvedCellStyle> | null,\n namedCellStyleByName?: Record<string, XlsxResolvedCellStyle> | null,\n tableStyleByName?: Record<string, XlsxTableStyleDefinition> | null\n): XlsxSheetData[] {\n const sheets: XlsxSheetData[] = [];\n\n for (let index = 0; index < workbook.sheetCount; index += 1) {\n const worksheet = workbook.getSheet(index);\n const sheetState = sheetStatesByWorkbookSheetIndex?.[index] ?? null;\n if (worksheet.visibility !== \"visible\") {\n continue;\n }\n\n const resolveColumnWidthPx = (col: number) => {\n const width = worksheet.getColumnWidth(col);\n if (width !== undefined && width !== null) {\n return resolveSheetColumnWidthPixels(width, sheetState?.columnWidthCharacterWidthPx);\n }\n\n return sheetState?.colWidthOverridesPx?.[col] ?? sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH;\n };\n\n const resolveRowHeightPx = (row: number) => {\n const height = worksheet.getRowHeight(row);\n if (height !== undefined && height !== null) {\n return Math.max(Math.round(height * 1.33), MIN_ROW_HEIGHT_PX);\n }\n\n return sheetState?.rowHeightOverridesPx?.[row] ?? sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT;\n };\n\n const usedRange = worksheet.usedRange() as [number, number, number, number] | null;\n if (!usedRange) {\n sheets.push({\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colStyleIds: sheetState?.colStyleIds ?? {},\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx: sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH,\n defaultRowHeightPx: sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: sheetState?.hasHorizontalMerges ?? false,\n hasVerticalMerges: sheetState?.hasVerticalMerges ?? false,\n maxHorizontalMergeEndCol: sheetState?.maxHorizontalMergeEndCol ?? -1,\n maxVerticalMergeEndRow: sheetState?.maxVerticalMergeEndRow ?? -1,\n hiddenCols: sheetState?.hiddenCols ?? [],\n hiddenRows: sheetState?.hiddenRows ?? [],\n maxUsedCol: -1,\n maxUsedRow: -1,\n name: worksheet.name,\n namedCellStyleByName: namedCellStyleByName ?? {},\n rowCount: 0,\n colCount: 0,\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n styleById: styleById ?? {},\n sparklines: sheetState?.sparklines ?? [],\n tableStyleByName: tableStyleByName ?? {},\n visibleRows: [],\n visibleCols: [],\n colWidths: [],\n rowHeights: [],\n showGridLines: sheetState?.showGridLines ?? true,\n themePalette: themePalette ?? { colorsByIndex: {} },\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState)\n });\n continue;\n }\n\n const [, , maxRow, maxCol] = usedRange;\n let visibleRowsCache: number[] | null = null;\n let visibleColsCache: number[] | null = null;\n let rowHeightsCache: number[] | null = null;\n let colWidthsCache: number[] | null = null;\n\n const getVisibleRows = () => {\n if (visibleRowsCache) {\n return visibleRowsCache;\n }\n\n const nextVisibleRows: number[] = [];\n for (let row = 0; row <= maxRow; row += 1) {\n if (!worksheet.isRowHidden(row)) {\n nextVisibleRows.push(row);\n }\n }\n\n visibleRowsCache = nextVisibleRows;\n return nextVisibleRows;\n };\n\n const getVisibleCols = () => {\n if (visibleColsCache) {\n return visibleColsCache;\n }\n\n const nextVisibleCols: number[] = [];\n for (let col = 0; col <= maxCol; col += 1) {\n if (!worksheet.isColumnHidden(col)) {\n nextVisibleCols.push(col);\n }\n }\n\n visibleColsCache = nextVisibleCols;\n return nextVisibleCols;\n };\n\n const getRowHeights = () => {\n if (rowHeightsCache) {\n return rowHeightsCache;\n }\n\n rowHeightsCache = getVisibleRows().map(resolveRowHeightPx);\n return rowHeightsCache;\n };\n\n const getColWidths = () => {\n if (colWidthsCache) {\n return colWidthsCache;\n }\n\n colWidthsCache = getVisibleCols().map(resolveColumnWidthPx);\n return colWidthsCache;\n };\n\n const sheet: XlsxSheetData = {\n cachedFormulaValues: sheetState?.cachedFormulaValues ?? {},\n columnWidthCharacterWidthPx: sheetState?.columnWidthCharacterWidthPx,\n colWidthOverridesPx: sheetState?.colWidthOverridesPx ?? {},\n colStyleIds: sheetState?.colStyleIds ?? {},\n conditionalFormatRules: sheetState?.conditionalFormatRules ?? [],\n dataValidations: parseWorksheetDataValidations(worksheet),\n defaultColWidthPx: sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH,\n defaultRowHeightPx: sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT,\n freezePanes: parseWorksheetFreezePanes(worksheet),\n hasHorizontalMerges: sheetState?.hasHorizontalMerges ?? false,\n hasVerticalMerges: sheetState?.hasVerticalMerges ?? false,\n maxHorizontalMergeEndCol: sheetState?.maxHorizontalMergeEndCol ?? -1,\n maxVerticalMergeEndRow: sheetState?.maxVerticalMergeEndRow ?? -1,\n hiddenCols: sheetState?.hiddenCols ?? [],\n hiddenRows: sheetState?.hiddenRows ?? [],\n maxUsedCol: maxCol,\n maxUsedRow: maxRow,\n name: worksheet.name,\n namedCellStyleByName: namedCellStyleByName ?? {},\n rowHeightOverridesPx: sheetState?.rowHeightOverridesPx ?? {},\n rowStyleIds: sheetState?.rowStyleIds ?? {},\n showGridLines: sheetState?.showGridLines ?? true,\n styleById: styleById ?? {},\n sparklines: sheetState?.sparklines ?? [],\n tableStyleByName: tableStyleByName ?? {},\n themePalette: themePalette ?? { colorsByIndex: {} },\n workbookSheetIndex: index,\n zoomScale: resolveWorksheetZoomScale(worksheet, sheetState),\n get rowCount() {\n return getVisibleRows().length;\n },\n get colCount() {\n return getVisibleCols().length;\n },\n get visibleRows() {\n return getVisibleRows();\n },\n get visibleCols() {\n return getVisibleCols();\n },\n get colWidths() {\n return getColWidths();\n },\n get rowHeights() {\n return getRowHeights();\n }\n };\n\n sheets.push(sheet);\n }\n\n return sheets;\n}\n\nfunction buildVisibleSheetIndexMap(sheets: XlsxSheetData[]) {\n return new Map(sheets.map((sheet, index) => [sheet.workbookSheetIndex, index]));\n}\n\nfunction resolveInheritedCellStyle(sheet: XlsxSheetData | null | undefined, row: number, col: number) {\n if (!sheet) {\n return null;\n }\n\n const rowStyleId = sheet.rowStyleIds[row];\n if (rowStyleId !== undefined) {\n return sheet.styleById[rowStyleId] ?? null;\n }\n\n const colStyleId = sheet.colStyleIds[col];\n if (colStyleId !== undefined) {\n return sheet.styleById[colStyleId] ?? null;\n }\n\n return null;\n}\n\nfunction columnLabel(col: number): string {\n let label = \"\";\n let nextValue = col;\n\n while (nextValue >= 0) {\n label = String.fromCharCode(65 + (nextValue % 26)) + label;\n nextValue = Math.floor(nextValue / 26) - 1;\n }\n\n return label;\n}\n\nfunction cellAddressToA1(cell: XlsxCellAddress): string {\n return `${columnLabel(cell.col)}${cell.row + 1}`;\n}\n\nfunction parseA1CellReference(reference: string): XlsxCellAddress | null {\n const match = /^([A-Z]+)(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const [, columnPart, rowPart] = match;\n let col = 0;\n for (const char of columnPart.toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(rowPart) - 1\n };\n}\n\nfunction parseA1RangeReference(reference: string): XlsxCellRange | null {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return normalizeRange({ start, end });\n}\n\nfunction parseWorksheetFreezePanes(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxFreezePanes | null {\n const rawFreezePanes = worksheet.freezePanes as Record<string, unknown> | null | undefined;\n const row = typeof rawFreezePanes?.row === \"number\" && rawFreezePanes.row >= 0 ? rawFreezePanes.row : null;\n const col = typeof rawFreezePanes?.col === \"number\" && rawFreezePanes.col >= 0 ? rawFreezePanes.col : null;\n if (row === null && col === null) {\n return null;\n }\n\n return {\n col: col ?? 0,\n row: row ?? 0\n };\n}\n\nfunction parseWorksheetDataValidations(worksheet: ReturnType<Workbook[\"getSheet\"]>): XlsxDataValidation[] {\n const rawDataValidations = Array.isArray(worksheet.dataValidations) ? worksheet.dataValidations : [];\n\n return rawDataValidations.flatMap((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return [];\n }\n\n const validation = entry as Record<string, unknown>;\n const ranges = Array.isArray(validation.ranges)\n ? validation.ranges.flatMap((range) => {\n if (typeof range !== \"string\") {\n return [];\n }\n\n const parsedRange = parseA1RangeReference(range);\n return parsedRange ? [parsedRange] : [];\n })\n : [];\n const validationType = typeof validation.validationType === \"string\" ? validation.validationType : null;\n if (!validationType || ranges.length === 0) {\n return [];\n }\n\n return [{\n allowBlank: typeof validation.allowBlank === \"boolean\" ? validation.allowBlank : undefined,\n errorMessage: typeof validation.errorMessage === \"string\" ? validation.errorMessage : undefined,\n errorStyle: typeof validation.errorStyle === \"string\" ? validation.errorStyle : undefined,\n inputMessage: typeof validation.inputMessage === \"string\" ? validation.inputMessage : undefined,\n listSource: typeof validation.listSource === \"string\" ? validation.listSource : undefined,\n ranges,\n showDropdown: typeof validation.showDropdown === \"boolean\" ? validation.showDropdown : undefined,\n showErrorAlert: typeof validation.showErrorAlert === \"boolean\" ? validation.showErrorAlert : undefined,\n showInputMessage: typeof validation.showInputMessage === \"boolean\" ? validation.showInputMessage : undefined,\n validationType\n } satisfies XlsxDataValidation];\n });\n}\n\nfunction normalizeRange(range: XlsxCellRange): XlsxCellRange {\n return {\n start: {\n row: Math.min(range.start.row, range.end.row),\n col: Math.min(range.start.col, range.end.col)\n },\n end: {\n row: Math.max(range.start.row, range.end.row),\n col: Math.max(range.start.col, range.end.col)\n }\n };\n}\n\nfunction rangeToA1(range: XlsxCellRange): string {\n const normalized = normalizeRange(range);\n const start = cellAddressToA1(normalized.start);\n const end = cellAddressToA1(normalized.end);\n return start === end ? start : `${start}:${end}`;\n}\n\nfunction rangeContainsCell(range: XlsxCellRange, cell: XlsxCellAddress): boolean {\n const normalized = normalizeRange(range);\n return (\n cell.row >= normalized.start.row &&\n cell.row <= normalized.end.row &&\n cell.col >= normalized.start.col &&\n cell.col <= normalized.end.col\n );\n}\n\nfunction mapWorksheetTables(\n worksheet: ReturnType<Workbook[\"getSheet\"]> | null,\n metadataForSheet?: WorkbookTableMetadata[] | null\n): XlsxTable[] {\n const rawTables = (worksheet?.tables ?? []) as Array<Record<string, unknown>>;\n return rawTables.flatMap((table, index) => {\n const reference = typeof table.reference === \"string\" ? table.reference : \"\";\n const parsedRange = parseA1RangeReference(reference);\n if (!parsedRange) {\n return [];\n }\n\n const rawColumns = Array.isArray(table.columns) ? table.columns : [];\n const rawName = typeof table.name === \"string\" ? table.name : `Table${index + 1}`;\n const rawDisplayName =\n typeof table.displayName === \"string\"\n ? table.displayName\n : typeof table.name === \"string\"\n ? table.name\n : `Table ${index + 1}`;\n const metadata = metadataForSheet?.find((entry) =>\n (entry.name && entry.name === rawName)\n || (entry.displayName && entry.displayName === rawDisplayName)\n || (entry.reference && entry.reference === reference)\n );\n\n return [{\n columns: rawColumns.map((column, columnIndex) => ({\n id: typeof (column as { id?: unknown }).id === \"number\" ? ((column as { id?: number }).id ?? columnIndex + 1) : columnIndex + 1,\n index: columnIndex,\n name: typeof (column as { name?: unknown }).name === \"string\" ? ((column as { name?: string }).name ?? `Column ${columnIndex + 1}`) : `Column ${columnIndex + 1}`\n })),\n displayName: rawDisplayName,\n end: parsedRange.end,\n headerRowCount: typeof table.headerRowCount === \"number\" ? table.headerRowCount : 1,\n headerRowCellStyle: metadata?.headerRowCellStyle,\n name: rawName,\n reference,\n start: parsedRange.start,\n styleInfo: table.styleInfo as XlsxTable[\"styleInfo\"] | undefined,\n totalsRowCount: typeof table.totalsRowCount === \"number\" ? table.totalsRowCount : 0,\n totalsRowShown: Boolean(table.totalsRowShown)\n }];\n });\n}\n\nfunction fileStem(fileName: string): string {\n const normalized = fileName.trim();\n const lastDot = normalized.lastIndexOf(\".\");\n return lastDot > 0 ? normalized.slice(0, lastDot) : normalized;\n}\n\nfunction pxToSheetRowHeight(heightPx: number): number {\n return Math.max(heightPx, MIN_ROW_HEIGHT_PX) / 1.33;\n}\n\nfunction cssColor(color: Record<string, unknown> | undefined): string | null {\n if (!color?.hex) {\n return null;\n }\n\n const hex = String(color.hex);\n const rgb = hex.length === 8 ? hex.slice(2) : hex;\n return `#${rgb}`;\n}\n\nfunction mapBorder(edge: { style: string; color?: { hex?: string } }): string {\n const color = cssColor(edge.color as Record<string, unknown> | undefined) ?? \"#000000\";\n const widthMap: Record<string, string> = {\n dashed: \"1px\",\n dotted: \"1px\",\n double: \"3px\",\n hair: \"1px\",\n medium: \"2px\",\n thick: \"3px\",\n thin: \"1px\"\n };\n const styleMap: Record<string, string> = {\n dashDot: \"dashed\",\n dashDotDot: \"dotted\",\n dashed: \"dashed\",\n dotted: \"dotted\",\n double: \"double\",\n hair: \"solid\",\n medium: \"solid\",\n mediumDashDot: \"dashed\",\n mediumDashDotDot: \"dotted\",\n mediumDashed: \"dashed\",\n slantDashDot: \"dashed\",\n thick: \"solid\",\n thin: \"solid\"\n };\n\n return `${widthMap[edge.style] ?? \"1px\"} ${styleMap[edge.style] ?? \"solid\"} ${color}`;\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/"/g, \"\\\"\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction cloneBytes(bytes: Uint8Array): Uint8Array {\n const nextBytes = new Uint8Array(bytes.byteLength);\n nextBytes.set(bytes);\n return nextBytes;\n}\n\nfunction sanitizeSavedWorkbookBytes(bytes: Uint8Array): Uint8Array {\n try {\n const archive = unzipSync(bytes);\n const stylesEntry = archive[\"xl/styles.xml\"];\n if (stylesEntry) {\n const stylesXml = strFromU8(stylesEntry)\n .replace(/&quot;/g, \""\")\n .replace(/&apos;/g, \"'\");\n archive[\"xl/styles.xml\"] = strToU8(stylesXml);\n }\n\n return zipSync(archive, { level: 6 });\n } catch {\n return cloneBytes(bytes);\n }\n}\n\nfunction pushHistoryEntry(stack: HistoryEntry[], entry: HistoryEntry) {\n stack.push(entry);\n if (stack.length > HISTORY_LIMIT) {\n stack.shift();\n }\n}\n\nfunction normalizeCellValue(value: unknown) {\n return value ?? \"\";\n}\n\nfunction coerceUserEnteredValue(value: string): unknown {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (trimmed.startsWith(\"'\")) {\n return trimmed.slice(1);\n }\n\n if (/^(true|false)$/i.test(trimmed)) {\n return trimmed.toLowerCase() === \"true\";\n }\n\n if (/^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)$/.test(trimmed)) {\n const parsed = Number(trimmed);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n\n return value;\n}\n\nfunction applyCellMutationState(\n worksheet: ReturnType<Workbook[\"getSheet\"]>,\n cell: XlsxCellAddress,\n state: CellMutationState\n) {\n if (state.formula) {\n worksheet.setFormula(cellAddressToA1(cell), state.formula);\n return;\n }\n\n worksheet.setCell(cellAddressToA1(cell), normalizeCellValue(state.value));\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction parseClipboardText(text: string): string[][] {\n const normalized = text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n const rows = normalized.split(\"\\n\");\n\n if (rows.length > 1 && rows[rows.length - 1] === \"\") {\n rows.pop();\n }\n\n return rows.map((row) => row.split(\"\\t\"));\n}\n\nasync function resolveWorkbookBuffer({ file, src }: UseXlsxViewerControllerOptions): Promise<ArrayBuffer> {\n let buffer: ArrayBuffer;\n\n if (file) {\n buffer = file;\n } else if (src) {\n const response = await fetch(src);\n if (!response.ok) {\n throw new Error(`Failed to fetch workbook (status ${response.status})`);\n }\n buffer = await response.arrayBuffer();\n } else {\n throw new Error(\"Either `file` or `src` must be provided.\");\n }\n\n return buffer;\n}\n\nasync function parseWorkbookBuffer(buffer: ArrayBuffer): Promise<{\n shouldAutoCalculate: boolean;\n workbook: Workbook;\n}> {\n const wasmModule = await getSheetsWasmModule();\n const workbook = wasmModule.Workbook.fromBytes(new Uint8Array(buffer));\n let totalFormulas = 0;\n\n for (let index = 0; index < workbook.sheetCount; index += 1) {\n totalFormulas += workbook.getSheet(index).formulaCount;\n }\n\n const shouldAutoCalculate = totalFormulas <= FORMULA_COUNT_THRESHOLD;\n if (shouldAutoCalculate) {\n workbook.calculate();\n }\n\n return {\n shouldAutoCalculate,\n workbook\n };\n}\n\nfunction scheduleLowPriorityTask(task: () => void) {\n if (typeof window === \"undefined\") {\n const timeoutHandle = setTimeout(task, 0);\n return () => clearTimeout(timeoutHandle);\n }\n\n const idleWindow = window as IdleWindow;\n if (typeof idleWindow.requestIdleCallback === \"function\") {\n const idleHandle = idleWindow.requestIdleCallback(() => {\n task();\n }, { timeout: 120 });\n return () => {\n idleWindow.cancelIdleCallback?.(idleHandle);\n };\n }\n\n const timeoutHandle = window.setTimeout(task, 0);\n return () => window.clearTimeout(timeoutHandle);\n}\n\nfunction asFiniteNumber(value: unknown) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction inferImageMimeType(source: string) {\n if (source.startsWith(\"data:\")) {\n const separatorIndex = source.indexOf(\";\");\n if (separatorIndex > 5) {\n return source.slice(5, separatorIndex);\n }\n }\n\n const normalized = source.split(\"?\")[0]?.toLowerCase() ?? \"\";\n if (normalized.endsWith(\".gif\")) {\n return \"image/gif\";\n }\n if (normalized.endsWith(\".jpg\") || normalized.endsWith(\".jpeg\")) {\n return \"image/jpeg\";\n }\n if (normalized.endsWith(\".svg\")) {\n return \"image/svg+xml\";\n }\n if (normalized.endsWith(\".webp\")) {\n return \"image/webp\";\n }\n\n return \"image/png\";\n}\n\nfunction inferWorksheetDirectImageMimeType(info: WorksheetDirectImageInfo) {\n const format = typeof info.format === \"string\" ? info.format.trim().toLowerCase() : \"\";\n if (format === \"gif\") {\n return \"image/gif\";\n }\n if (format === \"jpg\" || format === \"jpeg\") {\n return \"image/jpeg\";\n }\n if (format === \"svg\") {\n return \"image/svg+xml\";\n }\n if (format === \"webp\") {\n return \"image/webp\";\n }\n if (format === \"png\") {\n return \"image/png\";\n }\n\n const mediaPath = typeof info.mediaPath === \"string\" ? info.mediaPath : \"\";\n if (mediaPath) {\n return inferImageMimeType(mediaPath);\n }\n\n return \"image/png\";\n}\n\nfunction createWorksheetDirectImageSource(\n data: unknown,\n mimeType: string,\n objectUrls: string[]\n) {\n const bytes = data instanceof Uint8Array\n ? data\n : Array.isArray(data)\n ? Uint8Array.from(data.filter((value): value is number => typeof value === \"number\"))\n : null;\n if (!bytes || bytes.byteLength === 0) {\n return null;\n }\n\n const blobBuffer = new Uint8Array(bytes.byteLength);\n blobBuffer.set(bytes);\n const objectUrl = URL.createObjectURL(new Blob([blobBuffer.buffer], { type: mimeType }));\n objectUrls.push(objectUrl);\n return objectUrl;\n}\n\nfunction buildWorksheetDirectImageAnchor(\n rawAnchor: unknown,\n widthEmu: number,\n heightEmu: number\n): XlsxImage[\"anchor\"] {\n const anchor = rawAnchor && typeof rawAnchor === \"object\" ? rawAnchor as WorksheetDirectImageAnchorInfo : {};\n const fromCol = asFiniteNumber(anchor.fromCol) ?? 0;\n const fromRow = asFiniteNumber(anchor.fromRow) ?? 0;\n const fromColOffset = asFiniteNumber(anchor.fromColOffset) ?? 0;\n const fromRowOffset = asFiniteNumber(anchor.fromRowOffset) ?? 0;\n const toCol = asFiniteNumber(anchor.toCol);\n const toRow = asFiniteNumber(anchor.toRow);\n const toColOffset = asFiniteNumber(anchor.toColOffset) ?? 0;\n const toRowOffset = asFiniteNumber(anchor.toRowOffset) ?? 0;\n\n if (toCol !== null && toRow !== null) {\n return {\n from: {\n col: Math.max(0, Math.round(fromCol)),\n colOffsetEmu: Math.max(0, Math.round(fromColOffset)),\n row: Math.max(0, Math.round(fromRow)),\n rowOffsetEmu: Math.max(0, Math.round(fromRowOffset))\n },\n kind: \"two-cell\",\n to: {\n col: Math.max(0, Math.round(toCol)),\n colOffsetEmu: Math.max(0, Math.round(toColOffset)),\n row: Math.max(0, Math.round(toRow)),\n rowOffsetEmu: Math.max(0, Math.round(toRowOffset))\n }\n };\n }\n\n return {\n from: {\n col: Math.max(0, Math.round(fromCol)),\n colOffsetEmu: Math.max(0, Math.round(fromColOffset)),\n row: Math.max(0, Math.round(fromRow)),\n rowOffsetEmu: Math.max(0, Math.round(fromRowOffset))\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: Math.max(EMU_PER_PIXEL, Math.round(widthEmu)),\n cy: Math.max(EMU_PER_PIXEL, Math.round(heightEmu))\n }\n };\n}\n\nfunction normalizeWorksheetDirectShapeParagraphs(rawParagraphs: unknown, fallbackText: unknown): XlsxShape[\"paragraphs\"] {\n const normalizedParagraphs: XlsxShape[\"paragraphs\"] = [];\n\n if (Array.isArray(rawParagraphs)) {\n for (const entry of rawParagraphs) {\n const paragraph = entry && typeof entry === \"object\" ? entry as WorksheetDirectShapeParagraphInfo : {};\n const runs: XlsxShape[\"paragraphs\"][number][\"runs\"] = [];\n if (Array.isArray(paragraph.runs)) {\n for (const runEntry of paragraph.runs) {\n const run = runEntry && typeof runEntry === \"object\" ? runEntry as WorksheetDirectShapeParagraphRunInfo : {};\n const text = typeof run.text === \"string\" ? run.text : \"\";\n if (!text) {\n continue;\n }\n runs.push({\n bold: typeof run.bold === \"boolean\" ? run.bold : undefined,\n color: typeof run.color === \"string\" && run.color.trim() ? run.color : undefined,\n fontFamily: typeof run.fontFamily === \"string\" && run.fontFamily.trim() ? run.fontFamily : undefined,\n fontSizePt: asFiniteNumber(run.fontSizePt) ?? undefined,\n italic: typeof run.italic === \"boolean\" ? run.italic : undefined,\n text,\n underline: typeof run.underline === \"boolean\" ? run.underline : undefined\n });\n }\n }\n if (runs.length === 0) {\n continue;\n }\n const align = paragraph.align;\n normalizedParagraphs.push({\n align: align === \"center\" || align === \"justify\" || align === \"left\" || align === \"right\" ? align : undefined,\n runs\n });\n }\n }\n\n if (normalizedParagraphs.length > 0) {\n return normalizedParagraphs;\n }\n\n const text = typeof fallbackText === \"string\" ? fallbackText : \"\";\n return text\n ? [{ runs: [{ text }] }]\n : [];\n}\n\nfunction buildWorksheetDirectApiShape(\n workbookSheetIndex: number,\n info: WorksheetDirectShapeInfo,\n zIndex: number\n): XlsxShape {\n const fill = info.fill && typeof info.fill === \"object\"\n ? {\n color: typeof info.fill.color === \"string\" && info.fill.color.trim() ? info.fill.color : undefined,\n none: typeof info.fill.none === \"boolean\" ? info.fill.none : undefined,\n opacity: asFiniteNumber(info.fill.opacity) ?? undefined\n }\n : undefined;\n const stroke = info.stroke && typeof info.stroke === \"object\"\n ? {\n color: typeof info.stroke.color === \"string\" && info.stroke.color.trim() ? info.stroke.color : undefined,\n dash: typeof info.stroke.dash === \"string\" && info.stroke.dash.trim() ? info.stroke.dash : undefined,\n headEndType: typeof info.stroke.headEndType === \"string\" && info.stroke.headEndType.trim() ? info.stroke.headEndType : undefined,\n none: typeof info.stroke.none === \"boolean\" ? info.stroke.none : undefined,\n opacity: asFiniteNumber(info.stroke.opacity) ?? undefined,\n tailEndType: typeof info.stroke.tailEndType === \"string\" && info.stroke.tailEndType.trim() ? info.stroke.tailEndType : undefined,\n widthPx: asFiniteNumber(info.stroke.widthPx) ?? undefined\n }\n : undefined;\n const rawSvgViewBox = info.svgViewBox && typeof info.svgViewBox === \"object\" ? info.svgViewBox : null;\n const rawTextBox = info.textBox && typeof info.textBox === \"object\" ? info.textBox : null;\n const rawInset = rawTextBox?.insetPx && typeof rawTextBox.insetPx === \"object\" ? rawTextBox.insetPx : null;\n\n return {\n anchor: buildWorksheetDirectImageAnchor(\n info.anchor,\n DEFAULT_COL_WIDTH * EMU_PER_PIXEL,\n DEFAULT_ROW_HEIGHT * EMU_PER_PIXEL\n ),\n description: typeof info.description === \"string\" && info.description.trim() ? info.description : undefined,\n fill,\n flipH: typeof info.flipH === \"boolean\" ? info.flipH : undefined,\n flipV: typeof info.flipV === \"boolean\" ? info.flipV : undefined,\n geometry: typeof info.geometry === \"string\" && info.geometry.trim() ? info.geometry : \"rect\",\n geometryAdjustments: info.geometryAdjustments && typeof info.geometryAdjustments === \"object\"\n ? Object.fromEntries(\n Object.entries(info.geometryAdjustments as Record<string, unknown>)\n .map(([key, value]) => [key, asFiniteNumber(value)])\n .filter((entry): entry is [string, number] => typeof entry[1] === \"number\")\n )\n : undefined,\n hyperlink: typeof info.hyperlink === \"string\" && info.hyperlink.trim() ? info.hyperlink : undefined,\n id: `shape-${workbookSheetIndex}-${String(info.id ?? zIndex)}`,\n name: typeof info.name === \"string\" && info.name.trim() ? info.name : undefined,\n paragraphs: normalizeWorksheetDirectShapeParagraphs(info.paragraphs, info.text),\n rotationDeg: asFiniteNumber(info.rotationDeg) ?? undefined,\n scaleX: asFiniteNumber(info.scaleX) ?? undefined,\n scaleY: asFiniteNumber(info.scaleY) ?? undefined,\n sheetIndex: workbookSheetIndex,\n svgPath: typeof info.svgPath === \"string\" && info.svgPath.trim() ? info.svgPath : undefined,\n svgViewBox: rawSvgViewBox\n && asFiniteNumber(rawSvgViewBox.width) !== null\n && asFiniteNumber(rawSvgViewBox.height) !== null\n ? {\n height: asFiniteNumber(rawSvgViewBox.height) ?? 0,\n width: asFiniteNumber(rawSvgViewBox.width) ?? 0\n }\n : undefined,\n stroke,\n textBox: rawTextBox\n ? {\n horizontalAlign: rawTextBox.horizontalAlign === \"center\" || rawTextBox.horizontalAlign === \"left\"\n ? rawTextBox.horizontalAlign\n : undefined,\n insetPx: rawInset\n ? {\n bottom: asFiniteNumber(rawInset.bottom) ?? 0,\n left: asFiniteNumber(rawInset.left) ?? 0,\n right: asFiniteNumber(rawInset.right) ?? 0,\n top: asFiniteNumber(rawInset.top) ?? 0\n }\n : undefined,\n verticalAlign: rawTextBox.verticalAlign === \"bottom\" || rawTextBox.verticalAlign === \"middle\" || rawTextBox.verticalAlign === \"top\"\n ? rawTextBox.verticalAlign\n : undefined\n }\n : undefined,\n workbookSheetIndex,\n zIndex\n };\n}\n\nfunction buildWorksheetApiImage(\n workbookSheetIndex: number,\n row: number,\n col: number,\n info: WorksheetApiImageInfo,\n zIndex: number\n): XlsxImage | null {\n if (typeof info.source !== \"string\" || !info.source) {\n return null;\n }\n\n const width = Math.max(1, Math.round(asFiniteNumber(info.width) ?? DEFAULT_COL_WIDTH));\n const height = Math.max(1, Math.round(asFiniteNumber(info.height) ?? DEFAULT_ROW_HEIGHT));\n const description = typeof info.altText === \"string\" && info.altText.trim() ? info.altText : undefined;\n\n return {\n anchor: {\n from: {\n col,\n colOffsetEmu: 0,\n row,\n rowOffsetEmu: 0\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: width * EMU_PER_PIXEL,\n cy: height * EMU_PER_PIXEL\n }\n },\n description,\n editable: false,\n id: `worksheet-image-${workbookSheetIndex}-${row}-${col}-${zIndex}`,\n mimeType: inferImageMimeType(info.source),\n sheetIndex: workbookSheetIndex,\n src: info.source,\n workbookSheetIndex,\n zIndex\n };\n}\n\nfunction buildWorksheetDirectApiImage(\n workbookSheetIndex: number,\n info: WorksheetDirectImageInfo,\n zIndex: number,\n objectUrls: string[]\n): XlsxImage | null {\n const mimeType = inferWorksheetDirectImageMimeType(info);\n const src = createWorksheetDirectImageSource(info.data, mimeType, objectUrls);\n if (!src) {\n return null;\n }\n\n const widthEmu = Math.max(EMU_PER_PIXEL, Math.round(asFiniteNumber(info.widthEmu) ?? DEFAULT_COL_WIDTH * EMU_PER_PIXEL));\n const heightEmu = Math.max(EMU_PER_PIXEL, Math.round(asFiniteNumber(info.heightEmu) ?? DEFAULT_ROW_HEIGHT * EMU_PER_PIXEL));\n return {\n anchor: buildWorksheetDirectImageAnchor(info.anchor, widthEmu, heightEmu),\n editable: false,\n id: `worksheet-image-${workbookSheetIndex}-${String(info.id ?? zIndex)}`,\n mediaPath: typeof info.mediaPath === \"string\" && info.mediaPath.trim() ? info.mediaPath : undefined,\n mimeType,\n name: typeof info.name === \"string\" && info.name.trim() ? info.name : undefined,\n sheetIndex: workbookSheetIndex,\n src,\n workbookSheetIndex,\n zIndex\n };\n}\n\nfunction collectWorksheetBatchImages(workbook: Workbook) {\n const imagesByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, () => [] as XlsxImage[]);\n\n for (let workbookSheetIndex = 0; workbookSheetIndex < workbook.sheetCount; workbookSheetIndex += 1) {\n const worksheet = workbook.getSheet(workbookSheetIndex) as WorksheetWithRowsBatch;\n if (typeof worksheet.getRowsBatch !== \"function\") {\n continue;\n }\n\n const usedRange = worksheet.usedRange() as [number, number, number, number] | null;\n const maxRow = usedRange?.[2] ?? -1;\n if (maxRow < 0) {\n continue;\n }\n\n let zIndex = 1;\n let sheetFailed = false;\n for (let startRow = 0; startRow <= maxRow; startRow += IMAGE_BATCH_ROW_COUNT) {\n let rows: unknown;\n try {\n rows = worksheet.getRowsBatch(startRow, IMAGE_BATCH_ROW_COUNT, { includeImages: true });\n } catch {\n sheetFailed = true;\n break;\n }\n\n if (!Array.isArray(rows)) {\n continue;\n }\n\n for (const rowEntry of rows as WorksheetApiRow[]) {\n const row = typeof rowEntry.index === \"number\" ? rowEntry.index : null;\n if (row === null || !Array.isArray(rowEntry.cells)) {\n continue;\n }\n\n for (const cellEntry of rowEntry.cells as WorksheetApiRowCell[]) {\n const col = typeof cellEntry.col === \"number\" ? cellEntry.col : null;\n if (col === null || !cellEntry.image || typeof cellEntry.image !== \"object\") {\n continue;\n }\n\n const image = buildWorksheetApiImage(workbookSheetIndex, row, col, cellEntry.image, zIndex);\n if (!image) {\n continue;\n }\n\n imagesByWorkbookSheetIndex[workbookSheetIndex].push(image);\n zIndex += 1;\n }\n }\n }\n\n if (sheetFailed) {\n imagesByWorkbookSheetIndex[workbookSheetIndex] = [];\n }\n }\n\n return imagesByWorkbookSheetIndex;\n}\n\nfunction collectWorksheetApiImages(workbook: Workbook, objectUrls: string[]) {\n const directImagesByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, () => [] as XlsxImage[]);\n let didUseDirectImages = false;\n\n for (let workbookSheetIndex = 0; workbookSheetIndex < workbook.sheetCount; workbookSheetIndex += 1) {\n const worksheet = workbook.getSheet(workbookSheetIndex) as ReturnType<Workbook[\"getSheet\"]> & {\n images?: unknown;\n };\n const rawImages = Array.isArray(worksheet.images) ? worksheet.images as WorksheetDirectImageInfo[] : [];\n if (rawImages.length === 0) {\n continue;\n }\n\n const nextImages = rawImages\n .map((info, index) => buildWorksheetDirectApiImage(workbookSheetIndex, info, index + 1, objectUrls))\n .filter((image): image is XlsxImage => Boolean(image));\n if (nextImages.length > 0) {\n directImagesByWorkbookSheetIndex[workbookSheetIndex] = nextImages;\n didUseDirectImages = true;\n }\n }\n\n if (didUseDirectImages) {\n return directImagesByWorkbookSheetIndex;\n }\n\n return collectWorksheetBatchImages(workbook);\n}\n\nfunction collectWorksheetApiShapes(workbook: Workbook) {\n return Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = workbook.getSheet(workbookSheetIndex) as ReturnType<Workbook[\"getSheet\"]> & {\n shapes?: unknown;\n };\n const rawShapes = Array.isArray(worksheet.shapes) ? worksheet.shapes as WorksheetDirectShapeInfo[] : [];\n return rawShapes\n .map((shape, index) => buildWorksheetDirectApiShape(workbookSheetIndex, shape, index + 1));\n });\n}\n\nfunction mergeParsedAndApiImages(parsedImages: XlsxImage[], apiImages: XlsxImage[]) {\n if (parsedImages.length === 0) {\n return apiImages;\n }\n if (apiImages.length === 0) {\n return parsedImages;\n }\n\n const normalizeTextKey = (value: string | undefined) => value?.trim().toLowerCase() ?? \"\";\n const anchorKey = (anchor: XlsxImage[\"anchor\"]) => {\n if (anchor.kind === \"absolute\") {\n return [\n \"absolute\",\n Math.round(anchor.positionEmu.x),\n Math.round(anchor.positionEmu.y),\n Math.round(anchor.sizeEmu.cx),\n Math.round(anchor.sizeEmu.cy)\n ].join(\":\");\n }\n if (anchor.kind === \"one-cell\") {\n return [\n \"one\",\n anchor.from.col,\n anchor.from.row,\n Math.round(anchor.from.colOffsetEmu),\n Math.round(anchor.from.rowOffsetEmu),\n Math.round(anchor.sizeEmu.cx),\n Math.round(anchor.sizeEmu.cy)\n ].join(\":\");\n }\n return [\n \"two\",\n anchor.from.col,\n anchor.from.row,\n Math.round(anchor.from.colOffsetEmu),\n Math.round(anchor.from.rowOffsetEmu),\n anchor.to.col,\n anchor.to.row,\n Math.round(anchor.to.colOffsetEmu),\n Math.round(anchor.to.rowOffsetEmu)\n ].join(\":\");\n };\n const imageKeys = (image: XlsxImage) => {\n const keys = [\n `${normalizeTextKey(image.mediaPath)}|${normalizeTextKey(image.name)}|${anchorKey(image.anchor)}`,\n `${normalizeTextKey(image.mediaPath)}|${anchorKey(image.anchor)}`,\n `${normalizeTextKey(image.name)}|${anchorKey(image.anchor)}`,\n `${anchorKey(image.anchor)}`\n ];\n return keys.filter((key, index) => key && keys.indexOf(key) === index);\n };\n\n const apiBuckets = new Map<string, XlsxImage[]>();\n for (const apiImage of apiImages) {\n for (const key of imageKeys(apiImage)) {\n const bucket = apiBuckets.get(key);\n if (bucket) {\n bucket.push(apiImage);\n } else {\n apiBuckets.set(key, [apiImage]);\n }\n }\n }\n\n const usedApiImages = new Set<XlsxImage>();\n const takeApiMatch = (image: XlsxImage) => {\n for (const key of imageKeys(image)) {\n const bucket = apiBuckets.get(key);\n if (!bucket) {\n continue;\n }\n const match = bucket.find((candidate) => !usedApiImages.has(candidate));\n if (match) {\n usedApiImages.add(match);\n return match;\n }\n }\n return null;\n };\n\n const merged = parsedImages.map((image) => {\n const apiImage = takeApiMatch(image);\n if (!apiImage) {\n return image;\n }\n\n return {\n ...image,\n anchor: apiImage.anchor,\n mediaPath: apiImage.mediaPath ?? image.mediaPath,\n mimeType: apiImage.mimeType,\n name: apiImage.name ?? image.name,\n src: apiImage.src\n };\n });\n\n return merged;\n}\n\nfunction isZipWorkbook(bytes: Uint8Array) {\n return bytes.byteLength >= 4 && bytes[0] === 0x50 && bytes[1] === 0x4b;\n}\n\nfunction createBasicWorkbookAssets(workbook: Workbook): WorkbookImageAssets {\n const objectUrls: string[] = [];\n return {\n archive: {},\n imageOriginsById: new Map(),\n imagesByWorkbookSheetIndex: collectWorksheetApiImages(workbook, objectUrls),\n namedCellStyleByName: {},\n objectUrls,\n shapesByWorkbookSheetIndex: collectWorksheetApiShapes(workbook),\n sheetOrigins: Array.from({ length: workbook.sheetCount }, () => null as WorkbookImageSheetOrigin | null),\n sheetStatesByWorkbookSheetIndex: Array.from({ length: workbook.sheetCount }, () => null),\n styleById: {},\n tableMetadataByWorkbookSheetIndex: Array.from({ length: workbook.sheetCount }, () => [] as WorkbookTableMetadata[]),\n tableStyleByName: {},\n themePalette: { colorsByIndex: {} }\n };\n}\n\nfunction loadWorkbookImageAssets(bytes: Uint8Array, workbook: Workbook) {\n if (!isZipWorkbook(bytes)) {\n return createBasicWorkbookAssets(workbook);\n }\n\n const parsedAssets = parseWorkbookImageAssets(bytes);\n const apiImagesByWorkbookSheetIndex = collectWorksheetApiImages(workbook, parsedAssets.objectUrls);\n\n const imagesByWorkbookSheetIndex = Array.from(\n { length: Math.max(workbook.sheetCount, parsedAssets.imagesByWorkbookSheetIndex.length, apiImagesByWorkbookSheetIndex.length) },\n (_, index) => {\n const parsedImages = parsedAssets.imagesByWorkbookSheetIndex[index] ?? [];\n const apiImages = apiImagesByWorkbookSheetIndex[index] ?? [];\n return mergeParsedAndApiImages(parsedImages, apiImages);\n }\n );\n\n return {\n ...parsedAssets,\n imagesByWorkbookSheetIndex\n };\n}\n\nfunction downloadArrayBuffer(file: ArrayBuffer, fileName: string) {\n const blob = new Blob([file], { type: XLSX_MIME_TYPE });\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = fileName;\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(objectUrl), 0);\n}\n\nfunction downloadBytes(bytes: Uint8Array, fileName: string, mimeType: string) {\n const normalizedBytes = new Uint8Array(bytes.byteLength);\n normalizedBytes.set(bytes);\n const blob = new Blob([normalizedBytes], { type: mimeType });\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = fileName;\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(objectUrl), 0);\n}\n\nfunction downloadText(text: string, fileName: string, mimeType: string) {\n const blob = new Blob([text], { type: mimeType });\n const objectUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = objectUrl;\n anchor.download = fileName;\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n setTimeout(() => URL.revokeObjectURL(objectUrl), 0);\n}\n\nfunction downloadUrl(src: string, fileName: string) {\n const anchor = document.createElement(\"a\");\n anchor.href = src;\n anchor.download = fileName;\n anchor.rel = \"noreferrer\";\n document.body.append(anchor);\n anchor.click();\n anchor.remove();\n}\n\nexport function useXlsxViewerController(options: UseXlsxViewerControllerOptions): XlsxViewerController {\n const {\n deferLoadingAboveBytes = DEFAULT_DEFER_LOADING_ABOVE_BYTES,\n file,\n fileName,\n maxFileSizeBytes = DEFAULT_MAX_FILE_SIZE_BYTES,\n readOnly: requestedReadOnly = false,\n readOnlyAboveBytes = 0,\n src,\n useWorker = true\n } = options;\n const [isLoading, setIsLoading] = React.useState(Boolean(file ?? src));\n const [error, setError] = React.useState<Error | null>(null);\n const [workbook, setWorkbook] = React.useState<Workbook | null>(null);\n const [sheets, setSheets] = React.useState<XlsxSheetData[]>([]);\n const [chartsByWorkbookSheetIndex, setChartsByWorkbookSheetIndex] = React.useState<XlsxChart[][]>([]);\n const [chartsheets, setChartsheets] = React.useState<XlsxChartsheet[]>([]);\n const [tabs, setTabs] = React.useState<XlsxWorkbookTab[]>([]);\n const [isChartsLoading, setIsChartsLoading] = React.useState(false);\n const [workerTablesByWorkbookSheetIndex, setWorkerTablesByWorkbookSheetIndex] = React.useState<XlsxTable[][]>([]);\n const [imagesByWorkbookSheetIndex, setImagesByWorkbookSheetIndex] = React.useState<XlsxImage[][]>([]);\n const [shapesByWorkbookSheetIndex, setShapesByWorkbookSheetIndex] = React.useState<XlsxShape[][]>([]);\n const [activeSheetIndex, setActiveSheetIndexState] = React.useState(0);\n const [activeTabIndex, setActiveTabIndexState] = React.useState(0);\n const [zoomScaleOverridesByTabId, setZoomScaleOverridesByTabId] = React.useState<Record<string, number>>({});\n const [activeCell, setActiveCell] = React.useState<XlsxCellAddress | null>(null);\n const [selection, setSelection] = React.useState<XlsxCellRange | null>(null);\n const [selectedChartId, setSelectedChartId] = React.useState<string | null>(null);\n const [selectedImageId, setSelectedImageId] = React.useState<string | null>(null);\n const [revision, setRevision] = React.useState(0);\n const selectionAnchorRef = React.useRef<XlsxCellAddress | null>(null);\n const undoStackRef = React.useRef<HistoryEntry[]>([]);\n const redoStackRef = React.useRef<HistoryEntry[]>([]);\n const isApplyingHistoryRef = React.useRef(false);\n const [historyRevision, setHistoryRevision] = React.useState(0);\n const [shouldAutoCalculate, setShouldAutoCalculate] = React.useState(false);\n const [workerCellSnapshotRevision, setWorkerCellSnapshotRevision] = React.useState(0);\n const [isWorkerBacked, setIsWorkerBacked] = React.useState(false);\n const [sortState, setSortState] = React.useState<XlsxTableSortState | null>(null);\n const [forcedReadOnly, setForcedReadOnly] = React.useState(false);\n const deferredBufferRef = React.useRef<ArrayBuffer | null>(null);\n const [deferredLoadFileSize, setDeferredLoadFileSize] = React.useState<number | null>(null);\n const imageAssetsRef = React.useRef<WorkbookImageAssets | null>(null);\n const chartAssetsRef = React.useRef<WorkbookChartAssets | null>(null);\n const chartLoadRequestTokenRef = React.useRef(0);\n const chartDisplayFallbackCleanupRef = React.useRef<(() => void) | null>(null);\n const sheetOriginsRef = React.useRef<Array<WorkbookImageSheetOrigin | null>>([]);\n const workerClientRef = React.useRef<XlsxWorkerClient | null>(null);\n const workerCellSnapshotCacheRef = React.useRef(new Map<string, { displayValue: string; formula: string }>());\n const displayFileName = React.useMemo(() => resolveDisplayFileName(src, fileName), [fileName, src]);\n const shouldDeferLoading = deferLoadingAboveBytes > 0;\n const readOnly = requestedReadOnly || forcedReadOnly;\n const workerSupported = useWorker && typeof Worker !== \"undefined\";\n const shouldUseWorker = workerSupported && readOnly;\n const shouldForceReadOnlyForBuffer = React.useCallback((bufferByteLength: number) => (\n !requestedReadOnly && readOnlyAboveBytes > 0 && bufferByteLength > readOnlyAboveBytes\n ), [readOnlyAboveBytes, requestedReadOnly]);\n\n const disposeWorkerClient = React.useCallback(() => {\n workerClientRef.current?.dispose();\n workerClientRef.current = null;\n }, []);\n\n const getWorkerClient = React.useCallback(() => {\n if (!workerClientRef.current) {\n workerClientRef.current = new XlsxWorkerClient();\n }\n\n return workerClientRef.current;\n }, []);\n\n const clearImageAssets = React.useCallback(() => {\n revokeWorkbookImageAssets(imageAssetsRef.current);\n imageAssetsRef.current = null;\n sheetOriginsRef.current = [];\n setImagesByWorkbookSheetIndex([]);\n setShapesByWorkbookSheetIndex([]);\n }, []);\n\n const clearChartAssets = React.useCallback(() => {\n chartLoadRequestTokenRef.current += 1;\n chartDisplayFallbackCleanupRef.current?.();\n chartDisplayFallbackCleanupRef.current = null;\n chartAssetsRef.current = null;\n setChartsByWorkbookSheetIndex([]);\n setChartsheets([]);\n setTabs([]);\n setIsChartsLoading(false);\n }, []);\n\n const setImageAssets = React.useCallback((assets: WorkbookImageAssets | null) => {\n revokeWorkbookImageAssets(imageAssetsRef.current);\n imageAssetsRef.current = assets;\n sheetOriginsRef.current = assets?.sheetOrigins.slice() ?? [];\n setImagesByWorkbookSheetIndex(assets?.imagesByWorkbookSheetIndex ?? []);\n setShapesByWorkbookSheetIndex(assets?.shapesByWorkbookSheetIndex ?? []);\n }, []);\n\n const setChartAssets = React.useCallback((assets: WorkbookChartAssets | null) => {\n chartAssetsRef.current = assets;\n setChartsByWorkbookSheetIndex(assets?.chartsByWorkbookSheetIndex ?? []);\n setChartsheets(assets?.chartsheets ?? []);\n setTabs(assets?.tabs ?? []);\n setIsChartsLoading(false);\n }, []);\n\n const shouldFallbackFromWorkerError = React.useCallback((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return (\n message.includes(\"DOMParser is not defined\")\n || message.includes(\"XMLSerializer is not defined\")\n || message.includes(\"Worker chart payload incomplete\")\n );\n }, []);\n\n const hasIncompleteWorkerChartSnapshot = React.useCallback((snapshot: {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n }) => {\n for (const sheetCharts of snapshot.chartsByWorkbookSheetIndex) {\n for (const chart of sheetCharts) {\n if (!chart.chartPath) {\n return true;\n }\n if (chart.chartType !== \"Bubble\") {\n continue;\n }\n for (const series of chart.series) {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 1) {\n continue;\n }\n const numericBubbleSizes = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n );\n if (numericBubbleSizes.length < pointCount) {\n return true;\n }\n }\n }\n }\n\n return false;\n }, []);\n\n const ensureChartAssetsHydrated = React.useCallback((\n targetWorkbook: Workbook | null,\n targetSheets: XlsxSheetData[]\n ) => {\n if (chartAssetsRef.current || !targetWorkbook || !imageAssetsRef.current) {\n return chartAssetsRef.current;\n }\n\n const assets = loadWorkbookChartAssets(\n targetWorkbook,\n imageAssetsRef.current,\n buildVisibleSheetIndexMap(targetSheets)\n );\n chartAssetsRef.current = assets;\n return assets;\n }, []);\n\n const startChartDisplayHydration = React.useCallback((\n buffer: ArrayBuffer,\n targetWorkbook: Workbook,\n targetSheets: XlsxSheetData[]\n ) => {\n const visibleSheetIndexByWorkbookSheetIndex = buildVisibleSheetIndexMap(targetSheets);\n const quickAssets = loadWorkbookChartAssets(targetWorkbook, null, visibleSheetIndexByWorkbookSheetIndex);\n setChartAssets(quickAssets);\n\n const hasCharts = quickAssets.chartsByWorkbookSheetIndex.some((sheetCharts) => sheetCharts.length > 0);\n if (!hasCharts) {\n setIsChartsLoading(false);\n return;\n }\n\n setIsChartsLoading(true);\n const requestToken = chartLoadRequestTokenRef.current + 1;\n chartLoadRequestTokenRef.current = requestToken;\n chartDisplayFallbackCleanupRef.current?.();\n chartDisplayFallbackCleanupRef.current = null;\n let fallbackTriggered = false;\n const triggerFallback = () => {\n if (fallbackTriggered || requestToken !== chartLoadRequestTokenRef.current) {\n return;\n }\n fallbackTriggered = true;\n runMainThreadFallback();\n };\n const workerTimeoutHandle = typeof window !== \"undefined\"\n ? window.setTimeout(() => {\n triggerFallback();\n }, 1500)\n : null;\n\n const applyWorkerResult = (result: {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n }) => {\n if (requestToken !== chartLoadRequestTokenRef.current) {\n return;\n }\n setChartsByWorkbookSheetIndex(result.chartsByWorkbookSheetIndex);\n setChartsheets(result.chartsheets);\n setTabs(result.tabs);\n setIsChartsLoading(false);\n };\n\n const runMainThreadFallback = () => {\n chartDisplayFallbackCleanupRef.current = scheduleLowPriorityTask(() => {\n if (requestToken !== chartLoadRequestTokenRef.current) {\n return;\n }\n try {\n const hydratedAssets = loadWorkbookChartAssets(\n targetWorkbook,\n imageAssetsRef.current,\n visibleSheetIndexByWorkbookSheetIndex\n );\n if (requestToken !== chartLoadRequestTokenRef.current) {\n return;\n }\n setChartAssets(hydratedAssets);\n } catch {\n if (requestToken !== chartLoadRequestTokenRef.current) {\n return;\n }\n setChartAssets(quickAssets);\n } finally {\n if (requestToken === chartLoadRequestTokenRef.current) {\n setIsChartsLoading(false);\n }\n }\n });\n };\n\n if (!workerSupported) {\n runMainThreadFallback();\n return;\n }\n\n void getWorkerClient().parseCharts(buffer)\n .then((result) => {\n if (workerTimeoutHandle !== null) {\n window.clearTimeout(workerTimeoutHandle);\n }\n if (fallbackTriggered) {\n return;\n }\n try {\n if (hasIncompleteWorkerChartSnapshot(result)) {\n triggerFallback();\n return;\n }\n applyWorkerResult(result);\n } catch {\n triggerFallback();\n }\n })\n .catch(() => {\n if (workerTimeoutHandle !== null) {\n window.clearTimeout(workerTimeoutHandle);\n }\n triggerFallback();\n });\n }, [getWorkerClient, hasIncompleteWorkerChartSnapshot, setChartAssets, workerSupported]);\n\n const loadWorkbookOnMainThread = React.useCallback(async (buffer: ArrayBuffer) => {\n const nextParsedWorkbook = await parseWorkbookBuffer(buffer);\n const nextImageAssets = loadWorkbookImageAssets(new Uint8Array(buffer), nextParsedWorkbook.workbook);\n return {\n imageAssets: nextImageAssets,\n parsedWorkbook: nextParsedWorkbook\n };\n }, []);\n\n const refreshWorkbookState = React.useCallback((targetWorkbook: Workbook) => {\n const nextSheets = buildSheetList(\n targetWorkbook,\n imageAssetsRef.current?.sheetStatesByWorkbookSheetIndex,\n imageAssetsRef.current?.themePalette,\n imageAssetsRef.current?.styleById,\n imageAssetsRef.current?.namedCellStyleByName,\n imageAssetsRef.current?.tableStyleByName\n );\n setSheets(nextSheets);\n setChartAssets(\n loadWorkbookChartAssets(\n targetWorkbook,\n imageAssetsRef.current,\n buildVisibleSheetIndexMap(nextSheets)\n )\n );\n setRevision((current) => current + 1);\n }, [setChartAssets]);\n\n React.useEffect(() => () => {\n chartDisplayFallbackCleanupRef.current?.();\n chartDisplayFallbackCleanupRef.current = null;\n revokeWorkbookImageAssets(imageAssetsRef.current);\n disposeWorkerClient();\n }, [disposeWorkerClient]);\n\n React.useEffect(() => {\n if (!file && !src) {\n disposeWorkerClient();\n setForcedReadOnly(false);\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n clearImageAssets();\n setError(null);\n setIsLoading(false);\n setIsWorkerBacked(false);\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setActiveSheetIndexState(0);\n setActiveTabIndexState(0);\n setActiveCell(null);\n setSelection(null);\n setSelectedChartId(null);\n setSelectedImageId(null);\n selectionAnchorRef.current = null;\n undoStackRef.current = [];\n redoStackRef.current = [];\n setHistoryRevision(0);\n setShouldAutoCalculate(false);\n workerCellSnapshotCacheRef.current.clear();\n setWorkerCellSnapshotRevision(0);\n setSortState(null);\n setZoomScaleOverridesByTabId({});\n setRevision(0);\n return;\n }\n\n let isCurrent = true;\n setIsLoading(true);\n setError(null);\n clearImageAssets();\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n setIsWorkerBacked(false);\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setActiveSheetIndexState(0);\n setActiveTabIndexState(0);\n setActiveCell(null);\n setSelection(null);\n setSelectedChartId(null);\n setSelectedImageId(null);\n selectionAnchorRef.current = null;\n undoStackRef.current = [];\n redoStackRef.current = [];\n setHistoryRevision(0);\n setShouldAutoCalculate(false);\n workerCellSnapshotCacheRef.current.clear();\n setWorkerCellSnapshotRevision(0);\n setSortState(null);\n setZoomScaleOverridesByTabId({});\n setRevision(0);\n if (!workerSupported) {\n disposeWorkerClient();\n }\n\n void resolveWorkbookBuffer({ file, src })\n .then(async (buffer) => {\n if (!isCurrent) {\n return;\n }\n\n if (maxFileSizeBytes > 0 && buffer.byteLength > maxFileSizeBytes) {\n throw new XlsxFileSizeLimitExceededError(buffer.byteLength, maxFileSizeBytes);\n }\n\n const preflight = preflightWorkbookBuffer(buffer);\n if (preflight?.tooLarge) {\n throw createWorkbookTooLargeError(preflight);\n }\n\n const shouldForceReadOnly = shouldForceReadOnlyForBuffer(buffer.byteLength);\n setForcedReadOnly(shouldForceReadOnly);\n const shouldUseWorkerForLoad = workerSupported && (requestedReadOnly || shouldForceReadOnly);\n\n if (shouldDeferLoading && buffer.byteLength > deferLoadingAboveBytes) {\n deferredBufferRef.current = buffer;\n setDeferredLoadFileSize(buffer.byteLength);\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n setIsLoading(false);\n return;\n }\n\n if (shouldUseWorkerForLoad) {\n try {\n const snapshot = await getWorkerClient().loadWorkbook(buffer);\n if (!isCurrent) {\n return;\n }\n if (hasIncompleteWorkerChartSnapshot(snapshot)) {\n throw new Error(\"Worker chart payload incomplete\");\n }\n\n setWorkbook(null);\n setSheets(snapshot.sheets);\n setChartsByWorkbookSheetIndex(snapshot.chartsByWorkbookSheetIndex);\n setChartsheets(snapshot.chartsheets);\n setTabs(snapshot.tabs);\n chartAssetsRef.current = null;\n setWorkerTablesByWorkbookSheetIndex(snapshot.tablesByWorkbookSheetIndex);\n setShouldAutoCalculate(false);\n setIsWorkerBacked(true);\n setSortState(null);\n setIsChartsLoading(false);\n setIsLoading(false);\n return;\n } catch (workerError) {\n if (!shouldFallbackFromWorkerError(workerError)) {\n throw workerError;\n }\n\n disposeWorkerClient();\n }\n }\n\n const { imageAssets: nextImageAssets, parsedWorkbook: nextParsedWorkbook } = await loadWorkbookOnMainThread(buffer);\n if (!isCurrent) {\n revokeWorkbookImageAssets(nextImageAssets);\n return;\n }\n\n setImageAssets(nextImageAssets);\n setWorkbook(nextParsedWorkbook.workbook);\n const nextSheets = buildSheetList(\n nextParsedWorkbook.workbook,\n nextImageAssets.sheetStatesByWorkbookSheetIndex,\n nextImageAssets.themePalette,\n nextImageAssets.styleById,\n nextImageAssets.namedCellStyleByName,\n nextImageAssets.tableStyleByName\n );\n setSheets(nextSheets);\n startChartDisplayHydration(buffer, nextParsedWorkbook.workbook, nextSheets);\n setShouldAutoCalculate(nextParsedWorkbook.shouldAutoCalculate);\n setWorkerTablesByWorkbookSheetIndex([]);\n setIsWorkerBacked(false);\n setSortState(null);\n setIsLoading(false);\n })\n .catch((nextError: unknown) => {\n if (!isCurrent) {\n return;\n }\n\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n clearImageAssets();\n setShouldAutoCalculate(false);\n setIsWorkerBacked(false);\n setSortState(null);\n setError(nextError instanceof Error ? nextError : new Error(\"Could not load workbook.\"));\n setIsLoading(false);\n });\n\n return () => {\n isCurrent = false;\n if (!workerSupported) {\n disposeWorkerClient();\n }\n };\n }, [\n clearChartAssets,\n clearImageAssets,\n deferLoadingAboveBytes,\n disposeWorkerClient,\n file,\n getWorkerClient,\n hasIncompleteWorkerChartSnapshot,\n loadWorkbookOnMainThread,\n maxFileSizeBytes,\n requestedReadOnly,\n setImageAssets,\n startChartDisplayHydration,\n shouldFallbackFromWorkerError,\n shouldDeferLoading,\n shouldForceReadOnlyForBuffer,\n workerSupported,\n src\n ]);\n\n const activeTab = tabs[activeTabIndex] ?? null;\n const activeSheet = activeTab?.kind === \"sheet\"\n ? sheets[activeTab.sheetIndex ?? -1] ?? null\n : null;\n const deferredMetadataCell = React.useDeferredValue(activeCell);\n const deferredMetadataSheet = React.useDeferredValue(activeSheet);\n const activeZoomTabKey = activeTab?.id ?? DEFAULT_ZOOM_TAB_KEY;\n const defaultZoomScale = React.useMemo(\n () => resolveDefaultZoomScale(activeTab, activeSheet),\n [activeSheet, activeTab]\n );\n const zoomScale = React.useMemo(\n () => clampZoomScale(zoomScaleOverridesByTabId[activeZoomTabKey] ?? defaultZoomScale),\n [activeZoomTabKey, defaultZoomScale, zoomScaleOverridesByTabId]\n );\n const canZoomIn = zoomScale < MAX_ZOOM_SCALE;\n const canZoomOut = zoomScale > MIN_ZOOM_SCALE;\n\n React.useEffect(() => {\n setActiveCell(null);\n setSelection(null);\n setSelectedChartId(null);\n setSelectedImageId(null);\n selectionAnchorRef.current = null;\n setSortState(null);\n }, [activeTabIndex]);\n\n const setActiveSheetIndex = React.useCallback((index: number) => {\n setActiveSheetIndexState((currentIndex) => {\n if (index < 0 || index >= sheets.length) {\n return currentIndex;\n }\n const targetSheet = sheets[index];\n const tabIndex = tabs.findIndex((tab) => tab.kind === \"sheet\" && tab.workbookSheetIndex === targetSheet?.workbookSheetIndex);\n if (tabIndex >= 0) {\n setActiveTabIndexState(tabIndex);\n }\n return index;\n });\n }, [sheets, tabs]);\n\n const setActiveTabIndex = React.useCallback((index: number) => {\n setActiveTabIndexState((currentIndex) => {\n if (index < 0 || index >= tabs.length) {\n return currentIndex;\n }\n\n const targetTab = tabs[index];\n if (targetTab?.kind === \"sheet\" && typeof targetTab.sheetIndex === \"number\") {\n setActiveSheetIndexState(targetTab.sheetIndex);\n }\n return index;\n });\n }, [tabs]);\n\n const setZoomScale = React.useCallback((nextZoomScale: number) => {\n const normalizedZoomScale = clampZoomScale(nextZoomScale);\n setZoomScaleOverridesByTabId((current) => {\n if (current[activeZoomTabKey] === normalizedZoomScale) {\n return current;\n }\n\n return {\n ...current,\n [activeZoomTabKey]: normalizedZoomScale\n };\n });\n }, [activeZoomTabKey]);\n\n const resetZoom = React.useCallback(() => {\n setZoomScaleOverridesByTabId((current) => {\n if (current[activeZoomTabKey] === undefined) {\n return current;\n }\n\n const next = { ...current };\n delete next[activeZoomTabKey];\n return next;\n });\n }, [activeZoomTabKey]);\n\n const zoomIn = React.useCallback(() => {\n setZoomScale(resolveNextZoomScale(zoomScale, 1));\n }, [setZoomScale, zoomScale]);\n\n const zoomOut = React.useCallback(() => {\n setZoomScale(resolveNextZoomScale(zoomScale, -1));\n }, [setZoomScale, zoomScale]);\n\n React.useEffect(() => {\n setActiveTabIndexState((current) => {\n if (tabs.length === 0) {\n return 0;\n }\n return Math.min(current, tabs.length - 1);\n });\n }, [tabs.length]);\n\n const continueDeferredLoad = React.useCallback(() => {\n const deferredBuffer = deferredBufferRef.current;\n if (!deferredBuffer) {\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n if (maxFileSizeBytes > 0 && deferredBuffer.byteLength > maxFileSizeBytes) {\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n clearImageAssets();\n setShouldAutoCalculate(false);\n setIsWorkerBacked(false);\n setSortState(null);\n setError(new XlsxFileSizeLimitExceededError(deferredBuffer.byteLength, maxFileSizeBytes));\n setIsLoading(false);\n return;\n }\n\n const preflight = preflightWorkbookBuffer(deferredBuffer);\n if (preflight?.tooLarge) {\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n clearImageAssets();\n setShouldAutoCalculate(false);\n setIsWorkerBacked(false);\n setSortState(null);\n setError(createWorkbookTooLargeError(preflight));\n setIsLoading(false);\n return;\n }\n\n const shouldForceReadOnly = shouldForceReadOnlyForBuffer(deferredBuffer.byteLength);\n setForcedReadOnly(shouldForceReadOnly);\n const shouldUseWorkerForLoad = workerSupported && (requestedReadOnly || shouldForceReadOnly);\n\n if (shouldUseWorkerForLoad) {\n void getWorkerClient().loadWorkbook(deferredBuffer)\n .then((snapshot) => {\n if (hasIncompleteWorkerChartSnapshot(snapshot)) {\n throw new Error(\"Worker chart payload incomplete\");\n }\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setWorkbook(null);\n setSheets(snapshot.sheets);\n setChartsByWorkbookSheetIndex(snapshot.chartsByWorkbookSheetIndex);\n setChartsheets(snapshot.chartsheets);\n setTabs(snapshot.tabs);\n chartAssetsRef.current = null;\n setWorkerTablesByWorkbookSheetIndex(snapshot.tablesByWorkbookSheetIndex);\n setShouldAutoCalculate(false);\n setIsWorkerBacked(true);\n setSortState(null);\n setIsChartsLoading(false);\n setIsLoading(false);\n })\n .catch(async (workerError: unknown) => {\n if (!shouldFallbackFromWorkerError(workerError)) {\n throw workerError;\n }\n\n disposeWorkerClient();\n const { imageAssets: nextImageAssets, parsedWorkbook: nextParsedWorkbook } = await loadWorkbookOnMainThread(deferredBuffer);\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setImageAssets(nextImageAssets);\n setWorkbook(nextParsedWorkbook.workbook);\n const nextSheets = buildSheetList(\n nextParsedWorkbook.workbook,\n nextImageAssets.sheetStatesByWorkbookSheetIndex,\n nextImageAssets.themePalette,\n nextImageAssets.styleById,\n nextImageAssets.namedCellStyleByName,\n nextImageAssets.tableStyleByName\n );\n setSheets(nextSheets);\n startChartDisplayHydration(deferredBuffer, nextParsedWorkbook.workbook, nextSheets);\n setShouldAutoCalculate(nextParsedWorkbook.shouldAutoCalculate);\n setWorkerTablesByWorkbookSheetIndex([]);\n setIsWorkerBacked(false);\n setSortState(null);\n setIsLoading(false);\n })\n .catch((nextError: unknown) => {\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n clearImageAssets();\n setShouldAutoCalculate(false);\n setIsWorkerBacked(false);\n setSortState(null);\n setError(nextError instanceof Error ? nextError : new Error(\"Could not load workbook.\"));\n setIsLoading(false);\n });\n return;\n }\n\n void parseWorkbookBuffer(deferredBuffer)\n .then((nextParsedWorkbook) => {\n const nextImageAssets = loadWorkbookImageAssets(new Uint8Array(deferredBuffer), nextParsedWorkbook.workbook);\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setImageAssets(nextImageAssets);\n setWorkbook(nextParsedWorkbook.workbook);\n const nextSheets = buildSheetList(\n nextParsedWorkbook.workbook,\n nextImageAssets.sheetStatesByWorkbookSheetIndex,\n nextImageAssets.themePalette,\n nextImageAssets.styleById,\n nextImageAssets.namedCellStyleByName,\n nextImageAssets.tableStyleByName\n );\n setSheets(nextSheets);\n startChartDisplayHydration(deferredBuffer, nextParsedWorkbook.workbook, nextSheets);\n setShouldAutoCalculate(nextParsedWorkbook.shouldAutoCalculate);\n setWorkerTablesByWorkbookSheetIndex([]);\n setIsWorkerBacked(false);\n setSortState(null);\n setIsLoading(false);\n })\n .catch((nextError: unknown) => {\n deferredBufferRef.current = null;\n setDeferredLoadFileSize(null);\n setWorkbook(null);\n setSheets([]);\n clearChartAssets();\n setWorkerTablesByWorkbookSheetIndex([]);\n clearImageAssets();\n setShouldAutoCalculate(false);\n setIsWorkerBacked(false);\n setSortState(null);\n setError(nextError instanceof Error ? nextError : new Error(\"Could not load workbook.\"));\n setIsLoading(false);\n });\n }, [\n clearChartAssets,\n clearImageAssets,\n disposeWorkerClient,\n getWorkerClient,\n loadWorkbookOnMainThread,\n requestedReadOnly,\n setImageAssets,\n startChartDisplayHydration,\n hasIncompleteWorkerChartSnapshot,\n maxFileSizeBytes,\n shouldFallbackFromWorkerError,\n shouldForceReadOnlyForBuffer,\n workerSupported\n ]);\n\n const maybeRecalculateWorkbook = React.useCallback((targetWorkbook: Workbook) => {\n if (!shouldAutoCalculate) {\n return;\n }\n\n targetWorkbook.calculate();\n }, [shouldAutoCalculate]);\n\n const getActiveWorksheet = React.useCallback(() => {\n if (!workbook || !activeSheet) {\n return null;\n }\n\n return workbook.getSheet(activeSheet.workbookSheetIndex);\n }, [activeSheet, workbook]);\n\n const activeTableMetadata = imageAssetsRef.current?.tableMetadataByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? null;\n const tables = React.useMemo(\n () => (\n isWorkerBacked\n ? workerTablesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? []\n : mapWorksheetTables(getActiveWorksheet(), activeTableMetadata)\n ),\n [activeSheet?.workbookSheetIndex, activeTableMetadata, getActiveWorksheet, isWorkerBacked, revision, workerTablesByWorkbookSheetIndex]\n );\n\n const getCellSnapshotAsync = React.useCallback((workbookSheetIndex: number, row: number, col: number) => {\n if (!isWorkerBacked) {\n return Promise.resolve({\n displayValue: \"\",\n formula: \"\"\n });\n }\n\n return getWorkerClient().getCellSnapshot(workbookSheetIndex, row, col);\n }, [getWorkerClient, isWorkerBacked]);\n\n const getRowsBatchAsync = React.useCallback((workbookSheetIndex: number, startRow: number, rowCount: number) => {\n if (!isWorkerBacked) {\n return Promise.resolve(null);\n }\n\n return getWorkerClient().getRowsBatch(workbookSheetIndex, startRow, rowCount);\n }, [getWorkerClient, isWorkerBacked]);\n\n const visibleSheetIndexByWorkbookSheetIndex = React.useMemo(\n () => new Map(sheets.map((sheet, index) => [sheet.workbookSheetIndex, index])),\n [sheets]\n );\n\n const mapPublicChart = React.useCallback((chart: XlsxChart) => {\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(chart.workbookSheetIndex);\n return {\n ...chart,\n sheetIndex: visibleSheetIndex ?? chart.workbookSheetIndex\n };\n }, [visibleSheetIndexByWorkbookSheetIndex]);\n\n const mapPublicImage = React.useCallback((image: XlsxImage) => {\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(image.workbookSheetIndex);\n return {\n ...image,\n sheetIndex: visibleSheetIndex ?? image.workbookSheetIndex\n };\n }, [visibleSheetIndexByWorkbookSheetIndex]);\n\n const publicChartsByWorkbookSheetIndex = React.useMemo(\n () => chartsByWorkbookSheetIndex.map((sheetCharts) => sheetCharts.map(mapPublicChart)),\n [chartsByWorkbookSheetIndex, mapPublicChart]\n );\n const publicChartById = React.useMemo(() => {\n const lookup = new Map<string, XlsxChart>();\n for (const sheetCharts of publicChartsByWorkbookSheetIndex) {\n for (const chart of sheetCharts) {\n lookup.set(chart.id, chart);\n }\n }\n return lookup;\n }, [publicChartsByWorkbookSheetIndex]);\n\n const getSheetCharts = React.useCallback((sheetIndex = activeSheetIndex) => {\n const targetSheet = sheets[sheetIndex];\n if (!targetSheet) {\n return [];\n }\n\n return publicChartsByWorkbookSheetIndex[targetSheet.workbookSheetIndex] ?? [];\n }, [activeSheetIndex, publicChartsByWorkbookSheetIndex, sheets]);\n\n const getChartById = React.useCallback((id: string) => {\n return publicChartById.get(id) ?? null;\n }, [publicChartById]);\n\n const getChartsheetById = React.useCallback((id: string) => (\n chartsheets.find((chartsheet) => chartsheet.id === id) ?? null\n ), [chartsheets]);\n\n const charts = React.useMemo(() => {\n if (activeTab?.kind === \"chartsheet\" && typeof activeTab.chartsheetIndex === \"number\") {\n const chartsheet = chartsheets[activeTab.chartsheetIndex];\n return (chartsheet?.chartIds ?? []).map((id) => getChartById(id)).filter((value): value is XlsxChart => Boolean(value));\n }\n\n return getSheetCharts(activeSheetIndex);\n }, [activeSheetIndex, activeTab, chartsheets, getChartById, getSheetCharts]);\n\n const selectedChart = React.useMemo(\n () => (selectedChartId ? getChartById(selectedChartId) : null),\n [getChartById, selectedChartId]\n );\n\n const selectChart = React.useCallback((id: string | null) => {\n setSelectedImageId(null);\n setSelectedChartId(id);\n }, []);\n\n const clearSelectedChart = React.useCallback(() => {\n setSelectedChartId(null);\n }, []);\n\n const getSheetImages = React.useCallback((sheetIndex = activeSheetIndex) => {\n const targetSheet = sheets[sheetIndex];\n if (!targetSheet) {\n return [];\n }\n\n return (imagesByWorkbookSheetIndex[targetSheet.workbookSheetIndex] ?? []).map(mapPublicImage);\n }, [activeSheetIndex, imagesByWorkbookSheetIndex, mapPublicImage, sheets]);\n\n const images = React.useMemo(() => getSheetImages(activeSheetIndex), [activeSheetIndex, getSheetImages]);\n\n const getSheetShapes = React.useCallback((sheetIndex = activeSheetIndex) => {\n const targetSheet = sheets[sheetIndex];\n if (!targetSheet) {\n return [];\n }\n\n return (shapesByWorkbookSheetIndex[targetSheet.workbookSheetIndex] ?? []).map((shape) => {\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(shape.workbookSheetIndex);\n return {\n ...shape,\n sheetIndex: visibleSheetIndex ?? shape.workbookSheetIndex\n };\n });\n }, [activeSheetIndex, shapesByWorkbookSheetIndex, sheets, visibleSheetIndexByWorkbookSheetIndex]);\n\n const shapes = React.useMemo(() => getSheetShapes(activeSheetIndex), [activeSheetIndex, getSheetShapes]);\n\n const getImageById = React.useCallback((id: string) => {\n for (const sheetImages of imagesByWorkbookSheetIndex) {\n const match = sheetImages?.find((image) => image.id === id);\n if (match) {\n return mapPublicImage(match);\n }\n }\n\n return null;\n }, [imagesByWorkbookSheetIndex, mapPublicImage]);\n\n const selectedImage = React.useMemo(\n () => (selectedImageId ? getImageById(selectedImageId) : null),\n [getImageById, selectedImageId]\n );\n\n const selectImage = React.useCallback((id: string | null) => {\n setSelectedChartId(null);\n setSelectedImageId(id);\n }, []);\n\n const clearSelectedImage = React.useCallback(() => {\n setSelectedImageId(null);\n }, []);\n\n const getColumnWidthPx = React.useCallback((worksheet: ReturnType<Workbook[\"getSheet\"]>, col: number) => {\n const sheetState = imageAssetsRef.current?.sheetStatesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? null;\n const width = worksheet.getColumnWidth(col);\n const showGridLines = activeSheet?.showGridLines ?? true;\n if (width !== undefined && width !== null) {\n return resolveRenderedSheetAxisPixels(\n resolveSheetColumnWidthPixels(width, sheetState?.columnWidthCharacterWidthPx),\n showGridLines\n );\n }\n\n return resolveRenderedSheetAxisPixels(\n sheetState?.colWidthOverridesPx?.[col] ?? sheetState?.defaultColWidthPx ?? DEFAULT_COL_WIDTH,\n showGridLines\n );\n }, [activeSheet?.showGridLines, activeSheet?.workbookSheetIndex]);\n\n const getRowHeightPx = React.useCallback((worksheet: ReturnType<Workbook[\"getSheet\"]>, row: number) => {\n const sheetState = imageAssetsRef.current?.sheetStatesByWorkbookSheetIndex[activeSheet?.workbookSheetIndex ?? -1] ?? null;\n const height = worksheet.getRowHeight(row);\n const showGridLines = activeSheet?.showGridLines ?? true;\n if (height !== undefined && height !== null) {\n return resolveRenderedSheetAxisPixels(resolveSheetRowHeightPixels(height), showGridLines);\n }\n\n return resolveRenderedSheetAxisPixels(\n sheetState?.rowHeightOverridesPx?.[row] ?? sheetState?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT,\n showGridLines\n );\n }, [activeSheet?.showGridLines, activeSheet?.workbookSheetIndex]);\n\n const getCellDisplayValue = React.useCallback((cell?: XlsxCellAddress | null) => {\n if (cell && activeSheet) {\n const workerSnapshot = workerCellSnapshotCacheRef.current.get(`${activeSheet.workbookSheetIndex}:${cell.row}:${cell.col}`);\n if (workerSnapshot) {\n return workerSnapshot.displayValue;\n }\n }\n\n const worksheet = getActiveWorksheet();\n if (!worksheet || !cell) {\n return \"\";\n }\n\n const formula = worksheet.getFormulaAt(cell.row, cell.col);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1(cell)] : undefined;\n const formatted = worksheet.getFormattedValueAt(cell.row, cell.col);\n if (formatted && !(formula && cachedFormulaValue !== undefined && formatted.startsWith(\"#\"))) {\n return decodeHtmlEntities(formatted);\n }\n\n const calculated = worksheet.getCalculatedValueAt(cell.row, cell.col);\n if (formula && cachedFormulaValue !== undefined && calculated.is_error) {\n return cachedFormulaValue;\n }\n if (calculated.is_error) {\n return calculated.asError() ?? \"\";\n }\n if (calculated.is_empty) {\n return \"\";\n }\n\n return calculated.toString();\n }, [activeSheet, getActiveWorksheet]);\n\n const getCellFormula = React.useCallback((cell?: XlsxCellAddress | null) => {\n if (cell && activeSheet) {\n const workerSnapshot = workerCellSnapshotCacheRef.current.get(`${activeSheet.workbookSheetIndex}:${cell.row}:${cell.col}`);\n if (workerSnapshot) {\n return workerSnapshot.formula;\n }\n }\n\n const worksheet = getActiveWorksheet();\n if (!worksheet || !cell) {\n return \"\";\n }\n\n return worksheet.getFormulaAt(cell.row, cell.col) ?? \"\";\n }, [activeSheet, getActiveWorksheet]);\n\n const getClipboardData = React.useCallback((): XlsxClipboardData | null => {\n const worksheet = getActiveWorksheet();\n const targetRange = selection ?? (activeCell ? { start: activeCell, end: activeCell } : null);\n if (!worksheet || !targetRange) {\n return null;\n }\n\n const normalized = normalizeRange(targetRange);\n const rows: string[] = [];\n const htmlRows: string[] = [];\n const payload: ClipboardPayload = {\n cells: [],\n cols: normalized.end.col - normalized.start.col + 1,\n merges: [],\n rows: normalized.end.row - normalized.start.row + 1\n };\n\n for (let row = normalized.start.row; row <= normalized.end.row; row += 1) {\n const textCells: string[] = [];\n const htmlCells: string[] = [];\n\n for (let col = normalized.start.col; col <= normalized.end.col; col += 1) {\n if (worksheet.isMergedSecondary(row, col)) {\n textCells.push(\"\");\n continue;\n }\n\n const formula = worksheet.getFormulaAt(row, col) ?? null;\n const value = getCellDisplayValue({ row, col });\n const merge = worksheet.getMergeSpan(row, col) as\n | { colSpan?: number; rowSpan?: number }\n | null\n | undefined;\n const rawStyle = (\n worksheet.getCellStyleAt(row, col) as Record<string, unknown> | null | undefined\n ) ?? resolveInheritedCellStyle(activeSheet, row, col);\n const cellStyles: string[] = [\n \"padding:2px 4px\",\n \"white-space:pre-wrap\",\n \"vertical-align:top\"\n ];\n\n const fill = rawStyle?.fill as Record<string, unknown> | undefined;\n if (fill) {\n const fillStyle = resolveWorkbookFillStyle(fill, activeSheet?.themePalette);\n if (fillStyle.backgroundColor && fillStyle.backgroundColor.toLowerCase() !== \"#ffffff\") {\n cellStyles.push(`background-color:${fillStyle.backgroundColor}`);\n }\n if (fillStyle.backgroundImage) {\n cellStyles.push(`background-image:${fillStyle.backgroundImage}`);\n }\n }\n\n const font = rawStyle?.font as Record<string, unknown> | undefined;\n if (font) {\n if (font.bold) {\n cellStyles.push(\"font-weight:700\");\n }\n if (font.italic) {\n cellStyles.push(\"font-style:italic\");\n }\n if (font.underline && font.underline !== \"none\") {\n cellStyles.push(\"text-decoration:underline\");\n }\n if (font.strikethrough) {\n cellStyles.push(\"text-decoration:line-through\");\n }\n const fontColor = resolveWorkbookColor(font.color as Record<string, unknown> | undefined, activeSheet?.themePalette);\n if (fontColor) {\n cellStyles.push(`color:${fontColor}`);\n }\n if (typeof font.size === \"number\") {\n cellStyles.push(`font-size:${font.size}pt`);\n }\n }\n\n const alignment = rawStyle?.alignment as Record<string, unknown> | undefined;\n if (alignment?.horizontal && alignment.horizontal !== \"general\") {\n cellStyles.push(`text-align:${String(alignment.horizontal)}`);\n }\n if (alignment?.wrapText) {\n cellStyles.push(\"white-space:pre-wrap\");\n cellStyles.push(\"word-break:break-word\");\n }\n\n const border = rawStyle?.border as Record<string, Record<string, unknown>> | undefined;\n if (border?.top?.style && border.top.style !== \"none\") {\n cellStyles.push(`border-top:${mapBorder(border.top as { color?: { hex?: string }; style: string })}`);\n }\n if (border?.right?.style && border.right.style !== \"none\") {\n cellStyles.push(`border-right:${mapBorder(border.right as { color?: { hex?: string }; style: string })}`);\n }\n if (border?.bottom?.style && border.bottom.style !== \"none\") {\n cellStyles.push(`border-bottom:${mapBorder(border.bottom as { color?: { hex?: string }; style: string })}`);\n }\n if (border?.left?.style && border.left.style !== \"none\") {\n cellStyles.push(`border-left:${mapBorder(border.left as { color?: { hex?: string }; style: string })}`);\n }\n\n const rowSpan = Math.min(merge?.rowSpan ?? 1, normalized.end.row - row + 1);\n const colSpan = Math.min(merge?.colSpan ?? 1, normalized.end.col - col + 1);\n\n payload.cells.push({\n colOffset: col - normalized.start.col,\n formula,\n rowOffset: row - normalized.start.row,\n value\n });\n\n if (rowSpan > 1 || colSpan > 1) {\n payload.merges.push({\n colOffset: col - normalized.start.col,\n colSpan,\n rowOffset: row - normalized.start.row,\n rowSpan\n });\n }\n\n textCells.push(value);\n htmlCells.push(\n `<td${rowSpan > 1 ? ` rowspan=\"${rowSpan}\"` : \"\"}${colSpan > 1 ? ` colspan=\"${colSpan}\"` : \"\"} style=\"${escapeHtml(cellStyles.join(\";\"))}\">${escapeHtml(value)}</td>`\n );\n }\n\n rows.push(textCells.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCells.join(\"\")}</tr>`);\n }\n\n return {\n html: `<table style=\"border-collapse:collapse\">${htmlRows.join(\"\")}</table>`,\n structured: JSON.stringify(payload),\n text: rows.join(\"\\n\")\n };\n }, [activeCell, getActiveWorksheet, getCellDisplayValue, selection]);\n\n React.useEffect(() => {\n if (!isWorkerBacked || !deferredMetadataSheet || !deferredMetadataCell) {\n return;\n }\n\n const cacheKey = `${deferredMetadataSheet.workbookSheetIndex}:${deferredMetadataCell.row}:${deferredMetadataCell.col}`;\n if (workerCellSnapshotCacheRef.current.has(cacheKey)) {\n return;\n }\n\n let isCurrent = true;\n void getCellSnapshotAsync(deferredMetadataSheet.workbookSheetIndex, deferredMetadataCell.row, deferredMetadataCell.col)\n .then((snapshot) => {\n if (!isCurrent) {\n return;\n }\n\n workerCellSnapshotCacheRef.current.set(cacheKey, snapshot);\n setWorkerCellSnapshotRevision((current) => current + 1);\n })\n .catch(() => {\n if (!isCurrent) {\n return;\n }\n\n workerCellSnapshotCacheRef.current.set(cacheKey, {\n displayValue: \"\",\n formula: \"\"\n });\n setWorkerCellSnapshotRevision((current) => current + 1);\n });\n\n return () => {\n isCurrent = false;\n };\n }, [deferredMetadataCell, deferredMetadataSheet, getCellSnapshotAsync, isWorkerBacked]);\n\n const activeCellAddress = React.useMemo(() => (activeCell ? cellAddressToA1(activeCell) : null), [activeCell]);\n const selectedRangeAddress = React.useMemo(() => (selection ? rangeToA1(selection) : null), [selection]);\n const selectedValue = React.useMemo(\n () => getCellDisplayValue(deferredMetadataCell),\n [deferredMetadataCell, getCellDisplayValue, revision, workerCellSnapshotRevision]\n );\n const selectedFormula = React.useMemo(\n () => getCellFormula(deferredMetadataCell),\n [deferredMetadataCell, getCellFormula, revision, workerCellSnapshotRevision]\n );\n const isLoadDeferred = deferredLoadFileSize !== null;\n const canLoadDeferred = !isLoading && isLoadDeferred;\n const canUndo = !readOnly && undoStackRef.current.length > 0;\n const canRedo = !readOnly && redoStackRef.current.length > 0;\n\n const createSavedWorkbookBytes = React.useCallback((targetWorkbook: Workbook) => {\n const sanitizedBytes = sanitizeSavedWorkbookBytes(targetWorkbook.saveXlsxBytes());\n return mergeWorkbookImageAssets(sanitizedBytes, imageAssetsRef.current, sheetOriginsRef.current);\n }, []);\n\n const createHistoryEntry = React.useCallback((): SnapshotHistoryEntry | null => {\n if (!workbook) {\n return null;\n }\n\n return {\n kind: \"snapshot\",\n activeCell,\n activeSheetIndex,\n bytes: createSavedWorkbookBytes(workbook),\n selection\n };\n }, [activeCell, activeSheetIndex, createSavedWorkbookBytes, selection, workbook]);\n\n const captureCellMutationState = React.useCallback((cell: XlsxCellAddress): CellMutationState | null => {\n const worksheet = getActiveWorksheet();\n if (!worksheet) {\n return null;\n }\n\n return {\n formula: worksheet.getFormulaAt(cell.row, cell.col) ?? null,\n value: worksheet.getCellAt(cell.row, cell.col).toJs()\n };\n }, [getActiveWorksheet]);\n\n const restoreHistoryEntry = React.useCallback(async (entry: SnapshotHistoryEntry) => {\n const wasmModule = await getSheetsWasmModule();\n const nextWorkbook = wasmModule.Workbook.fromBytes(cloneBytes(entry.bytes));\n const nextImageAssets = loadWorkbookImageAssets(entry.bytes, nextWorkbook);\n const nextSheets = buildSheetList(\n nextWorkbook,\n nextImageAssets.sheetStatesByWorkbookSheetIndex,\n nextImageAssets.themePalette,\n nextImageAssets.styleById,\n nextImageAssets.namedCellStyleByName,\n nextImageAssets.tableStyleByName\n );\n const nextSheetIndex = Math.max(0, Math.min(entry.activeSheetIndex, Math.max(0, nextSheets.length - 1)));\n\n setError(null);\n setIsLoading(false);\n setImageAssets(nextImageAssets);\n setWorkbook(nextWorkbook);\n setSheets(nextSheets);\n const nextChartAssets = loadWorkbookChartAssets(nextWorkbook, nextImageAssets, buildVisibleSheetIndexMap(nextSheets));\n setChartAssets(nextChartAssets);\n setActiveSheetIndexState(nextSheetIndex);\n const nextTabIndex = nextChartAssets.tabs.findIndex((tab) => tab.kind === \"sheet\" && tab.sheetIndex === nextSheetIndex);\n if (nextTabIndex >= 0) {\n setActiveTabIndexState(nextTabIndex);\n }\n setActiveCell(entry.activeCell);\n setSelection(entry.selection);\n selectionAnchorRef.current = entry.selection ? normalizeRange(entry.selection).start : entry.activeCell;\n setRevision((current) => current + 1);\n }, [setChartAssets, setImageAssets]);\n\n const applyCellEditHistoryEntry = React.useCallback((\n entry: CellEditHistoryEntry,\n direction: \"undo\" | \"redo\"\n ) => {\n if (!workbook) {\n return;\n }\n\n const worksheet = workbook.getSheet(entry.sheetIndex);\n const visibleSheetIndex = sheets.findIndex((sheet) => sheet.workbookSheetIndex === entry.sheetIndex);\n const targetState = direction === \"undo\" ? entry.before : entry.after;\n\n isApplyingHistoryRef.current = true;\n applyCellMutationState(worksheet, entry.cell, targetState);\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n\n const nextActiveCell = direction === \"undo\" ? entry.activeCellBefore : entry.activeCellAfter;\n const nextSelection = direction === \"undo\" ? entry.selectionBefore : entry.selectionAfter;\n if (visibleSheetIndex >= 0) {\n setActiveSheetIndexState(visibleSheetIndex);\n }\n setActiveCell(nextActiveCell);\n setSelection(nextSelection);\n selectionAnchorRef.current = nextSelection ? normalizeRange(nextSelection).start : nextActiveCell;\n isApplyingHistoryRef.current = false;\n }, [maybeRecalculateWorkbook, refreshWorkbookState, sheets, workbook]);\n\n const applyRangeEditHistoryEntry = React.useCallback((\n entry: RangeEditHistoryEntry,\n direction: \"undo\" | \"redo\"\n ) => {\n if (!workbook) {\n return;\n }\n\n const worksheet = workbook.getSheet(entry.sheetIndex);\n const visibleSheetIndex = sheets.findIndex((sheet) => sheet.workbookSheetIndex === entry.sheetIndex);\n\n isApplyingHistoryRef.current = true;\n for (const mutation of entry.mutations) {\n applyCellMutationState(worksheet, mutation.cell, direction === \"undo\" ? mutation.before : mutation.after);\n }\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n\n const nextActiveCell = direction === \"undo\" ? entry.activeCellBefore : entry.activeCellAfter;\n const nextSelection = direction === \"undo\" ? entry.selectionBefore : entry.selectionAfter;\n if (visibleSheetIndex >= 0) {\n setActiveSheetIndexState(visibleSheetIndex);\n }\n setActiveCell(nextActiveCell);\n setSelection(nextSelection);\n selectionAnchorRef.current = nextSelection ? normalizeRange(nextSelection).start : nextActiveCell;\n isApplyingHistoryRef.current = false;\n }, [maybeRecalculateWorkbook, refreshWorkbookState, sheets, workbook]);\n\n const recordHistoryBeforeMutation = React.useCallback(() => {\n if (isApplyingHistoryRef.current) {\n return;\n }\n\n const snapshot = createHistoryEntry();\n if (!snapshot) {\n return;\n }\n\n pushHistoryEntry(undoStackRef.current, snapshot);\n redoStackRef.current = [];\n setHistoryRevision((current) => current + 1);\n }, [createHistoryEntry]);\n\n const recordCellEditHistory = React.useCallback((\n cell: XlsxCellAddress,\n before: CellMutationState,\n after: CellMutationState\n ) => {\n if (!activeSheet || isApplyingHistoryRef.current) {\n return;\n }\n\n pushHistoryEntry(undoStackRef.current, {\n kind: \"cell-edit\",\n activeCellAfter: cell,\n activeCellBefore: activeCell,\n after,\n before,\n cell,\n selectionAfter: { start: cell, end: cell },\n selectionBefore: selection,\n sheetIndex: activeSheet.workbookSheetIndex\n });\n redoStackRef.current = [];\n setHistoryRevision((current) => current + 1);\n }, [activeCell, activeSheet, selection]);\n\n const recordRangeEditHistory = React.useCallback((\n mutations: RangeCellMutation[],\n selectionAfter: XlsxCellRange | null,\n activeCellAfter: XlsxCellAddress | null\n ) => {\n if (!activeSheet || isApplyingHistoryRef.current || mutations.length === 0) {\n return;\n }\n\n pushHistoryEntry(undoStackRef.current, {\n kind: \"range-edit\",\n activeCellAfter,\n activeCellBefore: activeCell,\n mutations,\n selectionAfter,\n selectionBefore: selection,\n sheetIndex: activeSheet.workbookSheetIndex\n });\n redoStackRef.current = [];\n setHistoryRevision((current) => current + 1);\n }, [activeCell, activeSheet, selection]);\n\n const sortTable = React.useCallback((tableName: string, columnIndex: number, direction: XlsxTableSortDirection) => {\n const worksheet = getActiveWorksheet();\n const targetTable = tables.find((table) => table.name === tableName || table.displayName === tableName);\n if (readOnly || !worksheet || !workbook || !activeSheet || !targetTable) {\n return;\n }\n\n const dataStartRow = targetTable.start.row + Math.max(targetTable.headerRowCount, 1);\n const totalsRowOffset = targetTable.totalsRowShown ? Math.max(targetTable.totalsRowCount, 1) : 0;\n const dataEndRow = targetTable.end.row - totalsRowOffset;\n const startCol = targetTable.start.col;\n const endCol = targetTable.end.col;\n const sortCol = startCol + columnIndex;\n\n if (columnIndex < 0 || sortCol > endCol || dataStartRow > dataEndRow) {\n return;\n }\n\n const rows: Array<{\n cells: CellMutationState[];\n index: number;\n sortBoolean: boolean | undefined;\n sortEmpty: boolean;\n sortNumber: number | undefined;\n sortText: string;\n }> = [];\n\n for (let row = dataStartRow; row <= dataEndRow; row += 1) {\n const cells: CellMutationState[] = [];\n for (let col = startCol; col <= endCol; col += 1) {\n cells.push({\n formula: worksheet.getFormulaAt(row, col) ?? null,\n value: worksheet.getCellAt(row, col).toJs()\n });\n }\n\n const calculated = worksheet.getCalculatedValueAt(row, sortCol);\n const formatted = decodeHtmlEntities(worksheet.getFormattedValueAt(row, sortCol) ?? \"\");\n rows.push({\n cells,\n index: row,\n sortBoolean: calculated.is_boolean ? calculated.asBoolean() : undefined,\n sortEmpty: calculated.is_empty || formatted.length === 0,\n sortNumber: calculated.is_number ? calculated.asNumber() : undefined,\n sortText: calculated.is_text ? (calculated.asText() ?? formatted) : formatted\n });\n }\n\n const sortedRows = [...rows].sort((left, right) => {\n if (left.sortEmpty !== right.sortEmpty) {\n return left.sortEmpty ? 1 : -1;\n }\n\n if (left.sortNumber !== undefined && right.sortNumber !== undefined) {\n return direction === \"ascending\" ? left.sortNumber - right.sortNumber : right.sortNumber - left.sortNumber;\n }\n\n if (left.sortBoolean !== undefined && right.sortBoolean !== undefined) {\n const leftValue = left.sortBoolean ? 1 : 0;\n const rightValue = right.sortBoolean ? 1 : 0;\n return direction === \"ascending\" ? leftValue - rightValue : rightValue - leftValue;\n }\n\n const comparedText = left.sortText.localeCompare(right.sortText, undefined, { numeric: true, sensitivity: \"base\" });\n return direction === \"ascending\" ? comparedText : -comparedText;\n });\n\n if (sortedRows.every((row, index) => row.index === rows[index]?.index)) {\n setSortState({ columnIndex, direction, tableName: targetTable.name });\n return;\n }\n\n const mutations: RangeCellMutation[] = [];\n for (let rowOffset = 0; rowOffset < rows.length; rowOffset += 1) {\n const targetRow = dataStartRow + rowOffset;\n const sourceRow = sortedRows[rowOffset];\n const beforeRow = rows[rowOffset];\n if (!sourceRow || !beforeRow) {\n continue;\n }\n\n for (let colOffset = 0; colOffset <= endCol - startCol; colOffset += 1) {\n const before = beforeRow.cells[colOffset];\n const after = sourceRow.cells[colOffset];\n if (!before || !after) {\n continue;\n }\n\n const cell = { row: targetRow, col: startCol + colOffset };\n applyCellMutationState(worksheet, cell, after);\n mutations.push({\n after,\n before,\n cell\n });\n }\n }\n\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n setSortState({ columnIndex, direction, tableName: targetTable.name });\n recordRangeEditHistory(mutations, selection, activeCell);\n }, [\n activeCell,\n activeSheet,\n getActiveWorksheet,\n maybeRecalculateWorkbook,\n readOnly,\n recordRangeEditHistory,\n refreshWorkbookState,\n selection,\n tables,\n workbook\n ]);\n\n const download = React.useCallback(() => {\n if (file) {\n downloadArrayBuffer(file, displayFileName);\n return;\n }\n\n if (src) {\n downloadUrl(src, displayFileName);\n }\n }, [displayFileName, file, src]);\n\n const exportXlsx = React.useCallback(() => {\n if (!workbook) {\n return;\n }\n\n downloadBytes(createSavedWorkbookBytes(workbook), `${fileStem(displayFileName)}.xlsx`, XLSX_MIME_TYPE);\n }, [createSavedWorkbookBytes, displayFileName, workbook]);\n\n const exportCsv = React.useCallback(() => {\n if (!workbook) {\n return;\n }\n\n const activeSheetName = activeSheet?.name ?? \"sheet\";\n downloadText(workbook.saveCsvString(), `${fileStem(displayFileName)}-${activeSheetName}.csv`, CSV_MIME_TYPE);\n }, [activeSheet?.name, displayFileName, workbook]);\n\n const recalculate = React.useCallback(() => {\n if (!workbook) {\n return;\n }\n\n workbook.calculate();\n refreshWorkbookState(workbook);\n }, [refreshWorkbookState, workbook]);\n\n const resizeColumn = React.useCallback((col: number, widthPx: number) => {\n if (readOnly || !workbook || !activeSheet) {\n return;\n }\n\n recordHistoryBeforeMutation();\n const worksheet = workbook.getSheet(activeSheet.workbookSheetIndex);\n worksheet.setColumnWidth(\n col,\n pxToSheetColumnWidth(resolveContentSheetAxisPixels(widthPx, activeSheet.showGridLines))\n );\n refreshWorkbookState(workbook);\n }, [activeSheet, readOnly, recordHistoryBeforeMutation, refreshWorkbookState, workbook]);\n\n const resizeRow = React.useCallback((row: number, heightPx: number) => {\n if (readOnly || !workbook || !activeSheet) {\n return;\n }\n\n recordHistoryBeforeMutation();\n const worksheet = workbook.getSheet(activeSheet.workbookSheetIndex);\n worksheet.setRowHeight(\n row,\n pxToSheetRowHeight(resolveContentSheetAxisPixels(heightPx, activeSheet.showGridLines))\n );\n refreshWorkbookState(workbook);\n }, [activeSheet, readOnly, recordHistoryBeforeMutation, refreshWorkbookState, workbook]);\n\n const resolveAnchoredObjectRect = React.useCallback((\n anchor: XlsxImage[\"anchor\"],\n worksheet: ReturnType<Workbook[\"getSheet\"]>\n ): XlsxImageRect => {\n const resolveAxisSum = (\n index: number,\n getSize: (target: number) => number\n ) => {\n let total = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n total += getSize(cursor);\n }\n return total;\n };\n\n if (anchor.kind === \"absolute\") {\n return {\n height: anchor.sizeEmu.cy / 9525,\n left: GRID_ROW_HEADER_WIDTH + anchor.positionEmu.x / 9525,\n top: GRID_HEADER_HEIGHT + anchor.positionEmu.y / 9525,\n width: anchor.sizeEmu.cx / 9525\n };\n }\n\n const left = GRID_ROW_HEADER_WIDTH + resolveAxisSum(anchor.from.col, (col) => getColumnWidthPx(worksheet, col)) + anchor.from.colOffsetEmu / 9525;\n const top = GRID_HEADER_HEIGHT + resolveAxisSum(anchor.from.row, (row) => getRowHeightPx(worksheet, row)) + anchor.from.rowOffsetEmu / 9525;\n\n if (anchor.kind === \"one-cell\") {\n return {\n height: anchor.sizeEmu.cy / 9525,\n left,\n top,\n width: anchor.sizeEmu.cx / 9525\n };\n }\n\n const right = GRID_ROW_HEADER_WIDTH + resolveAxisSum(anchor.to.col, (col) => getColumnWidthPx(worksheet, col)) + anchor.to.colOffsetEmu / 9525;\n const bottom = GRID_HEADER_HEIGHT + resolveAxisSum(anchor.to.row, (row) => getRowHeightPx(worksheet, row)) + anchor.to.rowOffsetEmu / 9525;\n\n return {\n height: Math.max(1, bottom - top),\n left,\n top,\n width: Math.max(1, right - left)\n };\n }, [getColumnWidthPx, getRowHeightPx]);\n\n const setChartRect = React.useCallback((id: string, rect: XlsxImageRect) => {\n const hydratedChartAssets = ensureChartAssetsHydrated(workbook, sheets);\n if (readOnly || !workbook || !activeSheet || !imageAssetsRef.current || !hydratedChartAssets) {\n return;\n }\n\n const worksheet = workbook.getSheet(activeSheet.workbookSheetIndex);\n const currentChart = getChartById(id);\n if (!currentChart || currentChart.editable === false || currentChart.workbookSheetIndex !== activeSheet.workbookSheetIndex) {\n return;\n }\n\n const nextAnchor = rectToImageAnchor(rect, currentChart.anchor, {\n contentOffsetLeft: GRID_ROW_HEADER_WIDTH,\n contentOffsetTop: GRID_HEADER_HEIGHT,\n getColumnWidthPx: (col) => getColumnWidthPx(worksheet, col),\n getRowHeightPx: (row) => getRowHeightPx(worksheet, row)\n });\n\n recordHistoryBeforeMutation();\n updateWorkbookChartAnchor(imageAssetsRef.current, hydratedChartAssets, id, nextAnchor);\n\n hydratedChartAssets.chartsByWorkbookSheetIndex = hydratedChartAssets.chartsByWorkbookSheetIndex.map((sheetCharts) => (\n sheetCharts.map((chart) => chart.id === id ? { ...chart, anchor: nextAnchor } : chart)\n ));\n\n setChartsByWorkbookSheetIndex((current) => current.map((sheetCharts) => (\n sheetCharts.map((chart) => chart.id === id ? { ...chart, anchor: nextAnchor } : chart)\n )));\n setRevision((current) => current + 1);\n }, [\n activeSheet,\n getChartById,\n getColumnWidthPx,\n getRowHeightPx,\n ensureChartAssetsHydrated,\n readOnly,\n recordHistoryBeforeMutation,\n sheets,\n workbook\n ]);\n\n const setImageRect = React.useCallback((id: string, rect: XlsxImageRect) => {\n if (readOnly || !workbook || !activeSheet || !imageAssetsRef.current) {\n return;\n }\n\n const worksheet = workbook.getSheet(activeSheet.workbookSheetIndex);\n const currentImage = getImageById(id);\n if (!currentImage || currentImage.editable === false || currentImage.workbookSheetIndex !== activeSheet.workbookSheetIndex) {\n return;\n }\n\n const nextAnchor = rectToImageAnchor(rect, currentImage.anchor, {\n contentOffsetLeft: GRID_ROW_HEADER_WIDTH,\n contentOffsetTop: GRID_HEADER_HEIGHT,\n getColumnWidthPx: (col) => getColumnWidthPx(worksheet, col),\n getRowHeightPx: (row) => getRowHeightPx(worksheet, row)\n });\n\n recordHistoryBeforeMutation();\n if (!updateWorkbookImageAnchor(imageAssetsRef.current, id, nextAnchor)) {\n return;\n }\n\n setImagesByWorkbookSheetIndex([...imageAssetsRef.current.imagesByWorkbookSheetIndex]);\n setRevision((current) => current + 1);\n }, [\n activeSheet,\n getColumnWidthPx,\n getImageById,\n getRowHeightPx,\n readOnly,\n recordHistoryBeforeMutation,\n workbook\n ]);\n\n const moveChartBy = React.useCallback((id: string, deltaX: number, deltaY: number) => {\n const currentChart = getChartById(id);\n if (!currentChart || currentChart.editable === false) {\n return;\n }\n\n const worksheet = getActiveWorksheet();\n if (!worksheet) {\n return;\n }\n\n const currentRect = resolveAnchoredObjectRect(currentChart.anchor, worksheet);\n setChartRect(id, {\n ...currentRect,\n left: currentRect.left + deltaX,\n top: currentRect.top + deltaY\n });\n }, [getActiveWorksheet, getChartById, resolveAnchoredObjectRect, setChartRect]);\n\n const moveImageBy = React.useCallback((id: string, deltaX: number, deltaY: number) => {\n const currentImage = getImageById(id);\n if (!currentImage || currentImage.editable === false) {\n return;\n }\n\n const currentRect = (() => {\n const worksheet = getActiveWorksheet();\n if (!worksheet) {\n return null;\n }\n\n const resolveAxisSum = (\n index: number,\n getSize: (target: number) => number\n ) => {\n let total = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n total += getSize(cursor);\n }\n return total;\n };\n\n if (currentImage.anchor.kind === \"absolute\") {\n return {\n height: currentImage.anchor.sizeEmu.cy / 9525,\n left: GRID_ROW_HEADER_WIDTH + currentImage.anchor.positionEmu.x / 9525,\n top: GRID_HEADER_HEIGHT + currentImage.anchor.positionEmu.y / 9525,\n width: currentImage.anchor.sizeEmu.cx / 9525\n };\n }\n\n const left = GRID_ROW_HEADER_WIDTH + resolveAxisSum(currentImage.anchor.from.col, (col) => getColumnWidthPx(worksheet, col)) + currentImage.anchor.from.colOffsetEmu / 9525;\n const top = GRID_HEADER_HEIGHT + resolveAxisSum(currentImage.anchor.from.row, (row) => getRowHeightPx(worksheet, row)) + currentImage.anchor.from.rowOffsetEmu / 9525;\n\n if (currentImage.anchor.kind === \"one-cell\") {\n return {\n height: currentImage.anchor.sizeEmu.cy / 9525,\n left,\n top,\n width: currentImage.anchor.sizeEmu.cx / 9525\n };\n }\n\n const right = GRID_ROW_HEADER_WIDTH + resolveAxisSum(currentImage.anchor.to.col, (col) => getColumnWidthPx(worksheet, col)) + currentImage.anchor.to.colOffsetEmu / 9525;\n const bottom = GRID_HEADER_HEIGHT + resolveAxisSum(currentImage.anchor.to.row, (row) => getRowHeightPx(worksheet, row)) + currentImage.anchor.to.rowOffsetEmu / 9525;\n\n return {\n height: Math.max(1, bottom - top),\n left,\n top,\n width: Math.max(1, right - left)\n };\n })();\n\n if (!currentRect) {\n return;\n }\n\n setImageRect(id, {\n ...currentRect,\n left: currentRect.left + deltaX,\n top: currentRect.top + deltaY\n });\n }, [getActiveWorksheet, getColumnWidthPx, getImageById, getRowHeightPx, setImageRect]);\n\n const resizeChartBy = React.useCallback((\n id: string,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number\n ) => {\n const currentChart = getChartById(id);\n if (!currentChart || currentChart.editable === false) {\n return;\n }\n\n const worksheet = getActiveWorksheet();\n if (!worksheet) {\n return;\n }\n\n const currentRect = resolveAnchoredObjectRect(currentChart.anchor, worksheet);\n setChartRect(id, resizeImageRect(currentRect, handle, deltaX, deltaY, 48));\n }, [getActiveWorksheet, getChartById, resolveAnchoredObjectRect, setChartRect]);\n\n const resizeImageBy = React.useCallback((\n id: string,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number\n ) => {\n const currentImage = getImageById(id);\n if (!currentImage || currentImage.editable === false) {\n return;\n }\n\n const worksheet = getActiveWorksheet();\n if (!worksheet) {\n return;\n }\n\n const resolveAxisSum = (\n index: number,\n getSize: (target: number) => number\n ) => {\n let total = 0;\n for (let cursor = 0; cursor < index; cursor += 1) {\n total += getSize(cursor);\n }\n return total;\n };\n\n const left = currentImage.anchor.kind === \"absolute\"\n ? GRID_ROW_HEADER_WIDTH + currentImage.anchor.positionEmu.x / 9525\n : GRID_ROW_HEADER_WIDTH + resolveAxisSum(currentImage.anchor.from.col, (col) => getColumnWidthPx(worksheet, col)) + currentImage.anchor.from.colOffsetEmu / 9525;\n const top = currentImage.anchor.kind === \"absolute\"\n ? GRID_HEADER_HEIGHT + currentImage.anchor.positionEmu.y / 9525\n : GRID_HEADER_HEIGHT + resolveAxisSum(currentImage.anchor.from.row, (row) => getRowHeightPx(worksheet, row)) + currentImage.anchor.from.rowOffsetEmu / 9525;\n const width = currentImage.anchor.kind === \"two-cell\"\n ? Math.max(\n 1,\n GRID_ROW_HEADER_WIDTH + resolveAxisSum(currentImage.anchor.to.col, (col) => getColumnWidthPx(worksheet, col)) + currentImage.anchor.to.colOffsetEmu / 9525 - left\n )\n : currentImage.anchor.sizeEmu.cx / 9525;\n const height = currentImage.anchor.kind === \"two-cell\"\n ? Math.max(\n 1,\n GRID_HEADER_HEIGHT + resolveAxisSum(currentImage.anchor.to.row, (row) => getRowHeightPx(worksheet, row)) + currentImage.anchor.to.rowOffsetEmu / 9525 - top\n )\n : currentImage.anchor.sizeEmu.cy / 9525;\n\n const nextRect = resizeImageRect({ height, left, top, width }, handle, deltaX, deltaY);\n setImageRect(id, nextRect);\n }, [getActiveWorksheet, getColumnWidthPx, getImageById, getRowHeightPx, setImageRect]);\n\n const updateChart = React.useCallback((id: string, patch: Partial<XlsxChart>) => {\n const currentChart = getChartById(id);\n const hydratedChartAssets = ensureChartAssetsHydrated(workbook, sheets);\n if (readOnly || !currentChart) {\n return;\n }\n\n recordHistoryBeforeMutation();\n if (patch.anchor && imageAssetsRef.current && hydratedChartAssets) {\n updateWorkbookChartAnchor(imageAssetsRef.current, hydratedChartAssets, id, patch.anchor);\n }\n if (imageAssetsRef.current && hydratedChartAssets) {\n updateWorkbookChartDefinition(imageAssetsRef.current, hydratedChartAssets, id, patch);\n }\n\n setChartsByWorkbookSheetIndex((current) => current.map((sheetCharts) => (\n sheetCharts.map((chart) => chart.id === id ? { ...chart, ...patch } : chart)\n )));\n setRevision((current) => current + 1);\n }, [ensureChartAssetsHydrated, getChartById, readOnly, recordHistoryBeforeMutation, sheets, workbook]);\n\n const selectCell = React.useCallback((cell: XlsxCellAddress, options?: { extend?: boolean }) => {\n setSelectedChartId(null);\n setSelectedImageId(null);\n setActiveCell(cell);\n if (options?.extend && selectionAnchorRef.current) {\n setSelection(normalizeRange({ start: selectionAnchorRef.current, end: cell }));\n return;\n }\n\n selectionAnchorRef.current = cell;\n setSelection({ start: cell, end: cell });\n }, []);\n\n const selectRange = React.useCallback((range: XlsxCellRange) => {\n const normalized = normalizeRange(range);\n setSelectedChartId(null);\n setSelectedImageId(null);\n selectionAnchorRef.current = normalized.start;\n setActiveCell(normalized.end);\n setSelection(normalized);\n }, []);\n\n const clearSelection = React.useCallback(() => {\n selectionAnchorRef.current = null;\n setActiveCell(null);\n setSelection(null);\n setSelectedChartId(null);\n setSelectedImageId(null);\n }, []);\n\n const clearSelectedCells = React.useCallback(() => {\n const worksheet = getActiveWorksheet();\n const targetRange = selection ?? (activeCell ? { start: activeCell, end: activeCell } : null);\n if (readOnly || !worksheet || !workbook || !targetRange) {\n return;\n }\n\n const normalized = normalizeRange(targetRange);\n const mutations: RangeCellMutation[] = [];\n for (let row = normalized.start.row; row <= normalized.end.row; row += 1) {\n for (let col = normalized.start.col; col <= normalized.end.col; col += 1) {\n if (worksheet.isMergedSecondary(row, col)) {\n continue;\n }\n\n const cell = { row, col };\n const before = captureCellMutationState(cell);\n if (!before) {\n continue;\n }\n\n worksheet.setCell(cellAddressToA1({ row, col }), \"\");\n mutations.push({\n after: { formula: null, value: \"\" },\n before,\n cell\n });\n }\n }\n\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n recordRangeEditHistory(mutations, normalized, activeCell ?? normalized.start);\n }, [\n activeCell,\n captureCellMutationState,\n getActiveWorksheet,\n maybeRecalculateWorkbook,\n readOnly,\n recordRangeEditHistory,\n refreshWorkbookState,\n selection,\n workbook\n ]);\n\n const setCellValue = React.useCallback((cell: XlsxCellAddress, value: string) => {\n const worksheet = getActiveWorksheet();\n if (readOnly || !worksheet || !workbook) {\n return;\n }\n\n const before = captureCellMutationState(cell);\n if (!before) {\n return;\n }\n\n const nextValue = coerceUserEnteredValue(value);\n worksheet.setCell(cellAddressToA1(cell), nextValue);\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n recordCellEditHistory(cell, before, { formula: null, value: nextValue });\n }, [captureCellMutationState, getActiveWorksheet, maybeRecalculateWorkbook, readOnly, recordCellEditHistory, refreshWorkbookState, workbook]);\n\n const setCellFormula = React.useCallback((cell: XlsxCellAddress, formula: string) => {\n const worksheet = getActiveWorksheet();\n if (readOnly || !worksheet || !workbook) {\n return;\n }\n\n const before = captureCellMutationState(cell);\n if (!before) {\n return;\n }\n\n const trimmedFormula = formula.trim();\n if (!formula.trim()) {\n worksheet.setCell(cellAddressToA1(cell), \"\");\n } else {\n worksheet.setFormula(cellAddressToA1(cell), formula);\n }\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n recordCellEditHistory(cell, before, {\n formula: trimmedFormula || null,\n value: trimmedFormula ? null : \"\"\n });\n }, [captureCellMutationState, getActiveWorksheet, maybeRecalculateWorkbook, readOnly, recordCellEditHistory, refreshWorkbookState, workbook]);\n\n const setSelectedCellValue = React.useCallback((value: string) => {\n if (!activeCell) {\n return;\n }\n\n setCellValue(activeCell, value);\n }, [activeCell, setCellValue]);\n\n const setSelectedCellFormula = React.useCallback((formula: string) => {\n if (!activeCell) {\n return;\n }\n\n setCellFormula(activeCell, formula);\n }, [activeCell, setCellFormula]);\n\n const fillSelection = React.useCallback((targetRange: XlsxCellRange) => {\n const worksheet = getActiveWorksheet();\n if (readOnly || !worksheet || !workbook || !selection) {\n return;\n }\n\n const sourceRange = normalizeRange(selection);\n const nextRange = normalizeRange(targetRange);\n const sourceHeight = sourceRange.end.row - sourceRange.start.row + 1;\n const sourceWidth = sourceRange.end.col - sourceRange.start.col + 1;\n\n if (sourceHeight <= 0 || sourceWidth <= 0) {\n return;\n }\n\n const mutations: RangeCellMutation[] = [];\n for (let row = nextRange.start.row; row <= nextRange.end.row; row += 1) {\n for (let col = nextRange.start.col; col <= nextRange.end.col; col += 1) {\n if (rangeContainsCell(sourceRange, { row, col })) {\n continue;\n }\n\n const targetCell = { row, col };\n const before = captureCellMutationState(targetCell);\n if (!before) {\n continue;\n }\n\n const sourceRow = sourceRange.start.row + ((row - nextRange.start.row) % sourceHeight);\n const sourceCol = sourceRange.start.col + ((col - nextRange.start.col) % sourceWidth);\n const sourceFormula = worksheet.getFormulaAt(sourceRow, sourceCol);\n\n if (sourceFormula) {\n worksheet.setFormula(cellAddressToA1(targetCell), sourceFormula);\n mutations.push({\n after: { formula: sourceFormula, value: null },\n before,\n cell: targetCell\n });\n continue;\n }\n\n const sourceValue = normalizeCellValue(worksheet.getCellAt(sourceRow, sourceCol).toJs());\n worksheet.setCell(cellAddressToA1(targetCell), sourceValue);\n mutations.push({\n after: { formula: null, value: sourceValue },\n before,\n cell: targetCell\n });\n }\n }\n\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n setSelection(nextRange);\n setActiveCell(nextRange.end);\n selectionAnchorRef.current = nextRange.start;\n recordRangeEditHistory(mutations, nextRange, nextRange.end);\n }, [captureCellMutationState, getActiveWorksheet, maybeRecalculateWorkbook, readOnly, recordRangeEditHistory, refreshWorkbookState, selection, workbook]);\n\n const mergeSelection = React.useCallback(() => {\n const worksheet = getActiveWorksheet();\n if (readOnly || !worksheet || !selection || !workbook) {\n return;\n }\n\n recordHistoryBeforeMutation();\n worksheet.mergeCells(rangeToA1(selection));\n refreshWorkbookState(workbook);\n }, [getActiveWorksheet, readOnly, recordHistoryBeforeMutation, refreshWorkbookState, selection, workbook]);\n\n const unmergeSelection = React.useCallback(() => {\n const worksheet = getActiveWorksheet();\n if (readOnly || !worksheet || !selection || !workbook) {\n return;\n }\n\n recordHistoryBeforeMutation();\n worksheet.unmergeCells(rangeToA1(selection));\n refreshWorkbookState(workbook);\n }, [getActiveWorksheet, readOnly, recordHistoryBeforeMutation, refreshWorkbookState, selection, workbook]);\n\n const addSheet = React.useCallback((name?: string) => {\n if (readOnly || !workbook) {\n return;\n }\n\n recordHistoryBeforeMutation();\n const baseName = name?.trim() || \"Sheet\";\n let candidate = baseName;\n let counter = 2;\n while (workbook.sheetIndex(candidate) !== undefined) {\n candidate = `${baseName} ${counter}`;\n counter += 1;\n }\n\n workbook.addSheet(candidate);\n sheetOriginsRef.current = [...sheetOriginsRef.current, null];\n setImagesByWorkbookSheetIndex((current) => [...current, []]);\n setShapesByWorkbookSheetIndex((current) => [...current, []]);\n const nextSheets = buildSheetList(\n workbook,\n imageAssetsRef.current?.sheetStatesByWorkbookSheetIndex,\n imageAssetsRef.current?.themePalette,\n imageAssetsRef.current?.styleById,\n imageAssetsRef.current?.namedCellStyleByName,\n imageAssetsRef.current?.tableStyleByName\n );\n setSheets(nextSheets);\n const nextChartAssets = imageAssetsRef.current\n ? loadWorkbookChartAssets(workbook, imageAssetsRef.current, buildVisibleSheetIndexMap(nextSheets))\n : null;\n if (imageAssetsRef.current) {\n setChartAssets(nextChartAssets);\n }\n const nextIndex = nextSheets.findIndex((sheet) => sheet.name === candidate);\n setActiveSheetIndexState(nextIndex >= 0 ? nextIndex : 0);\n const nextTabIndex = nextChartAssets?.tabs.findIndex((tab) => tab.kind === \"sheet\" && tab.name === candidate) ?? -1;\n if (nextTabIndex >= 0) {\n setActiveTabIndexState(nextTabIndex);\n }\n setRevision((current) => current + 1);\n }, [readOnly, recordHistoryBeforeMutation, setChartAssets, workbook]);\n\n const removeActiveSheet = React.useCallback(() => {\n if (readOnly || !workbook || !activeSheet) {\n return;\n }\n\n recordHistoryBeforeMutation();\n workbook.removeSheet(activeSheet.workbookSheetIndex);\n sheetOriginsRef.current = sheetOriginsRef.current.filter((_, index) => index !== activeSheet.workbookSheetIndex);\n setImagesByWorkbookSheetIndex((current) => current.filter((_, index) => index !== activeSheet.workbookSheetIndex));\n setShapesByWorkbookSheetIndex((current) => current.filter((_, index) => index !== activeSheet.workbookSheetIndex));\n if (imageAssetsRef.current) {\n imageAssetsRef.current.sheetStatesByWorkbookSheetIndex = imageAssetsRef.current.sheetStatesByWorkbookSheetIndex.filter(\n (_, index) => index !== activeSheet.workbookSheetIndex\n );\n }\n const nextSheets = buildSheetList(\n workbook,\n imageAssetsRef.current?.sheetStatesByWorkbookSheetIndex,\n imageAssetsRef.current?.themePalette,\n imageAssetsRef.current?.styleById,\n imageAssetsRef.current?.namedCellStyleByName,\n imageAssetsRef.current?.tableStyleByName\n );\n setSheets(nextSheets);\n if (imageAssetsRef.current) {\n setChartAssets(loadWorkbookChartAssets(workbook, imageAssetsRef.current, buildVisibleSheetIndexMap(nextSheets)));\n }\n setActiveSheetIndexState((current) => Math.max(0, Math.min(current, nextSheets.length - 1)));\n setRevision((current) => current + 1);\n }, [activeSheet, readOnly, recordHistoryBeforeMutation, setChartAssets, workbook]);\n\n const defineNamedRange = React.useCallback((name: string, range?: XlsxCellRange | null) => {\n if (readOnly || !workbook) {\n return;\n }\n\n const trimmed = name.trim();\n if (!trimmed) {\n return;\n }\n\n const targetRange = range ?? selection;\n if (!targetRange) {\n return;\n }\n\n recordHistoryBeforeMutation();\n workbook.defineName(trimmed, rangeToA1(targetRange));\n setRevision((current) => current + 1);\n }, [readOnly, recordHistoryBeforeMutation, selection, workbook]);\n\n const pasteText = React.useCallback((text: string) => {\n const worksheet = getActiveWorksheet();\n const targetCell = activeCell ?? selection?.start ?? null;\n if (readOnly || !worksheet || !workbook || !targetCell || !text) {\n return false;\n }\n\n const grid = parseClipboardText(text);\n if (grid.length === 0 || grid.every((row) => row.length === 0)) {\n return false;\n }\n\n const mutations: RangeCellMutation[] = [];\n for (let rowIndex = 0; rowIndex < grid.length; rowIndex += 1) {\n const row = grid[rowIndex] ?? [];\n for (let colIndex = 0; colIndex < row.length; colIndex += 1) {\n const rawValue = row[colIndex] ?? \"\";\n const nextCell = {\n col: targetCell.col + colIndex,\n row: targetCell.row + rowIndex\n };\n const before = captureCellMutationState(nextCell);\n if (!before) {\n continue;\n }\n if (rawValue.startsWith(\"=\") && rawValue.length > 1) {\n worksheet.setFormula(cellAddressToA1(nextCell), rawValue);\n mutations.push({\n after: { formula: rawValue, value: null },\n before,\n cell: nextCell\n });\n } else {\n const nextValue = coerceUserEnteredValue(rawValue);\n worksheet.setCell(cellAddressToA1(nextCell), nextValue);\n mutations.push({\n after: { formula: null, value: nextValue },\n before,\n cell: nextCell\n });\n }\n }\n }\n\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n const nextRange = normalizeRange({\n start: targetCell,\n end: {\n col: targetCell.col + Math.max(0, Math.max(...grid.map((row) => row.length), 1) - 1),\n row: targetCell.row + grid.length - 1\n }\n });\n setActiveCell(targetCell);\n setSelection(nextRange);\n selectionAnchorRef.current = targetCell;\n recordRangeEditHistory(mutations, nextRange, targetCell);\n return true;\n }, [activeCell, captureCellMutationState, getActiveWorksheet, maybeRecalculateWorkbook, readOnly, recordRangeEditHistory, refreshWorkbookState, selection, workbook]);\n\n const pasteStructuredClipboardData = React.useCallback((serializedPayload: string) => {\n const worksheet = getActiveWorksheet();\n const targetCell = activeCell ?? selection?.start ?? null;\n if (readOnly || !worksheet || !workbook || !targetCell || !serializedPayload) {\n return false;\n }\n\n let payload: ClipboardPayload;\n try {\n payload = JSON.parse(serializedPayload) as ClipboardPayload;\n } catch {\n return false;\n }\n\n if (!Array.isArray(payload.cells) || payload.cells.length === 0) {\n return false;\n }\n\n const hasMergeOperations = Array.isArray(payload.merges) && payload.merges.some((merge) => (merge.rowSpan ?? 1) > 1 || (merge.colSpan ?? 1) > 1);\n const mutations: RangeCellMutation[] = [];\n if (hasMergeOperations) {\n recordHistoryBeforeMutation();\n }\n for (const cell of payload.cells) {\n const nextCell = {\n col: targetCell.col + cell.colOffset,\n row: targetCell.row + cell.rowOffset\n };\n const before = hasMergeOperations ? null : captureCellMutationState(nextCell);\n\n if (cell.formula) {\n worksheet.setFormula(cellAddressToA1(nextCell), cell.formula);\n if (before) {\n mutations.push({\n after: { formula: cell.formula, value: null },\n before,\n cell: nextCell\n });\n }\n } else {\n worksheet.setCell(cellAddressToA1(nextCell), cell.value);\n if (before) {\n mutations.push({\n after: { formula: null, value: cell.value },\n before,\n cell: nextCell\n });\n }\n }\n }\n\n if (Array.isArray(payload.merges)) {\n for (const merge of payload.merges) {\n if ((merge.rowSpan ?? 1) <= 1 && (merge.colSpan ?? 1) <= 1) {\n continue;\n }\n\n const mergeRange = normalizeRange({\n start: {\n col: targetCell.col + merge.colOffset,\n row: targetCell.row + merge.rowOffset\n },\n end: {\n col: targetCell.col + merge.colOffset + merge.colSpan - 1,\n row: targetCell.row + merge.rowOffset + merge.rowSpan - 1\n }\n });\n worksheet.mergeCells(rangeToA1(mergeRange));\n }\n }\n\n maybeRecalculateWorkbook(workbook);\n refreshWorkbookState(workbook);\n const nextRange = normalizeRange({\n start: targetCell,\n end: {\n col: targetCell.col + Math.max((payload.cols ?? 1) - 1, 0),\n row: targetCell.row + Math.max((payload.rows ?? 1) - 1, 0)\n }\n });\n setActiveCell(targetCell);\n setSelection(nextRange);\n selectionAnchorRef.current = targetCell;\n if (!hasMergeOperations) {\n recordRangeEditHistory(mutations, nextRange, targetCell);\n }\n return true;\n }, [\n activeCell,\n captureCellMutationState,\n getActiveWorksheet,\n maybeRecalculateWorkbook,\n readOnly,\n recordHistoryBeforeMutation,\n recordRangeEditHistory,\n refreshWorkbookState,\n selection,\n workbook\n ]);\n\n const copySelectionToClipboard = React.useCallback(async () => {\n const clipboardData = getClipboardData();\n if (!clipboardData || typeof navigator === \"undefined\" || !navigator.clipboard) {\n return false;\n }\n\n if (typeof ClipboardItem === \"function\" && navigator.clipboard.write) {\n const item = new ClipboardItem({\n [INTERNAL_CLIPBOARD_MIME]: new Blob([clipboardData.structured], { type: INTERNAL_CLIPBOARD_MIME }),\n \"text/html\": new Blob([clipboardData.html], { type: \"text/html\" }),\n \"text/plain\": new Blob([clipboardData.text], { type: \"text/plain\" })\n });\n await navigator.clipboard.write([item]);\n return true;\n }\n\n await navigator.clipboard.writeText(clipboardData.text);\n return true;\n }, [getClipboardData]);\n\n const pasteFromClipboard = React.useCallback(async () => {\n if (readOnly || typeof navigator === \"undefined\" || !navigator.clipboard) {\n return false;\n }\n\n if (navigator.clipboard.read) {\n const items = await navigator.clipboard.read();\n for (const item of items) {\n if (item.types.includes(INTERNAL_CLIPBOARD_MIME)) {\n const blob = await item.getType(INTERNAL_CLIPBOARD_MIME);\n return pasteStructuredClipboardData(await blob.text());\n }\n }\n\n for (const item of items) {\n if (item.types.includes(\"text/plain\")) {\n const blob = await item.getType(\"text/plain\");\n return pasteText(await blob.text());\n }\n }\n }\n\n return pasteText(await navigator.clipboard.readText());\n }, [pasteStructuredClipboardData, pasteText, readOnly]);\n\n const undo = React.useCallback(() => {\n if (readOnly || !workbook || undoStackRef.current.length === 0) {\n return;\n }\n\n const entry = undoStackRef.current.pop();\n if (!entry) {\n return;\n }\n\n if (entry.kind === \"cell-edit\") {\n pushHistoryEntry(redoStackRef.current, entry);\n setHistoryRevision((current) => current + 1);\n applyCellEditHistoryEntry(entry, \"undo\");\n return;\n }\n\n if (entry.kind === \"range-edit\") {\n pushHistoryEntry(redoStackRef.current, entry);\n setHistoryRevision((current) => current + 1);\n applyRangeEditHistoryEntry(entry, \"undo\");\n return;\n }\n\n const currentSnapshot = createHistoryEntry();\n if (currentSnapshot) {\n pushHistoryEntry(redoStackRef.current, currentSnapshot);\n }\n setHistoryRevision((current) => current + 1);\n void restoreHistoryEntry(entry);\n }, [applyCellEditHistoryEntry, applyRangeEditHistoryEntry, createHistoryEntry, readOnly, restoreHistoryEntry, workbook]);\n\n const redo = React.useCallback(() => {\n if (readOnly || !workbook || redoStackRef.current.length === 0) {\n return;\n }\n\n const entry = redoStackRef.current.pop();\n if (!entry) {\n return;\n }\n\n if (entry.kind === \"cell-edit\") {\n pushHistoryEntry(undoStackRef.current, entry);\n setHistoryRevision((current) => current + 1);\n applyCellEditHistoryEntry(entry, \"redo\");\n return;\n }\n\n if (entry.kind === \"range-edit\") {\n pushHistoryEntry(undoStackRef.current, entry);\n setHistoryRevision((current) => current + 1);\n applyRangeEditHistoryEntry(entry, \"redo\");\n return;\n }\n\n const currentSnapshot = createHistoryEntry();\n if (currentSnapshot) {\n pushHistoryEntry(undoStackRef.current, currentSnapshot);\n }\n setHistoryRevision((current) => current + 1);\n void restoreHistoryEntry(entry);\n }, [applyCellEditHistoryEntry, applyRangeEditHistoryEntry, createHistoryEntry, readOnly, restoreHistoryEntry, workbook]);\n\n return React.useMemo(\n () => ({\n activeCell,\n activeCellAddress,\n activeSheet,\n activeSheetIndex,\n activeTab,\n activeTabIndex,\n addSheet,\n canRedo,\n canDownload: Boolean(file ?? src),\n canExport: Boolean(workbook),\n canLoadDeferred,\n canUndo,\n canZoomIn,\n canZoomOut,\n charts,\n chartsheets,\n clearSelectedChart,\n clearSelectedCells,\n clearSelectedImage,\n clearSelection,\n continueDeferredLoad,\n copySelectionToClipboard,\n defaultZoomScale,\n deferredLoadFileSize,\n defineNamedRange,\n displayFileName,\n download,\n exportCsv,\n exportXlsx,\n error,\n fillSelection,\n getChartById,\n getChartsheetById,\n getImageById,\n getSheetCharts,\n getSheetImages,\n getSheetShapes,\n file,\n getClipboardData,\n getCellDisplayValue,\n getCellFormula,\n getCellSnapshotAsync: isWorkerBacked ? getCellSnapshotAsync : undefined,\n getActiveWorksheet,\n getRowsBatchAsync: isWorkerBacked ? getRowsBatchAsync : undefined,\n images,\n isLoadDeferred,\n isLoading,\n isChartsLoading,\n isWorkerBacked,\n mergeSelection,\n maxZoomScale: MAX_ZOOM_SCALE,\n minZoomScale: MIN_ZOOM_SCALE,\n moveChartBy,\n moveImageBy,\n pasteFromClipboard,\n pasteStructuredClipboardData,\n pasteText,\n removeActiveSheet,\n readOnly,\n recalculate,\n redo,\n resetZoom,\n revision,\n resizeChartBy,\n resizeImageBy,\n resizeColumn,\n resizeRow,\n setCellFormula,\n setCellValue,\n setZoomScale,\n setChartRect,\n setImageRect,\n selectedChart,\n selectedChartId,\n selectedFormula,\n selectedImage,\n selectedImageId,\n selectedRangeAddress,\n selectedValue,\n selectCell,\n selectChart,\n selectImage,\n selectRange,\n selection,\n setActiveSheetIndex,\n setActiveTabIndex,\n setSelectedCellFormula,\n setSelectedCellValue,\n sheets,\n shapes,\n src,\n sortState,\n sortTable,\n tabs,\n tables,\n undo,\n unmergeSelection,\n updateChart,\n workbook,\n zoomIn,\n zoomOut,\n zoomScale\n }),\n [\n activeCell,\n activeCellAddress,\n activeSheet,\n activeSheetIndex,\n activeTab,\n activeTabIndex,\n addSheet,\n canLoadDeferred,\n canRedo,\n canUndo,\n canZoomIn,\n canZoomOut,\n charts,\n chartsheets,\n clearSelectedChart,\n clearSelectedCells,\n clearSelectedImage,\n continueDeferredLoad,\n copySelectionToClipboard,\n defaultZoomScale,\n deferredLoadFileSize,\n defineNamedRange,\n displayFileName,\n download,\n error,\n exportCsv,\n exportXlsx,\n file,\n fillSelection,\n getChartById,\n getChartsheetById,\n getImageById,\n getSheetCharts,\n getSheetImages,\n getSheetShapes,\n getClipboardData,\n getCellDisplayValue,\n getCellFormula,\n getCellSnapshotAsync,\n getActiveWorksheet,\n historyRevision,\n images,\n isLoadDeferred,\n isLoading,\n isChartsLoading,\n isWorkerBacked,\n mergeSelection,\n resetZoom,\n moveChartBy,\n moveImageBy,\n pasteFromClipboard,\n pasteStructuredClipboardData,\n pasteText,\n removeActiveSheet,\n readOnly,\n recalculate,\n redo,\n revision,\n resizeChartBy,\n resizeImageBy,\n resizeColumn,\n resizeRow,\n setCellFormula,\n setCellValue,\n setZoomScale,\n setChartRect,\n setImageRect,\n selectedChart,\n selectedChartId,\n selectedFormula,\n selectedImage,\n selectedImageId,\n selectedRangeAddress,\n selectedValue,\n selectCell,\n selectChart,\n selectImage,\n selectRange,\n selection,\n setActiveSheetIndex,\n setActiveTabIndex,\n setSelectedCellFormula,\n setSelectedCellValue,\n sheets,\n shapes,\n sortState,\n sortTable,\n src,\n getRowsBatchAsync,\n tabs,\n tables,\n undo,\n unmergeSelection,\n updateChart,\n workbook,\n zoomIn,\n zoomOut,\n zoomScale\n ]\n );\n}\n","import type { Workbook } from \"@dukelib/sheets-wasm\";\nimport { strFromU8, strToU8 } from \"fflate\";\nimport type { WorkbookImageAssets, WorkbookImageSheetOrigin } from \"./images\";\nimport type {\n XlsxChart,\n XlsxChartAxis,\n XlsxChartDataLabels,\n XlsxChartLegend,\n XlsxChartPointDataLabel,\n XlsxChartPointStyle,\n XlsxChartReference,\n XlsxChartSeries,\n XlsxChartTypeGroup,\n XlsxChartWall,\n XlsxChartsheet,\n XlsxImageAnchor,\n XlsxThemePalette,\n XlsxWorkbookTab\n} from \"./types\";\n\nconst CHART_NS = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst DRAWINGML_NS = \"http://schemas.openxmlformats.org/drawingml/2006/main\";\nconst DRAWING_SPREADSHEET_NS = \"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst CHART_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\";\nconst CHART_EX_REL_TYPE = \"http://schemas.microsoft.com/office/2014/relationships/chartEx\";\nconst CHART_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartStyle\";\nconst CHART_COLOR_STYLE_REL_TYPE = \"http://schemas.microsoft.com/office/2011/relationships/chartColorStyle\";\nconst SERIES_COLORS = [\n \"#4472c4\",\n \"#ed7d31\",\n \"#a5a5a5\",\n \"#ffc000\",\n \"#5b9bd5\",\n \"#70ad47\",\n \"#264478\",\n \"#9e480e\",\n \"#636363\",\n \"#997300\"\n];\nconst EMU_PER_PIXEL = 9525;\nconst THEME_COLOR_INDEX_BY_NAME: Record<string, number> = {\n accent1: 4,\n accent2: 5,\n accent3: 6,\n accent4: 7,\n accent5: 8,\n accent6: 9,\n dk1: 1,\n dk2: 3,\n folHlink: 11,\n hlink: 10,\n lt1: 0,\n lt2: 2,\n tx1: 1,\n tx2: 3,\n bg1: 0,\n bg2: 2\n};\nconst PRIMARY_CHART_TYPE_LOCAL_NAMES = [\n \"barChart\",\n \"lineChart\",\n \"line3DChart\",\n \"stockChart\",\n \"radarChart\",\n \"scatterChart\",\n \"pieChart\",\n \"pie3DChart\",\n \"doughnutChart\",\n \"areaChart\",\n \"area3DChart\",\n \"bar3DChart\",\n \"ofPieChart\",\n \"bubbleChart\",\n \"surfaceChart\",\n \"surface3DChart\"\n] as const;\n\nexport type WorkbookChartOrigin = {\n anchorIndex: number;\n anchor: XlsxImageAnchor | null;\n chartPath: string | null;\n chartKind: \"classic\" | \"modern\";\n drawingPath: string;\n workbookSheetIndex: number;\n};\n\nexport type WorkbookChartAssets = {\n chartOriginsById: Map<string, WorkbookChartOrigin>;\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n};\n\ntype ChartStyleAppearance = {\n axisLabelColor?: string;\n axisLineColor?: string;\n chartAreaBorderColor?: string;\n chartAreaFillColor?: string;\n chartAreaNoFill?: boolean;\n paletteOffset?: number;\n textColor?: string;\n titleColor?: string;\n};\n\nfunction clampUnitInterval(value: number) {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction isElementNode(node: Node | ChildNode | null | undefined): node is Element {\n return node != null && node.nodeType === 1;\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction resolveColorFromXmlFragment(fragment: string, themePalette?: XlsxThemePalette | null) {\n if (!fragment) {\n return undefined;\n }\n\n const srgbMatch = fragment.match(/<a:srgbClr\\b[^>]*\\bval=\"([0-9a-fA-F]{6,8})\"/i);\n if (srgbMatch?.[1]) {\n return normalizeHexColor(srgbMatch[1]) ?? undefined;\n }\n\n const schemeMatch = fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/a:schemeClr>/i)\n ?? fragment.match(/<a:schemeClr\\b[^>]*\\bval=\"([^\"]+)\"[^>]*/i);\n if (!schemeMatch?.[1]) {\n return undefined;\n }\n\n const baseColor = resolveThemeColor(schemeMatch[1], themePalette);\n if (!baseColor) {\n return undefined;\n }\n\n const transforms = schemeMatch[2] ?? \"\";\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const match of transforms.matchAll(/<a:(lumMod|lumOff|tint|shade)\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/gi)) {\n const transform = match[1]?.toLowerCase();\n const rawValue = Number(match[2] ?? Number.NaN);\n if (!transform || !Number.isFinite(rawValue)) {\n continue;\n }\n if (transform === \"lummod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transform === \"lumoff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transform === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transform === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset) ?? undefined;\n}\n\nfunction readHexColorFromXmlFragment(\n fragment: string,\n preferLine = false,\n themePalette?: XlsxThemePalette | null\n) {\n const source = preferLine\n ? fragment.match(/<a:ln\\b[\\s\\S]*?<\\/a:ln>/i)?.[0] ?? \"\"\n : fragment.match(/<a:solidFill\\b[\\s\\S]*?<\\/a:solidFill>/i)?.[0] ?? \"\";\n return resolveColorFromXmlFragment(source, themePalette);\n}\n\ntype FallbackSeriesStyle = {\n color?: string;\n lineColor?: string;\n};\n\nfunction parseFallbackSeriesStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): FallbackSeriesStyle[] {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const shapeBlock = seriesBlock.match(/<c:spPr\\b[\\s\\S]*?<\\/c:spPr>/i)?.[0] ?? \"\";\n return {\n color: readHexColorFromXmlFragment(shapeBlock, false, themePalette),\n lineColor: readHexColorFromXmlFragment(shapeBlock, true, themePalette)\n };\n });\n}\n\nfunction parseFallbackPointStylesFromChartXml(\n chartXml: string,\n themePalette?: XlsxThemePalette | null\n): XlsxChartPointStyle[][] {\n const chartDocument = parseXml(chartXml);\n if (chartDocument) {\n const parsedSeriesStyles = getLocalDescendants(chartDocument, \"ser\").map((seriesNode) => {\n const styles: XlsxChartPointStyle[] = [];\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n styles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n return styles;\n });\n if (parsedSeriesStyles.some((styles) => styles.length > 0)) {\n return parsedSeriesStyles;\n }\n }\n\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const pointBlocks = seriesBlock.match(/<c:dPt\\b[\\s\\S]*?<\\/c:dPt>/gi) ?? [];\n if (pointBlocks.length === 0) {\n return [];\n }\n\n const styles: XlsxChartPointStyle[] = [];\n for (const pointBlock of pointBlocks) {\n const indexMatch = pointBlock.match(/<c:idx\\b[^>]*\\bval=\"(-?\\d+)\"/i);\n const index = indexMatch?.[1] ? Number(indexMatch[1]) : Number.NaN;\n if (!Number.isFinite(index)) {\n continue;\n }\n const explosionMatch = pointBlock.match(/<c:explosion\\b[^>]*\\bval=\"(-?\\d+(?:\\.\\d+)?)\"/i);\n const explosionValue = explosionMatch?.[1] ? Number(explosionMatch[1]) : Number.NaN;\n styles.push({\n color: readHexColorFromXmlFragment(pointBlock, false, themePalette),\n explosion: Number.isFinite(explosionValue) ? explosionValue : undefined,\n index,\n lineColor: readHexColorFromXmlFragment(pointBlock, true, themePalette)\n });\n }\n\n return styles;\n });\n}\n\nfunction parseNumericPointCacheFromXmlFragment(fragment: string) {\n const pointMatches = Array.from(fragment.matchAll(/<c:pt\\b[^>]*\\bidx=\"(-?\\d+)\"[^>]*>[\\s\\S]*?<c:v>([^<]*)<\\/c:v>[\\s\\S]*?<\\/c:pt>/gi));\n if (pointMatches.length === 0) {\n return [];\n }\n\n const explicitPointCountMatch = fragment.match(/<c:ptCount\\b[^>]*\\bval=\"(\\d+)\"/i);\n const explicitPointCount = explicitPointCountMatch?.[1] ? Number(explicitPointCountMatch[1]) : Number.NaN;\n const maxIndex = pointMatches.reduce((max, match) => {\n const current = Number(match[1] ?? Number.NaN);\n return Number.isFinite(current) ? Math.max(max, current) : max;\n }, -1);\n const pointCount = Math.max(\n pointMatches.length,\n Number.isFinite(explicitPointCount) ? explicitPointCount : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: pointCount }, () => null as number | null);\n\n for (const match of pointMatches) {\n const index = Number(match[1] ?? Number.NaN);\n const rawValue = (match[2] ?? \"\").trim();\n const numericValue = Number(rawValue);\n if (!Number.isFinite(index) || index < 0 || !Number.isFinite(numericValue)) {\n continue;\n }\n values[index] = numericValue;\n }\n\n return values;\n}\n\nfunction parseFallbackBubbleSizesFromChartXml(chartXml: string): Array<Array<number | null>> {\n const seriesBlocks = chartXml.match(/<c:ser\\b[\\s\\S]*?<\\/c:ser>/gi) ?? [];\n if (seriesBlocks.length === 0) {\n return [];\n }\n\n return seriesBlocks.map((seriesBlock) => {\n const bubbleSizeBlock = seriesBlock.match(/<c:bubbleSize\\b[\\s\\S]*?<\\/c:bubbleSize>/i)?.[0] ?? \"\";\n if (!bubbleSizeBlock) {\n return [];\n }\n\n return parseNumericPointCacheFromXmlFragment(bubbleSizeBlock);\n });\n}\n\nfunction decodeChartXmlText(value: string) {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\");\n}\n\nfunction normalizeChartTitleForMatch(value: string | null | undefined) {\n return (value ?? \"\").trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction extractChartTitleFromXml(chartXml: string): string | null {\n const match = chartXml.match(/<c:title\\b[\\s\\S]*?<a:t>([\\s\\S]*?)<\\/a:t>/i);\n if (!match?.[1]) {\n return null;\n }\n const decoded = decodeChartXmlText(match[1]).trim();\n return decoded.length > 0 ? decoded : null;\n}\n\nfunction resolveArchiveFallbackBubbleSizes(\n archive: Record<string, Uint8Array>,\n preferredTitle: string | undefined\n) {\n const preferred = normalizeChartTitleForMatch(preferredTitle);\n let bestScore = Number.NEGATIVE_INFINITY;\n let bestCandidate: Array<Array<number | null>> = [];\n\n for (const [path, bytes] of Object.entries(archive)) {\n if (!/\\/charts\\/chart\\d+\\.xml$/i.test(path)) {\n continue;\n }\n const chartXml = strFromU8(bytes);\n if (!/<c:bubbleChart\\b/i.test(chartXml)) {\n continue;\n }\n const candidateBubbleSizes = parseFallbackBubbleSizesFromChartXml(chartXml);\n const hasCandidateValues = candidateBubbleSizes.some((seriesValues) => seriesValues.some((value) => value != null));\n if (!hasCandidateValues) {\n continue;\n }\n\n let score = 0;\n const candidateTitle = normalizeChartTitleForMatch(extractChartTitleFromXml(chartXml));\n if (preferred.length > 0 && candidateTitle.length > 0 && preferred === candidateTitle) {\n score += 100;\n }\n if (bestCandidate.length === 0) {\n score += 1;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCandidate = candidateBubbleSizes;\n if (score >= 100) {\n break;\n }\n }\n }\n\n return bestCandidate;\n}\n\nfunction parseChartTypeFromXml(chartXml: string) {\n for (const chartType of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n if (new RegExp(`<c:${chartType}\\\\b`, \"i\").test(chartXml)) {\n return chartType;\n }\n }\n return \"\";\n}\n\nfunction findPrimaryChartTypeNode(plotAreaNode: Element | null) {\n if (!plotAreaNode) {\n return null;\n }\n\n for (const localName of PRIMARY_CHART_TYPE_LOCAL_NAMES) {\n const node = getLocalChildren(plotAreaNode, localName)[0];\n if (node) {\n return node;\n }\n }\n\n return null;\n}\n\nfunction resolveScatterChartType(scatterStyle: string | null | undefined) {\n switch (scatterStyle) {\n case \"line\":\n case \"lineMarker\":\n return \"ScatterLines\";\n case \"smooth\":\n case \"smoothMarker\":\n return \"ScatterSmooth\";\n default:\n return \"Scatter\";\n }\n}\n\nfunction resolveArchiveFallbackPointStyles(\n archive: Record<string, Uint8Array>,\n preferredTitle: string | undefined,\n preferredChartXmlType: string | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const preferred = normalizeChartTitleForMatch(preferredTitle);\n const preferredType = (preferredChartXmlType ?? \"\").trim();\n let bestScore = Number.NEGATIVE_INFINITY;\n let bestCandidate: XlsxChartPointStyle[][] = [];\n\n for (const [path, bytes] of Object.entries(archive)) {\n if (!/\\/charts\\/chart\\d+\\.xml$/i.test(path)) {\n continue;\n }\n const chartXml = strFromU8(bytes);\n const candidateType = parseChartTypeFromXml(chartXml);\n if (!candidateType) {\n continue;\n }\n const candidatePointStyles = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const hasCandidateValues = candidatePointStyles.some((seriesStyles) => seriesStyles.some((style) => (\n (typeof style.color === \"string\" && style.color.length > 0)\n || typeof style.explosion === \"number\"\n )));\n if (!hasCandidateValues) {\n continue;\n }\n\n let score = 0;\n const candidateTitle = normalizeChartTitleForMatch(extractChartTitleFromXml(chartXml));\n if (preferred.length > 0 && candidateTitle.length > 0 && preferred === candidateTitle) {\n score += 100;\n }\n if (preferredType && candidateType === preferredType) {\n score += 20;\n }\n if (bestCandidate.length === 0) {\n score += 1;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestCandidate = candidatePointStyles;\n if (score >= 120) {\n break;\n }\n }\n }\n\n return bestCandidate;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n if (!normalized) {\n return null;\n }\n const match = /^#([0-9a-f]{6})$/.exec(normalized);\n if (!match) {\n return null;\n }\n return [\n Number.parseInt(match[1].slice(0, 2), 16),\n Number.parseInt(match[1].slice(2, 4), 16),\n Number.parseInt(match[1].slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, Math.round(channel))).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyLightnessTransform(baseColor: string, modifier = 1, offset = 0) {\n const rgb = parseHexColor(baseColor);\n if (!rgb) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = clampUnitInterval(lightness * modifier + offset);\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, nextLightness);\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nfunction resolveThemeColor(name: string | null, themePalette?: XlsxThemePalette | null) {\n if (!name) {\n return null;\n }\n const index = THEME_COLOR_INDEX_BY_NAME[name];\n return index === undefined ? null : themePalette?.colorsByIndex[index] ?? null;\n}\n\nfunction resolveThemeTypeface(typeface: string | null, themePalette?: XlsxThemePalette | null) {\n if (!typeface) {\n return null;\n }\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return themePalette?.minorLatinFont ?? null;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return themePalette?.majorLatinFont ?? null;\n }\n return typeface;\n}\n\nfunction readChartTextTypeface(textPropertiesNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!textPropertiesNode) {\n return null;\n }\n const defaultRunProperties = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n if (!defaultRunProperties) {\n return null;\n }\n const typeface = getFirstLocalChild(defaultRunProperties, \"latin\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"ea\")?.getAttribute(\"typeface\")\n ?? getFirstLocalChild(defaultRunProperties, \"cs\")?.getAttribute(\"typeface\")\n ?? null;\n const resolved = resolveThemeTypeface(typeface, themePalette)?.trim() ?? \"\";\n return resolved.length > 0 ? resolved : null;\n}\n\nfunction resolveChartColorNode(node: Element | null, themePalette?: XlsxThemePalette | null): string | null {\n if (!node) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (node.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"val\") ?? \"\"}`);\n } else if (node.localName === \"schemeClr\") {\n baseColor = resolveThemeColor(node.getAttribute(\"val\"), themePalette);\n } else if (node.localName === \"sysClr\") {\n baseColor = normalizeHexColor(`#${node.getAttribute(\"lastClr\") ?? \"\"}`);\n }\n\n if (!baseColor) {\n return null;\n }\n\n let lightnessModifier = 1;\n let lightnessOffset = 0;\n for (const transformNode of Array.from(node.childNodes).filter(isElementNode)) {\n const rawValue = Number(transformNode.getAttribute(\"val\") ?? Number.NaN);\n if (!Number.isFinite(rawValue)) {\n continue;\n }\n if (transformNode.localName === \"lumMod\") {\n lightnessModifier *= rawValue / 100000;\n } else if (transformNode.localName === \"lumOff\") {\n lightnessOffset += rawValue / 100000;\n } else if (transformNode.localName === \"tint\") {\n lightnessOffset += (1 - lightnessOffset) * (rawValue / 100000);\n } else if (transformNode.localName === \"shade\") {\n lightnessModifier *= rawValue / 100000;\n }\n }\n\n return applyLightnessTransform(baseColor, lightnessModifier, lightnessOffset);\n}\n\nfunction isChartColorElement(node: Element | null | undefined): node is Element {\n return Boolean(node && (node.localName === \"schemeClr\" || node.localName === \"srgbClr\" || node.localName === \"sysClr\"));\n}\n\nfunction findFirstChartColorElement(node: Element | null) {\n if (!node) {\n return null;\n }\n if (isChartColorElement(node)) {\n return node;\n }\n\n for (const localName of [\"srgbClr\", \"schemeClr\", \"sysClr\"]) {\n for (const candidate of getLocalDescendants(node, localName)) {\n if (isChartColorElement(candidate)) {\n return candidate;\n }\n }\n }\n\n return null;\n}\n\nfunction resolveChartFillColor(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n if (!shapeNode || getFirstLocalChild(shapeNode, \"noFill\")) {\n return null;\n }\n const solidFill = getFirstLocalChild(shapeNode, \"solidFill\");\n if (solidFill) {\n const colorNode = findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null);\n return resolveChartColorNode(colorNode, themePalette);\n }\n\n const gradientFill = getFirstLocalChild(shapeNode, \"gradFill\");\n const gradientStops = gradientFill\n ? getLocalDescendants(gradientFill, \"gs\")\n .map((stopNode) => ({\n colorNode: Array.from(stopNode.childNodes).find(isElementNode) ?? null,\n position: Number(stopNode.getAttribute(\"pos\") ?? Number.NaN)\n }))\n .filter((stop) => Boolean(stop.colorNode))\n : [];\n if (gradientStops.length === 0) {\n return null;\n }\n\n gradientStops.sort((left, right) => {\n const leftPos = Number.isFinite(left.position) ? left.position : 0;\n const rightPos = Number.isFinite(right.position) ? right.position : 0;\n return leftPos - rightPos;\n });\n const midpointStop = gradientStops.find((stop) => Number.isFinite(stop.position) && stop.position >= 50000)\n ?? gradientStops[Math.floor(gradientStops.length / 2)]\n ?? gradientStops[0];\n return resolveChartColorNode(midpointStop.colorNode, themePalette);\n}\n\nfunction resolveChartLineStyle(shapeNode: Element | null, themePalette?: XlsxThemePalette | null) {\n const lineNode = shapeNode?.localName === \"ln\" ? shapeNode : (shapeNode ? getFirstLocalChild(shapeNode, \"ln\") : null);\n if (!lineNode) {\n return { color: null, hidden: false, widthPx: undefined };\n }\n if (getFirstLocalChild(lineNode, \"noFill\")) {\n return { color: null, hidden: true, widthPx: undefined };\n }\n\n const solidFill = getFirstLocalChild(lineNode, \"solidFill\");\n const colorNode = solidFill ? findFirstChartColorElement(Array.from(solidFill.childNodes).find(isElementNode) ?? null) : null;\n const widthValue = Number(lineNode.getAttribute(\"w\") ?? Number.NaN);\n return {\n color: resolveChartColorNode(colorNode, themePalette),\n hidden: false,\n widthPx: Number.isFinite(widthValue) ? Math.max(1, widthValue / EMU_PER_PIXEL) : undefined\n };\n}\n\nfunction normalizeLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n const legend = raw as Record<string, unknown>;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position: typeof legend.position === \"string\" ? legend.position : undefined,\n raw: legend\n };\n}\n\nfunction normalizeLegendPosition(position: string | undefined) {\n if (!position) {\n return undefined;\n }\n switch (position) {\n case \"bottom\":\n return \"b\";\n case \"left\":\n return \"l\";\n case \"right\":\n return \"r\";\n case \"top\":\n return \"t\";\n default:\n return position;\n }\n}\n\nfunction readChartNumericAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n const value = Number(node?.getAttribute(\"val\") ?? Number.NaN);\n return Number.isFinite(value) ? value : undefined;\n}\n\nfunction readChartBooleanAttribute(parent: Element | null, localName: string) {\n const node = parent ? getFirstLocalChild(parent, localName) : null;\n if (!node) {\n return undefined;\n }\n const rawValue = node.getAttribute(\"val\");\n if (rawValue == null) {\n return true;\n }\n if (rawValue === \"1\" || rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"0\" || rawValue === \"false\") {\n return false;\n }\n return undefined;\n}\n\nfunction readChartLabelFontSizePt(textPropertiesNode: Element | null) {\n if (!textPropertiesNode) {\n return undefined;\n }\n const runPropertiesNode = getFirstLocalDescendant(textPropertiesNode, \"defRPr\")\n ?? getFirstLocalDescendant(textPropertiesNode, \"rPr\");\n const rawSize = Number(runPropertiesNode?.getAttribute(\"sz\") ?? Number.NaN);\n if (!Number.isFinite(rawSize) || rawSize <= 0) {\n return undefined;\n }\n return rawSize / 100;\n}\n\nfunction parseChartPointDataLabelsFromXml(labelsNode: Element): XlsxChartPointDataLabel[] {\n const fallbackFontSizePt = readChartLabelFontSizePt(getFirstLocalChild(labelsNode, \"txPr\"));\n const labels: XlsxChartPointDataLabel[] = [];\n for (const pointLabelNode of getLocalChildren(labelsNode, \"dLbl\")) {\n const index = readChartNumericAttribute(pointLabelNode, \"idx\");\n if (typeof index !== \"number\" || !Number.isFinite(index)) {\n continue;\n }\n\n const layoutNode = getFirstLocalChild(pointLabelNode, \"layout\");\n const manualLayoutNode = getFirstLocalChild(layoutNode, \"manualLayout\");\n labels.push({\n deleted: readChartBooleanAttribute(pointLabelNode, \"delete\"),\n fontSizePt: readChartLabelFontSizePt(getFirstLocalChild(pointLabelNode, \"txPr\")) ?? fallbackFontSizePt,\n index,\n showBubbleSize: readChartBooleanAttribute(pointLabelNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(pointLabelNode, \"showCatName\"),\n showPercent: readChartBooleanAttribute(pointLabelNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(pointLabelNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(pointLabelNode, \"showVal\"),\n x: readChartNumericAttribute(manualLayoutNode, \"x\"),\n y: readChartNumericAttribute(manualLayoutNode, \"y\")\n });\n }\n return labels;\n}\n\nfunction parseChartDataLabelsFromXml(labelsNode: Element | null): XlsxChartDataLabels | null {\n if (!labelsNode) {\n return null;\n }\n\n const pointLabels = parseChartPointDataLabelsFromXml(labelsNode);\n const labels: XlsxChartDataLabels = {\n pointLabels: pointLabels.length > 0 ? pointLabels : undefined,\n raw: {},\n showBubbleSize: readChartBooleanAttribute(labelsNode, \"showBubbleSize\"),\n showCategoryName: readChartBooleanAttribute(labelsNode, \"showCatName\"),\n showLegendKey: readChartBooleanAttribute(labelsNode, \"showLegendKey\"),\n showPercent: readChartBooleanAttribute(labelsNode, \"showPercent\"),\n showSeriesName: readChartBooleanAttribute(labelsNode, \"showSerName\"),\n showValue: readChartBooleanAttribute(labelsNode, \"showVal\")\n };\n const hasValue = (\n labels.showBubbleSize !== undefined\n || labels.showCategoryName !== undefined\n || labels.showLegendKey !== undefined\n || labels.showPercent !== undefined\n || (labels.pointLabels?.length ?? 0) > 0\n || labels.showSeriesName !== undefined\n || labels.showValue !== undefined\n );\n return hasValue ? labels : null;\n}\n\nfunction readChartRelationships(\n archive: Record<string, Uint8Array>,\n chartPath: string\n) {\n const relsPath = normalizeArchivePath(`${dirname(chartPath)}/_rels/${chartPath.split(\"/\").pop()}.rels`);\n const relsXml = readArchiveText(archive, relsPath);\n if (!relsXml) {\n return new Map<string, string>();\n }\n\n const relsDocument = parseXml(relsXml);\n if (!relsDocument) {\n return new Map<string, string>();\n }\n\n const relationships = new Map<string, string>();\n for (const relationshipNode of getLocalDescendants(relsDocument, \"Relationship\")) {\n const type = relationshipNode.getAttribute(\"Type\");\n const target = relationshipNode.getAttribute(\"Target\");\n if (!type || !target) {\n continue;\n }\n relationships.set(type, resolveRelationshipPath(relsPath, target));\n }\n\n return relationships;\n}\n\nfunction readChartColorPalette(\n archive: Record<string, Uint8Array>,\n colorStylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n const colorStyleXml = readArchiveText(archive, colorStylePath);\n if (!colorStyleXml) {\n return [];\n }\n\n const colorStyleDocument = parseXml(colorStyleXml);\n if (!colorStyleDocument?.documentElement) {\n return [];\n }\n\n return Array.from(colorStyleDocument.documentElement.childNodes)\n .filter((child): child is Element => isElementNode(child) && child.localName !== \"variation\")\n .map((child) => (\n resolveChartColorNode(child, themePalette)\n ?? resolveChartColorNode(findFirstChartColorElement(child), themePalette)\n ))\n .filter((color): color is string => typeof color === \"string\");\n}\n\nfunction readChartStyleAppearance(\n archive: Record<string, Uint8Array>,\n stylePath: string | null | undefined,\n themePalette?: XlsxThemePalette | null\n): ChartStyleAppearance {\n const styleXml = readArchiveText(archive, stylePath);\n if (!styleXml) {\n return {};\n }\n\n const styleDocument = parseXml(styleXml);\n if (!styleDocument) {\n return {};\n }\n\n const dataPointNode = getFirstLocalDescendant(styleDocument, \"dataPoint\");\n const fillRefNode = dataPointNode ? getFirstLocalChild(dataPointNode, \"fillRef\") : null;\n const index = Number(fillRefNode?.getAttribute(\"idx\") ?? Number.NaN);\n const chartAreaNode = getFirstLocalDescendant(styleDocument, \"chartArea\");\n const chartAreaShapeProperties = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"spPr\") : null;\n const chartAreaFontRef = chartAreaNode ? getFirstLocalChild(chartAreaNode, \"fontRef\") : null;\n const chartAreaFontColor = chartAreaFontRef\n ? resolveChartColorNode(Array.from(chartAreaFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const titleNode = getFirstLocalDescendant(styleDocument, \"title\");\n const titleFontRef = titleNode ? getFirstLocalChild(titleNode, \"fontRef\") : null;\n const titleColor = titleFontRef\n ? resolveChartColorNode(Array.from(titleFontRef.childNodes).find(isElementNode) ?? null, themePalette)\n : null;\n const axisStyleNode = getFirstLocalDescendant(styleDocument, \"categoryAxis\")\n ?? getFirstLocalDescendant(styleDocument, \"valueAxis\");\n const axisShapeProperties = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"spPr\") : null;\n const axisFontRef = axisStyleNode ? getFirstLocalChild(axisStyleNode, \"fontRef\") : null;\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n\n return {\n axisLabelColor: axisFontRef\n ? resolveChartColorNode(Array.from(axisFontRef.childNodes).find(isElementNode) ?? null, themePalette) ?? undefined\n : undefined,\n axisLineColor: resolveChartLineStyle(axisShapeProperties, themePalette).color ?? undefined,\n chartAreaBorderColor: resolveChartLineStyle(chartAreaShapeProperties, themePalette).color ?? undefined,\n chartAreaFillColor: resolveChartFillColor(chartAreaShapeProperties, themePalette) ?? undefined,\n chartAreaNoFill,\n paletteOffset: Number.isFinite(index) ? index : undefined,\n textColor: chartAreaFontColor ?? undefined,\n titleColor: titleColor ?? chartAreaFontColor ?? undefined\n };\n}\n\nfunction buildThemeSeriesPalette(themePalette?: XlsxThemePalette | null) {\n const themeColors = [4, 5, 6, 7, 8, 9]\n .map((index) => themePalette?.colorsByIndex[index] ?? null)\n .filter((color): color is string => Boolean(color));\n return themeColors.length > 0 ? themeColors : SERIES_COLORS;\n}\n\nfunction normalizeBuiltinSurfaceStyleId(styleId: number | undefined) {\n if (typeof styleId !== \"number\" || !Number.isFinite(styleId)) {\n return null;\n }\n return styleId >= 100 ? styleId - 100 : styleId;\n}\n\nfunction getBuiltinSurfacePalette(styleId: number | undefined, wireframe: boolean | undefined) {\n const normalized = normalizeBuiltinSurfaceStyleId(styleId);\n if (normalized === 34 || (wireframe === true && normalized == null)) {\n return [\"#5b9bd5\", \"#ed7d31\", \"#a5a5a5\"];\n }\n if (normalized === 35 || normalized === 36 || (wireframe !== true && normalized == null)) {\n return [\"#2f5597\", \"#4472c4\", \"#5b9bd5\", \"#8faadc\", \"#d9e2f3\"];\n }\n return null;\n}\n\nfunction applyBuiltinSurfaceDefaults(chart: XlsxChart) {\n if (chart.chartType !== \"Surface\") {\n return;\n }\n\n const builtinPalette = getBuiltinSurfacePalette(chart.chartStyleId, chart.wireframe);\n if ((!chart.chartColorPalette || chart.chartColorPalette.length === 0) && builtinPalette) {\n chart.chartColorPalette = builtinPalette;\n }\n\n const wallFill = chart.wireframe ? \"#d0d0d0\" : \"#d9d9df\";\n const wallLine = chart.wireframe ? \"#a6a6a6\" : \"#a8adb7\";\n chart.floor = {\n ...(chart.floor ?? {}),\n fillColor: chart.floor?.fillColor ?? wallFill,\n lineColor: chart.floor?.lineColor ?? wallLine\n };\n chart.sideWall = {\n ...(chart.sideWall ?? {}),\n fillColor: chart.sideWall?.fillColor ?? wallFill,\n lineColor: chart.sideWall?.lineColor ?? wallLine\n };\n chart.backWall = {\n ...(chart.backWall ?? {}),\n fillColor: chart.backWall?.fillColor ?? wallFill,\n lineColor: chart.backWall?.lineColor ?? wallLine\n };\n if (!chart.surfaceMaterial && chart.wireframe !== true) {\n chart.surfaceMaterial = \"flat\";\n }\n}\n\nfunction applyBuiltinChartDefaults(chart: XlsxChart, themePalette?: XlsxThemePalette | null) {\n const darkBuiltInStyle = typeof chart.chartStyleId === \"number\" && chart.chartStyleId >= 140 && chart.chartStyleId < 150;\n const textColor = themePalette?.colorsByIndex[1] ?? themePalette?.colorsByIndex[3] ?? null;\n const minorTypeface = themePalette?.minorLatinFont?.trim() || undefined;\n const derivedAxisColor = textColor ? applyLightnessTransform(textColor, 0.35, 0.55) : null;\n const derivedBorderColor = textColor\n ? applyLightnessTransform(textColor, chart.is3d ? 0.28 : 0.22, chart.is3d ? 0.6 : 0.7)\n : null;\n if (darkBuiltInStyle) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? \"#1f1f1f\";\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? \"#1f1f1f\";\n chart.textColor = chart.textColor ?? \"#f5f5f5\";\n chart.titleColor = chart.titleColor ?? \"#f5f5f5\";\n chart.axisLabelColor = chart.axisLabelColor ?? \"#d9d9d9\";\n chart.axisLineColor = chart.axisLineColor ?? \"#8c8c8c\";\n }\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? derivedBorderColor ?? undefined;\n chart.textColor = chart.textColor ?? textColor ?? undefined;\n chart.titleColor = chart.titleColor ?? textColor ?? undefined;\n chart.axisLabelColor = chart.axisLabelColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.axisLineColor = chart.axisLineColor ?? derivedAxisColor ?? textColor ?? undefined;\n chart.fontFamily = chart.fontFamily ?? minorTypeface;\n chart.titleFontFamily = chart.titleFontFamily ?? chart.fontFamily ?? minorTypeface;\n\n const seriesPalette = chart.chartColorPalette && chart.chartColorPalette.length > 0\n ? chart.chartColorPalette\n : buildThemeSeriesPalette(themePalette);\n if (!chart.chartColorPalette || chart.chartColorPalette.length === 0) {\n chart.chartColorPalette = seriesPalette;\n }\n\n chart.series = chart.series.map((series, index) => {\n const fallbackColor = seriesPalette[index % seriesPalette.length];\n return {\n ...series,\n color: series.color ?? series.lineColor ?? fallbackColor,\n lineColor: series.lineColor ?? series.color ?? fallbackColor,\n markerColor: series.markerColor ?? series.color ?? series.lineColor ?? fallbackColor,\n markerLineColor: series.markerLineColor ?? series.lineColor ?? series.color ?? fallbackColor\n };\n });\n chart.typeGroups = chart.typeGroups?.map((group, groupIndex) => ({\n ...group,\n series: group.series.map((series, seriesIndex) => {\n const fallbackColor = seriesPalette[(groupIndex + seriesIndex) % seriesPalette.length];\n return {\n ...series,\n color: series.color ?? series.lineColor ?? fallbackColor,\n lineColor: series.lineColor ?? series.color ?? fallbackColor,\n markerColor: series.markerColor ?? series.color ?? series.lineColor ?? fallbackColor,\n markerLineColor: series.markerLineColor ?? series.lineColor ?? series.color ?? fallbackColor\n };\n })\n }));\n applyBuiltinSurfaceDefaults(chart);\n}\n\nfunction parseChartPointStyles(seriesNode: Element, themePalette?: XlsxThemePalette | null): XlsxChartPointStyle[] {\n const pointStyles: XlsxChartPointStyle[] = [];\n\n for (const dataPointNode of getLocalChildren(seriesNode, \"dPt\")) {\n const indexValue = readChartNumericAttribute(dataPointNode, \"idx\");\n if (indexValue === undefined) {\n continue;\n }\n const shapeProperties = getFirstLocalChild(dataPointNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n pointStyles.push({\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n explosion: readChartNumericAttribute(dataPointNode, \"explosion\"),\n index: indexValue,\n lineColor: lineStyle.color ?? undefined\n });\n }\n\n return pointStyles;\n}\n\nfunction parseInvertNegativeStyle(seriesNode: Element, themePalette?: XlsxThemePalette | null) {\n const invertNode = getFirstLocalDescendant(seriesNode, \"invertSolidFillFmt\");\n const shapeProperties = invertNode ? getFirstLocalChild(invertNode, \"spPr\") : null;\n if (!shapeProperties) {\n return {\n color: undefined,\n lineColor: undefined\n };\n }\n\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n color: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n lineColor: lineStyle.color ?? undefined\n };\n}\n\nfunction parseChartCacheValues(\n parentNode: Element | null,\n cacheName: \"numCache\" | \"strCache\",\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"numRef\")\n ?? getFirstLocalChild(parentNode, \"strRef\")\n ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, cacheName);\n if (!cacheNode) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const pointNodes = getLocalChildren(cacheNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n } else {\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n }\n return values;\n}\n\nfunction parseChartMultiLevelCacheValues(\n parentNode: Element | null,\n mode: \"category\" | \"value\"\n): Array<number | string | null> | null {\n if (!parentNode) {\n return null;\n }\n\n const referenceNode = getFirstLocalChild(parentNode, \"multiLvlStrRef\") ?? parentNode;\n const cacheNode = getFirstLocalChild(referenceNode, \"multiLvlStrCache\");\n if (!cacheNode) {\n return null;\n }\n\n const levelNodes = getLocalChildren(cacheNode, \"lvl\");\n if (levelNodes.length === 0) {\n return null;\n }\n\n const pointCount = readChartNumericAttribute(cacheNode, \"ptCount\");\n const primaryLevelNode = mode === \"category\"\n ? levelNodes[levelNodes.length - 1] ?? levelNodes[0]\n : levelNodes[0];\n const pointNodes = getLocalChildren(primaryLevelNode, \"pt\")\n .map((pointNode) => {\n const rawIndex = Number(pointNode.getAttribute(\"idx\") ?? Number.NaN);\n return {\n index: Number.isFinite(rawIndex) ? rawIndex : 0,\n value: getFirstLocalChild(pointNode, \"v\")?.textContent ?? \"\"\n };\n })\n .sort((left, right) => left.index - right.index);\n\n if (pointNodes.length === 0) {\n return null;\n }\n\n const maxIndex = pointNodes.reduce((max, point) => Math.max(max, point.index), 0);\n const targetLength = Math.max(\n pointNodes.length,\n Number.isFinite(pointCount ?? Number.NaN) ? Number(pointCount) : 0,\n maxIndex + 1\n );\n const values = Array.from({ length: targetLength }, () => null as number | string | null);\n for (const point of pointNodes) {\n if (mode === \"value\") {\n values[point.index] = cellValueToNumber(point.value);\n continue;\n }\n values[point.index] = point.value.length > 0 ? point.value : null;\n }\n return values;\n}\n\nfunction applyChartSeriesStyleFromXml(chart: XlsxChart, chartTypeNode: Element, themePalette?: XlsxThemePalette | null) {\n const seriesNodes = getLocalChildren(chartTypeNode, \"ser\");\n chart.series = chart.series.map((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return series;\n }\n\n const shapeProperties = getFirstLocalChild(seriesNode, \"spPr\");\n const markerNode = getFirstLocalChild(seriesNode, \"marker\");\n const markerShapeProperties = getFirstLocalChild(markerNode ?? chartTypeNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n const markerLineStyle = resolveChartLineStyle(markerShapeProperties, themePalette);\n const fillColor = resolveChartFillColor(shapeProperties, themePalette);\n const markerSize = readChartNumericAttribute(markerNode, \"size\");\n const markerSymbolNode = markerNode ? getFirstLocalChild(markerNode, \"symbol\") : null;\n const markerSymbol = markerSymbolNode?.getAttribute(\"val\") ?? undefined;\n const pointStyles = parseChartPointStyles(seriesNode, themePalette);\n const seriesExplosion = readChartNumericAttribute(seriesNode, \"explosion\");\n const invertNegativeStyle = parseInvertNegativeStyle(seriesNode, themePalette);\n const invertIfNegative = readChartBooleanAttribute(seriesNode, \"invertIfNegative\");\n const isScatterChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n const cachedCategories = isScatterChart\n ? (\n parseChartCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"numCache\", \"value\")\n ?? parseChartMultiLevelCacheValues(getFirstLocalChild(seriesNode, \"xVal\"), \"category\")\n )\n : parseChartCacheValues(getFirstLocalChild(seriesNode, \"cat\"), \"strCache\", \"category\");\n const cachedValues = isScatterChart\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"yVal\"), \"numCache\", \"value\")\n : parseChartCacheValues(getFirstLocalChild(seriesNode, \"val\"), \"numCache\", \"value\");\n const cachedBubbleSizes = chart.chartType === \"Bubble\"\n ? parseChartCacheValues(getFirstLocalChild(seriesNode, \"bubbleSize\"), \"numCache\", \"value\")\n : null;\n const existingShapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : null;\n const rawFillColor = typeof existingShapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof existingShapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(existingShapeProperties.lineColorHex)\n : null;\n const resolvedLineColor = lineStyle.hidden\n ? undefined\n : rawLineColor ?? lineStyle.color ?? rawFillColor ?? fillColor ?? series.lineColor ?? series.color;\n\n const hasCategoryReference = typeof series.categoriesRef?.formula === \"string\" && series.categoriesRef.formula.length > 0;\n const hasValueReference = typeof series.valuesRef?.formula === \"string\" && series.valuesRef.formula.length > 0;\n const hasBubbleSizeReference = typeof series.bubbleSizeRef?.formula === \"string\" && series.bubbleSizeRef.formula.length > 0;\n\n return {\n ...series,\n bubbleSizes: !hasBubbleSizeReference && cachedBubbleSizes\n ? cachedBubbleSizes.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.bubbleSizes,\n categories: !hasCategoryReference && cachedCategories ? cachedCategories : series.categories,\n color: rawFillColor ?? rawLineColor ?? fillColor ?? lineStyle.color ?? series.color,\n dataPointStyles: pointStyles.length > 0 ? pointStyles : series.dataPointStyles,\n lineColor: resolvedLineColor,\n lineWidthPx: lineStyle.hidden ? undefined : lineStyle.widthPx ?? series.lineWidthPx,\n markerColor: rawFillColor\n ?? rawLineColor\n ?? resolveChartFillColor(markerShapeProperties, themePalette)\n ?? fillColor\n ?? lineStyle.color\n ?? undefined,\n markerLineColor: rawLineColor\n ?? rawFillColor\n ?? markerLineStyle.color\n ?? lineStyle.color\n ?? fillColor\n ?? undefined,\n markerSize: markerSize ?? series.markerSize,\n markerSymbol,\n smooth: readChartBooleanAttribute(seriesNode, \"smooth\") ?? series.smooth,\n invertIfNegative: invertIfNegative ?? series.invertIfNegative,\n shapeProperties: {\n ...series.shapeProperties,\n xmlExplosion: seriesExplosion ?? undefined,\n xmlFillColor: fillColor ?? undefined,\n xmlLineHidden: lineStyle.hidden ? true : undefined,\n xmlLineColor: lineStyle.color ?? undefined,\n xmlLineWidthPx: lineStyle.widthPx ?? undefined,\n xmlNegativeFillColor: invertNegativeStyle.color ?? undefined,\n xmlNegativeLineColor: invertNegativeStyle.lineColor ?? undefined\n },\n negativeColor: invertNegativeStyle.color ?? series.negativeColor,\n negativeLineColor: invertNegativeStyle.lineColor ?? series.negativeLineColor,\n values: !hasValueReference && cachedValues\n ? cachedValues.map((value) => (typeof value === \"number\" && Number.isFinite(value) ? value : null))\n : series.values\n };\n });\n}\n\nfunction applyChartStyleFromXml(\n chart: XlsxChart,\n chartPath: string | undefined,\n archive: Record<string, Uint8Array>,\n themePalette?: XlsxThemePalette | null\n) {\n const chartXml = readArchiveText(archive, chartPath);\n if (!chartXml) {\n return;\n }\n const relationships = chartPath ? readChartRelationships(archive, chartPath) : new Map<string, string>();\n const fallbackPointStylesBySeries = parseFallbackPointStylesFromChartXml(chartXml, themePalette);\n const fallbackSeriesStyles = parseFallbackSeriesStylesFromChartXml(chartXml, themePalette);\n const fallbackBubbleSizesBySeries = parseFallbackBubbleSizesFromChartXml(chartXml);\n const applyFallbackSeriesStyles = () => {\n if (fallbackBubbleSizesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackBubbleSizes = fallbackBubbleSizesBySeries[seriesIndex] ?? [];\n if (fallbackBubbleSizes.length === 0) {\n return series;\n }\n\n const currentNumericPointCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n const fallbackNumericPointCount = fallbackBubbleSizes.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n\n if (currentNumericPointCount >= fallbackNumericPointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackBubbleSizes\n };\n });\n }\n\n if (fallbackPointStylesBySeries.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackPointStyles = fallbackPointStylesBySeries[seriesIndex] ?? [];\n if (fallbackPointStyles.length === 0) {\n return series;\n }\n\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackPointStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n\n if (fallbackSeriesStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyle = fallbackSeriesStyles[seriesIndex];\n if (!fallbackStyle) {\n return series;\n }\n const fallbackColor = fallbackStyle.color ?? fallbackStyle.lineColor;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? fallbackStyle.lineColor ?? fallbackColor,\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? fallbackStyle.lineColor ?? fallbackColor ?? series.lineColor\n };\n });\n }\n };\n const applyRelationshipStyles = () => {\n chart.chartColorPalette = readChartColorPalette(archive, relationships.get(CHART_COLOR_STYLE_REL_TYPE), themePalette);\n const styleAppearance = readChartStyleAppearance(\n archive,\n relationships.get(CHART_STYLE_REL_TYPE),\n themePalette\n );\n chart.axisLabelColor = styleAppearance.axisLabelColor ?? chart.axisLabelColor;\n chart.axisLineColor = styleAppearance.axisLineColor ?? chart.axisLineColor;\n chart.chartAreaBorderColor = styleAppearance.chartAreaBorderColor ?? chart.chartAreaBorderColor;\n chart.chartAreaFillColor = styleAppearance.chartAreaFillColor ?? chart.chartAreaFillColor;\n chart.chartColorPaletteOffset = styleAppearance.paletteOffset ?? chart.chartColorPaletteOffset;\n chart.textColor = styleAppearance.textColor ?? chart.textColor;\n chart.titleColor = styleAppearance.titleColor ?? chart.titleColor;\n return styleAppearance;\n };\n const applyModernChartExStyles = () => {\n const modernPlotAreaNode = chartDocument?.documentElement\n ? getFirstLocalDescendant(chartDocument.documentElement, \"plotArea\")\n : null;\n if (!modernPlotAreaNode) {\n return;\n }\n\n const parseModernBinning = (seriesNode: Element) => {\n const layoutPrNode = getFirstLocalChild(seriesNode, \"layoutPr\");\n const binningNode = layoutPrNode ? getFirstLocalChild(layoutPrNode, \"binning\") : null;\n if (!binningNode) {\n return null;\n }\n const binning: Record<string, unknown> = {};\n for (const attribute of Array.from(binningNode.attributes)) {\n const rawValue = attribute.value;\n const numeric = Number(rawValue);\n binning[attribute.localName || attribute.name] = Number.isFinite(numeric) && rawValue.trim() !== \"\"\n ? numeric\n : rawValue;\n }\n return Object.keys(binning).length > 0 ? binning : {};\n };\n\n const plotAreaShapeProperties = getFirstLocalChild(modernPlotAreaNode, \"spPr\");\n if (plotAreaShapeProperties) {\n const plotAreaFillColor = resolveChartFillColor(plotAreaShapeProperties, themePalette);\n const plotAreaLineStyle = resolveChartLineStyle(plotAreaShapeProperties, themePalette);\n if (plotAreaFillColor) {\n chart.chartAreaFillColor = chart.chartAreaFillColor ?? plotAreaFillColor;\n }\n if (plotAreaLineStyle.color) {\n chart.chartAreaBorderColor = chart.chartAreaBorderColor ?? plotAreaLineStyle.color;\n }\n }\n\n const modernSeriesNodes = getLocalDescendants(modernPlotAreaNode, \"series\");\n if (modernSeriesNodes.length === 0) {\n return;\n }\n\n chart.series = chart.series.map((series, seriesIndex) => {\n const modernSeriesNode = modernSeriesNodes[seriesIndex] ?? null;\n if (!modernSeriesNode) {\n return series;\n }\n const valueColorsNode = getFirstLocalChild(modernSeriesNode, \"valueColors\");\n const valueColors = valueColorsNode\n ? Array.from(valueColorsNode.childNodes)\n .filter((node): node is Element => node.nodeType === Node.ELEMENT_NODE)\n .map((node) => resolveChartColorNode(findFirstChartColorElement(node) ?? node, themePalette))\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n : [];\n const nextRaw = valueColors.length > 0\n ? {\n ...(series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : {}),\n valueColors\n }\n : series.raw;\n const seriesShapeProperties = getFirstLocalChild(modernSeriesNode, \"spPr\");\n if (!seriesShapeProperties) {\n return nextRaw === series.raw\n ? series\n : {\n ...series,\n raw: nextRaw\n };\n }\n const fillColor = resolveChartFillColor(seriesShapeProperties, themePalette);\n const lineStyle = resolveChartLineStyle(seriesShapeProperties, themePalette);\n const fallbackColor = fillColor ?? lineStyle.color ?? undefined;\n return {\n ...series,\n color: series.color ?? fallbackColor,\n lineColor: series.lineColor ?? lineStyle.color ?? fillColor ?? fallbackColor,\n lineWidthPx: series.lineWidthPx ?? (typeof lineStyle.widthPx === \"number\" ? lineStyle.widthPx : undefined),\n markerColor: series.markerColor ?? fallbackColor ?? series.color,\n markerLineColor: series.markerLineColor ?? lineStyle.color ?? fallbackColor ?? series.lineColor,\n raw: nextRaw\n };\n });\n\n const seriesLayouts = modernSeriesNodes.map((node) => node.getAttribute(\"layoutId\") ?? node.getAttribute(\"layout\"));\n const clusteredColumnIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n if (clusteredColumnIndex >= 0) {\n const clusteredNode = modernSeriesNodes[clusteredColumnIndex] ?? null;\n const parsedBinning = clusteredNode ? parseModernBinning(clusteredNode) : null;\n if (parsedBinning) {\n const syntheticRawSeries: Record<string, unknown> = {\n layoutId: \"clusteredColumn\",\n layoutPr: {\n binning: parsedBinning\n }\n };\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const replaceColumnSeries = (series: XlsxChartSeries | null | undefined) => (\n series ? buildChartExHistogramSeries(series, syntheticRawSeries, hasParetoLine) : null\n );\n\n if (chart.typeGroups && chart.typeGroups.length > 0) {\n const nextTypeGroups = chart.typeGroups.map((group) => ({ ...group, series: [...group.series] }));\n const columnGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"ColumnClustered\");\n if (columnGroupIndex >= 0) {\n const originalColumnSeries = nextTypeGroups[columnGroupIndex]?.series[0] ?? null;\n const binnedColumnSeries = replaceColumnSeries(originalColumnSeries);\n if (binnedColumnSeries) {\n nextTypeGroups[columnGroupIndex].series = [binnedColumnSeries];\n const lineGroupIndex = nextTypeGroups.findIndex((group) => group.chartType === \"Line\");\n if (lineGroupIndex >= 0 && nextTypeGroups[lineGroupIndex]?.series[0]) {\n const originalLineSeries = nextTypeGroups[lineGroupIndex].series[0];\n const recomputedLine = buildChartExParetoLineSeries(\n binnedColumnSeries,\n {\n text: originalLineSeries.name,\n ...(originalLineSeries.raw && typeof originalLineSeries.raw === \"object\"\n ? originalLineSeries.raw as Record<string, unknown>\n : {})\n },\n 0\n );\n nextTypeGroups[lineGroupIndex].series = [\n {\n ...originalLineSeries,\n categories: recomputedLine.categories,\n categoriesRef: recomputedLine.categoriesRef,\n raw: recomputedLine.raw,\n values: recomputedLine.values\n }\n ];\n chart.series = [binnedColumnSeries, nextTypeGroups[lineGroupIndex].series[0]];\n } else {\n chart.series = [binnedColumnSeries];\n }\n chart.typeGroups = nextTypeGroups;\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n } else if (chart.series[0]) {\n const binnedSeries = replaceColumnSeries(chart.series[0]);\n if (binnedSeries) {\n chart.series = [binnedSeries];\n }\n }\n }\n }\n };\n\n const chartDocument = parseXml(chartXml);\n const chartNode = chartDocument ? getFirstLocalDescendant(chartDocument, \"chart\") : null;\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const styleIdNode = chartDocument?.documentElement ? getFirstLocalDescendant(chartDocument.documentElement, \"style\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n\n if (!chartNode || !chartTypeNode) {\n applyRelationshipStyles();\n const fallbackStyleId = readChartNumericAttribute(styleIdNode, \"style\");\n if (typeof fallbackStyleId === \"number\" && Number.isFinite(fallbackStyleId)) {\n chart.chartStyleId = fallbackStyleId;\n }\n applyModernChartExStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n const plotArea = plotAreaNode;\n if (!plotArea) {\n applyRelationshipStyles();\n applyFallbackSeriesStyles();\n applyBuiltinChartDefaults(chart, themePalette);\n return;\n }\n\n switch (chartTypeNode.localName) {\n case \"barChart\":\n case \"bar3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n const barDir = getFirstLocalChild(chartTypeNode, \"barDir\")?.getAttribute(\"val\");\n const isHorizontalBar = barDir === \"bar\";\n chart.is3d = chartTypeNode.localName === \"bar3DChart\" ? true : chart.is3d;\n if (grouping === \"percentStacked\") {\n chart.chartType = isHorizontalBar ? \"BarPercentStacked\" : \"ColumnPercentStacked\";\n } else if (grouping === \"stacked\") {\n chart.chartType = isHorizontalBar ? \"BarStacked\" : \"ColumnStacked\";\n } else {\n chart.chartType = isHorizontalBar ? \"BarClustered\" : \"ColumnClustered\";\n }\n break;\n }\n case \"areaChart\":\n case \"area3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"area3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"AreaStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"AreaPercentStacked\";\n } else {\n chart.chartType = \"Area\";\n }\n break;\n }\n case \"lineChart\":\n case \"line3DChart\": {\n const grouping = getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\");\n chart.is3d = chartTypeNode.localName === \"line3DChart\" ? true : chart.is3d;\n if (grouping === \"stacked\") {\n chart.chartType = \"LineStacked\";\n } else if (grouping === \"percentStacked\") {\n chart.chartType = \"LinePercentStacked\";\n } else {\n chart.chartType = \"Line\";\n }\n break;\n }\n case \"pieChart\":\n chart.chartType = \"Pie\";\n break;\n case \"pie3DChart\":\n chart.chartType = \"Pie3D\";\n chart.is3d = true;\n break;\n case \"doughnutChart\":\n chart.chartType = \"Doughnut\";\n break;\n case \"ofPieChart\":\n chart.chartType = \"BarOfPie\";\n break;\n case \"scatterChart\":\n chart.chartType = resolveScatterChartType(getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\"));\n break;\n case \"radarChart\":\n chart.chartType = \"Radar\";\n break;\n case \"surfaceChart\":\n chart.chartType = \"Surface\";\n chart.is3d = false;\n break;\n case \"surface3DChart\":\n chart.chartType = \"Surface\";\n chart.is3d = true;\n break;\n case \"stockChart\":\n chart.chartType = \"Stock\";\n break;\n case \"bubbleChart\":\n chart.chartType = \"Bubble\";\n break;\n default:\n break;\n }\n\n const legendNode = getFirstLocalChild(chartNode, \"legend\");\n const legendPosition = legendNode ? getFirstLocalChild(legendNode, \"legendPos\")?.getAttribute(\"val\") ?? undefined : undefined;\n const legendOverlay = legendNode ? getFirstLocalChild(legendNode, \"overlay\")?.getAttribute(\"val\") : undefined;\n\n chart.legend = legendNode ? {\n overlay: legendOverlay === \"1\",\n position: normalizeLegendPosition(legendPosition),\n raw: chart.legend?.raw\n } : chart.legend;\n const plotVisibleOnly = readChartBooleanAttribute(chartNode, \"plotVisOnly\");\n if (plotVisibleOnly !== undefined) {\n chart.plotVisibleOnly = plotVisibleOnly;\n }\n chart.displayBlanksAs = getFirstLocalChild(chartNode, \"dispBlanksAs\")?.getAttribute(\"val\") ?? chart.displayBlanksAs;\n const styleId = Number(styleIdNode?.getAttribute(\"val\") ?? Number.NaN);\n chart.chartStyleId = Number.isFinite(styleId) ? styleId : chart.chartStyleId;\n chart.firstSliceAngle = readChartNumericAttribute(chartTypeNode, \"firstSliceAng\") ?? chart.firstSliceAngle;\n chart.gapWidth = readChartNumericAttribute(chartTypeNode, \"gapWidth\") ?? chart.gapWidth;\n chart.overlap = readChartNumericAttribute(chartTypeNode, \"overlap\") ?? chart.overlap;\n chart.bubbleScale = readChartNumericAttribute(chartTypeNode, \"bubbleScale\") ?? chart.bubbleScale;\n chart.varyColors = readChartBooleanAttribute(chartTypeNode, \"varyColors\") ?? chart.varyColors;\n const bubble3dNode = getFirstLocalChild(chartTypeNode, \"bubble3D\");\n chart.bubble3d = bubble3dNode\n ? bubble3dNode.getAttribute(\"val\") !== \"0\"\n : chart.bubble3d;\n chart.holeSize = readChartNumericAttribute(chartTypeNode, \"holeSize\") ?? chart.holeSize;\n chart.radarStyle = getFirstLocalChild(chartTypeNode, \"radarStyle\")?.getAttribute(\"val\") ?? chart.radarStyle;\n chart.scatterStyle = getFirstLocalChild(chartTypeNode, \"scatterStyle\")?.getAttribute(\"val\") ?? chart.scatterStyle;\n chart.shape3d = getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? chart.shape3d;\n const wireframeNode = getFirstLocalChild(chartTypeNode, \"wireframe\");\n chart.wireframe = wireframeNode\n ? wireframeNode.getAttribute(\"val\") !== \"0\"\n : chart.wireframe;\n const chartTypeDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(chartTypeNode, \"dLbls\"));\n const firstSeriesNode = getLocalChildren(chartTypeNode, \"ser\")[0] ?? null;\n const seriesDataLabels = parseChartDataLabelsFromXml(getFirstLocalChild(firstSeriesNode, \"dLbls\"));\n chart.dataLabels = chartTypeDataLabels ?? seriesDataLabels ?? chart.dataLabels;\n const seriesSp3dNode = firstSeriesNode ? getFirstLocalDescendant(firstSeriesNode, \"sp3d\") : null;\n chart.surfaceMaterial = seriesSp3dNode?.getAttribute(\"prstMaterial\") ?? chart.surfaceMaterial;\n const bandFormatsNode = getLocalChildren(chartTypeNode, \"bandFmts\")[0] ?? null;\n const bandFormatNodes = bandFormatsNode ? getLocalChildren(bandFormatsNode, \"bandFmt\") : [];\n const bandFormatColors = bandFormatNodes\n .map((bandFormatNode) => {\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n return resolveChartFillColor(shapeProperties, themePalette) ?? undefined;\n })\n .filter((color): color is string => typeof color === \"string\" && color.length > 0);\n const bandFormatLineColors = bandFormatNodes\n .map((bandFormatNode) => {\n const shapeProperties = getFirstLocalChild(bandFormatNode, \"spPr\");\n return resolveChartLineStyle(shapeProperties, themePalette).color ?? undefined;\n })\n .filter((color): color is string => typeof color === \"string\" && color.length > 0);\n\n chart.raw = {\n ...(chart.raw ?? {}),\n bandFormatCount: bandFormatNodes.length > 0 ? bandFormatNodes.length : undefined,\n bandFormatColors: bandFormatColors.length > 0 ? bandFormatColors : undefined,\n bandFormatLineColors: bandFormatLineColors.length > 0 ? bandFormatLineColors : undefined,\n date1904: readChartBooleanAttribute(chartDocument?.documentElement ?? null, \"date1904\"),\n bubble3d: chart.bubble3d,\n grouping: getFirstLocalChild(chartTypeNode, \"grouping\")?.getAttribute(\"val\") ?? undefined,\n ofPieType: getFirstLocalChild(chartTypeNode, \"ofPieType\")?.getAttribute(\"val\") ?? undefined,\n shape: getFirstLocalChild(chartTypeNode, \"shape\")?.getAttribute(\"val\") ?? undefined,\n secondPieSize: readChartNumericAttribute(chartTypeNode, \"secondPieSize\"),\n scatterStyle: chart.scatterStyle,\n splitPos: readChartNumericAttribute(chartTypeNode, \"splitPos\"),\n splitType: getFirstLocalChild(chartTypeNode, \"splitType\")?.getAttribute(\"val\") ?? undefined,\n xmlChartType: chartTypeNode.localName\n };\n const view3dNode = getFirstLocalDescendant(chartNode, \"view3D\");\n if (view3dNode) {\n chart.view3d = {\n depthPercent: readChartNumericAttribute(view3dNode, \"depthPercent\"),\n perspective: readChartNumericAttribute(view3dNode, \"perspective\"),\n rAngAx: getFirstLocalChild(view3dNode, \"rAngAx\")?.getAttribute(\"val\") === \"1\",\n rotX: readChartNumericAttribute(view3dNode, \"rotX\"),\n rotY: readChartNumericAttribute(view3dNode, \"rotY\")\n };\n }\n chart.floor = readChartWallFromXml(getFirstLocalChild(chartNode, \"floor\"), themePalette) ?? chart.floor;\n chart.sideWall = readChartWallFromXml(getFirstLocalChild(chartNode, \"sideWall\"), themePalette) ?? chart.sideWall;\n chart.backWall = readChartWallFromXml(getFirstLocalChild(chartNode, \"backWall\"), themePalette) ?? chart.backWall;\n\n const styleAppearance = applyRelationshipStyles();\n const chartTextTypeface = readChartTextTypeface(getFirstLocalChild(chartNode, \"txPr\"), themePalette);\n const titleTypeface = readChartTextTypeface(getFirstLocalDescendant(chartNode, \"title\"), themePalette);\n chart.fontFamily = chartTextTypeface ?? chart.fontFamily;\n chart.titleFontFamily = titleTypeface ?? chart.titleFontFamily ?? chart.fontFamily;\n\n const chartAreaShapeProperties = chartDocument?.documentElement\n ? getFirstLocalChild(chartDocument.documentElement, \"spPr\")\n : null;\n const plotAreaShapeProperties = getFirstLocalChild(plotArea, \"spPr\");\n const chartAreaNoFill = chartAreaShapeProperties ? getFirstLocalChild(chartAreaShapeProperties, \"noFill\") != null : false;\n const plotAreaNoFill = plotAreaShapeProperties ? getFirstLocalChild(plotAreaShapeProperties, \"noFill\") != null : false;\n chart.raw = {\n ...(chart.raw ?? {}),\n chartAreaNoFill: styleAppearance.chartAreaNoFill === true || chartAreaNoFill,\n plotAreaNoFill\n };\n if (chartAreaShapeProperties) {\n const chartAreaFillColor = resolveChartFillColor(chartAreaShapeProperties, themePalette);\n if (chartAreaFillColor) {\n chart.chartAreaFillColor = chartAreaFillColor;\n } else if (getFirstLocalChild(chartAreaShapeProperties, \"noFill\")) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const chartAreaLineStyle = resolveChartLineStyle(chartAreaShapeProperties, themePalette);\n if (chartAreaLineStyle.hidden) {\n chart.chartAreaBorderColor = \"transparent\";\n } else if (chartAreaLineStyle.color) {\n chart.chartAreaBorderColor = chartAreaLineStyle.color;\n }\n }\n if (!chart.chartAreaFillColor && (styleAppearance.chartAreaNoFill === true || plotAreaNoFill)) {\n chart.chartAreaFillColor = \"transparent\";\n }\n const categoryAxisNodes = [\n ...getLocalChildren(plotArea, \"catAx\"),\n ...getLocalChildren(plotArea, \"dateAx\")\n ];\n const valueAxisNodes = getLocalChildren(plotArea, \"valAx\");\n const seriesAxisNode = getLocalChildren(plotArea, \"serAx\")[0] ?? null;\n const isScatterLikeChart = (\n chart.chartType === \"Scatter\"\n || chart.chartType === \"ScatterLines\"\n || chart.chartType === \"ScatterSmooth\"\n || chart.chartType === \"Bubble\"\n );\n let categoryAxisNode = categoryAxisNodes[0] ?? null;\n let valueAxisNode = valueAxisNodes[0] ?? null;\n if (!categoryAxisNode && isScatterLikeChart && valueAxisNodes.length >= 2) {\n categoryAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"b\" || position === \"t\";\n }) ?? valueAxisNodes[0];\n valueAxisNode = valueAxisNodes.find((axisNode) => {\n const position = getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\");\n return position === \"l\" || position === \"r\";\n }) ?? valueAxisNodes[1] ?? valueAxisNodes[0];\n }\n chart.categoryAxis = mergeChartAxis(chart.categoryAxis, readChartAxisFromXml(categoryAxisNode));\n chart.valueAxis = mergeChartAxis(chart.valueAxis, readChartAxisFromXml(valueAxisNode));\n chart.seriesAxis = mergeChartAxis(chart.seriesAxis, readChartAxisFromXml(seriesAxisNode));\n chart.axes = chart.axes.length > 0\n ? chart.axes.map((axis, index) => (\n index === 0 && categoryAxisNode\n ? { ...axis, ...readChartAxisFromXml(categoryAxisNode) }\n : index === 1 && valueAxisNode\n ? { ...axis, ...readChartAxisFromXml(valueAxisNode) }\n : axis\n ))\n : chart.axes;\n if (seriesAxisNode) {\n const seriesAxis = readChartAxisFromXml(seriesAxisNode);\n if (seriesAxis && !chart.axes.some((axis) => axis.id != null && axis.id === seriesAxis.id)) {\n chart.axes = [...chart.axes, seriesAxis as XlsxChartAxis];\n }\n }\n\n applyChartSeriesStyleFromXml(chart, chartTypeNode, themePalette);\n applyFallbackSeriesStyles();\n if (chart.chartType === \"Bubble\") {\n const archiveFallbackBubbleSizes = resolveArchiveFallbackBubbleSizes(archive, chart.title);\n if (archiveFallbackBubbleSizes.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 1) {\n return series;\n }\n\n const numericBubbleCount = (series.bubbleSizes ?? []).filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n if (numericBubbleCount >= pointCount) {\n return series;\n }\n\n const fallbackCandidate = archiveFallbackBubbleSizes[seriesIndex] ?? archiveFallbackBubbleSizes[0] ?? [];\n const fallbackNumericCount = fallbackCandidate.filter(\n (value): value is number => typeof value === \"number\" && Number.isFinite(value)\n ).length;\n if (fallbackNumericCount < pointCount) {\n return series;\n }\n\n return {\n ...series,\n bubbleSizes: fallbackCandidate\n };\n });\n }\n }\n if (chart.chartType === \"Pie\" || chart.chartType === \"Pie3D\" || chart.chartType === \"PieExploded\" || chart.chartType === \"Doughnut\" || chart.chartType === \"BarOfPie\") {\n const needsPointColorFallback = chart.series.some((series) => {\n const pointCount = Math.max(series.values.length, series.categories.length);\n if (pointCount <= 0) {\n return false;\n }\n const coloredPointCount = (series.dataPointStyles ?? []).filter(\n (style) => typeof style.color === \"string\" && style.color.length > 0\n ).length;\n return coloredPointCount === 0;\n });\n if (needsPointColorFallback) {\n const archiveFallbackPointStyles = resolveArchiveFallbackPointStyles(\n archive,\n chart.title,\n chartTypeNode.localName,\n themePalette\n );\n if (archiveFallbackPointStyles.length > 0) {\n chart.series = chart.series.map((series, seriesIndex) => {\n const fallbackStyles = archiveFallbackPointStyles[seriesIndex] ?? archiveFallbackPointStyles[0] ?? [];\n if (fallbackStyles.length === 0) {\n return series;\n }\n const existingByIndex = new Map((series.dataPointStyles ?? []).map((entry) => [entry.index, entry]));\n for (const fallbackStyle of fallbackStyles) {\n const existing = existingByIndex.get(fallbackStyle.index);\n existingByIndex.set(fallbackStyle.index, {\n color: existing?.color ?? fallbackStyle.color,\n explosion: existing?.explosion ?? fallbackStyle.explosion,\n index: fallbackStyle.index,\n lineColor: existing?.lineColor ?? fallbackStyle.lineColor\n });\n }\n return {\n ...series,\n dataPointStyles: Array.from(existingByIndex.values()).sort((left, right) => left.index - right.index)\n };\n });\n }\n }\n }\n applyBuiltinChartDefaults(chart, themePalette);\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const index = normalized.lastIndexOf(\"/\");\n return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction resolveRelationshipPath(basePath: string, target: string) {\n if (!target) {\n return \"\";\n }\n\n const normalizedTarget = target.replace(/\\\\/g, \"/\");\n if (normalizedTarget.startsWith(\"/\")) {\n return normalizeArchivePath(normalizedTarget);\n }\n const normalizedBasePath = normalizeArchivePath(basePath);\n let baseDirectory = dirname(normalizedBasePath);\n if (normalizedBasePath.endsWith(\".rels\")) {\n const relsMarker = \"/_rels/\";\n const relsMarkerIndex = normalizedBasePath.lastIndexOf(relsMarker);\n if (relsMarkerIndex >= 0) {\n const ownerPrefix = normalizedBasePath.slice(0, relsMarkerIndex);\n const relFileName = normalizedBasePath.slice(relsMarkerIndex + relsMarker.length);\n const ownerFileName = relFileName.endsWith(\".rels\")\n ? relFileName.slice(0, -\".rels\".length)\n : relFileName;\n baseDirectory = dirname(`${ownerPrefix}/${ownerFileName}`);\n }\n }\n\n const segments = [...baseDirectory.split(\"/\").filter(Boolean), ...normalizedTarget.split(\"/\").filter(Boolean)];\n const resolved: string[] = [];\n for (const segment of segments) {\n if (segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n resolved.pop();\n continue;\n }\n resolved.push(segment);\n }\n\n return resolved.join(\"/\");\n}\n\nfunction readArchiveText(archive: Record<string, Uint8Array>, path: string | null | undefined) {\n if (!path) {\n return null;\n }\n\n const entry = archive[normalizeArchivePath(path)];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseXml(xml: string) {\n if (typeof DOMParser === \"undefined\") {\n return null;\n }\n\n try {\n return new DOMParser().parseFromString(xml, \"application/xml\");\n } catch {\n return null;\n }\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction getLocalChildren(parent: ParentNode, localName: string) {\n return Array.from(parent.childNodes).filter(\n (node): node is Element => node.nodeType === Node.ELEMENT_NODE && (node as Element).localName === localName\n );\n}\n\nfunction getLocalDescendants(parent: ParentNode, localName: string) {\n return Array.from((parent as Element | Document).getElementsByTagName(\"*\")).filter(\n (node) => node.localName === localName\n );\n}\n\nfunction getFirstLocalChild(parent: ParentNode, localName: string) {\n return getLocalChildren(parent, localName)[0] ?? null;\n}\n\nfunction getFirstLocalDescendant(parent: ParentNode, localName: string) {\n return getLocalDescendants(parent, localName)[0] ?? null;\n}\n\nfunction ensureChild(parent: Element, localName: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const existing = getFirstLocalChild(parent, localName);\n if (existing) {\n return existing;\n }\n\n const document = parent.ownerDocument;\n const node = document.createElementNS(namespace, `${prefix}:${localName}`);\n parent.appendChild(node);\n return node;\n}\n\nfunction setLeafValue(parent: Element, localName: string, value: string, namespace = parent.namespaceURI ?? CHART_NS, prefix = \"c\") {\n const node = ensureChild(parent, localName, namespace, prefix);\n node.textContent = value;\n return node;\n}\n\nfunction setBooleanValue(parent: Element, localName: string, value: boolean) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", value ? \"1\" : \"0\");\n return node;\n}\n\nfunction setNumericValue(parent: Element, localName: string, value: number) {\n const node = ensureChild(parent, localName);\n node.setAttribute(\"val\", String(Math.round(value)));\n return node;\n}\n\nfunction unquoteSheetName(value: string) {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction splitSheetReference(reference: string) {\n let bangIndex = -1;\n let quoted = false;\n for (let index = 0; index < reference.length; index += 1) {\n const char = reference[index];\n if (char === \"'\") {\n quoted = !quoted;\n } else if (char === \"!\" && !quoted) {\n bangIndex = index;\n break;\n }\n }\n\n if (bangIndex < 0) {\n return null;\n }\n\n return {\n range: reference.slice(bangIndex + 1),\n sheetName: unquoteSheetName(reference.slice(0, bangIndex))\n };\n}\n\nfunction parseA1Cell(reference: string) {\n const match = /^\\$?([A-Z]+)\\$?(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n let col = 0;\n for (const char of match[1].toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(match[2]) - 1\n };\n}\n\nfunction parseA1Range(reference: string) {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1Cell(startRef ?? \"\");\n const end = parseA1Cell(endRef ?? \"\");\n if (!start || !end) {\n return null;\n }\n\n return {\n end: {\n col: Math.max(start.col, end.col),\n row: Math.max(start.row, end.row)\n },\n start: {\n col: Math.min(start.col, end.col),\n row: Math.min(start.row, end.row)\n }\n };\n}\n\nfunction formatA1Column(col: number) {\n let current = col + 1;\n let label = \"\";\n while (current > 0) {\n const remainder = (current - 1) % 26;\n label = String.fromCharCode(65 + remainder) + label;\n current = Math.floor((current - 1) / 26);\n }\n return label;\n}\n\nfunction buildA1RangeFormula(sheetName: string, start: { col: number; row: number }, end: { col: number; row: number }) {\n const escapedSheetName = sheetName.replace(/'/g, \"''\");\n return `'${escapedSheetName}'!$${formatA1Column(start.col)}$${start.row + 1}:$${formatA1Column(end.col)}$${end.row + 1}`;\n}\n\nfunction resolveReferenceSheet(workbook: Workbook, fallbackSheetIndex: number, formula?: string | null) {\n if (!formula) {\n return {\n range: null,\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n const trimmedFormula = formula.trim();\n if (trimmedFormula.length > 0 && !trimmedFormula.includes(\"!\")) {\n try {\n const namedRange = workbook.getNamedRange(trimmedFormula);\n if (typeof namedRange === \"string\" && namedRange.length > 0 && namedRange !== trimmedFormula) {\n return resolveReferenceSheet(workbook, fallbackSheetIndex, namedRange);\n }\n } catch {\n // Fall back to direct A1 parsing when the workbook has no matching name.\n }\n }\n\n const split = splitSheetReference(trimmedFormula);\n if (!split) {\n return {\n range: parseA1Range(trimmedFormula),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n\n try {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheetByName(split.sheetName),\n sheetName: split.sheetName\n };\n } catch {\n return {\n range: parseA1Range(split.range),\n sheet: workbook.getSheet(fallbackSheetIndex),\n sheetName: workbook.getSheet(fallbackSheetIndex)?.name ?? \"\"\n };\n }\n}\n\nfunction resolveChartReferenceLabel(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n fallbackLabel: string\n) {\n if (!reference?.formula) {\n return fallbackLabel;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return fallbackLabel;\n }\n\n const { start } = resolved.range;\n if (start.row > 0) {\n const headerDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row - 1, start.col)\n : null\n );\n if (headerDisplay.length > 0) {\n return headerDisplay;\n }\n }\n\n const firstDisplay = cellValueToDisplay(\n typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(start.row, start.col)\n : null\n );\n return firstDisplay.length > 0 ? firstDisplay : fallbackLabel;\n}\n\nfunction resolveReferenceRowPaths(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined\n) {\n if (!reference?.formula) {\n return [] as string[][];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return [];\n }\n\n const rows: string[][] = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n const parts: string[] = [];\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n const label = display.length > 0 ? display : (numeric != null ? String(numeric) : \"\");\n if (label.length > 0) {\n parts.push(label);\n }\n }\n rows.push(parts);\n }\n return rows;\n}\n\nfunction normalizeChartExLegend(raw: unknown): XlsxChartLegend | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const legend = raw as Record<string, unknown>;\n const position = typeof legend.pos === \"string\"\n ? normalizeLegendPosition(String(legend.pos))\n : undefined;\n return {\n overlay: typeof legend.overlay === \"boolean\" ? legend.overlay : undefined,\n position,\n raw: legend\n };\n}\n\nfunction humanizeChartExLayoutLabel(layout: string | undefined) {\n if (!layout) {\n return undefined;\n }\n return layout\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[-_]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (match) => match.toUpperCase());\n}\n\nfunction normalizeChartExAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const axis = raw as Record<string, unknown>;\n const scaling = axis.scaling && typeof axis.scaling === \"object\"\n ? axis.scaling as Record<string, unknown>\n : null;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n delete: typeof axis.hidden === \"boolean\" ? axis.hidden : undefined,\n id: typeof axis.id === \"number\" && Number.isFinite(axis.id) ? axis.id : undefined,\n crossId: typeof axis.crossId === \"number\" && Number.isFinite(axis.crossId) ? axis.crossId : undefined,\n majorGridlines: axis.majorGridlines != null ? true : undefined,\n majorUnit: typeof scaling?.majorUnit === \"number\" ? scaling.majorUnit : undefined,\n max: typeof scaling?.max === \"number\" ? scaling.max : undefined,\n min: typeof scaling?.min === \"number\" ? scaling.min : undefined,\n minorGridlines: axis.minorGridlines != null ? true : undefined,\n minorUnit: typeof scaling?.minorUnit === \"number\" ? scaling.minorUnit : undefined,\n numberFormat: numberFormat\n ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n }\n : undefined,\n raw: axis,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction resolveChartExLayoutChartType(layout: string | undefined) {\n switch (layout) {\n case \"boxWhisker\":\n return \"BoxWhisker\";\n case \"clusteredColumn\":\n return \"ColumnClustered\";\n case \"funnel\":\n return \"Funnel\";\n case \"paretoLine\":\n return \"Line\";\n case \"regionMap\":\n return \"RegionMap\";\n case \"sunburst\":\n return \"Sunburst\";\n case \"treemap\":\n return \"Treemap\";\n case \"waterfall\":\n return \"Waterfall\";\n default:\n return layout ? `Unsupported(cx:${layout})` : \"ColumnClustered\";\n }\n}\n\nfunction resolveChartExSeriesLayout(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n return typeof record.layout === \"string\"\n ? record.layout\n : typeof record.layoutId === \"string\"\n ? record.layoutId\n : undefined;\n}\n\nfunction resolveChartExSeriesAxisIds(raw: unknown) {\n if (!raw || typeof raw !== \"object\") {\n return [];\n }\n const record = raw as Record<string, unknown>;\n if (Array.isArray(record.axisIds)) {\n return record.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n }\n if (Array.isArray(record.axisId)) {\n return record.axisId.flatMap((value) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return [value];\n }\n if (value && typeof value === \"object\" && typeof (value as { val?: unknown }).val === \"number\") {\n return [(value as { val: number }).val];\n }\n return [];\n });\n }\n if (typeof record.axisId === \"number\" && Number.isFinite(record.axisId)) {\n return [record.axisId];\n }\n return [];\n}\n\nfunction niceHistogramStep(value: number) {\n if (!Number.isFinite(value) || value <= 0) {\n return 1;\n }\n const exponent = Math.floor(Math.log10(value));\n const scale = 10 ** exponent;\n const normalized = value / scale;\n if (normalized <= 1) {\n return scale;\n }\n if (normalized <= 2) {\n return scale * 2;\n }\n if (normalized <= 5) {\n return scale * 5;\n }\n return scale * 10;\n}\n\nfunction formatHistogramBinLabel(lower: number, upper: number, index: number, closedRight: boolean) {\n const leftBracket = closedRight\n ? (index === 0 ? \"[\" : \"(\")\n : \"[\";\n const rightBracket = closedRight ? \"]\" : \")\";\n return `${leftBracket}${Number(lower.toFixed(6))},${Number(upper.toFixed(6))}${rightBracket}`;\n}\n\ntype ChartExHistogramBin = {\n count: number;\n label: string;\n lower: number;\n upper: number;\n};\n\nfunction buildChartExHistogramBins(values: number[], rawSeries: unknown, sortByFrequency: boolean) {\n if (values.length === 0) {\n return [] as ChartExHistogramBin[];\n }\n\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const layoutProperties = rawRecord?.layoutPr && typeof rawRecord.layoutPr === \"object\"\n ? rawRecord.layoutPr as Record<string, unknown>\n : null;\n const rawBinning = layoutProperties?.binning && typeof layoutProperties.binning === \"object\"\n ? layoutProperties.binning as Record<string, unknown>\n : null;\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const explicitWidth = typeof rawBinning?.binWidth === \"number\" && Number.isFinite(rawBinning.binWidth) && rawBinning.binWidth > 0\n ? rawBinning.binWidth\n : typeof rawBinning?.width === \"number\" && Number.isFinite(rawBinning.width) && rawBinning.width > 0\n ? rawBinning.width\n : undefined;\n const explicitCount = typeof rawBinning?.binCount === \"number\" && Number.isFinite(rawBinning.binCount) && rawBinning.binCount > 0\n ? rawBinning.binCount\n : typeof rawBinning?.count === \"number\" && Number.isFinite(rawBinning.count) && rawBinning.count > 0\n ? rawBinning.count\n : undefined;\n const closedRight = rawBinning?.intervalClosed === \"r\" || rawBinning?.intervalClosed === \"right\";\n const mean = values.reduce((sum, value) => sum + value, 0) / values.length;\n const variance = values.reduce((sum, value) => sum + ((value - mean) ** 2), 0) / Math.max(1, values.length);\n const standardDeviation = Math.sqrt(Math.max(0, variance));\n const allIntegers = values.every((value) => Math.abs(value - Math.round(value)) < 1e-9);\n const scottWidth = standardDeviation > 0\n ? (3.49 * standardDeviation) / Math.cbrt(values.length)\n : undefined;\n const fallbackWidth = explicitCount != null\n ? (maxValue - minValue) / Math.max(1, explicitCount)\n : scottWidth ?? ((maxValue - minValue) / Math.max(1, Math.ceil(Math.log2(values.length) + 1)));\n const roughWidth = explicitWidth\n ?? (allIntegers\n ? Math.max(1, Math.ceil(Math.max(fallbackWidth, 1e-6)))\n : niceHistogramStep(Math.max(fallbackWidth, 1e-6)));\n const binWidth = Math.max(roughWidth, 1e-6);\n const start = explicitWidth != null || explicitCount != null\n ? Math.floor(minValue / binWidth) * binWidth\n : minValue;\n const end = Math.max(start + binWidth, start + Math.ceil((maxValue - start) / binWidth) * binWidth);\n const binCount = Math.max(1, Math.ceil((end - start) / binWidth));\n const bins = Array.from({ length: binCount }, (_, index) => {\n const lower = start + binWidth * index;\n const upper = lower + binWidth;\n return {\n count: 0,\n label: formatHistogramBinLabel(lower, upper, index, closedRight),\n lower,\n upper\n } satisfies ChartExHistogramBin;\n });\n\n values.forEach((value) => {\n if (!Number.isFinite(value)) {\n return;\n }\n const offset = (value - start) / binWidth;\n let binIndex = Math.floor(offset);\n if (closedRight && Math.abs(offset - Math.round(offset)) < 1e-9 && value > start) {\n binIndex -= 1;\n }\n if (value >= end) {\n binIndex = bins.length - 1;\n }\n if (value <= start) {\n binIndex = 0;\n }\n const target = bins[Math.max(0, Math.min(bins.length - 1, binIndex))];\n if (target) {\n target.count += 1;\n }\n });\n\n if (sortByFrequency) {\n bins.sort((left, right) => (\n right.count - left.count\n || left.lower - right.lower\n ));\n }\n return bins;\n}\n\nfunction buildChartExHistogramSeries(\n series: XlsxChartSeries,\n rawSeries: unknown,\n sortByFrequency: boolean\n) {\n const layout = resolveChartExSeriesLayout(rawSeries);\n const rawRecord = rawSeries && typeof rawSeries === \"object\" ? rawSeries as Record<string, unknown> : null;\n const hasBinning = Boolean(\n layout === \"clusteredColumn\"\n && rawRecord?.layoutPr\n && typeof rawRecord.layoutPr === \"object\"\n && (rawRecord.layoutPr as Record<string, unknown>).binning != null\n );\n if (!hasBinning) {\n return series;\n }\n\n const numericValues = series.values.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n if (numericValues.length === 0) {\n return series;\n }\n\n const bins = buildChartExHistogramBins(numericValues, rawSeries, sortByFrequency);\n if (bins.length === 0) {\n return series;\n }\n\n return {\n ...series,\n categories: bins.map((bin) => bin.label),\n categoriesRef: null,\n raw: {\n ...series.raw,\n chartExHistogramBins: bins,\n chartExSourceValues: numericValues\n },\n values: bins.map((bin) => bin.count)\n };\n}\n\nfunction buildChartExParetoLineSeries(series: XlsxChartSeries, sourceRaw: unknown, index: number) {\n const counts = series.values.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : 0\n ));\n const total = counts.reduce((sum, value) => sum + value, 0);\n let running = 0;\n const cumulative = counts.map((value) => {\n running += value;\n return total > 0 ? (running / total) * 100 : 0;\n });\n return {\n ...series,\n color: undefined,\n lineColor: undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: 7,\n markerSymbol: \"circle\",\n name: typeof (sourceRaw as { text?: unknown } | null)?.text === \"string\"\n ? (sourceRaw as { text: string }).text\n : \"Pareto\",\n raw: {\n ...(series.raw ?? {}),\n chartExLayout: \"paretoLine\",\n source: sourceRaw && typeof sourceRaw === \"object\" ? sourceRaw as Record<string, unknown> : undefined\n },\n values: cumulative\n };\n}\n\nfunction resolveChartExTextFormula(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.formula === \"string\" && record.formula.length > 0) {\n return record.formula;\n }\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n if (typeof record.value === \"string\" && record.value.length > 0) {\n return record.value;\n }\n return undefined;\n}\n\nfunction resolveChartExTitleText(raw: unknown) {\n if (typeof raw === \"string\" && raw.length > 0) {\n return raw;\n }\n if (!raw || typeof raw !== \"object\") {\n return undefined;\n }\n const record = raw as Record<string, unknown>;\n if (typeof record.text === \"string\" && record.text.length > 0) {\n return record.text;\n }\n const nestedText = record.text && typeof record.text === \"object\"\n ? resolveChartExTextFormula(record.text)\n : undefined;\n if (nestedText) {\n return nestedText;\n }\n return typeof record.value === \"string\" && record.value.length > 0 ? record.value : undefined;\n}\n\nfunction resolveChartExFallbackCategoryReference(\n workbook: Workbook,\n fallbackSheetIndex: number,\n valueFormula: string | undefined\n) {\n if (!valueFormula) {\n return null;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, valueFormula);\n if (!resolved.sheet || !resolved.range || resolved.range.start.col <= 0) {\n return null;\n }\n\n return normalizeChartReference({\n formula: buildA1RangeFormula(\n resolved.sheetName,\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.start.row\n },\n {\n col: resolved.range.start.col - 1,\n row: resolved.range.end.row\n }\n )\n });\n}\n\nfunction normalizeChartExSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n dataById: Map<number, Record<string, unknown>>,\n index: number,\n chartType?: XlsxChart[\"chartType\"]\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const dataId = typeof series.dataId === \"number\" ? series.dataId : null;\n const dataEntry = dataId != null ? dataById.get(dataId) ?? null : null;\n const dimensions = Array.isArray(dataEntry?.dimensions)\n ? dataEntry.dimensions.filter((value): value is Record<string, unknown> => Boolean(value && typeof value === \"object\"))\n : [];\n const categoryDimension = dimensions.find((dimension) => dimension.dimType === \"cat\")\n ?? dimensions.find((dimension) => dimension.dimType === \"name\")\n ?? null;\n const valueDimension = dimensions.find((dimension) => (\n dimension.dimType === \"val\"\n || dimension.dimType === \"y\"\n || dimension.dimType === \"colorVal\"\n || dimension.dimType === \"size\"\n ))\n ?? dimensions.find((dimension) => dimension !== categoryDimension)\n ?? categoryDimension;\n const categoryDimensionFormula = typeof categoryDimension?.formula === \"string\" ? categoryDimension.formula : undefined;\n const valueDimensionFormula = typeof valueDimension?.formula === \"string\" ? valueDimension.formula : undefined;\n const fallbackCategoryRef = (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && !categoryDimension\n && typeof valueDimensionFormula === \"string\"\n )\n ? resolveChartExFallbackCategoryReference(workbook, workbookSheetIndex, valueDimensionFormula)\n : null;\n const categoriesRef = categoryDimension\n ? normalizeChartReference({\n formula: categoryDimensionFormula\n })\n : fallbackCategoryRef;\n const valuesRef = valueDimension\n ? normalizeChartReference({\n formula: valueDimensionFormula\n })\n : null;\n const resolvedValueCells = resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\");\n const values = resolvedValueCells.map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n ));\n const colorStrings = chartType === \"RegionMap\" && valueDimension?.dimType === \"colorStr\"\n ? resolvedValueCells.map((value) => {\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n return null;\n })\n : [];\n const categories = resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\");\n const hierarchyCategories = (\n chartType === \"Sunburst\" || chartType === \"Treemap\"\n )\n ? resolveReferenceRowPaths(workbook, workbookSheetIndex, categoriesRef)\n : [];\n const seriesTextFormula = resolveChartExTextFormula(series.text);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n\n return {\n bubbleSizeRef: null,\n bubbleSizes: [],\n categories,\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n formatIdx: typeof series.formatIdx === \"number\" ? series.formatIdx : undefined,\n hidden: typeof series.hidden === \"boolean\" ? series.hidden : undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: undefined,\n markerColor: rawFillColor ?? undefined,\n markerLineColor: rawLineColor ?? rawFillColor ?? undefined,\n markerSize: undefined,\n markerSymbol: undefined,\n name: typeof series.text === \"string\"\n ? series.text\n : seriesTextFormula\n ? resolveSeriesName(workbook, workbookSheetIndex, seriesTextFormula)\n : resolveChartReferenceLabel(workbook, workbookSheetIndex, valuesRef, `Series ${index + 1}`),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: {\n ...series,\n chartExColorStrings: colorStrings,\n chartExHierarchyCategories: hierarchyCategories,\n data: dataEntry,\n dimType: typeof valueDimension?.dimType === \"string\" ? valueDimension.dimType : undefined\n },\n shapeProperties,\n smooth: undefined,\n values,\n valuesRef\n };\n}\n\nfunction collapseChartExPointSeries(chartType: XlsxChart[\"chartType\"], series: XlsxChartSeries[]) {\n if (chartType !== \"Funnel\" && chartType !== \"Waterfall\") {\n if (\n (chartType === \"Sunburst\" || chartType === \"Treemap\")\n && series.length > 1\n && series.every((entry) => {\n const raw = entry.raw && typeof entry.raw === \"object\" ? entry.raw as Record<string, unknown> : null;\n return raw?.dimType === \"size\";\n })\n ) {\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n return [\n {\n ...primarySeries,\n dataPoints: [],\n hidden: false\n }\n ];\n }\n return series;\n }\n\n const primarySeries = series.find((entry) => entry.hidden !== true) ?? series[0] ?? null;\n if (!primarySeries) {\n return series;\n }\n\n return [\n {\n ...primarySeries,\n categories: [],\n categoriesRef: null,\n dataPoints: [],\n hidden: false\n }\n ];\n}\n\nfunction normalizeChartExChart(\n workbook: Workbook,\n workbookSheetIndex: number,\n visibleSheetIndex: number,\n raw: unknown,\n index: number,\n themePalette?: XlsxThemePalette | null\n): XlsxChart {\n const chart = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const plotArea = chart.plotArea && typeof chart.plotArea === \"object\"\n ? chart.plotArea as Record<string, unknown>\n : {};\n const rawSeries = Array.isArray(plotArea.series) ? plotArea.series : [];\n const seriesLayouts = rawSeries.map(resolveChartExSeriesLayout);\n const dataEntries = Array.isArray(chart.data) ? chart.data : [];\n const dataById = new Map<number, Record<string, unknown>>();\n dataEntries.forEach((entry) => {\n if (!entry || typeof entry !== \"object\") {\n return;\n }\n const record = entry as Record<string, unknown>;\n if (typeof record.id === \"number\") {\n dataById.set(record.id, record);\n }\n });\n const axes = Array.isArray(plotArea.axes)\n ? plotArea.axes.map(normalizeChartExAxis).filter((value): value is XlsxChartAxis => Boolean(value))\n : [];\n const primaryLayout = typeof chart.layout === \"string\"\n ? chart.layout\n : seriesLayouts.find((value): value is string => typeof value === \"string\" && value.length > 0);\n const fallbackTitle = humanizeChartExLayoutLabel(primaryLayout);\n const chartTitle = resolveChartExTitleText(chart.title) ?? (chart.title != null ? \"Chart Title\" : fallbackTitle);\n const chartType = resolveChartExLayoutChartType(primaryLayout);\n const normalizedSeries = rawSeries.map((entry, seriesIndex) => (\n normalizeChartExSeries(workbook, workbookSheetIndex, `chart-ex-${workbookSheetIndex}-${index}`, entry, dataById, seriesIndex, chartType)\n ));\n const clusteredColumnSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"clusteredColumn\");\n const hasParetoLine = seriesLayouts.includes(\"paretoLine\");\n const clusteredColumnAxisIds = clusteredColumnSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[clusteredColumnSeriesIndex])\n : [];\n const paretoLineSeriesIndex = seriesLayouts.findIndex((layout) => layout === \"paretoLine\");\n const paretoLineAxisIds = paretoLineSeriesIndex >= 0\n ? resolveChartExSeriesAxisIds(rawSeries[paretoLineSeriesIndex])\n : [];\n const primaryHistogramSeries = clusteredColumnSeriesIndex >= 0\n ? buildChartExHistogramSeries(normalizedSeries[clusteredColumnSeriesIndex] ?? normalizedSeries[0], rawSeries[clusteredColumnSeriesIndex], hasParetoLine)\n : null;\n const synthesizedParetoSeries = (\n hasParetoLine\n && primaryHistogramSeries\n && primaryHistogramSeries.values.length > 0\n )\n ? buildChartExParetoLineSeries(primaryHistogramSeries, rawSeries[paretoLineSeriesIndex], paretoLineSeriesIndex)\n : null;\n const resolvedSeries = synthesizedParetoSeries\n ? [primaryHistogramSeries!, synthesizedParetoSeries]\n : primaryHistogramSeries\n ? [\n primaryHistogramSeries,\n ...normalizedSeries.filter((_, seriesIndex) => seriesIndex !== clusteredColumnSeriesIndex)\n ]\n : collapseChartExPointSeries(chartType, normalizedSeries);\n const resolvedChartType = primaryHistogramSeries ? \"ColumnClustered\" : chartType;\n const resolvedGapWidth = primaryHistogramSeries ? 0 : undefined;\n const typeGroups = synthesizedParetoSeries\n ? [\n {\n axisIds: clusteredColumnAxisIds,\n chartType: \"ColumnClustered\",\n gapWidth: 0,\n raw: {\n gapWidth: 0,\n layout: \"clusteredColumn\"\n },\n series: [primaryHistogramSeries!]\n },\n {\n axisIds: paretoLineAxisIds,\n chartType: \"Line\",\n raw: {\n layout: \"paretoLine\"\n },\n series: [synthesizedParetoSeries]\n }\n ]\n : [];\n const normalizedChart: XlsxChart = {\n anchor: normalizeChartAnchor(chart.anchor),\n autoTitleDeleted: undefined,\n axes,\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: axes[0] ?? null,\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartExLayout: primaryLayout,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: resolvedChartType,\n dataLabels: rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null,\n displayBlanksAs: undefined,\n editable: true,\n firstSliceAngle: undefined,\n fontFamily: undefined,\n gapWidth: resolvedGapWidth,\n holeSize: undefined,\n id: `chart-ex-${workbookSheetIndex}-${index}`,\n is3d: undefined,\n legend: normalizeChartExLegend(chart.legend),\n name: chartTitle,\n overlap: undefined,\n plotVisibleOnly: undefined,\n raw: chart,\n radarStyle: undefined,\n scatterStyle: undefined,\n roundedCorners: undefined,\n shape3d: undefined,\n seriesAxis: null,\n series: resolvedSeries,\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: undefined,\n bubble3d: undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: chartTitle,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups,\n valueAxis: axes.find((axis) => axis.numberFormat || axis.majorGridlines) ?? axes[1] ?? null,\n varyColors: typeof chart.valueColors === \"boolean\" ? chart.valueColors : undefined,\n view3d: undefined,\n wireframe: undefined,\n workbookSheetIndex,\n zIndex: index\n };\n\n applyBuiltinChartDefaults(normalizedChart, themePalette);\n return normalizedChart;\n}\n\nfunction cellValueToNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return null;\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asNumber?: () => unknown }).asNumber === \"function\") {\n candidates.push((value as { asNumber: () => unknown }).asNumber());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n if (typeof candidate === \"string\") {\n const parsed = Number(candidate.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n }\n }\n if (typeof value === \"string\") {\n const parsed = Number(value.replace(/,/g, \"\"));\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction cellValueToDisplay(value: unknown) {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value && typeof value === \"object\") {\n if ((value as { is_empty?: boolean }).is_empty) {\n return \"\";\n }\n const candidates: unknown[] = [];\n if (typeof (value as { asText?: () => unknown }).asText === \"function\") {\n candidates.push((value as { asText: () => unknown }).asText());\n }\n if (typeof (value as { toJs?: () => unknown }).toJs === \"function\") {\n candidates.push((value as { toJs: () => unknown }).toJs());\n }\n if (typeof (value as { toString?: () => unknown }).toString === \"function\") {\n candidates.push((value as { toString: () => unknown }).toString());\n }\n\n for (const candidate of candidates) {\n if (candidate === null || candidate === undefined) {\n continue;\n }\n if (typeof candidate === \"string\") {\n return candidate;\n }\n return String(candidate);\n }\n }\n return String(value);\n}\n\nfunction resolveReferenceValues(\n workbook: Workbook,\n fallbackSheetIndex: number,\n reference: XlsxChartReference | null | undefined,\n mode: \"category\" | \"value\"\n): Array<number | string | null> {\n if (!reference?.formula) {\n return reference?.values ?? [];\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, reference.formula);\n if (!resolved.sheet || !resolved.range) {\n return reference.values ?? [];\n }\n\n const values: Array<number | string | null> = [];\n for (let row = resolved.range.start.row; row <= resolved.range.end.row; row += 1) {\n for (let col = resolved.range.start.col; col <= resolved.range.end.col; col += 1) {\n const calculated = typeof resolved.sheet.getCalculatedValueAt === \"function\"\n ? resolved.sheet.getCalculatedValueAt(row, col)\n : null;\n const formatted = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(row, col)\n : calculated;\n if (mode === \"value\") {\n values.push(cellValueToNumber(calculated ?? formatted));\n } else {\n const display = cellValueToDisplay(formatted ?? calculated);\n const numeric = cellValueToNumber(calculated ?? formatted);\n values.push(display.length > 0 ? display : (numeric !== null ? numeric : null));\n }\n }\n }\n\n return values;\n}\n\nfunction resolveSeriesName(workbook: Workbook, fallbackSheetIndex: number, rawName: unknown) {\n if (typeof rawName !== \"string\" || !rawName) {\n return undefined;\n }\n\n const resolved = resolveReferenceSheet(workbook, fallbackSheetIndex, rawName);\n if (!resolved.sheet || !resolved.range) {\n return rawName;\n }\n\n const value = typeof resolved.sheet.getFormattedValueAt === \"function\"\n ? resolved.sheet.getFormattedValueAt(resolved.range.start.row, resolved.range.start.col)\n : null;\n const display = cellValueToDisplay(value);\n return display || rawName;\n}\n\nfunction normalizeChartReference(raw: unknown): XlsxChartReference | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const record = raw as Record<string, unknown>;\n return {\n formula: typeof record.formula === \"string\" ? record.formula : undefined,\n refType: typeof record.refType === \"string\" ? record.refType : undefined,\n values: Array.isArray(record.values) ? record.values as Array<number | string | null> : undefined\n };\n}\n\nfunction normalizeChartAxis(raw: unknown): XlsxChartAxis | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const rawAxis = raw as Record<string, unknown>;\n const axis = rawAxis.axis && typeof rawAxis.axis === \"object\"\n ? rawAxis.axis as Record<string, unknown>\n : rawAxis;\n const numberFormat = axis.numberFormat && typeof axis.numberFormat === \"object\"\n ? axis.numberFormat as Record<string, unknown>\n : null;\n\n return {\n crossId: typeof rawAxis.crossId === \"number\" && Number.isFinite(rawAxis.crossId) ? rawAxis.crossId : undefined,\n crosses: typeof axis.crosses === \"string\" ? axis.crosses : undefined,\n crossBetween: typeof axis.crossBetween === \"string\" ? axis.crossBetween : undefined,\n delete: typeof axis.delete === \"boolean\" ? axis.delete : undefined,\n id: typeof rawAxis.id === \"number\" && Number.isFinite(rawAxis.id) ? rawAxis.id : undefined,\n labelPosition: typeof axis.labelPosition === \"string\" ? axis.labelPosition : undefined,\n logBase: typeof axis.logBase === \"number\" ? axis.logBase : undefined,\n orientation: typeof axis.orientation === \"string\" ? axis.orientation : undefined,\n majorUnit: typeof axis.majorUnit === \"number\" ? axis.majorUnit : undefined,\n max: typeof axis.max === \"number\" ? axis.max : undefined,\n min: typeof axis.min === \"number\" ? axis.min : undefined,\n majorGridlines: typeof axis.majorGridlines === \"boolean\" ? axis.majorGridlines : undefined,\n majorTickMark: typeof axis.majorTickMark === \"string\" ? axis.majorTickMark : undefined,\n minorUnit: typeof axis.minorUnit === \"number\" ? axis.minorUnit : undefined,\n minorGridlines: typeof axis.minorGridlines === \"boolean\" ? axis.minorGridlines : undefined,\n minorTickMark: typeof axis.minorTickMark === \"string\" ? axis.minorTickMark : undefined,\n numberFormat: numberFormat ? {\n formatCode: typeof numberFormat.formatCode === \"string\" ? numberFormat.formatCode : undefined,\n sourceLinked: typeof numberFormat.sourceLinked === \"boolean\" ? numberFormat.sourceLinked : undefined\n } : undefined,\n position: typeof axis.position === \"string\" ? axis.position : undefined,\n raw: axis,\n shapeProperties: axis.shapeProperties && typeof axis.shapeProperties === \"object\"\n ? axis.shapeProperties as Record<string, unknown>\n : undefined,\n tickLabelSkip: typeof axis.tickLabelSkip === \"number\" && Number.isFinite(axis.tickLabelSkip) ? axis.tickLabelSkip : undefined,\n tickMarkSkip: typeof axis.tickMarkSkip === \"number\" && Number.isFinite(axis.tickMarkSkip) ? axis.tickMarkSkip : undefined\n };\n}\n\nfunction mergeChartAxis(target: XlsxChartAxis | null | undefined, patch: Partial<XlsxChartAxis> | null | undefined) {\n if (!patch) {\n return target ?? null;\n }\n return {\n ...(target ?? {}),\n ...patch\n };\n}\n\nfunction readChartAxisFromXml(axisNode: Element | null): Partial<XlsxChartAxis> | null {\n if (!axisNode) {\n return null;\n }\n\n const numFmt = getFirstLocalChild(axisNode, \"numFmt\");\n const scalingNode = getFirstLocalChild(axisNode, \"scaling\");\n return {\n crossId: readChartNumericAttribute(axisNode, \"crossAx\"),\n crosses: getFirstLocalChild(axisNode, \"crosses\")?.getAttribute(\"val\") ?? undefined,\n crossBetween: getFirstLocalChild(axisNode, \"crossBetween\")?.getAttribute(\"val\") ?? undefined,\n delete: getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"1\"\n ? true\n : getFirstLocalChild(axisNode, \"delete\")?.getAttribute(\"val\") === \"0\"\n ? false\n : undefined,\n id: readChartNumericAttribute(axisNode, \"axId\"),\n labelPosition: getFirstLocalChild(axisNode, \"tickLblPos\")?.getAttribute(\"val\") ?? undefined,\n logBase: readChartNumericAttribute(getFirstLocalChild(axisNode, \"scaling\"), \"logBase\"),\n orientation: getFirstLocalChild(scalingNode ?? axisNode, \"orientation\")?.getAttribute(\"val\") ?? undefined,\n majorGridlines: Boolean(getFirstLocalChild(axisNode, \"majorGridlines\")),\n majorTickMark: getFirstLocalChild(axisNode, \"majorTickMark\")?.getAttribute(\"val\") ?? undefined,\n majorUnit: readChartNumericAttribute(axisNode, \"majorUnit\"),\n max: readChartNumericAttribute(scalingNode, \"max\"),\n min: readChartNumericAttribute(scalingNode, \"min\"),\n minorGridlines: Boolean(getFirstLocalChild(axisNode, \"minorGridlines\")),\n minorTickMark: getFirstLocalChild(axisNode, \"minorTickMark\")?.getAttribute(\"val\") ?? undefined,\n minorUnit: readChartNumericAttribute(axisNode, \"minorUnit\"),\n numberFormat: numFmt\n ? {\n formatCode: numFmt.getAttribute(\"formatCode\") ?? undefined,\n sourceLinked: numFmt.getAttribute(\"sourceLinked\") === \"1\"\n ? true\n : numFmt.getAttribute(\"sourceLinked\") === \"0\"\n ? false\n : undefined\n }\n : undefined,\n position: getFirstLocalChild(axisNode, \"axPos\")?.getAttribute(\"val\") ?? undefined,\n tickLabelSkip: readChartNumericAttribute(axisNode, \"tickLblSkip\"),\n tickMarkSkip: readChartNumericAttribute(axisNode, \"tickMarkSkip\")\n };\n}\n\nfunction readChartWallFromXml(wallNode: Element | null, themePalette?: XlsxThemePalette | null): XlsxChartWall | null {\n if (!wallNode) {\n return null;\n }\n const shapeProperties = getFirstLocalChild(wallNode, \"spPr\");\n const lineStyle = resolveChartLineStyle(shapeProperties, themePalette);\n return {\n fillColor: resolveChartFillColor(shapeProperties, themePalette) ?? undefined,\n hidden: shapeProperties ? getFirstLocalChild(shapeProperties, \"noFill\") != null : undefined,\n lineColor: lineStyle.color ?? undefined,\n thickness: readChartNumericAttribute(wallNode, \"thickness\")\n };\n}\n\nfunction normalizeChartDataLabels(raw: unknown): XlsxChartDataLabels | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const labels = raw as Record<string, unknown>;\n const pointLabels = Array.isArray(labels.pointLabels)\n ? (() => {\n const normalized: XlsxChartPointDataLabel[] = [];\n for (const entry of labels.pointLabels) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const point = entry as Record<string, unknown>;\n const index = typeof point.index === \"number\" && Number.isFinite(point.index)\n ? point.index\n : null;\n if (index == null) {\n continue;\n }\n\n const nextPoint: XlsxChartPointDataLabel = { index };\n if (typeof point.deleted === \"boolean\") {\n nextPoint.deleted = point.deleted;\n }\n if (typeof point.fontSizePt === \"number\" && Number.isFinite(point.fontSizePt)) {\n nextPoint.fontSizePt = point.fontSizePt;\n }\n if (typeof point.showBubbleSize === \"boolean\") {\n nextPoint.showBubbleSize = point.showBubbleSize;\n }\n if (typeof point.showCategoryName === \"boolean\") {\n nextPoint.showCategoryName = point.showCategoryName;\n }\n if (typeof point.showPercent === \"boolean\") {\n nextPoint.showPercent = point.showPercent;\n }\n if (typeof point.showSeriesName === \"boolean\") {\n nextPoint.showSeriesName = point.showSeriesName;\n }\n if (typeof point.showValue === \"boolean\") {\n nextPoint.showValue = point.showValue;\n }\n if (typeof point.x === \"number\" && Number.isFinite(point.x)) {\n nextPoint.x = point.x;\n }\n if (typeof point.y === \"number\" && Number.isFinite(point.y)) {\n nextPoint.y = point.y;\n }\n normalized.push(nextPoint);\n }\n return normalized;\n })()\n : undefined;\n return {\n pointLabels: pointLabels && pointLabels.length > 0 ? pointLabels : undefined,\n raw: labels,\n showBubbleSize: typeof labels.showBubbleSize === \"boolean\" ? labels.showBubbleSize : undefined,\n showCategoryName: typeof labels.showCategoryName === \"boolean\" ? labels.showCategoryName : undefined,\n showLegendKey: typeof labels.showLegendKey === \"boolean\" ? labels.showLegendKey : undefined,\n showPercent: typeof labels.showPercent === \"boolean\" ? labels.showPercent : undefined,\n showSeriesName: typeof labels.showSeriesName === \"boolean\" ? labels.showSeriesName : undefined,\n showValue: typeof labels.showValue === \"boolean\" ? labels.showValue : undefined\n };\n}\n\nfunction normalizeChartAnchor(raw: unknown): XlsxImageAnchor {\n if (!raw || typeof raw !== \"object\") {\n return {\n kind: \"two-cell\",\n from: { col: 0, colOffsetEmu: 0, row: 0, rowOffsetEmu: 0 },\n to: { col: 8, colOffsetEmu: 0, row: 15, rowOffsetEmu: 0 }\n };\n }\n\n const anchor = raw as Record<string, unknown>;\n const fromCol = typeof anchor.fromCol === \"number\" ? anchor.fromCol : 0;\n const fromColOffsetEmu = typeof anchor.fromColOffset === \"number\" ? anchor.fromColOffset : 0;\n const fromRow = typeof anchor.fromRow === \"number\" ? anchor.fromRow : 0;\n const fromRowOffsetEmu = typeof anchor.fromRowOffset === \"number\" ? anchor.fromRowOffset : 0;\n const rawToCol = typeof anchor.toCol === \"number\" ? anchor.toCol : null;\n const rawToColOffsetEmu = typeof anchor.toColOffset === \"number\" ? anchor.toColOffset : 0;\n const rawToRow = typeof anchor.toRow === \"number\" ? anchor.toRow : null;\n const rawToRowOffsetEmu = typeof anchor.toRowOffset === \"number\" ? anchor.toRowOffset : 0;\n const hasExplicitTo = rawToCol !== null && rawToRow !== null;\n const collapsedWidth = hasExplicitTo && (\n rawToCol < fromCol ||\n (rawToCol === fromCol && rawToColOffsetEmu <= fromColOffsetEmu)\n );\n const collapsedHeight = hasExplicitTo && (\n rawToRow < fromRow ||\n (rawToRow === fromRow && rawToRowOffsetEmu <= fromRowOffsetEmu)\n );\n const fallbackToCol = Math.max(fromCol + 8, 8);\n const fallbackToRow = Math.max(fromRow + 15, 15);\n\n return {\n kind: \"two-cell\",\n from: {\n col: fromCol,\n colOffsetEmu: fromColOffsetEmu,\n row: fromRow,\n rowOffsetEmu: fromRowOffsetEmu\n },\n to: {\n col: !hasExplicitTo || collapsedWidth ? fallbackToCol : rawToCol,\n colOffsetEmu: !hasExplicitTo || collapsedWidth ? 0 : rawToColOffsetEmu,\n row: !hasExplicitTo || collapsedHeight ? fallbackToRow : rawToRow,\n rowOffsetEmu: !hasExplicitTo || collapsedHeight ? 0 : rawToRowOffsetEmu\n }\n };\n}\n\nfunction parseMarkerNode(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstLocalChild(node, \"col\")?.textContent ?? Number.NaN);\n const row = Number(getFirstLocalChild(node, \"row\")?.textContent ?? Number.NaN);\n const colOffsetEmu = Number(getFirstLocalChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstLocalChild(node, \"rowOff\")?.textContent ?? 0);\n\n if (!Number.isFinite(col) || !Number.isFinite(row)) {\n return null;\n }\n\n return {\n col: Math.max(0, Math.round(col)),\n colOffsetEmu: Number.isFinite(colOffsetEmu) ? Math.max(0, Math.round(colOffsetEmu)) : 0,\n row: Math.max(0, Math.round(row)),\n rowOffsetEmu: Number.isFinite(rowOffsetEmu) ? Math.max(0, Math.round(rowOffsetEmu)) : 0\n };\n}\n\nfunction parseChartAnchorNode(anchorNode: Element): XlsxImageAnchor | null {\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const to = parseMarkerNode(getFirstLocalChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\", to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarkerNode(getFirstLocalChild(anchorNode, \"from\"));\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return from && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n from,\n kind: \"one-cell\",\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n const x = Number(pos?.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pos?.getAttribute(\"y\") ?? Number.NaN);\n const cx = Number(ext?.getAttribute(\"cx\") ?? Number.NaN);\n const cy = Number(ext?.getAttribute(\"cy\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) && Number.isFinite(cx) && Number.isFinite(cy)\n ? {\n kind: \"absolute\",\n positionEmu: {\n x: Math.round(x),\n y: Math.round(y)\n },\n sizeEmu: {\n cx: Math.max(0, Math.round(cx)),\n cy: Math.max(0, Math.round(cy))\n }\n }\n : null;\n}\n\nfunction isCollapsedChartAnchor(anchor: XlsxImageAnchor) {\n if (anchor.kind !== \"two-cell\") {\n return false;\n }\n\n const collapsedWidth = anchor.to.col < anchor.from.col\n || (anchor.to.col === anchor.from.col && anchor.to.colOffsetEmu <= anchor.from.colOffsetEmu);\n const collapsedHeight = anchor.to.row < anchor.from.row\n || (anchor.to.row === anchor.from.row && anchor.to.rowOffsetEmu <= anchor.from.rowOffsetEmu);\n return collapsedWidth || collapsedHeight;\n}\n\nfunction normalizeChartSeries(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartSeries {\n const series = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n const categoriesRef = normalizeChartReference(series.categories);\n const valuesRef = normalizeChartReference(series.values);\n const shapeProperties = series.shapeProperties && typeof series.shapeProperties === \"object\"\n ? series.shapeProperties as Record<string, unknown>\n : undefined;\n const rawFillColor = typeof shapeProperties?.solidFillHex === \"string\"\n ? normalizeHexColor(shapeProperties.solidFillHex)\n : null;\n const rawLineColor = typeof shapeProperties?.lineColorHex === \"string\"\n ? normalizeHexColor(shapeProperties.lineColorHex)\n : null;\n const bubbleSizeRef = normalizeChartReference(series.bubbleSize ?? series.bubbleSizes ?? series.bubbles);\n\n return {\n bubbleSizeRef,\n bubbleSizes: resolveReferenceValues(workbook, workbookSheetIndex, bubbleSizeRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n categories: resolveReferenceValues(workbook, workbookSheetIndex, categoriesRef, \"category\"),\n categoriesRef,\n color: rawFillColor ?? undefined,\n dataPoints: Array.isArray(series.dataPoints) ? series.dataPoints : [],\n dataPointStyles: undefined,\n id: `${chartId}-series-${index}`,\n invertIfNegative: typeof series.invertIfNegative === \"boolean\" ? series.invertIfNegative : undefined,\n lineColor: rawLineColor ?? rawFillColor ?? undefined,\n lineWidthPx: typeof shapeProperties?.lineWidth === \"number\"\n ? Math.max(1, Number(shapeProperties.lineWidth) / EMU_PER_PIXEL)\n : undefined,\n marker: series.marker && typeof series.marker === \"object\" ? series.marker as Record<string, unknown> : undefined,\n markerColor: undefined,\n markerLineColor: undefined,\n markerSize: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).size === \"number\"\n ? Number((series.marker as Record<string, unknown>).size)\n : undefined,\n markerSymbol: series.marker && typeof series.marker === \"object\" && typeof (series.marker as Record<string, unknown>).symbol === \"string\"\n ? String((series.marker as Record<string, unknown>).symbol)\n : undefined,\n name: resolveSeriesName(workbook, workbookSheetIndex, series.name),\n negativeColor: undefined,\n negativeLineColor: undefined,\n raw: series,\n shapeProperties,\n smooth: typeof series.smooth === \"boolean\" ? series.smooth : undefined,\n values: resolveReferenceValues(workbook, workbookSheetIndex, valuesRef, \"value\").map((value) => (\n typeof value === \"number\" && Number.isFinite(value) ? value : null\n )),\n valuesRef\n };\n}\n\nfunction normalizeChartTypeGroup(\n workbook: Workbook,\n workbookSheetIndex: number,\n chartId: string,\n raw: unknown,\n index: number\n): XlsxChartTypeGroup | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const group = raw as Record<string, unknown>;\n const rawSeries = Array.isArray(group.series) ? group.series : [];\n return {\n axisIds: Array.isArray(group.axisIds)\n ? group.axisIds.filter((value): value is number => typeof value === \"number\" && Number.isFinite(value))\n : undefined,\n chartType: typeof group.chartType === \"string\" ? group.chartType : \"ColumnClustered\",\n dataLabels: normalizeChartDataLabels(group.dataLabels),\n gapWidth: typeof group.gapWidth === \"number\" && Number.isFinite(group.gapWidth) ? group.gapWidth : undefined,\n is3d: typeof group.is3d === \"boolean\" ? group.is3d : undefined,\n overlap: typeof group.overlap === \"number\" && Number.isFinite(group.overlap) ? group.overlap : undefined,\n raw: group,\n series: rawSeries.map((entry, seriesIndex) => (\n normalizeChartSeries(workbook, workbookSheetIndex, `${chartId}-group-${index}`, entry, seriesIndex)\n )),\n varyColors: typeof group.varyColors === \"boolean\" ? group.varyColors : undefined\n };\n}\n\nfunction normalizeChartsheet(raw: unknown, index: number): XlsxChartsheet {\n const chartsheet = raw && typeof raw === \"object\" ? raw as Record<string, unknown> : {};\n return {\n chartIds: Array.isArray(chartsheet.chartIds) ? chartsheet.chartIds.filter((value): value is string => typeof value === \"string\") : [],\n chartPath: typeof chartsheet.chartPath === \"string\" ? chartsheet.chartPath : undefined,\n id: `chartsheet-${index}`,\n index,\n name: typeof chartsheet.name === \"string\" ? chartsheet.name : `Chart ${index + 1}`,\n raw: chartsheet,\n workbookSheetIndex: typeof chartsheet.workbookSheetIndex === \"number\" ? chartsheet.workbookSheetIndex : undefined\n };\n}\n\nfunction buildTabs(\n workbook: Workbook,\n chartsheets: XlsxChartsheet[],\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>\n): XlsxWorkbookTab[] {\n const rawOrder = Array.isArray(workbook.sheetOrder) ? workbook.sheetOrder as Array<Record<string, unknown>> : [];\n if (rawOrder.length === 0) {\n return workbook.sheetNames.map((name, index) => ({\n id: `sheet-${index}`,\n index,\n kind: \"sheet\" as const,\n name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(index) ?? index,\n workbookSheetIndex: index\n }));\n }\n\n return rawOrder.flatMap<XlsxWorkbookTab>((entry, index) => {\n const slotType = typeof entry.slotType === \"string\" ? entry.slotType : \"worksheet\";\n const slotIndex = typeof entry.index === \"number\" ? entry.index : index;\n if (slotType === \"chartsheet\") {\n const chartsheet = chartsheets[slotIndex];\n return chartsheet ? [{\n chartsheetIndex: slotIndex,\n id: `chartsheet-${slotIndex}`,\n index,\n kind: \"chartsheet\" as const,\n name: chartsheet.name\n }] : [];\n }\n\n const worksheet = workbook.getSheet(slotIndex);\n if (worksheet.visibility !== \"visible\") {\n return [];\n }\n\n return [{\n id: `sheet-${slotIndex}`,\n index,\n kind: \"sheet\" as const,\n name: worksheet.name,\n sheetIndex: visibleSheetIndexByWorkbookSheetIndex.get(slotIndex) ?? slotIndex,\n workbookSheetIndex: slotIndex\n }];\n });\n}\n\nfunction collectChartOriginsForSheet(\n archive: Record<string, Uint8Array>,\n origin: WorkbookImageSheetOrigin | null\n) {\n if (!origin) {\n return [] as WorkbookChartOrigin[];\n }\n\n const chartOrigins: WorkbookChartOrigin[] = [];\n\n for (const attachment of origin.attachments) {\n const drawingXml = readArchiveText(archive, attachment.drawingPath);\n const relsXml = readArchiveText(archive, attachment.drawingRelsPath);\n if (!drawingXml || !relsXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n const relsDocument = parseXml(relsXml);\n if (!drawingDocument || !relsDocument) {\n continue;\n }\n\n const relationships = new Map<string, { target: string; type: string | null }>();\n for (const node of getLocalDescendants(relsDocument, \"Relationship\")) {\n const id = node.getAttribute(\"Id\");\n const target = node.getAttribute(\"Target\");\n const type = node.getAttribute(\"Type\");\n if (id && target) {\n relationships.set(id, {\n target: resolveRelationshipPath(attachment.drawingRelsPath ?? attachment.drawingPath, target),\n type\n });\n }\n }\n\n const anchorNodes = Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n );\n\n let chartAnchorIndex = 0;\n for (const anchorNode of anchorNodes) {\n const graphicFrame = getFirstLocalDescendant(anchorNode, \"graphicFrame\");\n const chartNode = graphicFrame ? getFirstLocalDescendant(graphicFrame, \"chart\") : null;\n const relationshipId = chartNode?.getAttributeNS(\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\", \"id\")\n ?? chartNode?.getAttribute(\"r:id\")\n ?? chartNode?.getAttribute(\"id\");\n if (!relationshipId) {\n continue;\n }\n const relationship = relationships.get(relationshipId);\n if (!relationship || (relationship.type !== CHART_REL_TYPE && relationship.type !== CHART_EX_REL_TYPE)) {\n continue;\n }\n\n chartOrigins.push({\n anchorIndex: chartAnchorIndex,\n anchor: parseChartAnchorNode(anchorNode),\n chartKind: relationship.type === CHART_EX_REL_TYPE ? \"modern\" : \"classic\",\n chartPath: relationship.target,\n drawingPath: attachment.drawingPath,\n workbookSheetIndex: origin.workbookSheetIndex\n });\n chartAnchorIndex += 1;\n }\n }\n\n return chartOrigins;\n}\n\nfunction applyChartOrigins(\n chartsByWorkbookSheetIndex: XlsxChart[][],\n chartOriginsById: Map<string, WorkbookChartOrigin>,\n archive: Record<string, Uint8Array>,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n for (let workbookSheetIndex = 0; workbookSheetIndex < chartsByWorkbookSheetIndex.length; workbookSheetIndex += 1) {\n const charts = chartsByWorkbookSheetIndex[workbookSheetIndex] ?? [];\n const origins = collectChartOriginsForSheet(archive, sheetOrigins[workbookSheetIndex] ?? null);\n const originsByKind = {\n classic: origins.filter((origin) => origin.chartKind === \"classic\"),\n modern: origins.filter((origin) => origin.chartKind === \"modern\")\n };\n const chartIndexByKind = {\n classic: 0,\n modern: 0\n };\n\n charts.forEach((chart) => {\n const chartKind = chart.id.startsWith(\"chart-ex-\") ? \"modern\" : \"classic\";\n const origin = originsByKind[chartKind][chartIndexByKind[chartKind]];\n chartIndexByKind[chartKind] += 1;\n if (!origin) {\n return;\n }\n if (origin.anchor && isCollapsedChartAnchor(chart.anchor)) {\n chart.anchor = origin.anchor;\n } else if (origin.anchor && chart.anchor.kind === \"two-cell\" && chart.anchor.from.col === 0 && chart.anchor.from.row === 0) {\n chart.anchor = origin.anchor;\n }\n chart.chartPath = origin.chartPath ?? undefined;\n chartOriginsById.set(chart.id, origin);\n });\n }\n}\n\nexport function loadWorkbookChartAssets(\n workbook: Workbook,\n imageAssets: Pick<WorkbookImageAssets, \"archive\" | \"sheetOrigins\" | \"themePalette\"> | null,\n visibleSheetIndexByWorkbookSheetIndex: Map<number, number>\n): WorkbookChartAssets {\n const chartsByWorkbookSheetIndex = Array.from({ length: workbook.sheetCount }, (_, workbookSheetIndex) => {\n const worksheet = workbook.getSheet(workbookSheetIndex);\n const rawCharts = Array.isArray(worksheet.charts) ? worksheet.charts : [];\n const rawChartsEx = Array.isArray(worksheet.chartsEx) ? worksheet.chartsEx : [];\n const visibleSheetIndex = visibleSheetIndexByWorkbookSheetIndex.get(workbookSheetIndex) ?? workbookSheetIndex;\n\n const classicCharts = rawCharts.map((rawChart, chartIndex) => {\n const chartId = `chart-${workbookSheetIndex}-${chartIndex}`;\n const chart = rawChart && typeof rawChart === \"object\" ? rawChart as Record<string, unknown> : {};\n const rawView3d = chart.view3d && typeof chart.view3d === \"object\"\n ? chart.view3d as Record<string, unknown>\n : null;\n const rawSeries = Array.isArray(chart.series) ? chart.series : [];\n const chartLevelDataLabels = normalizeChartDataLabels(chart.dataLabels);\n const firstSeriesDataLabels = rawSeries.length > 0 && rawSeries[0] && typeof rawSeries[0] === \"object\"\n ? normalizeChartDataLabels((rawSeries[0] as Record<string, unknown>).dataLabels)\n : null;\n return {\n anchor: normalizeChartAnchor(chart.anchor),\n autoTitleDeleted: typeof chart.autoTitleDeleted === \"boolean\" ? chart.autoTitleDeleted : undefined,\n axes: Array.isArray(chart.axes) ? chart.axes.map(normalizeChartAxis).filter((value): value is XlsxChartAxis => Boolean(value)) : [],\n axisLabelColor: undefined,\n axisLineColor: undefined,\n categoryAxis: normalizeChartAxis(chart.categoryAxis),\n chartAreaBorderColor: undefined,\n chartAreaFillColor: undefined,\n chartColorPalette: undefined,\n chartColorPaletteOffset: undefined,\n chartPath: undefined,\n chartStyleId: undefined,\n chartType: typeof chart.chartType === \"string\" ? chart.chartType : \"ColumnClustered\",\n dataLabels: chartLevelDataLabels ?? firstSeriesDataLabels,\n displayBlanksAs: typeof chart.displayBlanksAs === \"string\" ? chart.displayBlanksAs : undefined,\n editable: true,\n firstSliceAngle: typeof chart.firstSliceAngle === \"number\" ? chart.firstSliceAngle : undefined,\n fontFamily: undefined,\n gapWidth: typeof chart.gapWidth === \"number\" ? chart.gapWidth : undefined,\n holeSize: typeof chart.holeSize === \"number\" ? chart.holeSize : undefined,\n id: chartId,\n is3d: typeof chart.is3d === \"boolean\" ? chart.is3d : undefined,\n legend: normalizeLegend(chart.legend)\n ? {\n ...normalizeLegend(chart.legend),\n position: normalizeLegendPosition(normalizeLegend(chart.legend)?.position)\n }\n : null,\n name: typeof chart.name === \"string\" ? chart.name : undefined,\n overlap: typeof chart.overlap === \"number\" ? chart.overlap : undefined,\n plotVisibleOnly: typeof chart.plotVisibleOnly === \"boolean\" ? chart.plotVisibleOnly : undefined,\n raw: chart,\n radarStyle: typeof chart.radarStyle === \"string\" ? chart.radarStyle : undefined,\n scatterStyle: typeof chart.scatterStyle === \"string\" ? chart.scatterStyle : undefined,\n roundedCorners: typeof chart.roundedCorners === \"boolean\" ? chart.roundedCorners : undefined,\n shape3d: typeof chart.shape === \"string\"\n ? chart.shape\n : typeof chart.shape3d === \"string\"\n ? chart.shape3d\n : undefined,\n seriesAxis: null,\n series: rawSeries.map((entry, seriesIndex) => normalizeChartSeries(workbook, workbookSheetIndex, chartId, entry, seriesIndex)),\n sheetIndex: visibleSheetIndex,\n showDlblsOverMax: typeof chart.showDlblsOverMax === \"boolean\" ? chart.showDlblsOverMax : undefined,\n sideWall: null,\n backWall: null,\n bubbleScale: typeof chart.bubbleScale === \"number\" ? chart.bubbleScale : undefined,\n bubble3d: typeof chart.bubble3d === \"boolean\" ? chart.bubble3d : undefined,\n floor: null,\n surfaceMaterial: undefined,\n textColor: undefined,\n title: typeof chart.title === \"string\" ? chart.title : undefined,\n titleColor: undefined,\n titleFontFamily: undefined,\n typeGroups: Array.isArray(chart.typeGroups)\n ? chart.typeGroups\n .map((entry, groupIndex) => normalizeChartTypeGroup(workbook, workbookSheetIndex, chartId, entry, groupIndex))\n .filter((value): value is XlsxChartTypeGroup => value != null)\n : [],\n valueAxis: normalizeChartAxis(chart.valueAxis),\n varyColors: typeof chart.varyColors === \"boolean\" ? chart.varyColors : undefined,\n view3d: rawView3d\n ? {\n depthPercent: typeof rawView3d.depthPercent === \"number\" ? rawView3d.depthPercent : undefined,\n perspective: typeof rawView3d.perspective === \"number\" ? rawView3d.perspective : undefined,\n rAngAx: typeof rawView3d.rAngAx === \"boolean\"\n ? rawView3d.rAngAx\n : typeof rawView3d.rightAngleAxes === \"boolean\"\n ? rawView3d.rightAngleAxes\n : undefined,\n rotX: typeof rawView3d.rotX === \"number\"\n ? rawView3d.rotX\n : typeof rawView3d.rotateX === \"number\"\n ? rawView3d.rotateX\n : undefined,\n rotY: typeof rawView3d.rotY === \"number\"\n ? rawView3d.rotY\n : typeof rawView3d.rotateY === \"number\"\n ? rawView3d.rotateY\n : undefined\n }\n : undefined,\n wireframe: typeof chart.wireframe === \"boolean\" ? chart.wireframe : undefined,\n workbookSheetIndex,\n zIndex: 200 + chartIndex\n } satisfies XlsxChart;\n });\n\n const modernCharts = rawChartsEx.map((rawChartEx, chartExIndex) => (\n normalizeChartExChart(\n workbook,\n workbookSheetIndex,\n visibleSheetIndex,\n rawChartEx,\n chartExIndex,\n imageAssets?.themePalette ?? null\n )\n ));\n\n return [...classicCharts, ...modernCharts];\n });\n\n const chartsheets = Array.isArray(workbook.chartsheets)\n ? workbook.chartsheets.map((entry, index) => normalizeChartsheet(entry, index))\n : [];\n const tabs = buildTabs(workbook, chartsheets, visibleSheetIndexByWorkbookSheetIndex);\n const chartOriginsById = new Map<string, WorkbookChartOrigin>();\n\n if (imageAssets) {\n applyChartOrigins(chartsByWorkbookSheetIndex, chartOriginsById, imageAssets.archive, imageAssets.sheetOrigins);\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyChartStyleFromXml(chart, chart.chartPath, imageAssets.archive, imageAssets.themePalette);\n applyBuiltinChartDefaults(chart, imageAssets.themePalette);\n }\n }\n } else {\n for (const charts of chartsByWorkbookSheetIndex) {\n for (const chart of charts) {\n applyBuiltinChartDefaults(chart, null);\n }\n }\n }\n\n return {\n chartOriginsById,\n chartsByWorkbookSheetIndex,\n chartsheets,\n tabs\n };\n}\n\nfunction getChartAnchorNodes(drawingDocument: XMLDocument) {\n return Array.from(drawingDocument.documentElement.childNodes).filter(\n (node): node is Element => (\n node.nodeType === Node.ELEMENT_NODE\n && (\n (node as Element).localName === \"twoCellAnchor\"\n || (node as Element).localName === \"oneCellAnchor\"\n || (node as Element).localName === \"absoluteAnchor\"\n )\n )\n )\n .filter((anchorNode) => {\n const graphicFrame = getFirstLocalChild(anchorNode, \"graphicFrame\");\n return Boolean(graphicFrame && getFirstLocalDescendant(graphicFrame, \"chart\"));\n });\n}\n\nfunction updateMarkerNode(markerNode: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!markerNode) {\n return;\n }\n\n setLeafValue(markerNode, \"col\", String(Math.max(0, Math.round(marker.col))));\n setLeafValue(markerNode, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setLeafValue(markerNode, \"row\", String(Math.max(0, Math.round(marker.row))));\n setLeafValue(markerNode, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImageAnchor) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n updateMarkerNode(getFirstLocalChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerNode(getFirstLocalChild(anchorNode, \"from\"), anchor.from);\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const pos = getFirstLocalChild(anchorNode, \"pos\");\n if (pos) {\n pos.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n pos.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const ext = getFirstLocalChild(anchorNode, \"ext\");\n if (ext) {\n ext.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n ext.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nfunction setChartTitle(chartNode: Element, value: string | undefined) {\n const existing = getFirstLocalChild(chartNode, \"title\");\n if (!value) {\n existing?.remove();\n return;\n }\n\n const titleNode = existing ?? chartNode.insertBefore(\n chartNode.ownerDocument.createElementNS(CHART_NS, \"c:title\"),\n chartNode.firstChild\n );\n while (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n const tx = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:tx\");\n const rich = titleNode.ownerDocument.createElementNS(CHART_NS, \"c:rich\");\n const bodyPr = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:bodyPr\");\n const lstStyle = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:lstStyle\");\n const p = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:p\");\n const r = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:r\");\n const t = titleNode.ownerDocument.createElementNS(DRAWINGML_NS, \"a:t\");\n t.textContent = value;\n r.appendChild(t);\n p.appendChild(r);\n rich.append(bodyPr, lstStyle, p);\n tx.appendChild(rich);\n titleNode.appendChild(tx);\n}\n\nfunction setRefFormula(parent: Element, refNodeName: string, formula: string | undefined) {\n if (!formula) {\n return;\n }\n\n const refNode = ensureChild(parent, refNodeName);\n setLeafValue(refNode, \"f\", formula);\n}\n\nfunction updateSeriesNodes(chartTypeNode: Element, chart: Partial<XlsxChart>) {\n if (!chart.series) {\n return;\n }\n\n const seriesNodes = getLocalDescendants(chartTypeNode, \"ser\");\n chart.series.forEach((series, index) => {\n const seriesNode = seriesNodes[index];\n if (!seriesNode) {\n return;\n }\n\n if (series.name !== undefined) {\n const tx = ensureChild(seriesNode, \"tx\");\n const strRef = ensureChild(tx, \"strRef\");\n setLeafValue(strRef, \"f\", series.name);\n }\n if (series.categoriesRef?.formula) {\n const target = (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\"\n )\n ? ensureChild(seriesNode, \"xVal\")\n : ensureChild(seriesNode, \"cat\");\n setRefFormula(target, \"strRef\", series.categoriesRef.formula);\n }\n if (series.valuesRef?.formula) {\n const target = (\n chart.chartType === \"Scatter\" || chart.chartType === \"ScatterLines\" || chart.chartType === \"ScatterSmooth\"\n )\n ? ensureChild(seriesNode, \"yVal\")\n : ensureChild(seriesNode, \"val\");\n setRefFormula(target, \"numRef\", series.valuesRef.formula);\n }\n if (series.invertIfNegative !== undefined) {\n setBooleanValue(seriesNode, \"invertIfNegative\", series.invertIfNegative);\n }\n if (series.smooth !== undefined) {\n setBooleanValue(seriesNode, \"smooth\", series.smooth);\n }\n });\n}\n\nfunction updateAxisNode(axisNode: Element | null, axis: XlsxChartAxis | null | undefined) {\n if (!axisNode || !axis) {\n return;\n }\n\n if (axis.position) {\n setLeafValue(ensureChild(axisNode, \"axPos\"), \"val\", axis.position);\n getFirstLocalChild(axisNode, \"axPos\")?.setAttribute(\"val\", axis.position);\n }\n if (axis.majorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"majorGridlines\");\n if (axis.majorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:majorGridlines\"));\n } else if (!axis.majorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.minorGridlines !== undefined) {\n const gridlines = getFirstLocalChild(axisNode, \"minorGridlines\");\n if (axis.minorGridlines && !gridlines) {\n axisNode.appendChild(axisNode.ownerDocument.createElementNS(CHART_NS, \"c:minorGridlines\"));\n } else if (!axis.minorGridlines) {\n gridlines?.remove();\n }\n }\n if (axis.majorTickMark) {\n getFirstLocalChild(axisNode, \"majorTickMark\")?.setAttribute(\"val\", axis.majorTickMark)\n ?? setBooleanValue(axisNode, \"majorTickMark\", false).setAttribute(\"val\", axis.majorTickMark);\n }\n if (axis.minorTickMark) {\n getFirstLocalChild(axisNode, \"minorTickMark\")?.setAttribute(\"val\", axis.minorTickMark)\n ?? setBooleanValue(axisNode, \"minorTickMark\", false).setAttribute(\"val\", axis.minorTickMark);\n }\n if (axis.labelPosition) {\n getFirstLocalChild(axisNode, \"tickLblPos\")?.setAttribute(\"val\", axis.labelPosition)\n ?? setBooleanValue(axisNode, \"tickLblPos\", false).setAttribute(\"val\", axis.labelPosition);\n }\n if (axis.crosses) {\n getFirstLocalChild(axisNode, \"crosses\")?.setAttribute(\"val\", axis.crosses)\n ?? setBooleanValue(axisNode, \"crosses\", false).setAttribute(\"val\", axis.crosses);\n }\n if (axis.crossBetween) {\n getFirstLocalChild(axisNode, \"crossBetween\")?.setAttribute(\"val\", axis.crossBetween)\n ?? setBooleanValue(axisNode, \"crossBetween\", false).setAttribute(\"val\", axis.crossBetween);\n }\n if (axis.delete !== undefined) {\n setBooleanValue(axisNode, \"delete\", axis.delete);\n }\n if (axis.numberFormat?.formatCode) {\n const numFmt = ensureChild(axisNode, \"numFmt\");\n numFmt.setAttribute(\"formatCode\", axis.numberFormat.formatCode);\n if (axis.numberFormat.sourceLinked !== undefined) {\n numFmt.setAttribute(\"sourceLinked\", axis.numberFormat.sourceLinked ? \"1\" : \"0\");\n }\n }\n}\n\nfunction updateDataLabels(chartTypeNode: Element, labels: XlsxChartDataLabels | null | undefined) {\n if (!labels) {\n return;\n }\n\n const labelsNode = ensureChild(chartTypeNode, \"dLbls\");\n if (labels.showLegendKey !== undefined) {\n setBooleanValue(labelsNode, \"showLegendKey\", labels.showLegendKey);\n }\n if (labels.showValue !== undefined) {\n setBooleanValue(labelsNode, \"showVal\", labels.showValue);\n }\n if (labels.showCategoryName !== undefined) {\n setBooleanValue(labelsNode, \"showCatName\", labels.showCategoryName);\n }\n if (labels.showSeriesName !== undefined) {\n setBooleanValue(labelsNode, \"showSerName\", labels.showSeriesName);\n }\n if (labels.showPercent !== undefined) {\n setBooleanValue(labelsNode, \"showPercent\", labels.showPercent);\n }\n if (labels.showBubbleSize !== undefined) {\n setBooleanValue(labelsNode, \"showBubbleSize\", labels.showBubbleSize);\n }\n}\n\nexport function updateWorkbookChartAnchor(\n imageAssets: Pick<WorkbookImageAssets, \"archive\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n anchor: XlsxImageAnchor\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin) {\n return false;\n }\n\n const drawingXml = readArchiveText(imageAssets.archive, origin.drawingPath);\n if (!drawingXml) {\n return false;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return false;\n }\n\n const anchorNode = getChartAnchorNodes(drawingDocument)[origin.anchorIndex];\n if (!anchorNode) {\n return false;\n }\n\n updateAnchorNode(anchorNode, anchor);\n imageAssets.archive[normalizeArchivePath(origin.drawingPath)] = strToU8(serializeXml(drawingDocument));\n return true;\n}\n\nexport function updateWorkbookChartDefinition(\n imageAssets: Pick<WorkbookImageAssets, \"archive\">,\n chartAssets: WorkbookChartAssets,\n chartId: string,\n patch: Partial<XlsxChart>\n) {\n const origin = chartAssets.chartOriginsById.get(chartId);\n if (!origin?.chartPath) {\n return false;\n }\n\n const chartXml = readArchiveText(imageAssets.archive, origin.chartPath);\n if (!chartXml) {\n return false;\n }\n\n const chartDocument = parseXml(chartXml);\n if (!chartDocument) {\n return false;\n }\n\n const chartNode = getFirstLocalDescendant(chartDocument, \"chart\");\n const plotAreaNode = chartNode ? getFirstLocalChild(chartNode, \"plotArea\") : null;\n const chartTypeNode = findPrimaryChartTypeNode(plotAreaNode);\n if (!chartNode || !plotAreaNode || !chartTypeNode) {\n return false;\n }\n\n if (patch.title !== undefined) {\n setChartTitle(chartNode, patch.title);\n }\n if (patch.displayBlanksAs) {\n const node = ensureChild(chartNode, \"dispBlanksAs\");\n node.setAttribute(\"val\", patch.displayBlanksAs);\n }\n if (patch.roundedCorners !== undefined) {\n setBooleanValue(chartNode, \"roundedCorners\", patch.roundedCorners);\n }\n if (patch.showDlblsOverMax !== undefined) {\n setBooleanValue(chartNode, \"showDLblsOverMax\", patch.showDlblsOverMax);\n }\n if (patch.varyColors !== undefined) {\n setBooleanValue(chartTypeNode, \"varyColors\", patch.varyColors);\n }\n if (patch.gapWidth !== undefined) {\n setNumericValue(chartTypeNode, \"gapWidth\", patch.gapWidth);\n }\n if (patch.overlap !== undefined) {\n const overlapNode = ensureChild(chartTypeNode, \"overlap\");\n overlapNode.setAttribute(\"val\", String(Math.round(patch.overlap)));\n }\n if (patch.dataLabels) {\n updateDataLabels(chartTypeNode, patch.dataLabels);\n }\n updateSeriesNodes(chartTypeNode, patch);\n updateAxisNode(\n getLocalChildren(plotAreaNode, \"catAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"dateAx\")[0]\n ?? getLocalChildren(plotAreaNode, \"serAx\")[0]\n ?? null,\n patch.categoryAxis\n );\n updateAxisNode(getLocalChildren(plotAreaNode, \"valAx\")[0] ?? null, patch.valueAxis);\n\n imageAssets.archive[normalizeArchivePath(origin.chartPath)] = strToU8(serializeXml(chartDocument));\n return true;\n}\n","import type { XlsxThemePalette } from \"./types\";\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return null;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = normalizeHexColor(color);\n const match = normalized ? /^#([0-9a-f]{6})$/.exec(normalized) : null;\n if (!match) {\n return null;\n }\n\n const hex = match[1];\n return [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16)\n ];\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => Math.max(0, Math.min(255, channel)).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyExcelTint(baseColor: string, tint: number) {\n const rgb = parseHexColor(baseColor);\n if (!rgb || !Number.isFinite(tint) || tint === 0) {\n return normalizeHexColor(baseColor);\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const nextLightness = tint < 0\n ? lightness * (1 + tint)\n : lightness * (1 - tint) + tint;\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, Math.max(0, Math.min(1, nextLightness)));\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nexport function resolveWorkbookColor(\n color: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!color) {\n return null;\n }\n\n const directHex = [\"hex\", \"rgb\", \"argb\"]\n .map((key) => color[key])\n .find((value): value is string => typeof value === \"string\" && value.trim().length > 0);\n if (directHex) {\n return normalizeHexColor(directHex);\n }\n\n const themeValue = color.theme;\n const numericTheme = typeof themeValue === \"number\"\n ? themeValue\n : typeof themeValue === \"string\" && themeValue.trim().length > 0\n ? Number(themeValue)\n : Number.NaN;\n const themeColor = Number.isFinite(numericTheme) ? themePalette?.colorsByIndex[numericTheme] ?? null : null;\n if (!themeColor) {\n return null;\n }\n\n const tintValue = color.tint;\n const tint = typeof tintValue === \"number\"\n ? tintValue\n : typeof tintValue === \"string\" && tintValue.trim().length > 0\n ? Number(tintValue)\n : Number.NaN;\n\n return Number.isFinite(tint) ? applyExcelTint(themeColor, tint) : themeColor;\n}\n\nexport function resolveWorkbookFillColor(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n): string | null {\n if (!fill) {\n return null;\n }\n\n if (fill.fillType === \"solid\") {\n return resolveWorkbookColor(\n (fill.color as Record<string, unknown> | undefined)\n ?? (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n if (fill.fillType === \"pattern\") {\n return resolveWorkbookColor(\n (fill.foreground as Record<string, unknown> | undefined)\n ?? (fill.color as Record<string, unknown> | undefined)\n ?? (fill.background as Record<string, unknown> | undefined),\n themePalette\n );\n }\n\n return null;\n}\n\nexport function resolveWorkbookFillStyle(\n fill: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette | null\n) {\n if (!fill) {\n return {\n backgroundColor: null,\n backgroundImage: null\n };\n }\n\n if (fill.fillType === \"gradient\") {\n const rawStops = Array.isArray(fill.stops) ? fill.stops as Array<Record<string, unknown>> : [];\n const stops = rawStops\n .map((stop) => ({\n color: resolveWorkbookColor(stop.color as Record<string, unknown> | undefined, themePalette),\n position: typeof stop.position === \"number\" ? stop.position : Number(stop.position)\n }))\n .filter((stop): stop is { color: string; position: number } => Boolean(stop.color) && Number.isFinite(stop.position))\n .sort((left, right) => left.position - right.position);\n if (stops.length > 0) {\n const gradientType = typeof fill.gradientType === \"string\" ? fill.gradientType : \"linear\";\n if (gradientType === \"path\") {\n const backgroundColor = stops[stops.length - 1]?.color ?? null;\n return {\n backgroundColor,\n backgroundImage: `radial-gradient(circle at center, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n\n const degree = typeof fill.degree === \"number\" ? fill.degree : Number(fill.degree ?? 0);\n const cssAngle = Number.isFinite(degree) ? 90 - degree : 90;\n return {\n backgroundColor: stops[stops.length - 1]?.color ?? null,\n backgroundImage: `linear-gradient(${cssAngle}deg, ${stops.map((stop) => `${stop.color} ${Math.max(0, Math.min(100, stop.position * 100))}%`).join(\", \")})`\n };\n }\n }\n\n return {\n backgroundColor: resolveWorkbookFillColor(fill, themePalette),\n backgroundImage: null\n };\n}\n","import { strFromU8, strToU8, unzipSync, zipSync } from \"fflate\";\nimport { resolveWorkbookColor } from \"./colors\";\nimport type {\n XlsxCellAddress,\n XlsxConditionalDataBarRule,\n XlsxConditionalFormatIcon,\n XlsxConditionalFormatRule,\n XlsxConditionalFormatValueObject,\n XlsxConditionalIconSetRule,\n XlsxCellRange,\n XlsxImage,\n XlsxImageRect,\n XlsxImageResizeHandlePosition,\n XlsxResolvedCellStyle,\n XlsxShape,\n XlsxSparkline,\n XlsxTableStyleDefinition,\n XlsxThemePalette\n} from \"./types\";\n\nconst REL_NS = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\";\nconst PKG_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst SPREADSHEET_NS = \"http://schemas.openxmlformats.org/spreadsheetml/2006/main\";\nconst CONTENT_TYPES_NS = \"http://schemas.openxmlformats.org/package/2006/content-types\";\nconst DRAWING_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\";\nconst IMAGE_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\";\nconst HYPERLINK_REL_TYPE = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\nconst DRAWING_CONTENT_TYPE = \"application/vnd.openxmlformats-officedocument.drawing+xml\";\nconst EMU_PER_PIXEL = 9525;\nconst MIN_COL_WIDTH_PX = 30;\nconst MIN_ROW_HEIGHT_PX = 16;\nconst DEFAULT_COL_WIDTH_EMU = 64 * EMU_PER_PIXEL;\nconst DEFAULT_ROW_HEIGHT_EMU = 20 * EMU_PER_PIXEL;\nconst DEFAULT_COLUMN_CHARACTER_WIDTH_PX = 7;\nconst columnCharacterWidthCache = new Map<string, number>();\n\nfunction resolveDeviceGridlineThicknessPx() {\n if (typeof window === \"undefined\") {\n return 1;\n }\n\n const devicePixelRatio = window.devicePixelRatio;\n if (!Number.isFinite(devicePixelRatio) || devicePixelRatio <= 0) {\n return 1;\n }\n\n return 1 / devicePixelRatio;\n}\n\nfunction measureColumnCharacterWidthPx(fontFamily?: string | null, fontSizePt?: number | null) {\n const normalizedFamily = typeof fontFamily === \"string\" && fontFamily.trim().length > 0\n ? fontFamily.trim()\n : \"Calibri\";\n const normalizedSizePt = typeof fontSizePt === \"number\" && Number.isFinite(fontSizePt) && fontSizePt > 0\n ? fontSizePt\n : 11;\n const cacheKey = `${normalizedFamily}|${normalizedSizePt}`;\n const cached = columnCharacterWidthCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const fontSizePx = normalizedSizePt * (96 / 72);\n const font = `${fontSizePx}px \"${normalizedFamily}\"`;\n let width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n\n try {\n const context = typeof document !== \"undefined\"\n ? document.createElement(\"canvas\").getContext(\"2d\")\n : typeof OffscreenCanvas !== \"undefined\"\n ? new OffscreenCanvas(32, 32).getContext(\"2d\")\n : null;\n if (context) {\n context.font = font;\n width = Math.max(1, context.measureText(\"0\").width);\n }\n } catch {\n width = DEFAULT_COLUMN_CHARACTER_WIDTH_PX;\n }\n\n columnCharacterWidthCache.set(cacheKey, width);\n return width;\n}\n\nfunction sheetColumnWidthToPixels(width: number, columnCharacterWidthPx = DEFAULT_COLUMN_CHARACTER_WIDTH_PX) {\n if (!Number.isFinite(width) || width <= 0) {\n return MIN_COL_WIDTH_PX;\n }\n\n const digitWidth = Math.max(1, columnCharacterWidthPx);\n const pixels = width < 1\n ? Math.floor(width * (digitWidth + 5) + 0.5)\n : Math.floor(((256 * width + Math.floor(128 / digitWidth)) / 256) * digitWidth);\n return Math.max(MIN_COL_WIDTH_PX, pixels);\n}\n\ntype ArchiveEntries = Record<string, Uint8Array>;\n\ntype ContentTypesState = {\n defaultEntries: Map<string, string>;\n overrideEntries: Map<string, string>;\n};\n\ntype RelationshipRecord = {\n id: string;\n target: string;\n targetMode: string | null;\n type: string;\n};\n\ntype WorkbookSheetInfo = {\n name: string;\n path: string;\n};\n\ntype WorkbookSheetState = {\n cachedFormulaValues: Record<string, string>;\n columnWidthCharacterWidthPx?: number;\n colWidthOverridesPx: Record<number, number>;\n colStyleIds: Record<number, number>;\n conditionalFormatRules: XlsxConditionalFormatRule[];\n defaultColWidthPx: number;\n defaultRowHeightPx: number;\n hasHorizontalMerges: boolean;\n hasVerticalMerges: boolean;\n maxHorizontalMergeEndCol: number;\n maxVerticalMergeEndRow: number;\n hiddenCols: number[];\n hiddenRows: number[];\n rowHeightOverridesPx: Record<number, number>;\n rowStyleIds: Record<number, number>;\n showGridLines: boolean;\n sparklines: XlsxSparkline[];\n zoomScale: number;\n};\n\ntype ParseWorkbookStructureOptions = {\n includeCachedFormulaValues?: boolean;\n themePalette?: XlsxThemePalette | null;\n};\n\ntype ThemeState = {\n colors: Map<string, string>;\n majorLatinFont: string | null;\n minorLatinFont: string | null;\n};\n\ntype DrawingColor = {\n color: string;\n opacity: number;\n};\n\ntype DrawingRectEmu = {\n cx: number;\n cy: number;\n x: number;\n y: number;\n};\n\ntype ShapeVectorPath = {\n path: string;\n viewBox: {\n height: number;\n width: number;\n };\n};\n\ntype GroupTransform = {\n chCx: number;\n chCy: number;\n chX: number;\n chY: number;\n cx: number;\n cy: number;\n scaleX: number;\n scaleY: number;\n x: number;\n y: number;\n};\n\ntype XlsxImageAttachment = {\n drawingPath: string;\n drawingRelsPath: string | null;\n mediaPaths: string[];\n};\n\ntype WorkbookImageOrigin = {\n anchorIndex: number;\n workbookSheetIndex: number;\n};\n\nexport type WorkbookImageSheetOrigin = {\n attachments: XlsxImageAttachment[];\n workbookSheetIndex: number;\n};\n\nexport type WorkbookTableMetadata = {\n displayName?: string;\n headerRowCellStyle?: string;\n name?: string;\n reference?: string;\n};\n\nexport type WorkbookImageAssets = {\n archive: ArchiveEntries;\n imageOriginsById: Map<string, WorkbookImageOrigin>;\n imagesByWorkbookSheetIndex: XlsxImage[][];\n namedCellStyleByName: Record<string, XlsxResolvedCellStyle>;\n objectUrls: string[];\n shapesByWorkbookSheetIndex: XlsxShape[][];\n sheetStatesByWorkbookSheetIndex: Array<WorkbookSheetState | null>;\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>;\n styleById: Record<number, XlsxResolvedCellStyle>;\n tableMetadataByWorkbookSheetIndex: WorkbookTableMetadata[][];\n tableStyleByName: Record<string, XlsxTableStyleDefinition>;\n themePalette: XlsxThemePalette;\n};\n\nexport type WorkbookStructureAssets = Pick<\n WorkbookImageAssets,\n | \"namedCellStyleByName\"\n | \"sheetStatesByWorkbookSheetIndex\"\n | \"styleById\"\n | \"tableMetadataByWorkbookSheetIndex\"\n | \"tableStyleByName\"\n | \"themePalette\"\n>;\n\nexport type WorkbookChartStyleAssets = Pick<\n WorkbookImageAssets,\n | \"archive\"\n | \"sheetOrigins\"\n | \"themePalette\"\n>;\n\nfunction buildThemePalette(theme: ThemeState): XlsxThemePalette {\n const themeOrder = [\"lt1\", \"dk1\", \"lt2\", \"dk2\", \"accent1\", \"accent2\", \"accent3\", \"accent4\", \"accent5\", \"accent6\", \"hlink\", \"folHlink\"];\n const colorsByIndex: Record<number, string> = {};\n\n themeOrder.forEach((key, index) => {\n const color = theme.colors.get(key);\n if (color) {\n colorsByIndex[index] = color;\n }\n });\n\n return {\n colorsByIndex,\n majorLatinFont: theme.majorLatinFont ?? undefined,\n minorLatinFont: theme.minorLatinFont ?? undefined\n };\n}\n\nfunction cloneBytes(bytes: Uint8Array) {\n const nextBytes = new Uint8Array(bytes.byteLength);\n nextBytes.set(bytes);\n return nextBytes;\n}\n\nfunction normalizeArchivePath(path: string) {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction joinArchivePath(...parts: string[]) {\n return normalizeArchivePath(parts.join(\"/\"));\n}\n\nfunction dirname(path: string) {\n const normalized = normalizeArchivePath(path);\n const lastSlash = normalized.lastIndexOf(\"/\");\n return lastSlash >= 0 ? normalized.slice(0, lastSlash) : \"\";\n}\n\nfunction resolveArchiveTarget(baseDocumentPath: string, target: string) {\n if (!target) {\n return normalizeArchivePath(baseDocumentPath);\n }\n\n if (target.startsWith(\"#\")) {\n return target;\n }\n\n if (target.startsWith(\"/\")) {\n return normalizeArchivePath(target);\n }\n\n const baseParts = dirname(baseDocumentPath).split(\"/\").filter(Boolean);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n baseParts.pop();\n continue;\n }\n baseParts.push(segment);\n }\n\n return normalizeArchivePath(baseParts.join(\"/\"));\n}\n\nfunction relativeArchivePath(fromDocumentPath: string, toPath: string) {\n const fromParts = dirname(fromDocumentPath).split(\"/\").filter(Boolean);\n const toParts = normalizeArchivePath(toPath).split(\"/\").filter(Boolean);\n let shared = 0;\n while (shared < fromParts.length && shared < toParts.length && fromParts[shared] === toParts[shared]) {\n shared += 1;\n }\n\n const upSegments = fromParts.slice(shared).map(() => \"..\");\n const downSegments = toParts.slice(shared);\n return [...upSegments, ...downSegments].join(\"/\") || \".\";\n}\n\nfunction relsPathForDocument(documentPath: string) {\n const baseName = documentPath.split(\"/\").pop();\n const parentDir = dirname(documentPath);\n return joinArchivePath(parentDir, \"_rels\", `${baseName}.rels`);\n}\n\nfunction parseXml(xml: string) {\n const parser = new DOMParser();\n const document = parser.parseFromString(xml, \"application/xml\");\n if (document.querySelector(\"parsererror\")) {\n return null;\n }\n return document;\n}\n\nfunction serializeXml(document: XMLDocument) {\n return new XMLSerializer().serializeToString(document);\n}\n\nfunction readArchiveText(archive: ArchiveEntries, path: string) {\n const entry = archive[path];\n return entry ? strFromU8(entry) : null;\n}\n\nfunction parseColumnReference(reference: string) {\n let value = 0;\n for (const character of reference.toUpperCase()) {\n if (character < \"A\" || character > \"Z\") {\n return null;\n }\n value = value * 26 + (character.charCodeAt(0) - 64);\n }\n return value > 0 ? value - 1 : null;\n}\n\nfunction parseA1CellReference(reference: string) {\n const match = /^\\$?([A-Za-z]+)\\$?(\\d+)$/.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const col = parseColumnReference(match[1] ?? \"\");\n const row = Number(match[2] ?? Number.NaN) - 1;\n if (col === null || !Number.isFinite(row) || row < 0) {\n return null;\n }\n\n return { col, row };\n}\n\nfunction parseA1RangeReference(reference: string) {\n const [startRef, endRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? startRef ?? \"\");\n return start && end ? { end, start } : null;\n}\n\nfunction stripSheetNameFromFormulaReference(reference: string) {\n const trimmed = reference.trim();\n const bangIndex = trimmed.lastIndexOf(\"!\");\n return bangIndex >= 0 ? trimmed.slice(bangIndex + 1) : trimmed;\n}\n\nfunction parseFormulaCellReference(reference: string) {\n const normalized = stripSheetNameFromFormulaReference(reference).split(/\\s+/)[0] ?? \"\";\n return parseA1CellReference(normalized);\n}\n\nfunction parseFormulaRangeReference(reference: string) {\n return parseA1RangeReference(stripSheetNameFromFormulaReference(reference));\n}\n\nfunction isElementNode(node: Node | null | undefined): node is Element {\n return Boolean(node && node.nodeType === 1);\n}\n\nfunction getLocalElements(parent: Document | Element, localName: string) {\n return Array.from(parent.getElementsByTagName(\"*\")).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getChildElements(parent: Element, localName: string) {\n return Array.from(parent.childNodes).filter((node): node is Element => isElementNode(node) && node.localName === localName);\n}\n\nfunction getFirstChild(parent: Element, localName: string) {\n return getChildElements(parent, localName)[0] ?? null;\n}\n\nfunction getFirstDescendant(parent: Document | Element, localName: string) {\n return getLocalElements(parent, localName)[0] ?? null;\n}\n\nfunction readFeaturePropertyBagCheckboxComplements(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/featurePropertyBag/featurePropertyBag.xml\");\n if (!xml) {\n return new Set<number>();\n }\n\n const document = parseXml(xml);\n if (!document?.documentElement) {\n return new Set<number>();\n }\n\n const bagNodes = getChildElements(document.documentElement, \"bag\");\n const bagTypeById = bagNodes.map((node) => node.getAttribute(\"type\") ?? \"\");\n const checkboxComplementIndices = new Set<number>();\n\n const xfComplementsBag = bagNodes.find((node) => node.getAttribute(\"type\") === \"XFComplements\") ?? null;\n const mappedBagIds = xfComplementsBag\n ? getLocalElements(xfComplementsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .filter((value) => Number.isFinite(value))\n : [];\n\n mappedBagIds.forEach((bagId, complementIndex) => {\n const xfComplementBag = bagNodes[bagId];\n if (!xfComplementBag || bagTypeById[bagId] !== \"XFComplement\") {\n return;\n }\n\n const xfControlsBagId = getLocalElements(xfComplementBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (xfControlsBagId === undefined) {\n return;\n }\n\n const xfControlsBag = bagNodes[xfControlsBagId];\n if (!xfControlsBag || bagTypeById[xfControlsBagId] !== \"XFControls\") {\n return;\n }\n\n const cellControlBagId = getLocalElements(xfControlsBag, \"bagId\")\n .map((node) => Number(node.textContent ?? Number.NaN))\n .find((value) => Number.isFinite(value));\n if (cellControlBagId === undefined) {\n return;\n }\n\n if (bagTypeById[cellControlBagId] === \"Checkbox\") {\n checkboxComplementIndices.add(complementIndex);\n }\n });\n\n return checkboxComplementIndices;\n}\n\nfunction getRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"id\") ?? element.getAttribute(\"r:id\") ?? element.getAttribute(\"id\");\n}\n\nfunction getEmbeddedRelationshipId(element: Element) {\n return element.getAttributeNS(REL_NS, \"embed\") ?? element.getAttribute(\"r:embed\") ?? element.getAttribute(\"embed\");\n}\n\nfunction setChildText(parent: Element, localName: string, value: string) {\n const child = getFirstChild(parent, localName);\n if (child) {\n child.textContent = value;\n }\n}\n\nfunction updateMarkerElement(element: Element | null, marker: { col: number; colOffsetEmu: number; row: number; rowOffsetEmu: number }) {\n if (!element) {\n return;\n }\n\n setChildText(element, \"col\", String(Math.max(0, marker.col)));\n setChildText(element, \"colOff\", String(Math.max(0, Math.round(marker.colOffsetEmu))));\n setChildText(element, \"row\", String(Math.max(0, marker.row)));\n setChildText(element, \"rowOff\", String(Math.max(0, Math.round(marker.rowOffsetEmu))));\n}\n\nfunction parseContentTypes(archive: ArchiveEntries): ContentTypesState {\n const xml = readArchiveText(archive, \"[Content_Types].xml\");\n const defaultEntries = new Map<string, string>();\n const overrideEntries = new Map<string, string>();\n if (!xml) {\n return { defaultEntries, overrideEntries };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return { defaultEntries, overrideEntries };\n }\n\n for (const defaultNode of getLocalElements(document, \"Default\")) {\n const extension = defaultNode.getAttribute(\"Extension\");\n const contentType = defaultNode.getAttribute(\"ContentType\");\n if (extension && contentType) {\n defaultEntries.set(extension.toLowerCase(), contentType);\n }\n }\n\n for (const overrideNode of getLocalElements(document, \"Override\")) {\n const partName = overrideNode.getAttribute(\"PartName\");\n const contentType = overrideNode.getAttribute(\"ContentType\");\n if (partName && contentType) {\n overrideEntries.set(normalizeArchivePath(partName), contentType);\n }\n }\n\n return { defaultEntries, overrideEntries };\n}\n\nfunction resolveContentType(contentTypes: ContentTypesState, path: string) {\n const normalized = normalizeArchivePath(path);\n const override = contentTypes.overrideEntries.get(normalized);\n if (override) {\n return override;\n }\n\n const extension = normalized.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return \"application/octet-stream\";\n }\n\n return contentTypes.defaultEntries.get(extension) ?? \"application/octet-stream\";\n}\n\nfunction parseRelationships(archive: ArchiveEntries, relsPath: string, baseDocumentPath: string) {\n const xml = readArchiveText(archive, relsPath);\n const relationships = new Map<string, RelationshipRecord>();\n if (!xml) {\n return relationships;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return relationships;\n }\n\n for (const relationshipNode of getLocalElements(document, \"Relationship\")) {\n const id = relationshipNode.getAttribute(\"Id\");\n const target = relationshipNode.getAttribute(\"Target\");\n const type = relationshipNode.getAttribute(\"Type\");\n if (!id || !target || !type) {\n continue;\n }\n\n relationships.set(id, {\n id,\n target: resolveArchiveTarget(baseDocumentPath, target),\n targetMode: relationshipNode.getAttribute(\"TargetMode\"),\n type\n });\n }\n\n return relationships;\n}\n\nfunction parseWorkbookSheets(archive: ArchiveEntries) {\n const workbookXml = readArchiveText(archive, \"xl/workbook.xml\");\n if (!workbookXml) {\n return [];\n }\n\n const workbookDocument = parseXml(workbookXml);\n if (!workbookDocument) {\n return [];\n }\n\n const workbookRelationships = parseRelationships(archive, \"xl/_rels/workbook.xml.rels\", \"xl/workbook.xml\");\n const sheets: WorkbookSheetInfo[] = [];\n\n for (const sheetNode of getLocalElements(workbookDocument, \"sheet\")) {\n const relationshipId = getRelationshipId(sheetNode);\n if (!relationshipId) {\n continue;\n }\n\n const relationship = workbookRelationships.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n sheets.push({\n name: sheetNode.getAttribute(\"name\") ?? `Sheet ${sheets.length + 1}`,\n path: relationship.target\n });\n }\n\n return sheets;\n}\n\nfunction parseWorkbookTheme(archive: ArchiveEntries): ThemeState {\n const defaultTheme: ThemeState = {\n colors: new Map([\n [\"accent1\", \"#5b9bd5\"],\n [\"accent2\", \"#ed7d31\"],\n [\"accent3\", \"#a5a5a5\"],\n [\"accent4\", \"#ffc000\"],\n [\"accent5\", \"#4472c4\"],\n [\"accent6\", \"#70ad47\"],\n [\"bg1\", \"#ffffff\"],\n [\"bg2\", \"#e7e6e6\"],\n [\"dk1\", \"#000000\"],\n [\"dk2\", \"#6e747a\"],\n [\"folHlink\", \"#993366\"],\n [\"hlink\", \"#085296\"],\n [\"lt1\", \"#ffffff\"],\n [\"lt2\", \"#e7e6e6\"],\n [\"tx1\", \"#000000\"],\n [\"tx2\", \"#6e747a\"]\n ]),\n majorLatinFont: null,\n minorLatinFont: null\n };\n\n const themeXml = readArchiveText(archive, \"xl/theme/theme1.xml\");\n if (!themeXml) {\n return defaultTheme;\n }\n\n const themeDocument = parseXml(themeXml);\n if (!themeDocument) {\n return defaultTheme;\n }\n\n const colors = new Map(defaultTheme.colors);\n const colorSchemeNode = getLocalElements(themeDocument, \"clrScheme\")[0] ?? null;\n if (colorSchemeNode) {\n for (const colorNode of Array.from(colorSchemeNode.childNodes).filter(isElementNode)) {\n const key = colorNode.localName;\n const srgbNode = getFirstChild(colorNode, \"srgbClr\");\n const sysNode = getFirstChild(colorNode, \"sysClr\");\n const hex = srgbNode?.getAttribute(\"val\") ?? sysNode?.getAttribute(\"lastClr\");\n if (hex) {\n colors.set(key, normalizeHexColor(hex));\n }\n }\n }\n\n const fontSchemeNode = getLocalElements(themeDocument, \"fontScheme\")[0] ?? null;\n const majorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"majorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n const minorLatinFont = getFirstChild(getFirstChild(fontSchemeNode, \"minorFont\"), \"latin\")?.getAttribute(\"typeface\") ?? null;\n\n colors.set(\"bg1\", colors.get(\"lt1\") ?? defaultTheme.colors.get(\"bg1\") ?? \"#ffffff\");\n colors.set(\"tx1\", colors.get(\"dk1\") ?? defaultTheme.colors.get(\"tx1\") ?? \"#000000\");\n colors.set(\"bg2\", colors.get(\"lt2\") ?? defaultTheme.colors.get(\"bg2\") ?? \"#e7e6e6\");\n colors.set(\"tx2\", colors.get(\"dk2\") ?? defaultTheme.colors.get(\"tx2\") ?? \"#6e747a\");\n\n return {\n colors,\n majorLatinFont,\n minorLatinFont\n };\n}\n\nfunction parseSpreadsheetColor(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const color: Record<string, unknown> = {};\n const rgb = node.getAttribute(\"rgb\");\n const theme = node.getAttribute(\"theme\");\n const tint = node.getAttribute(\"tint\");\n const indexed = node.getAttribute(\"indexed\");\n if (rgb) {\n color.rgb = normalizeHexColor(rgb);\n }\n if (theme !== null) {\n color.theme = Number(theme);\n }\n if (tint !== null) {\n color.tint = Number(tint);\n }\n if (indexed !== null) {\n color.indexed = Number(indexed);\n }\n\n return Object.keys(color).length > 0 ? color : undefined;\n}\n\nfunction hasEnabledSpreadsheetFlag(node: Element | null) {\n if (!node) {\n return false;\n }\n\n const value = node.getAttribute(\"val\");\n return value === null || (value !== \"0\" && value !== \"false\");\n}\n\nfunction parseSheetSparklines(\n document: XMLDocument,\n themePalette?: XlsxThemePalette | null\n) {\n const sparklines: XlsxSparkline[] = [];\n\n for (const groupNode of getLocalElements(document, \"sparklineGroup\")) {\n const rawType = groupNode.getAttribute(\"type\");\n const sparklineType: XlsxSparkline[\"type\"] = rawType === \"column\"\n ? \"column\"\n : rawType === \"stacked\"\n ? \"winLoss\"\n : \"line\";\n\n const markersNode = getFirstChild(groupNode, \"markers\");\n const negativeNode = getFirstChild(groupNode, \"negative\");\n const colorSeries = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorSeries\")), themePalette);\n const colorNegative = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorNegative\")), themePalette);\n const colorMarkers = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorMarkers\")), themePalette);\n const colorFirst = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorFirst\")), themePalette);\n const colorLast = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLast\")), themePalette);\n const colorHigh = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorHigh\")), themePalette);\n const colorLow = resolveWorkbookColor(parseSpreadsheetColor(getFirstChild(groupNode, \"colorLow\")), themePalette);\n const sparklineCollectionNode = getFirstChild(groupNode, \"sparklines\");\n if (!sparklineCollectionNode) {\n continue;\n }\n\n for (const sparklineNode of getChildElements(sparklineCollectionNode, \"sparkline\")) {\n const formula = getFirstChild(sparklineNode, \"f\")?.textContent ?? \"\";\n const targetReference = getFirstChild(sparklineNode, \"sqref\")?.textContent ?? \"\";\n const range = parseFormulaRangeReference(formula);\n const target = parseFormulaCellReference(targetReference);\n if (!range || !target) {\n continue;\n }\n\n sparklines.push({\n color: colorSeries ?? undefined,\n firstColor: colorFirst ?? undefined,\n highColor: colorHigh ?? undefined,\n lastColor: colorLast ?? undefined,\n lowColor: colorLow ?? undefined,\n markerColor: colorMarkers ?? undefined,\n markers: hasEnabledSpreadsheetFlag(markersNode),\n negative: hasEnabledSpreadsheetFlag(negativeNode),\n negativeColor: colorNegative ?? undefined,\n range,\n target,\n type: sparklineType\n });\n }\n }\n\n return sparklines;\n}\n\nfunction parseSpreadsheetFont(node: Element | null): XlsxResolvedCellStyle[\"font\"] {\n if (!node) {\n return undefined;\n }\n\n const font: Record<string, unknown> = {};\n const size = getFirstChild(node, \"sz\")?.getAttribute(\"val\");\n const name = getFirstChild(node, \"name\")?.getAttribute(\"val\");\n const family = getFirstChild(node, \"family\")?.getAttribute(\"val\");\n const scheme = getFirstChild(node, \"scheme\")?.getAttribute(\"val\");\n const charset = getFirstChild(node, \"charset\")?.getAttribute(\"val\");\n const verticalAlign = getFirstChild(node, \"vertAlign\")?.getAttribute(\"val\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"b\"))) {\n font.bold = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"i\"))) {\n font.italic = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"strike\"))) {\n font.strikethrough = true;\n }\n if (getFirstChild(node, \"u\")) {\n font.underline = getFirstChild(node, \"u\")?.getAttribute(\"val\") ?? \"single\";\n }\n if (size !== null && size !== undefined) {\n font.size = Number(size);\n }\n if (name) {\n font.name = name;\n }\n if (family !== null && family !== undefined) {\n font.family = Number(family);\n }\n if (scheme) {\n font.scheme = scheme;\n }\n if (charset !== null && charset !== undefined) {\n font.charset = Number(charset);\n }\n if (verticalAlign) {\n font.verticalAlign = verticalAlign;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"shadow\"))) {\n font.shadow = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"outline\"))) {\n font.outline = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"condense\"))) {\n font.condense = true;\n }\n if (hasEnabledSpreadsheetFlag(getFirstChild(node, \"extend\"))) {\n font.extend = true;\n }\n if (color) {\n font.color = color;\n }\n\n return Object.keys(font).length > 0 ? font : undefined;\n}\n\nfunction parseSpreadsheetFill(node: Element | null): XlsxResolvedCellStyle[\"fill\"] {\n if (!node) {\n return undefined;\n }\n\n const gradientFill = getFirstChild(node, \"gradientFill\");\n if (gradientFill) {\n const stops = Array.from(gradientFill.childNodes)\n .filter(isElementNode)\n .filter((child) => child.localName === \"stop\")\n .map((stopNode) => ({\n color: parseSpreadsheetColor(Array.from(stopNode.childNodes).find(isElementNode) ?? null),\n position: Number(stopNode.getAttribute(\"position\") ?? Number.NaN)\n }))\n .filter((stop) => stop.color && Number.isFinite(stop.position));\n if (stops.length > 0) {\n return {\n degree: Number(gradientFill.getAttribute(\"degree\") ?? 0),\n fillType: \"gradient\",\n gradientType: gradientFill.getAttribute(\"type\") ?? \"linear\",\n stops\n };\n }\n }\n\n const patternFill = getFirstChild(node, \"patternFill\");\n if (!patternFill) {\n return undefined;\n }\n\n const patternType = patternFill.getAttribute(\"patternType\") ?? \"none\";\n const foreground = parseSpreadsheetColor(getFirstChild(patternFill, \"fgColor\"));\n const background = parseSpreadsheetColor(getFirstChild(patternFill, \"bgColor\"));\n const solidColor = foreground ?? background;\n if (patternType === \"solid\" && solidColor) {\n return {\n color: solidColor,\n fillType: \"solid\"\n };\n }\n // Differential table styles sometimes omit patternType and only set bgColor.\n // Preserve those fills so header/table overrides are not dropped during import.\n if ((patternType === \"none\" || patternType === \"gray125\") && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n if (patternType !== \"none\" && patternType !== \"gray125\" && (foreground || background)) {\n return {\n background,\n fillType: \"pattern\",\n foreground,\n patternType\n };\n }\n\n return undefined;\n}\n\nfunction parseSpreadsheetBorderEdge(node: Element | null) {\n if (!node) {\n return undefined;\n }\n\n const style = node.getAttribute(\"style\");\n const color = parseSpreadsheetColor(getFirstChild(node, \"color\"));\n if (!style || style === \"none\") {\n return undefined;\n }\n\n return {\n color,\n style\n };\n}\n\nfunction parseSpreadsheetBorder(node: Element | null): XlsxResolvedCellStyle[\"border\"] {\n if (!node) {\n return undefined;\n }\n\n const border: Record<string, Record<string, unknown>> = {};\n ([\"top\", \"right\", \"bottom\", \"left\", \"horizontal\", \"vertical\"] as const).forEach((edge) => {\n const parsedEdge = parseSpreadsheetBorderEdge(getFirstChild(node, edge));\n if (parsedEdge) {\n border[edge] = parsedEdge;\n }\n });\n\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parseSpreadsheetAlignment(node: Element | null): XlsxResolvedCellStyle[\"alignment\"] {\n if (!node) {\n return undefined;\n }\n\n const alignment: Record<string, unknown> = {};\n const horizontal = node.getAttribute(\"horizontal\");\n const vertical = node.getAttribute(\"vertical\");\n const wrapText = node.getAttribute(\"wrapText\");\n const indent = node.getAttribute(\"indent\");\n if (horizontal) {\n alignment.horizontal = horizontal;\n }\n if (vertical) {\n alignment.vertical = vertical;\n }\n if (wrapText !== null) {\n alignment.wrapText = wrapText === \"1\";\n }\n if (indent !== null) {\n alignment.indent = Number(indent);\n }\n\n return Object.keys(alignment).length > 0 ? alignment : undefined;\n}\n\nfunction parseDifferentialStyle(node: Element | null): XlsxResolvedCellStyle {\n if (!node) {\n return {};\n }\n\n const style: XlsxResolvedCellStyle = {};\n const font = parseSpreadsheetFont(getFirstChild(node, \"font\"));\n const fill = parseSpreadsheetFill(getFirstChild(node, \"fill\"));\n const border = parseSpreadsheetBorder(getFirstChild(node, \"border\"));\n const alignment = parseSpreadsheetAlignment(getFirstChild(node, \"alignment\"));\n\n if (font) {\n style.font = font;\n }\n if (fill) {\n style.fill = fill;\n }\n if (border) {\n style.border = border;\n }\n if (alignment) {\n style.alignment = alignment;\n }\n\n return style;\n}\n\nfunction parseResolvedXfStyle(\n xfNode: Element,\n fonts: Array<XlsxResolvedCellStyle[\"font\"]>,\n fills: Array<XlsxResolvedCellStyle[\"fill\"]>,\n borders: Array<XlsxResolvedCellStyle[\"border\"]>,\n checkboxComplementIndices?: Set<number>\n) {\n const style: XlsxResolvedCellStyle = {};\n const fontId = Number(xfNode.getAttribute(\"fontId\") ?? Number.NaN);\n const fillId = Number(xfNode.getAttribute(\"fillId\") ?? Number.NaN);\n const borderId = Number(xfNode.getAttribute(\"borderId\") ?? Number.NaN);\n const alignment = parseSpreadsheetAlignment(getFirstChild(xfNode, \"alignment\"));\n\n if (Number.isFinite(fontId) && fonts[fontId]) {\n style.font = fonts[fontId];\n }\n if (Number.isFinite(fillId) && fills[fillId]) {\n style.fill = fills[fillId];\n }\n if (Number.isFinite(borderId) && borders[borderId]) {\n style.border = borders[borderId];\n }\n if (alignment) {\n style.alignment = alignment;\n }\n const xfComplementNode = getFirstDescendant(xfNode, \"xfComplement\");\n const xfComplementIndex = Number(xfComplementNode?.getAttribute(\"i\") ?? Number.NaN);\n if (Number.isFinite(xfComplementIndex) && checkboxComplementIndices?.has(xfComplementIndex)) {\n style.cellControl = { kind: \"checkbox\" };\n }\n\n return style;\n}\n\nfunction parseWorkbookStyles(archive: ArchiveEntries) {\n const xml = readArchiveText(archive, \"xl/styles.xml\");\n if (!xml) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const document = parseXml(xml);\n if (!document) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const fontsNode = getFirstDescendant(document, \"fonts\");\n const fillsNode = getFirstDescendant(document, \"fills\");\n const bordersNode = getFirstDescendant(document, \"borders\");\n const cellStyleXfsNode = getFirstDescendant(document, \"cellStyleXfs\");\n const cellStylesNode = getFirstDescendant(document, \"cellStyles\");\n const cellXfsNode = getFirstDescendant(document, \"cellXfs\");\n const dxfsNode = getFirstDescendant(document, \"dxfs\");\n const tableStylesNode = getFirstDescendant(document, \"tableStyles\");\n if (!cellXfsNode) {\n return {\n defaultFont: null,\n namedCellStyleByName: {},\n styleById: {},\n tableStyleByName: {}\n };\n }\n\n const checkboxComplementIndices = readFeaturePropertyBagCheckboxComplements(archive);\n const fonts = getChildElements(fontsNode ?? document.documentElement, \"font\").map((node) => parseSpreadsheetFont(node));\n const fills = getChildElements(fillsNode ?? document.documentElement, \"fill\").map((node) => parseSpreadsheetFill(node));\n const borders = getChildElements(bordersNode ?? document.documentElement, \"border\").map((node) => parseSpreadsheetBorder(node));\n const differentialStyles = getChildElements(dxfsNode ?? document.documentElement, \"dxf\").map((node) => parseDifferentialStyle(node));\n const cellStyleXfs = getChildElements(cellStyleXfsNode ?? document.documentElement, \"xf\").map(\n (node) => parseResolvedXfStyle(node, fonts, fills, borders, checkboxComplementIndices)\n );\n const namedCellStyleByName: Record<string, XlsxResolvedCellStyle> = {};\n const styleById: Record<number, XlsxResolvedCellStyle> = {};\n const tableStyleByName: Record<string, XlsxTableStyleDefinition> = {};\n\n getChildElements(cellXfsNode, \"xf\").forEach((xfNode, index) => {\n styleById[index] = parseResolvedXfStyle(xfNode, fonts, fills, borders, checkboxComplementIndices);\n });\n\n getChildElements(cellStylesNode ?? document.documentElement, \"cellStyle\").forEach((cellStyleNode) => {\n const name = cellStyleNode.getAttribute(\"name\");\n const xfId = Number(cellStyleNode.getAttribute(\"xfId\") ?? Number.NaN);\n if (!name || !Number.isFinite(xfId)) {\n return;\n }\n\n const resolvedStyle = cellStyleXfs[xfId];\n if (resolvedStyle) {\n namedCellStyleByName[name] = resolvedStyle;\n }\n });\n\n getChildElements(tableStylesNode ?? document.documentElement, \"tableStyle\").forEach((tableStyleNode) => {\n const name = tableStyleNode.getAttribute(\"name\");\n if (!name) {\n return;\n }\n\n const elements: XlsxTableStyleDefinition = {};\n getChildElements(tableStyleNode, \"tableStyleElement\").forEach((elementNode) => {\n const type = elementNode.getAttribute(\"type\");\n const dxfId = Number(elementNode.getAttribute(\"dxfId\") ?? Number.NaN);\n if (!type || !Number.isFinite(dxfId)) {\n return;\n }\n\n const differentialStyle = differentialStyles[dxfId];\n if (differentialStyle) {\n elements[type] = differentialStyle;\n }\n });\n tableStyleByName[name] = elements;\n });\n\n const normalFont = (namedCellStyleByName.Normal?.font ?? styleById[0]?.font ?? fonts[0]) as Record<string, unknown> | undefined;\n const defaultFont = normalFont ? {\n family: typeof normalFont.name === \"string\" ? normalFont.name : undefined,\n sizePt: typeof normalFont.size === \"number\" ? normalFont.size : undefined\n } : null;\n\n return {\n defaultFont,\n namedCellStyleByName,\n styleById,\n tableStyleByName\n };\n}\n\nfunction parseWorkbookTableMetadata(\n archive: ArchiveEntries,\n workbookSheets: WorkbookSheetInfo[]\n) {\n return workbookSheets.map((sheet) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const sheetXml = readArchiveText(archive, sheet.path);\n if (!sheetXml) {\n return [];\n }\n\n const sheetDocument = parseXml(sheetXml);\n if (!sheetDocument) {\n return [];\n }\n\n return getLocalElements(sheetDocument, \"tablePart\").flatMap((tablePartNode) => {\n const relationshipId = getRelationshipId(tablePartNode);\n if (!relationshipId) {\n return [];\n }\n\n const relationship = sheetRelationships.get(relationshipId);\n if (!relationship) {\n return [];\n }\n\n const tableXml = readArchiveText(archive, relationship.target);\n if (!tableXml) {\n return [];\n }\n\n const tableDocument = parseXml(tableXml);\n const tableNode = tableDocument?.documentElement;\n if (!tableNode || tableNode.localName !== \"table\") {\n return [];\n }\n\n return [{\n displayName: tableNode.getAttribute(\"displayName\") ?? undefined,\n headerRowCellStyle: tableNode.getAttribute(\"headerRowCellStyle\") ?? undefined,\n name: tableNode.getAttribute(\"name\") ?? undefined,\n reference: tableNode.getAttribute(\"ref\") ?? undefined\n } satisfies WorkbookTableMetadata];\n });\n });\n}\n\nfunction parseSqrefRanges(sqref: string | null | undefined): XlsxCellRange[] {\n if (!sqref) {\n return [];\n }\n\n return sqref\n .trim()\n .split(/\\s+/)\n .flatMap((reference) => {\n const range = parseA1RangeReference(reference);\n return range ? [range] : [];\n });\n}\n\nfunction parseConditionalFormatValueObject(node: Element | null): XlsxConditionalFormatValueObject | null {\n if (!node) {\n return null;\n }\n\n const type = node.getAttribute(\"type\");\n if (!type) {\n return null;\n }\n\n const rawValue = node.getAttribute(\"val\") ?? getFirstChild(node, \"f\")?.textContent ?? undefined;\n const numericValue = rawValue !== undefined ? Number(rawValue) : Number.NaN;\n return {\n type,\n value: Number.isFinite(numericValue) ? numericValue : undefined\n };\n}\n\nfunction parseSpreadsheetBooleanAttribute(node: Element | null, name: string) {\n if (!node) {\n return undefined;\n }\n\n const value = node.getAttribute(name);\n if (value === null) {\n return undefined;\n }\n\n return value !== \"0\" && value !== \"false\";\n}\n\nfunction parseStandardConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"colorScale\") {\n const colorScaleNode = getFirstChild(cfRuleNode, \"colorScale\");\n if (!colorScaleNode) {\n return null;\n }\n\n const cfvos = getChildElements(colorScaleNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const colors = getChildElements(colorScaleNode, \"color\")\n .map((node) => parseSpreadsheetColor(node))\n .filter((value): value is Record<string, unknown> => Boolean(value));\n if (cfvos.length === 0 || colors.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n colors,\n kind: \"colorScale\",\n priority,\n ranges\n };\n }\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n const extId = getFirstDescendant(cfRuleNode, \"id\")?.textContent?.trim() || undefined;\n return {\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"color\")),\n kind: \"dataBar\",\n priority,\n ranges,\n id: extId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const iconSetName = iconSetNode.getAttribute(\"iconSet\");\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (!iconSetName || cfvos.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons: cfvos.map((_, index) => ({\n iconId: index,\n iconSet: iconSetName\n })),\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\")\n };\n }\n\n return null;\n}\n\nfunction parseExtendedConditionalFormatRule(\n cfRuleNode: Element,\n ranges: XlsxCellRange[]\n): (XlsxConditionalFormatRule & { id?: string }) | null {\n const type = cfRuleNode.getAttribute(\"type\");\n const ruleId = cfRuleNode.getAttribute(\"id\") ?? undefined;\n const rawPriority = Number(cfRuleNode.getAttribute(\"priority\") ?? Number.NaN);\n const priority = Number.isFinite(rawPriority) ? rawPriority : Number.MAX_SAFE_INTEGER;\n\n if (type === \"dataBar\") {\n const dataBarNode = getFirstChild(cfRuleNode, \"dataBar\");\n if (!dataBarNode) {\n return null;\n }\n\n const cfvos = getChildElements(dataBarNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n if (cfvos.length === 0) {\n return null;\n }\n\n return {\n axisColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"axisColor\")),\n border: parseSpreadsheetBooleanAttribute(dataBarNode, \"border\"),\n borderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"borderColor\")),\n cfvos,\n color: parseSpreadsheetColor(getFirstChild(dataBarNode, \"fillColor\")),\n gradient: parseSpreadsheetBooleanAttribute(dataBarNode, \"gradient\"),\n kind: \"dataBar\",\n maxLength: Number(dataBarNode.getAttribute(\"maxLength\") ?? Number.NaN),\n minLength: Number(dataBarNode.getAttribute(\"minLength\") ?? Number.NaN),\n negativeBarBorderColorSameAsPositive: parseSpreadsheetBooleanAttribute(dataBarNode, \"negativeBarBorderColorSameAsPositive\"),\n negativeBorderColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeBorderColor\")),\n negativeFillColor: parseSpreadsheetColor(getFirstChild(dataBarNode, \"negativeFillColor\")),\n priority,\n ranges,\n showValue: parseSpreadsheetBooleanAttribute(dataBarNode, \"showValue\"),\n id: ruleId\n };\n }\n\n if (type === \"iconSet\") {\n const iconSetNode = getFirstChild(cfRuleNode, \"iconSet\");\n if (!iconSetNode) {\n return null;\n }\n\n const cfvos = getChildElements(iconSetNode, \"cfvo\")\n .map((node) => parseConditionalFormatValueObject(node))\n .filter((value): value is XlsxConditionalFormatValueObject => Boolean(value));\n const icons = getChildElements(iconSetNode, \"cfIcon\")\n .map((iconNode) => {\n const iconSet = iconNode.getAttribute(\"iconSet\");\n const rawIconId = Number(iconNode.getAttribute(\"iconId\") ?? Number.NaN);\n if (!iconSet || !Number.isFinite(rawIconId)) {\n return null;\n }\n\n return {\n iconId: rawIconId,\n iconSet\n } satisfies XlsxConditionalFormatIcon;\n })\n .filter((icon): icon is XlsxConditionalFormatIcon => Boolean(icon));\n\n if (cfvos.length === 0 || icons.length === 0) {\n return null;\n }\n\n return {\n cfvos,\n icons,\n kind: \"iconSet\",\n priority,\n ranges,\n reverse: parseSpreadsheetBooleanAttribute(iconSetNode, \"reverse\"),\n showValue: parseSpreadsheetBooleanAttribute(iconSetNode, \"showValue\"),\n id: ruleId\n };\n }\n\n return null;\n}\n\nfunction mergeConditionalFormatRule(\n baseRule: XlsxConditionalFormatRule & { id?: string },\n extendedRule: XlsxConditionalFormatRule & { id?: string }\n) {\n if (baseRule.kind !== extendedRule.kind) {\n return baseRule;\n }\n\n if (baseRule.kind === \"colorScale\" && extendedRule.kind === \"colorScale\") {\n return {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n colors: extendedRule.colors.length > 0 ? extendedRule.colors : baseRule.colors,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n }\n\n if (baseRule.kind === \"dataBar\" && extendedRule.kind === \"dataBar\") {\n const merged: XlsxConditionalDataBarRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n axisColor: extendedRule.axisColor ?? baseRule.axisColor,\n border: extendedRule.border ?? baseRule.border,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n color: extendedRule.color ?? baseRule.color,\n negativeBarBorderColorSameAsPositive: extendedRule.negativeBarBorderColorSameAsPositive ?? baseRule.negativeBarBorderColorSameAsPositive,\n negativeBorderColor: extendedRule.negativeBorderColor ?? baseRule.negativeBorderColor,\n negativeFillColor: extendedRule.negativeFillColor ?? baseRule.negativeFillColor,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n if (baseRule.kind === \"iconSet\" && extendedRule.kind === \"iconSet\") {\n const merged: XlsxConditionalIconSetRule & { id?: string } = {\n ...baseRule,\n ...extendedRule,\n cfvos: extendedRule.cfvos.length > 0 ? extendedRule.cfvos : baseRule.cfvos,\n icons: extendedRule.icons.length > 0 ? extendedRule.icons : baseRule.icons,\n priority: Number.isFinite(extendedRule.priority) ? extendedRule.priority : baseRule.priority,\n ranges: extendedRule.ranges.length > 0 ? extendedRule.ranges : baseRule.ranges\n };\n return merged;\n }\n\n return baseRule;\n}\n\nfunction parseConditionalFormatRules(document: Document) {\n const standardRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n const extendedRules: Array<XlsxConditionalFormatRule & { id?: string }> = [];\n\n getLocalElements(document, \"conditionalFormatting\").forEach((conditionalFormattingNode) => {\n const isExtended = conditionalFormattingNode.namespaceURI !== SPREADSHEET_NS;\n const ranges = isExtended\n ? parseSqrefRanges(getFirstChild(conditionalFormattingNode, \"sqref\")?.textContent ?? \"\")\n : parseSqrefRanges(conditionalFormattingNode.getAttribute(\"sqref\"));\n\n getChildElements(conditionalFormattingNode, \"cfRule\").forEach((cfRuleNode) => {\n const parsedRule = isExtended\n ? parseExtendedConditionalFormatRule(cfRuleNode, ranges)\n : parseStandardConditionalFormatRule(cfRuleNode, ranges);\n if (parsedRule) {\n if (isExtended) {\n extendedRules.push(parsedRule);\n } else {\n standardRules.push(parsedRule);\n }\n }\n });\n });\n\n const mergedRules: XlsxConditionalFormatRule[] = [];\n const usedExtendedRuleIds = new Set<string>();\n const extendedRulesById = new Map(\n extendedRules\n .filter((rule) => typeof rule.id === \"string\" && rule.id.length > 0)\n .map((rule) => [rule.id as string, rule])\n );\n\n standardRules.forEach((rule) => {\n const matchingExtendedRule = rule.id ? extendedRulesById.get(rule.id) : undefined;\n if (matchingExtendedRule) {\n usedExtendedRuleIds.add(rule.id as string);\n mergedRules.push(mergeConditionalFormatRule(rule, matchingExtendedRule));\n return;\n }\n\n mergedRules.push(rule);\n });\n\n extendedRules.forEach((rule) => {\n if (rule.id && usedExtendedRuleIds.has(rule.id)) {\n return;\n }\n\n mergedRules.push(rule);\n });\n\n return mergedRules\n .map((rule) => {\n const nextRule = { ...rule } as XlsxConditionalFormatRule & { id?: string };\n delete nextRule.id;\n return nextRule;\n })\n .filter((rule) => rule.ranges.length > 0)\n .sort((left, right) => left.priority - right.priority);\n}\n\nfunction parseSheetState(\n archive: ArchiveEntries,\n path: string,\n options?: ParseWorkbookStructureOptions & {\n defaultFont?: {\n family?: string;\n sizePt?: number;\n } | null;\n }\n): WorkbookSheetState | null {\n const xml = readArchiveText(archive, path);\n if (!xml) {\n return null;\n }\n\n const document = parseXml(xml);\n if (!document) {\n return null;\n }\n\n const includeCachedFormulaValues = options?.includeCachedFormulaValues ?? true;\n const cachedFormulaValues: Record<string, string> = {};\n const conditionalFormatRules = parseConditionalFormatRules(document);\n const sparklines = parseSheetSparklines(document, options?.themePalette);\n const sheetFormatNode = getLocalElements(document, \"sheetFormatPr\")[0] ?? null;\n const sheetViewNode = getLocalElements(document, \"sheetView\")[0] ?? null;\n const rowHeightOverridesPx: Record<number, number> = {};\n const colWidthOverridesPx: Record<number, number> = {};\n const rowStyleIds: Record<number, number> = {};\n const colStyleIds: Record<number, number> = {};\n const hiddenRows = new Set<number>();\n const hiddenCols = new Set<number>();\n let hasHorizontalMerges = false;\n let hasVerticalMerges = false;\n let maxHorizontalMergeEndCol = -1;\n let maxVerticalMergeEndRow = -1;\n const columnWidthCharacterWidthPx = measureColumnCharacterWidthPx(\n options?.defaultFont?.family,\n options?.defaultFont?.sizePt\n );\n\n const defaultRowHeight = Number(sheetFormatNode?.getAttribute(\"defaultRowHeight\") ?? 15);\n const defaultColWidth = Number(\n sheetFormatNode?.getAttribute(\"defaultColWidth\")\n ?? sheetFormatNode?.getAttribute(\"baseColWidth\")\n ?? 8.43\n );\n const rawZoomScale = Number(\n sheetViewNode?.getAttribute(\"zoomScale\")\n ?? sheetViewNode?.getAttribute(\"zoomScaleNormal\")\n ?? Number.NaN\n );\n const zoomScale = Number.isFinite(rawZoomScale) && rawZoomScale > 0\n ? rawZoomScale\n : 100;\n\n getLocalElements(document, \"row\").forEach((rowNode) => {\n const rowIndex = Number(rowNode.getAttribute(\"r\") ?? 0) - 1;\n const height = Number(rowNode.getAttribute(\"ht\") ?? Number.NaN);\n const styleId = Number(rowNode.getAttribute(\"s\") ?? Number.NaN);\n const isHidden = (rowNode.getAttribute(\"hidden\") ?? \"0\") === \"1\";\n if (rowIndex >= 0 && Number.isFinite(height)) {\n rowHeightOverridesPx[rowIndex] = Math.max(MIN_ROW_HEIGHT_PX, Math.round(height * 1.33));\n }\n if (rowIndex >= 0 && Number.isFinite(styleId)) {\n rowStyleIds[rowIndex] = styleId;\n }\n if (rowIndex >= 0 && isHidden) {\n hiddenRows.add(rowIndex);\n }\n\n if (includeCachedFormulaValues) {\n getChildElements(rowNode, \"c\").forEach((cellNode) => {\n const formulaNode = getFirstChild(cellNode, \"f\");\n const valueNode = getFirstChild(cellNode, \"v\");\n const cellRef = cellNode.getAttribute(\"r\");\n if (formulaNode && valueNode && cellRef) {\n cachedFormulaValues[cellRef] = valueNode.textContent ?? \"\";\n }\n });\n }\n });\n\n getLocalElements(document, \"col\").forEach((colNode) => {\n const min = Number(colNode.getAttribute(\"min\") ?? 0) - 1;\n const max = Number(colNode.getAttribute(\"max\") ?? 0) - 1;\n const width = Number(colNode.getAttribute(\"width\") ?? Number.NaN);\n const styleId = Number(colNode.getAttribute(\"style\") ?? Number.NaN);\n const isHidden = (colNode.getAttribute(\"hidden\") ?? \"0\") === \"1\";\n if (!Number.isFinite(width)) {\n if (!Number.isFinite(styleId)) {\n return;\n }\n }\n\n for (let col = min; col <= max; col += 1) {\n if (col >= 0) {\n if (Number.isFinite(width)) {\n const widthPx = sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n colWidthOverridesPx[col] = widthPx;\n }\n if (Number.isFinite(styleId)) {\n colStyleIds[col] = styleId;\n }\n if (isHidden) {\n hiddenCols.add(col);\n }\n }\n }\n });\n\n getLocalElements(document, \"mergeCell\").forEach((mergeNode) => {\n const reference = mergeNode.getAttribute(\"ref\");\n const range = reference ? parseA1RangeReference(reference) : null;\n if (!range) {\n return;\n }\n\n if (range.end.col > range.start.col) {\n hasHorizontalMerges = true;\n maxHorizontalMergeEndCol = Math.max(maxHorizontalMergeEndCol, range.end.col);\n }\n if (range.end.row > range.start.row) {\n hasVerticalMerges = true;\n maxVerticalMergeEndRow = Math.max(maxVerticalMergeEndRow, range.end.row);\n }\n });\n\n return {\n cachedFormulaValues,\n columnWidthCharacterWidthPx,\n colWidthOverridesPx,\n colStyleIds,\n conditionalFormatRules,\n defaultColWidthPx: sheetColumnWidthToPixels(defaultColWidth, columnWidthCharacterWidthPx),\n defaultRowHeightPx: Math.max(MIN_ROW_HEIGHT_PX, Math.round(defaultRowHeight * 1.33)),\n hasHorizontalMerges,\n hasVerticalMerges,\n maxHorizontalMergeEndCol,\n maxVerticalMergeEndRow,\n hiddenCols: [...hiddenCols].sort((left, right) => left - right),\n hiddenRows: [...hiddenRows].sort((left, right) => left - right),\n rowHeightOverridesPx,\n rowStyleIds,\n showGridLines: (sheetViewNode?.getAttribute(\"showGridLines\") ?? \"1\") !== \"0\",\n sparklines,\n zoomScale\n };\n}\n\nfunction clampChannel(value: number) {\n return Math.max(0, Math.min(255, Math.round(value)));\n}\n\nfunction normalizeHexColor(value: string) {\n const hex = value.replace(/^#/, \"\");\n if (hex.length === 8) {\n return `#${hex.slice(2).toLowerCase()}`;\n }\n if (hex.length === 6) {\n return `#${hex.toLowerCase()}`;\n }\n return \"#000000\";\n}\n\nfunction hexToRgb(hex: string) {\n const normalized = normalizeHexColor(hex);\n return {\n b: Number.parseInt(normalized.slice(5, 7), 16),\n g: Number.parseInt(normalized.slice(3, 5), 16),\n r: Number.parseInt(normalized.slice(1, 3), 16)\n };\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((value) => clampChannel(value).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction applyDrawingColorTransforms(\n baseColor: string,\n transformNodes: Element[]\n): DrawingColor {\n let { r, g, b } = hexToRgb(baseColor);\n let opacity = 1;\n let lumMod = 1;\n let lumOff = 0;\n\n transformNodes.forEach((node) => {\n const rawValue = Number(node.getAttribute(\"val\") ?? 0);\n const value = Number.isFinite(rawValue) ? rawValue / 100000 : 0;\n switch (node.localName) {\n case \"alpha\":\n opacity *= value;\n break;\n case \"lumMod\":\n lumMod *= value;\n break;\n case \"lumOff\":\n lumOff += value;\n break;\n case \"shade\":\n r *= value;\n g *= value;\n b *= value;\n break;\n case \"tint\":\n r = r + (255 - r) * value;\n g = g + (255 - g) * value;\n b = b + (255 - b) * value;\n break;\n default:\n break;\n }\n });\n\n if (lumMod !== 1 || lumOff !== 0) {\n r = r * lumMod + 255 * lumOff;\n g = g * lumMod + 255 * lumOff;\n b = b * lumMod + 255 * lumOff;\n }\n\n return {\n color: rgbToHex(r, g, b),\n opacity: Math.max(0, Math.min(1, opacity))\n };\n}\n\nfunction resolveThemeColorName(theme: ThemeState, name: string | null) {\n if (!name) {\n return null;\n }\n\n const aliases: Record<string, string> = {\n bg1: \"bg1\",\n bg2: \"bg2\",\n tx1: \"tx1\",\n tx2: \"tx2\"\n };\n const key = aliases[name] ?? name;\n return theme.colors.get(key) ?? null;\n}\n\nfunction resolveColorValue(colorNode: Element | null, theme: ThemeState): DrawingColor | null {\n if (!colorNode) {\n return null;\n }\n\n let baseColor: string | null = null;\n if (colorNode.localName === \"srgbClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"val\") ?? \"\");\n } else if (colorNode.localName === \"schemeClr\") {\n baseColor = resolveThemeColorName(theme, colorNode.getAttribute(\"val\"));\n } else if (colorNode.localName === \"scrgbClr\") {\n const r = Number(colorNode.getAttribute(\"r\") ?? 0) * 255 / 100000;\n const g = Number(colorNode.getAttribute(\"g\") ?? 0) * 255 / 100000;\n const b = Number(colorNode.getAttribute(\"b\") ?? 0) * 255 / 100000;\n baseColor = rgbToHex(r, g, b);\n } else if (colorNode.localName === \"sysClr\") {\n baseColor = normalizeHexColor(colorNode.getAttribute(\"lastClr\") ?? \"\");\n }\n\n if (!baseColor) {\n return null;\n }\n\n return applyDrawingColorTransforms(baseColor, Array.from(colorNode.childNodes).filter(isElementNode));\n}\n\nfunction resolveFillColor(fillParent: Element | null, theme: ThemeState): DrawingColor | null {\n if (!fillParent) {\n return null;\n }\n\n const solidFillNode = getFirstChild(fillParent, \"solidFill\");\n if (!solidFillNode) {\n return null;\n }\n\n return resolveColorValue(Array.from(solidFillNode.childNodes).filter(isElementNode)[0] ?? null, theme);\n}\n\nfunction resolveTextTypeface(typeface: string | null, theme: ThemeState) {\n if (!typeface) {\n return undefined;\n }\n\n if (typeface === \"+mn-lt\" || typeface === \"+mn-ea\" || typeface === \"+mn-cs\") {\n return theme.minorLatinFont ?? undefined;\n }\n if (typeface === \"+mj-lt\" || typeface === \"+mj-ea\" || typeface === \"+mj-cs\") {\n return theme.majorLatinFont ?? undefined;\n }\n\n return typeface;\n}\n\nfunction isThemeTypeface(typeface: string | null | undefined) {\n return Boolean(typeface && typeface.startsWith(\"+\"));\n}\n\nfunction resolvePreferredTextTypeface(node: Element | null, theme: ThemeState) {\n if (!node) {\n return undefined;\n }\n\n const latin = getFirstChild(node, \"latin\")?.getAttribute(\"typeface\") ?? null;\n const eastAsian = getFirstChild(node, \"ea\")?.getAttribute(\"typeface\") ?? null;\n const complexScript = getFirstChild(node, \"cs\")?.getAttribute(\"typeface\") ?? null;\n const candidates = [latin, eastAsian, complexScript];\n const explicit = candidates.find((candidate) => candidate && !isThemeTypeface(candidate));\n if (explicit) {\n return explicit;\n }\n\n return resolveTextTypeface(candidates.find(Boolean) ?? null, theme);\n}\n\ntype ShapeTextStyle = {\n bold?: boolean;\n color?: string;\n fontFamily?: string;\n fontSizePt?: number;\n italic?: boolean;\n underline?: boolean;\n};\n\nfunction parseShapeTextStyle(node: Element | null, theme: ThemeState, fallbackColor?: DrawingColor | null): ShapeTextStyle {\n if (!node) {\n return {\n color: fallbackColor?.color\n };\n }\n\n const fillColor = resolveFillColor(node, theme) ?? fallbackColor ?? null;\n const underlineValue = node.getAttribute(\"u\");\n return {\n bold: node.getAttribute(\"b\") === \"1\" || undefined,\n color: fillColor?.color,\n fontFamily: resolvePreferredTextTypeface(node, theme),\n fontSizePt: node.getAttribute(\"sz\") ? Number(node.getAttribute(\"sz\")) / 100 : undefined,\n italic: node.getAttribute(\"i\") === \"1\" || undefined,\n underline: underlineValue && underlineValue !== \"none\" ? true : undefined\n };\n}\n\nfunction mergeShapeTextStyles(...styles: Array<ShapeTextStyle | undefined>): ShapeTextStyle {\n return styles.reduce<ShapeTextStyle>((acc, style) => {\n if (!style) {\n return acc;\n }\n return {\n bold: style.bold ?? acc.bold,\n color: style.color ?? acc.color,\n fontFamily: style.fontFamily ?? acc.fontFamily,\n fontSizePt: style.fontSizePt ?? acc.fontSizePt,\n italic: style.italic ?? acc.italic,\n underline: style.underline ?? acc.underline\n };\n }, {});\n}\n\nfunction parseMarker(node: Element | null) {\n if (!node) {\n return null;\n }\n\n const col = Number(getFirstChild(node, \"col\")?.textContent ?? 0);\n const row = Number(getFirstChild(node, \"row\")?.textContent ?? 0);\n const colOffsetEmu = Number(getFirstChild(node, \"colOff\")?.textContent ?? 0);\n const rowOffsetEmu = Number(getFirstChild(node, \"rowOff\")?.textContent ?? 0);\n\n return {\n col,\n colOffsetEmu,\n row,\n rowOffsetEmu\n };\n}\n\nfunction parseAnchor(anchorNode: Element) {\n if (anchorNode.localName === \"twoCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const to = parseMarker(getFirstChild(anchorNode, \"to\"));\n return from && to ? { from, kind: \"two-cell\" as const, to } : null;\n }\n\n if (anchorNode.localName === \"oneCellAnchor\") {\n const from = parseMarker(getFirstChild(anchorNode, \"from\"));\n const extNode = getFirstChild(anchorNode, \"ext\");\n return from && extNode\n ? {\n from,\n kind: \"one-cell\" as const,\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n const extNode = getFirstChild(anchorNode, \"ext\");\n return positionNode && extNode\n ? {\n kind: \"absolute\" as const,\n positionEmu: {\n x: Number(positionNode.getAttribute(\"x\") ?? 0),\n y: Number(positionNode.getAttribute(\"y\") ?? 0)\n },\n sizeEmu: {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0)\n }\n }\n : null;\n}\n\nfunction anchorToRect(anchor: XlsxImage[\"anchor\"]): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.positionEmu.x,\n y: anchor.positionEmu.y\n };\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n }\n\n return {\n cx: Math.max(0, (anchor.to.col - anchor.from.col) * DEFAULT_COL_WIDTH_EMU + anchor.to.colOffsetEmu - anchor.from.colOffsetEmu),\n cy: Math.max(0, (anchor.to.row - anchor.from.row) * DEFAULT_ROW_HEIGHT_EMU + anchor.to.rowOffsetEmu - anchor.from.rowOffsetEmu),\n x: anchor.from.colOffsetEmu,\n y: anchor.from.rowOffsetEmu\n };\n}\n\nfunction resolveSheetColumnWidthPx(sheetState: WorkbookSheetState | null, col: number) {\n if (col < 0) {\n return 0;\n }\n return sheetState?.colWidthOverridesPx[col] ?? sheetState?.defaultColWidthPx ?? emuToPixels(DEFAULT_COL_WIDTH_EMU);\n}\n\nfunction resolveSheetRowHeightPx(sheetState: WorkbookSheetState | null, row: number) {\n if (row < 0) {\n return 0;\n }\n return sheetState?.rowHeightOverridesPx[row] ?? sheetState?.defaultRowHeightPx ?? emuToPixels(DEFAULT_ROW_HEIGHT_EMU);\n}\n\nfunction sumSheetColumnWidthsEmu(sheetState: WorkbookSheetState | null, beforeCol: number) {\n let total = 0;\n for (let col = 0; col < beforeCol; col += 1) {\n total += pixelsToEmu(resolveSheetColumnWidthPx(sheetState, col));\n }\n return total;\n}\n\nfunction sumSheetRowHeightsEmu(sheetState: WorkbookSheetState | null, beforeRow: number) {\n let total = 0;\n for (let row = 0; row < beforeRow; row += 1) {\n total += pixelsToEmu(resolveSheetRowHeightPx(sheetState, row));\n }\n return total;\n}\n\nfunction anchorToAbsoluteRect(anchor: XlsxImage[\"anchor\"], sheetState: WorkbookSheetState | null): DrawingRectEmu {\n if (anchor.kind === \"absolute\") {\n return anchorToRect(anchor);\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n cx: anchor.sizeEmu.cx,\n cy: anchor.sizeEmu.cy,\n x: sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu,\n y: sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu\n };\n }\n\n const left = sumSheetColumnWidthsEmu(sheetState, anchor.from.col) + anchor.from.colOffsetEmu;\n const top = sumSheetRowHeightsEmu(sheetState, anchor.from.row) + anchor.from.rowOffsetEmu;\n const right = sumSheetColumnWidthsEmu(sheetState, anchor.to.col) + anchor.to.colOffsetEmu;\n const bottom = sumSheetRowHeightsEmu(sheetState, anchor.to.row) + anchor.to.rowOffsetEmu;\n\n return {\n cx: Math.max(0, right - left),\n cy: Math.max(0, bottom - top),\n x: left,\n y: top\n };\n}\n\nfunction rectToAbsoluteAnchor(rect: DrawingRectEmu): XlsxImage[\"anchor\"] {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: rect.x,\n y: rect.y\n },\n sizeEmu: {\n cx: rect.cx,\n cy: rect.cy\n }\n };\n}\n\nfunction parseTransformRect(xfrmNode: Element | null) {\n if (!xfrmNode) {\n return null;\n }\n\n const offNode = getFirstChild(xfrmNode, \"off\");\n const extNode = getFirstChild(xfrmNode, \"ext\");\n if (!offNode || !extNode) {\n return null;\n }\n\n return {\n cx: Number(extNode.getAttribute(\"cx\") ?? 0),\n cy: Number(extNode.getAttribute(\"cy\") ?? 0),\n flipH: xfrmNode.getAttribute(\"flipH\") === \"1\",\n flipV: xfrmNode.getAttribute(\"flipV\") === \"1\",\n rot: Number(xfrmNode.getAttribute(\"rot\") ?? 0) / 60000,\n x: Number(offNode.getAttribute(\"x\") ?? 0),\n y: Number(offNode.getAttribute(\"y\") ?? 0)\n };\n}\n\nfunction applyGroupTransform(rect: DrawingRectEmu, group: GroupTransform): DrawingRectEmu {\n return {\n cx: rect.cx * group.scaleX,\n cy: rect.cy * group.scaleY,\n x: group.x + (rect.x - group.chX) * group.scaleX,\n y: group.y + (rect.y - group.chY) * group.scaleY\n };\n}\n\nfunction parseGroupTransform(\n groupNode: Element,\n parentGroup: GroupTransform | null,\n fallbackAnchor: XlsxImage[\"anchor\"],\n sheetState: WorkbookSheetState | null\n) {\n const xfrmNode = getFirstDescendant(getFirstChild(groupNode, \"grpSpPr\") ?? groupNode, \"xfrm\");\n const anchorRect = anchorToAbsoluteRect(fallbackAnchor, sheetState);\n const rect = parseTransformRect(xfrmNode) ?? anchorRect;\n const rootRectMatchesAnchorOrigin = Math.abs(rect.x - anchorRect.x) <= EMU_PER_PIXEL\n && Math.abs(rect.y - anchorRect.y) <= EMU_PER_PIXEL;\n const chOffNode = getFirstChild(xfrmNode ?? groupNode, \"chOff\");\n const chExtNode = getFirstChild(xfrmNode ?? groupNode, \"chExt\");\n const rootScaleX = rect.cx !== 0 ? anchorRect.cx / rect.cx : 1;\n const rootScaleY = rect.cy !== 0 ? anchorRect.cy / rect.cy : 1;\n const useRectFrameForRoot = !parentGroup && (\n rootScaleX < 0.85\n || rootScaleX > 1.15\n || rootScaleY < 0.85\n || rootScaleY > 1.15\n );\n const absoluteRect = parentGroup\n ? applyGroupTransform(rect, parentGroup)\n : rootRectMatchesAnchorOrigin\n ? rect\n : anchorRect;\n const childRectX = parentGroup\n ? Number(chOffNode?.getAttribute(\"x\") ?? 0)\n : useRectFrameForRoot\n ? rect.x\n : Number(chOffNode?.getAttribute(\"x\") ?? 0);\n const childRectY = parentGroup\n ? Number(chOffNode?.getAttribute(\"y\") ?? 0)\n : useRectFrameForRoot\n ? rect.y\n : Number(chOffNode?.getAttribute(\"y\") ?? 0);\n const childRectCx = parentGroup\n ? Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx)\n : useRectFrameForRoot\n ? rect.cx\n : Number(chExtNode?.getAttribute(\"cx\") ?? rect.cx);\n const childRectCy = parentGroup\n ? Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy)\n : useRectFrameForRoot\n ? rect.cy\n : Number(chExtNode?.getAttribute(\"cy\") ?? rect.cy);\n return {\n chCx: childRectCx,\n chCy: childRectCy,\n chX: childRectX,\n chY: childRectY,\n cx: absoluteRect.cx,\n cy: absoluteRect.cy,\n scaleX: childRectCx !== 0 ? absoluteRect.cx / childRectCx : (parentGroup?.scaleX ?? 1),\n scaleY: childRectCy !== 0 ? absoluteRect.cy / childRectCy : (parentGroup?.scaleY ?? 1),\n x: absoluteRect.x,\n y: absoluteRect.y\n };\n}\n\nfunction anchorFromNodeOrFallback(\n node: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n parentGroup: GroupTransform | null\n) {\n const xfrmNode = getFirstDescendant(node, \"xfrm\");\n const rect = parseTransformRect(xfrmNode);\n if (rect) {\n const scaleX = parentGroup?.scaleX ?? 1;\n const scaleY = parentGroup?.scaleY ?? 1;\n return {\n anchor: parentGroup ? rectToAbsoluteAnchor(applyGroupTransform(rect, parentGroup)) : fallbackAnchor,\n flipH: rect.flipH,\n flipV: rect.flipV,\n rotationDeg: rect.rot,\n scaleX,\n scaleY\n };\n }\n\n return {\n anchor: fallbackAnchor,\n flipH: false,\n flipV: false,\n rotationDeg: 0,\n scaleX: parentGroup?.scaleX ?? 1,\n scaleY: parentGroup?.scaleY ?? 1\n };\n}\n\nfunction mapParagraphAlign(value: string | null | undefined): XlsxShape[\"paragraphs\"][number][\"align\"] | undefined {\n switch (value) {\n case \"ctr\":\n return \"center\";\n case \"just\":\n return \"justify\";\n case \"r\":\n return \"right\";\n case \"l\":\n return \"left\";\n default:\n return undefined;\n }\n}\n\nfunction mapVerticalAnchor(value: string | null | undefined): \"bottom\" | \"middle\" | \"top\" {\n switch (value) {\n case \"b\":\n return \"bottom\";\n case \"ctr\":\n return \"middle\";\n default:\n return \"top\";\n }\n}\n\nfunction createImageAnchorNodes(document: XMLDocument) {\n return document.documentElement\n ? Array.from(document.documentElement.childNodes).filter(\n (node): node is Element =>\n isElementNode(node) &&\n (node.localName === \"twoCellAnchor\" || node.localName === \"oneCellAnchor\" || node.localName === \"absoluteAnchor\")\n )\n : [];\n}\n\nfunction createImageSource(bytes: Uint8Array, mimeType: string, objectUrls: string[]) {\n if (typeof URL !== \"undefined\" && typeof Blob !== \"undefined\") {\n const objectUrl = URL.createObjectURL(new Blob([cloneBytes(bytes)], { type: mimeType }));\n objectUrls.push(objectUrl);\n return objectUrl;\n }\n\n let binary = \"\";\n for (const value of bytes) {\n binary += String.fromCharCode(value);\n }\n const base64 = typeof btoa === \"function\" ? btoa(binary) : \"\";\n return `data:${mimeType};base64,${base64}`;\n}\n\nfunction isStrokeOnlyGeometry(geometry: string) {\n return geometry === \"line\" || geometry === \"arc\" || geometry === \"leftBrace\";\n}\n\nfunction parseShapeStroke(node: Element, styleNode: Element | null, theme: ThemeState): XlsxShape[\"stroke\"] | undefined {\n const lineNode = getFirstDescendant(node, \"ln\");\n const lineRefNode = styleNode ? getFirstChild(styleNode, \"lnRef\") : null;\n if (!lineNode && !lineRefNode) {\n return undefined;\n }\n\n if (lineNode && getFirstChild(lineNode, \"noFill\")) {\n return { none: true };\n }\n\n const color = resolveFillColor(lineNode, theme)\n ?? resolveColorValue(Array.from(lineRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const widthEmu = Number(lineNode?.getAttribute(\"w\") ?? 0);\n return {\n color: color?.color,\n dash: getFirstChild(lineNode ?? node, \"prstDash\")?.getAttribute(\"val\") ?? undefined,\n headEndType: getFirstChild(lineNode ?? node, \"headEnd\")?.getAttribute(\"type\") ?? undefined,\n none: false,\n opacity: color?.opacity,\n tailEndType: getFirstChild(lineNode ?? node, \"tailEnd\")?.getAttribute(\"type\") ?? undefined,\n widthPx: widthEmu > 0 ? emuToPixels(widthEmu) : undefined\n };\n}\n\nfunction parseShapeFill(\n node: Element,\n styleNode: Element | null,\n theme: ThemeState,\n geometry: string\n): XlsxShape[\"fill\"] | undefined {\n const shapePropsNode = getFirstChild(node, \"spPr\") ?? node;\n const noFillNode = getFirstChild(shapePropsNode, \"noFill\");\n if (noFillNode) {\n return { none: true };\n }\n\n if (isStrokeOnlyGeometry(geometry)) {\n return { none: true };\n }\n\n const fillRefNode = styleNode ? getFirstChild(styleNode, \"fillRef\") : null;\n const fillColor = resolveFillColor(shapePropsNode, theme)\n ?? resolveColorValue(Array.from(fillRefNode?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n if (!fillColor) {\n return undefined;\n }\n\n return {\n color: fillColor.color,\n none: false,\n opacity: fillColor.opacity\n };\n}\n\nfunction parsePointNode(pointNode: Element | null) {\n if (!pointNode) {\n return null;\n }\n\n const x = Number(pointNode.getAttribute(\"x\") ?? Number.NaN);\n const y = Number(pointNode.getAttribute(\"y\") ?? Number.NaN);\n return Number.isFinite(x) && Number.isFinite(y) ? { x, y } : null;\n}\n\nfunction parseCustomGeometryPath(shapeNode: Element): ShapeVectorPath | undefined {\n const pathNode = getFirstDescendant(shapeNode, \"path\");\n if (!pathNode) {\n return undefined;\n }\n\n const width = Number(pathNode.getAttribute(\"w\") ?? Number.NaN);\n const height = Number(pathNode.getAttribute(\"h\") ?? Number.NaN);\n if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) {\n return undefined;\n }\n\n const commands: string[] = [];\n let lastPoint: { x: number; y: number } | null = null;\n for (const child of Array.from(pathNode.childNodes).filter(isElementNode)) {\n if (child.localName === \"moveTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point) {\n commands.push(`M ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"lnTo\") {\n const point = parsePointNode(getFirstChild(child, \"pt\"));\n if (point && (!lastPoint || point.x !== lastPoint.x || point.y !== lastPoint.y)) {\n commands.push(`L ${point.x} ${point.y}`);\n lastPoint = point;\n }\n continue;\n }\n\n if (child.localName === \"cubicBezTo\") {\n const points = getChildElements(child, \"pt\").map(parsePointNode).filter((point): point is { x: number; y: number } => point !== null);\n if (points.length === 3) {\n commands.push(`C ${points[0].x} ${points[0].y} ${points[1].x} ${points[1].y} ${points[2].x} ${points[2].y}`);\n lastPoint = points[2];\n }\n continue;\n }\n\n if (child.localName === \"close\") {\n commands.push(\"Z\");\n lastPoint = null;\n }\n }\n\n if (commands.length === 0) {\n return undefined;\n }\n\n return {\n path: commands.join(\" \"),\n viewBox: {\n height,\n width\n }\n };\n}\n\nfunction parseShapeGeometryAdjustments(shapeNode: Element) {\n const presetGeometry = getFirstDescendant(shapeNode, \"prstGeom\");\n if (!presetGeometry) {\n return undefined;\n }\n\n const adjustments: Record<string, number> = {};\n getChildElements(getFirstChild(presetGeometry, \"avLst\"), \"gd\").forEach((adjustmentNode) => {\n const name = adjustmentNode.getAttribute(\"name\");\n const formula = adjustmentNode.getAttribute(\"fmla\") ?? \"\";\n const match = formula.match(/^val\\s+(-?\\d+(?:\\.\\d+)?)$/);\n if (!name || !match) {\n return;\n }\n\n const value = Number.parseFloat(match[1] ?? \"\");\n if (Number.isFinite(value)) {\n adjustments[name] = value;\n }\n });\n\n return Object.keys(adjustments).length > 0 ? adjustments : undefined;\n}\n\nfunction parseShapeParagraphs(\n shapeNode: Element,\n styleNode: Element | null,\n theme: ThemeState\n): XlsxShape[\"paragraphs\"] {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return [];\n }\n\n const defaultFontRef = styleNode ? getFirstChild(styleNode, \"fontRef\") : null;\n const defaultFontColor = resolveColorValue(Array.from(defaultFontRef?.childNodes ?? []).filter(isElementNode)[0] ?? null, theme);\n const listStyleNode = getFirstChild(txBodyNode, \"lstStyle\");\n const paragraphs: XlsxShape[\"paragraphs\"] = [];\n\n getChildElements(txBodyNode, \"p\").forEach((paragraphNode) => {\n const paragraphProps = getFirstChild(paragraphNode, \"pPr\");\n const paragraphLevel = Number(paragraphProps?.getAttribute(\"lvl\") ?? 0);\n const listLevelProps = getFirstChild(listStyleNode ?? txBodyNode, `lvl${paragraphLevel + 1}pPr`);\n const inheritedStyle = mergeShapeTextStyles(\n parseShapeTextStyle(getFirstChild(listLevelProps ?? txBodyNode, \"defRPr\"), theme, defaultFontColor),\n parseShapeTextStyle(getFirstChild(paragraphProps ?? paragraphNode, \"defRPr\"), theme, defaultFontColor)\n );\n const runs: XlsxShape[\"paragraphs\"][number][\"runs\"] = [];\n let sawRenderableChild = false;\n\n Array.from(paragraphNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"br\") {\n sawRenderableChild = true;\n runs.push({ text: \"\\n\" });\n return;\n }\n if (child.localName !== \"r\") {\n return;\n }\n\n sawRenderableChild = true;\n const text = getFirstChild(child, \"t\")?.textContent ?? \"\";\n const runProps = getFirstChild(child, \"rPr\");\n const runStyle = mergeShapeTextStyles(\n inheritedStyle,\n parseShapeTextStyle(runProps, theme, defaultFontColor)\n );\n\n runs.push({\n bold: runStyle.bold,\n color: runStyle.color,\n fontFamily: runStyle.fontFamily,\n fontSizePt: runStyle.fontSizePt,\n italic: runStyle.italic,\n text,\n underline: runStyle.underline\n });\n });\n\n if (runs.length === 0) {\n if (!sawRenderableChild && !getFirstChild(paragraphNode, \"endParaRPr\")) {\n return;\n }\n\n runs.push({\n bold: inheritedStyle.bold,\n color: inheritedStyle.color,\n fontFamily: inheritedStyle.fontFamily,\n fontSizePt: inheritedStyle.fontSizePt,\n italic: inheritedStyle.italic,\n text: \" \",\n underline: inheritedStyle.underline\n });\n }\n\n paragraphs.push({\n align: mapParagraphAlign(paragraphProps?.getAttribute(\"algn\")),\n runs\n });\n });\n\n return paragraphs;\n}\n\nfunction parseTextBox(shapeNode: Element): XlsxShape[\"textBox\"] | undefined {\n const txBodyNode = getFirstChild(shapeNode, \"txBody\");\n if (!txBodyNode) {\n return undefined;\n }\n\n const bodyProps = getFirstChild(txBodyNode, \"bodyPr\");\n const leftInset = emuToPixels(Number(bodyProps?.getAttribute(\"lIns\") ?? 91440));\n const rightInset = emuToPixels(Number(bodyProps?.getAttribute(\"rIns\") ?? 91440));\n const topInset = emuToPixels(Number(bodyProps?.getAttribute(\"tIns\") ?? 45720));\n const bottomInset = emuToPixels(Number(bodyProps?.getAttribute(\"bIns\") ?? 45720));\n\n return {\n horizontalAlign: bodyProps?.getAttribute(\"anchorCtr\") === \"1\" ? \"center\" : \"left\",\n insetPx: {\n bottom: bottomInset,\n left: leftInset,\n right: rightInset,\n top: topInset\n },\n verticalAlign: mapVerticalAnchor(bodyProps?.getAttribute(\"anchor\"))\n };\n}\n\nfunction getHyperlinkTarget(\n node: Element | null,\n drawingRelationships: Map<string, RelationshipRecord>\n) {\n const hyperlinkNode = node ? getFirstDescendant(node, \"hlinkClick\") : null;\n const hyperlinkTargetNode = hyperlinkNode ?? node;\n const hyperlinkId = hyperlinkTargetNode ? getRelationshipId(hyperlinkTargetNode) : null;\n return hyperlinkId ? drawingRelationships.get(hyperlinkId)?.target ?? undefined : undefined;\n}\n\nfunction parsePictureNode(\n pictureNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n imageId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const blipNode = getFirstDescendant(pictureNode, \"blip\");\n const svgBlipNode = blipNode ? getFirstDescendant(blipNode, \"svgBlip\") : null;\n const embedId = (svgBlipNode ? getEmbeddedRelationshipId(svgBlipNode) : null) ?? (blipNode ? getEmbeddedRelationshipId(blipNode) : null);\n if (!embedId) {\n return null;\n }\n\n const mediaRelationship = drawingRelationships.get(embedId);\n if (!mediaRelationship || mediaRelationship.type !== IMAGE_REL_TYPE) {\n return null;\n }\n\n const mediaBytes = archive[mediaRelationship.target];\n if (!mediaBytes) {\n return null;\n }\n\n const nonVisualProps = getFirstDescendant(pictureNode, \"cNvPr\");\n const transform = anchorFromNodeOrFallback(pictureNode, fallbackAnchor, parentGroup);\n return {\n image: {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? pictureNode, drawingRelationships),\n id: imageId,\n mediaPath: mediaRelationship.target,\n mimeType: resolveContentType(contentTypes, mediaRelationship.target),\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n sheetIndex: workbookSheetIndex,\n src: createImageSource(mediaBytes, resolveContentType(contentTypes, mediaRelationship.target), objectUrls),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxImage,\n mediaPath: mediaRelationship.target\n };\n}\n\nfunction parseShapeNode(\n shapeNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n theme: ThemeState,\n workbookSheetIndex: number,\n shapeId: string,\n zIndex: number,\n parentGroup: GroupTransform | null\n) {\n const nonVisualProps = getFirstDescendant(shapeNode, \"cNvPr\");\n const styleNode = getFirstChild(shapeNode, \"style\");\n const transform = anchorFromNodeOrFallback(shapeNode, fallbackAnchor, parentGroup);\n const geometry = getFirstDescendant(shapeNode, \"prstGeom\")?.getAttribute(\"prst\")\n ?? (getFirstDescendant(shapeNode, \"custGeom\") ? \"custom\" : \"rect\");\n const customPath = geometry === \"custom\" ? parseCustomGeometryPath(shapeNode) : undefined;\n const geometryAdjustments = parseShapeGeometryAdjustments(shapeNode);\n return {\n anchor: transform.anchor,\n description: nonVisualProps?.getAttribute(\"descr\") ?? undefined,\n fill: parseShapeFill(shapeNode, styleNode, theme, geometry),\n flipH: transform.flipH,\n flipV: transform.flipV,\n geometry,\n geometryAdjustments,\n hyperlink: getHyperlinkTarget(nonVisualProps ?? shapeNode, drawingRelationships),\n id: shapeId,\n name: nonVisualProps?.getAttribute(\"name\") ?? undefined,\n paragraphs: parseShapeParagraphs(shapeNode, styleNode, theme),\n rotationDeg: transform.rotationDeg,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n sheetIndex: workbookSheetIndex,\n svgPath: customPath?.path,\n svgViewBox: customPath?.viewBox,\n stroke: parseShapeStroke(shapeNode, styleNode, theme),\n textBox: parseTextBox(shapeNode),\n workbookSheetIndex,\n zIndex\n } satisfies XlsxShape;\n}\n\nfunction parseAnchorContents(\n anchorNode: Element,\n fallbackAnchor: XlsxImage[\"anchor\"],\n drawingRelationships: Map<string, RelationshipRecord>,\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n objectUrls: string[],\n workbookSheetIndex: number,\n theme: ThemeState,\n ids: { image: number; shape: number; z: number },\n imageOriginsById: Map<string, WorkbookImageOrigin>,\n anchorIndex: number,\n sheetState: WorkbookSheetState | null,\n parentGroup: GroupTransform | null = null\n) {\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n\n Array.from(anchorNode.childNodes).filter(isElementNode).forEach((child) => {\n if (child.localName === \"pic\") {\n const imageId = `sheet-${workbookSheetIndex}-${ids.image}`;\n const parsed = parsePictureNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n imageId,\n ids.z++,\n parentGroup\n );\n ids.image += 1;\n if (parsed) {\n images.push(parsed.image);\n mediaPaths.add(parsed.mediaPath);\n imageOriginsById.set(imageId, {\n anchorIndex,\n workbookSheetIndex\n });\n }\n return;\n }\n\n if (child.localName === \"sp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName === \"cxnSp\") {\n shapes.push(parseShapeNode(\n child,\n fallbackAnchor,\n drawingRelationships,\n theme,\n workbookSheetIndex,\n `shape-${workbookSheetIndex}-${ids.shape++}`,\n ids.z++,\n parentGroup\n ));\n return;\n }\n\n if (child.localName !== \"grpSp\") {\n return;\n }\n\n const nextGroup = parseGroupTransform(\n child,\n parentGroup,\n fallbackAnchor,\n sheetState\n );\n const groupFallbackAnchor = rectToAbsoluteAnchor({\n cx: nextGroup.cx,\n cy: nextGroup.cy,\n x: nextGroup.x,\n y: nextGroup.y\n });\n const parsedGroup = parseAnchorContents(\n child,\n groupFallbackAnchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState,\n nextGroup\n );\n parsedGroup.images.forEach((image) => images.push(image));\n parsedGroup.shapes.forEach((shape) => shapes.push(shape));\n parsedGroup.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths,\n shapes\n };\n}\n\nfunction parseDrawingObjects(\n archive: ArchiveEntries,\n contentTypes: ContentTypesState,\n drawingPath: string,\n objectUrls: string[],\n workbookSheetIndex: number,\n zIndexBase: number,\n theme: ThemeState,\n sheetState: WorkbookSheetState | null,\n imageOriginsById: Map<string, WorkbookImageOrigin>\n) {\n const drawingXml = readArchiveText(archive, drawingPath);\n if (!drawingXml) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n return {\n images: [] as XlsxImage[],\n mediaPaths: [] as string[],\n shapes: [] as XlsxShape[]\n };\n }\n\n const drawingRelationships = parseRelationships(archive, relsPathForDocument(drawingPath), drawingPath);\n const images: XlsxImage[] = [];\n const shapes: XlsxShape[] = [];\n const mediaPaths = new Set<string>();\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const ids = {\n image: zIndexBase,\n shape: zIndexBase,\n z: zIndexBase\n };\n\n anchorNodes.forEach((anchorNode, anchorIndex) => {\n const anchor = parseAnchor(anchorNode);\n if (!anchor) {\n return;\n }\n\n const parsed = parseAnchorContents(\n anchorNode,\n anchor,\n drawingRelationships,\n archive,\n contentTypes,\n objectUrls,\n workbookSheetIndex,\n theme,\n ids,\n imageOriginsById,\n anchorIndex,\n sheetState\n );\n parsed.images.forEach((image) => images.push(image));\n parsed.shapes.forEach((shape) => shapes.push(shape));\n parsed.mediaPaths.forEach((path) => mediaPaths.add(path));\n });\n\n return {\n images,\n mediaPaths: [...mediaPaths],\n shapes\n };\n}\n\nexport function revokeWorkbookImageAssets(assets: WorkbookImageAssets | null) {\n if (!assets) {\n return;\n }\n\n for (const objectUrl of assets.objectUrls) {\n if (objectUrl.startsWith(\"blob:\")) {\n URL.revokeObjectURL(objectUrl);\n }\n }\n}\n\nfunction parseWorkbookStructureAssetsFromArchive(\n archive: ArchiveEntries,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets & {\n contentTypes: ContentTypesState;\n theme: ThemeState;\n workbookSheets: WorkbookSheetInfo[];\n} {\n const contentTypes = parseContentTypes(archive);\n const workbookSheets = parseWorkbookSheets(archive);\n const theme = parseWorkbookTheme(archive);\n const themePalette = buildThemePalette(theme);\n const { defaultFont, namedCellStyleByName, styleById, tableStyleByName } = parseWorkbookStyles(archive);\n const tableMetadataByWorkbookSheetIndex = parseWorkbookTableMetadata(archive, workbookSheets);\n return {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex: workbookSheets.map((sheet) => parseSheetState(archive, sheet.path, {\n ...options,\n defaultFont,\n themePalette\n })),\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n };\n}\n\nexport function parseWorkbookStructureAssets(\n bytes: Uint8Array,\n options?: ParseWorkbookStructureOptions\n): WorkbookStructureAssets {\n const archive = unzipSync(bytes);\n const {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n } = parseWorkbookStructureAssetsFromArchive(archive, options);\n\n return {\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nexport function parseWorkbookChartStyleAssets(bytes: Uint8Array): WorkbookChartStyleAssets {\n const archive = unzipSync(bytes);\n const {\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: []\n });\n }\n\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n sheetOrigins,\n themePalette\n };\n}\n\nexport function parseWorkbookImageAssets(bytes: Uint8Array): WorkbookImageAssets {\n const archive = unzipSync(bytes);\n const {\n contentTypes,\n namedCellStyleByName,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n theme,\n themePalette,\n workbookSheets\n } = parseWorkbookStructureAssetsFromArchive(archive);\n const objectUrls: string[] = [];\n const imagesByWorkbookSheetIndex: XlsxImage[][] = [];\n const shapesByWorkbookSheetIndex: XlsxShape[][] = [];\n const sheetOrigins: Array<WorkbookImageSheetOrigin | null> = [];\n const imageOriginsById = new Map<string, WorkbookImageOrigin>();\n\n workbookSheets.forEach((sheet, workbookSheetIndex) => {\n const sheetRelationships = parseRelationships(archive, relsPathForDocument(sheet.path), sheet.path);\n const attachments: XlsxImageAttachment[] = [];\n const imageList: XlsxImage[] = [];\n const shapeList: XlsxShape[] = [];\n let zIndexBase = 1;\n\n for (const relationship of sheetRelationships.values()) {\n if (relationship.type !== DRAWING_REL_TYPE) {\n continue;\n }\n\n const drawingPath = relationship.target;\n const drawingRelsPath = relsPathForDocument(drawingPath);\n const drawingImages = parseDrawingObjects(\n archive,\n contentTypes,\n drawingPath,\n objectUrls,\n workbookSheetIndex,\n zIndexBase,\n theme,\n sheetStatesByWorkbookSheetIndex[workbookSheetIndex] ?? null,\n imageOriginsById\n );\n imageList.push(...drawingImages.images);\n shapeList.push(...drawingImages.shapes);\n zIndexBase += drawingImages.images.length + drawingImages.shapes.length + 10;\n attachments.push({\n drawingPath,\n drawingRelsPath: archive[drawingRelsPath] ? drawingRelsPath : null,\n mediaPaths: drawingImages.mediaPaths\n });\n }\n\n imagesByWorkbookSheetIndex[workbookSheetIndex] = imageList;\n shapesByWorkbookSheetIndex[workbookSheetIndex] = shapeList;\n sheetOrigins[workbookSheetIndex] = attachments.length > 0\n ? {\n attachments,\n workbookSheetIndex\n }\n : null;\n });\n\n return {\n archive,\n imageOriginsById,\n imagesByWorkbookSheetIndex,\n namedCellStyleByName,\n objectUrls,\n shapesByWorkbookSheetIndex,\n sheetOrigins,\n sheetStatesByWorkbookSheetIndex,\n styleById,\n tableMetadataByWorkbookSheetIndex,\n tableStyleByName,\n themePalette\n };\n}\n\nfunction updateAnchorNode(anchorNode: Element, anchor: XlsxImage[\"anchor\"]) {\n if (anchor.kind === \"two-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n updateMarkerElement(getFirstChild(anchorNode, \"to\"), anchor.to);\n return;\n }\n\n if (anchor.kind === \"one-cell\") {\n updateMarkerElement(getFirstChild(anchorNode, \"from\"), anchor.from);\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n return;\n }\n\n const positionNode = getFirstChild(anchorNode, \"pos\");\n if (positionNode) {\n positionNode.setAttribute(\"x\", String(Math.max(0, Math.round(anchor.positionEmu.x))));\n positionNode.setAttribute(\"y\", String(Math.max(0, Math.round(anchor.positionEmu.y))));\n }\n const extNode = getFirstChild(anchorNode, \"ext\");\n if (extNode) {\n extNode.setAttribute(\"cx\", String(Math.max(0, Math.round(anchor.sizeEmu.cx))));\n extNode.setAttribute(\"cy\", String(Math.max(0, Math.round(anchor.sizeEmu.cy))));\n }\n}\n\nexport function updateWorkbookImageAnchor(\n assets: WorkbookImageAssets,\n imageId: string,\n anchor: XlsxImage[\"anchor\"]\n) {\n const origin = assets.imageOriginsById.get(imageId);\n if (!origin) {\n return false;\n }\n\n const attachments = assets.sheetOrigins[origin.workbookSheetIndex]?.attachments ?? [];\n for (const attachment of attachments) {\n const drawingXml = readArchiveText(assets.archive, attachment.drawingPath);\n if (!drawingXml) {\n continue;\n }\n\n const drawingDocument = parseXml(drawingXml);\n if (!drawingDocument) {\n continue;\n }\n\n const anchorNodes = createImageAnchorNodes(drawingDocument);\n const anchorNode = anchorNodes[origin.anchorIndex];\n if (!anchorNode || !getFirstChild(anchorNode, \"pic\")) {\n continue;\n }\n\n updateAnchorNode(anchorNode, anchor);\n assets.archive[attachment.drawingPath] = strToU8(serializeXml(drawingDocument));\n const imageList = assets.imagesByWorkbookSheetIndex[origin.workbookSheetIndex] ?? [];\n const imageIndex = imageList.findIndex((image) => image.id === imageId);\n if (imageIndex >= 0) {\n imageList[imageIndex] = {\n ...imageList[imageIndex],\n anchor\n };\n }\n return true;\n }\n\n return false;\n}\n\nfunction ensureRelationshipsDocument(archive: ArchiveEntries, relsPath: string) {\n const existing = readArchiveText(archive, relsPath);\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"${PKG_REL_NS}\"></Relationships>`\n );\n}\n\nfunction ensureContentTypesDocument(archive: ArchiveEntries) {\n const existing = readArchiveText(archive, \"[Content_Types].xml\");\n if (existing) {\n const parsed = parseXml(existing);\n if (parsed) {\n return parsed;\n }\n }\n\n return parseXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Types xmlns=\"${CONTENT_TYPES_NS}\"></Types>`\n );\n}\n\nfunction mergeContentTypeForPath(\n targetDocument: XMLDocument,\n originalDocument: XMLDocument | null,\n partPath: string\n) {\n const normalizedPartName = `/${normalizeArchivePath(partPath)}`;\n const targetRoot = targetDocument.documentElement;\n if (!targetRoot) {\n return;\n }\n\n const existingOverride = getLocalElements(targetDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (!existingOverride && originalDocument) {\n const sourceOverride = getLocalElements(originalDocument, \"Override\").find(\n (node) => node.getAttribute(\"PartName\") === normalizedPartName\n );\n if (sourceOverride) {\n targetRoot.appendChild(sourceOverride.cloneNode(true));\n return;\n }\n }\n\n const extension = normalizedPartName.split(\".\").pop()?.toLowerCase();\n if (!extension) {\n return;\n }\n\n const existingDefault = getLocalElements(targetDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (existingDefault) {\n return;\n }\n\n if (originalDocument) {\n const sourceDefault = getLocalElements(originalDocument, \"Default\").find(\n (node) => (node.getAttribute(\"Extension\") ?? \"\").toLowerCase() === extension\n );\n if (sourceDefault) {\n targetRoot.appendChild(sourceDefault.cloneNode(true));\n return;\n }\n }\n\n if (extension === \"xml\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/xml\");\n targetRoot.appendChild(defaultNode);\n return;\n }\n\n if (extension === \"rels\") {\n const defaultNode = targetDocument.createElementNS(CONTENT_TYPES_NS, \"Default\");\n defaultNode.setAttribute(\"Extension\", extension);\n defaultNode.setAttribute(\"ContentType\", \"application/vnd.openxmlformats-package.relationships+xml\");\n targetRoot.appendChild(defaultNode);\n }\n}\n\nfunction removeDrawingReferences(sheetDocument: XMLDocument, relDocument: XMLDocument) {\n getLocalElements(sheetDocument, \"drawing\").forEach((node) => node.remove());\n getLocalElements(relDocument, \"Relationship\")\n .filter((node) => node.getAttribute(\"Type\") === DRAWING_REL_TYPE)\n .forEach((node) => node.remove());\n}\n\nfunction nextRelationshipId(relDocument: XMLDocument) {\n const existingIds = new Set(\n getLocalElements(relDocument, \"Relationship\")\n .map((node) => node.getAttribute(\"Id\"))\n .filter((value): value is string => Boolean(value))\n );\n\n let index = 1;\n while (existingIds.has(`rIdReactXlsxImage${index}`)) {\n index += 1;\n }\n\n return `rIdReactXlsxImage${index}`;\n}\n\nfunction appendSheetDrawingReference(\n sheetDocument: XMLDocument,\n relationshipId: string\n) {\n const worksheet = sheetDocument.documentElement;\n if (!worksheet) {\n return;\n }\n\n const drawingNode = sheetDocument.createElementNS(SPREADSHEET_NS, \"drawing\");\n drawingNode.setAttributeNS(REL_NS, \"r:id\", relationshipId);\n\n const extLst = getFirstChild(worksheet, \"extLst\");\n if (extLst) {\n worksheet.insertBefore(drawingNode, extLst);\n return;\n }\n\n worksheet.appendChild(drawingNode);\n}\n\nexport function mergeWorkbookImageAssets(\n savedBytes: Uint8Array,\n sourceAssets: WorkbookImageAssets | null,\n sheetOrigins: Array<WorkbookImageSheetOrigin | null>\n) {\n if (!sourceAssets || sheetOrigins.every((origin) => !origin?.attachments.length)) {\n return cloneBytes(savedBytes);\n }\n\n try {\n const archive = unzipSync(savedBytes);\n const workbookSheets = parseWorkbookSheets(archive);\n const originalContentTypesDocument = parseXml(readArchiveText(sourceAssets.archive, \"[Content_Types].xml\") ?? \"\");\n const targetContentTypesDocument = ensureContentTypesDocument(archive);\n if (!targetContentTypesDocument) {\n return cloneBytes(savedBytes);\n }\n\n sheetOrigins.forEach((origin, workbookSheetIndex) => {\n if (!origin?.attachments.length) {\n return;\n }\n\n const currentSheet = workbookSheets[workbookSheetIndex];\n if (!currentSheet) {\n return;\n }\n\n const sheetXml = readArchiveText(archive, currentSheet.path);\n if (!sheetXml) {\n return;\n }\n\n const sheetDocument = parseXml(sheetXml);\n const relsPath = relsPathForDocument(currentSheet.path);\n const relDocument = ensureRelationshipsDocument(archive, relsPath);\n if (!sheetDocument || !relDocument) {\n return;\n }\n\n removeDrawingReferences(sheetDocument, relDocument);\n\n origin.attachments.forEach((attachment) => {\n const drawingBytes = sourceAssets.archive[attachment.drawingPath];\n if (!drawingBytes) {\n return;\n }\n\n archive[attachment.drawingPath] = cloneBytes(drawingBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingPath);\n\n if (attachment.drawingRelsPath) {\n const drawingRelsBytes = sourceAssets.archive[attachment.drawingRelsPath];\n if (drawingRelsBytes) {\n archive[attachment.drawingRelsPath] = cloneBytes(drawingRelsBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, attachment.drawingRelsPath);\n }\n }\n\n attachment.mediaPaths.forEach((mediaPath) => {\n const mediaBytes = sourceAssets.archive[mediaPath];\n if (!mediaBytes) {\n return;\n }\n\n archive[mediaPath] = cloneBytes(mediaBytes);\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, mediaPath);\n });\n\n const relationshipId = nextRelationshipId(relDocument);\n const relationshipNode = relDocument.createElementNS(PKG_REL_NS, \"Relationship\");\n relationshipNode.setAttribute(\"Id\", relationshipId);\n relationshipNode.setAttribute(\"Type\", DRAWING_REL_TYPE);\n relationshipNode.setAttribute(\"Target\", relativeArchivePath(currentSheet.path, attachment.drawingPath));\n relDocument.documentElement?.appendChild(relationshipNode);\n appendSheetDrawingReference(sheetDocument, relationshipId);\n });\n\n archive[currentSheet.path] = strToU8(serializeXml(sheetDocument));\n archive[relsPath] = strToU8(serializeXml(relDocument));\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, relsPath);\n });\n\n const hasDrawingOverride = getLocalElements(targetContentTypesDocument, \"Override\").some(\n (node) => node.getAttribute(\"ContentType\") === DRAWING_CONTENT_TYPE\n );\n if (!hasDrawingOverride) {\n for (const path of Object.keys(archive)) {\n if (path.startsWith(\"xl/drawings/\") && path.endsWith(\".xml\")) {\n mergeContentTypeForPath(targetContentTypesDocument, originalContentTypesDocument, path);\n }\n }\n }\n\n archive[\"[Content_Types].xml\"] = strToU8(serializeXml(targetContentTypesDocument));\n return zipSync(archive, { level: 6 });\n } catch {\n return cloneBytes(savedBytes);\n }\n}\n\nexport function emuToPixels(value: number) {\n return value / EMU_PER_PIXEL;\n}\n\nexport function pixelsToEmu(value: number) {\n return value * EMU_PER_PIXEL;\n}\n\nexport function pxToSheetColumnWidth(widthPx: number) {\n return (Math.max(widthPx, MIN_COL_WIDTH_PX) - 5) / 7;\n}\n\nexport function resolveSheetColumnWidthPixels(width: number, columnWidthCharacterWidthPx?: number) {\n return sheetColumnWidthToPixels(width, columnWidthCharacterWidthPx);\n}\n\nexport function resolveSheetRowHeightPixels(height: number) {\n return Math.max(Math.round(height * 1.33), MIN_ROW_HEIGHT_PX);\n}\n\nexport function resolveRenderedSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx) + (showGridLines ? resolveDeviceGridlineThicknessPx() : 0);\n}\n\nexport function resolveContentSheetAxisPixels(sizePx: number, showGridLines = true) {\n return Math.max(0, sizePx - (showGridLines ? resolveDeviceGridlineThicknessPx() : 0));\n}\n\nfunction markerFromOffset(offsetPx: number, getSizePx: (index: number) => number) {\n let remaining = Math.max(0, offsetPx);\n let index = 0;\n while (remaining > 0) {\n const size = Math.max(1, getSizePx(index));\n if (remaining < size) {\n break;\n }\n remaining -= size;\n index += 1;\n }\n\n return {\n index,\n offsetPx: remaining\n };\n}\n\nexport function rectToImageAnchor(\n rect: XlsxImageRect,\n currentAnchor: XlsxImage[\"anchor\"],\n options: {\n contentOffsetLeft: number;\n contentOffsetTop: number;\n getColumnWidthPx: (col: number) => number;\n getRowHeightPx: (row: number) => number;\n }\n): XlsxImage[\"anchor\"] {\n const contentLeft = Math.max(0, rect.left - options.contentOffsetLeft);\n const contentTop = Math.max(0, rect.top - options.contentOffsetTop);\n const contentRight = Math.max(contentLeft + 1, rect.left + rect.width - options.contentOffsetLeft);\n const contentBottom = Math.max(contentTop + 1, rect.top + rect.height - options.contentOffsetTop);\n\n if (currentAnchor.kind === \"absolute\") {\n return {\n kind: \"absolute\",\n positionEmu: {\n x: pixelsToEmu(contentLeft),\n y: pixelsToEmu(contentTop)\n },\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const fromCol = markerFromOffset(contentLeft, options.getColumnWidthPx);\n const fromRow = markerFromOffset(contentTop, options.getRowHeightPx);\n if (currentAnchor.kind === \"one-cell\") {\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"one-cell\",\n sizeEmu: {\n cx: pixelsToEmu(rect.width),\n cy: pixelsToEmu(rect.height)\n }\n };\n }\n\n const toCol = markerFromOffset(contentRight, options.getColumnWidthPx);\n const toRow = markerFromOffset(contentBottom, options.getRowHeightPx);\n return {\n from: {\n col: fromCol.index,\n colOffsetEmu: pixelsToEmu(fromCol.offsetPx),\n row: fromRow.index,\n rowOffsetEmu: pixelsToEmu(fromRow.offsetPx)\n },\n kind: \"two-cell\",\n to: {\n col: toCol.index,\n colOffsetEmu: pixelsToEmu(toCol.offsetPx),\n row: toRow.index,\n rowOffsetEmu: pixelsToEmu(toRow.offsetPx)\n }\n };\n}\n\nexport function resizeImageRect(\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition,\n deltaX: number,\n deltaY: number,\n minimumSize = 16\n) {\n let left = rect.left;\n let top = rect.top;\n let width = rect.width;\n let height = rect.height;\n\n if (handle.includes(\"w\")) {\n left += deltaX;\n width -= deltaX;\n }\n if (handle.includes(\"e\")) {\n width += deltaX;\n }\n if (handle.includes(\"n\")) {\n top += deltaY;\n height -= deltaY;\n }\n if (handle.includes(\"s\")) {\n height += deltaY;\n }\n\n if (width < minimumSize) {\n if (handle.includes(\"w\")) {\n left -= minimumSize - width;\n }\n width = minimumSize;\n }\n if (height < minimumSize) {\n if (handle.includes(\"n\")) {\n top -= minimumSize - height;\n }\n height = minimumSize;\n }\n\n return { height, left, top, width };\n}\n","let wasmModulePromise: Promise<typeof import(\"@dukelib/sheets-wasm\")> | null = null;\n\nexport function getSheetsWasmModule() {\n if (!wasmModulePromise) {\n wasmModulePromise = import(\"@dukelib/sheets-wasm\").then(async (mod) => {\n try {\n const wasmAsset = await import(\"@dukelib/sheets-wasm/duke_sheets_wasm_bg.wasm?url\");\n await mod.default(wasmAsset.default);\n } catch {\n await mod.default();\n }\n return mod;\n });\n }\n\n return wasmModulePromise;\n}\n","import type { XlsxChart, XlsxChartsheet, XlsxSheetData, XlsxTable, XlsxWorkbookTab } from \"./types\";\n\ntype WorkerMessage =\n | {\n id: number;\n type: \"load\";\n payload: {\n buffer: ArrayBuffer;\n };\n }\n | {\n id: number;\n type: \"parseCharts\";\n payload: {\n buffer: ArrayBuffer;\n };\n }\n | {\n id: number;\n type: \"getCellSnapshot\";\n payload: {\n workbookSheetIndex: number;\n row: number;\n col: number;\n };\n }\n | {\n id: number;\n type: \"getRowsBatch\";\n payload: {\n workbookSheetIndex: number;\n startRow: number;\n rowCount: number;\n };\n };\n\ntype WorkerSuccessMessage =\n | {\n id: number;\n success: true;\n result: {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n };\n }\n | {\n id: number;\n success: true;\n result: {\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n sheets: XlsxSheetData[];\n tablesByWorkbookSheetIndex: XlsxTable[][];\n tabs: XlsxWorkbookTab[];\n };\n }\n | {\n id: number;\n success: true;\n result: {\n displayValue: string;\n formula: string;\n };\n }\n | {\n id: number;\n success: true;\n result: unknown[] | null;\n };\n\ntype WorkerErrorMessage = {\n id: number;\n success: false;\n error: string;\n};\n\ntype WorkerResponse = WorkerSuccessMessage | WorkerErrorMessage;\n\ntype PendingRequest = {\n reject: (error: Error) => void;\n resolve: (value: unknown) => void;\n};\n\nexport class XlsxWorkerClient {\n private readonly worker: Worker;\n\n private nextRequestId = 1;\n\n private readonly pendingRequests = new Map<number, PendingRequest>();\n\n constructor() {\n this.worker = new Worker(new URL(\"./xlsx-worker.js\", import.meta.url), { type: \"module\" });\n this.worker.addEventListener(\"message\", this.handleMessage);\n this.worker.addEventListener(\"error\", this.handleError);\n }\n\n dispose() {\n this.worker.removeEventListener(\"message\", this.handleMessage);\n this.worker.removeEventListener(\"error\", this.handleError);\n this.worker.terminate();\n for (const request of this.pendingRequests.values()) {\n request.reject(new Error(\"Worker was disposed.\"));\n }\n this.pendingRequests.clear();\n }\n\n loadWorkbook(buffer: ArrayBuffer) {\n const workerBuffer = cloneArrayBufferForTransfer(buffer);\n return this.request<{\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n sheets: XlsxSheetData[];\n tablesByWorkbookSheetIndex: XlsxTable[][];\n tabs: XlsxWorkbookTab[];\n }>({\n id: 0,\n payload: { buffer: workerBuffer },\n type: \"load\"\n }, [workerBuffer]);\n }\n\n getCellSnapshot(workbookSheetIndex: number, row: number, col: number) {\n return this.request<{\n displayValue: string;\n formula: string;\n }>({\n id: 0,\n payload: { col, row, workbookSheetIndex },\n type: \"getCellSnapshot\"\n });\n }\n\n parseCharts(buffer: ArrayBuffer) {\n const workerBuffer = cloneArrayBufferForTransfer(buffer);\n return this.request<{\n chartsByWorkbookSheetIndex: XlsxChart[][];\n chartsheets: XlsxChartsheet[];\n tabs: XlsxWorkbookTab[];\n }>({\n id: 0,\n payload: { buffer: workerBuffer },\n type: \"parseCharts\"\n }, [workerBuffer]);\n }\n\n getRowsBatch(workbookSheetIndex: number, startRow: number, rowCount: number) {\n return this.request<unknown[] | null>({\n id: 0,\n payload: { rowCount, startRow, workbookSheetIndex },\n type: \"getRowsBatch\"\n });\n }\n\n private request<TResult>(message: WorkerMessage, transfer: Transferable[] = []) {\n return new Promise<TResult>((resolve, reject) => {\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n this.pendingRequests.set(id, { reject, resolve: resolve as (value: unknown) => void });\n this.worker.postMessage({ ...message, id }, transfer);\n });\n }\n\n private readonly handleError = () => {\n for (const request of this.pendingRequests.values()) {\n request.reject(new Error(\"Worker request failed.\"));\n }\n this.pendingRequests.clear();\n };\n\n private readonly handleMessage = (event: MessageEvent<WorkerResponse>) => {\n const message = event.data;\n const request = this.pendingRequests.get(message.id);\n if (!request) {\n return;\n }\n\n this.pendingRequests.delete(message.id);\n if (!message.success) {\n request.reject(new Error(message.error));\n return;\n }\n\n request.resolve(message.result);\n };\n}\n\nfunction cloneArrayBufferForTransfer(buffer: ArrayBuffer) {\n return buffer.slice(0);\n}\n","import * as React from \"react\";\nimport type { Worksheet } from \"@dukelib/sheets-wasm\";\nimport {\n elementScroll,\n observeElementOffset,\n observeElementRect,\n useVirtualizer,\n type Rect,\n type Virtualizer\n} from \"@tanstack/react-virtual\";\nimport { resolveWorkbookColor, resolveWorkbookFillStyle } from \"./colors\";\nimport { useXlsxViewerController, XlsxFileSizeLimitExceededError } from \"./controller\";\nimport { MemoChartSvg } from \"./chart-renderer\";\nimport {\n emuToPixels,\n resizeImageRect,\n resolveRenderedSheetAxisPixels,\n resolveSheetColumnWidthPixels,\n resolveSheetRowHeightPixels\n} from \"./images\";\nimport type {\n XlsxChart,\n XlsxChartsheet,\n XlsxCellAddress,\n XlsxCellRange,\n XlsxImage,\n XlsxImageRect,\n XlsxImageRenderProps,\n XlsxImageResizeHandlePosition,\n XlsxImageSelectionRenderProps,\n XlsxShape,\n XlsxSheetData,\n XlsxThemePalette,\n XlsxTable,\n XlsxTableColumn,\n XlsxTableHeaderMenuRenderProps,\n XlsxViewerCharts,\n XlsxViewerTables,\n XlsxViewerController,\n XlsxViewerEditing,\n XlsxViewerImages,\n XlsxViewerProps,\n XlsxViewerProviderProps,\n XlsxViewerSelection,\n XlsxViewerZoom\n} from \"./types\";\n\nconst DEFAULT_ROW_HEIGHT = 24;\nconst DEFAULT_COL_WIDTH = 80;\nconst HEADER_HEIGHT = 24;\nconst ROW_HEADER_WIDTH = 40;\nconst INTERNAL_CLIPBOARD_MIME = \"application/x-react-xlsx-range+json\";\nconst MIN_OPEN_GRID_ROWS = 200;\nconst MIN_OPEN_GRID_COLS = 50;\nconst OPEN_GRID_ROW_PADDING = 120;\nconst OPEN_GRID_COL_PADDING = 24;\nconst INITIAL_WORKER_GRID_ROWS = 600;\nconst INITIAL_WORKER_GRID_COLS = 120;\nconst WORKER_GRID_GROW_ROWS = 2000;\nconst WORKER_GRID_GROW_COLS = 120;\nconst WORKER_GRID_GROW_THRESHOLD_ROWS = 160;\nconst WORKER_GRID_GROW_THRESHOLD_COLS = 24;\nconst OPEN_GRID_ROW_GROWTH = 200;\nconst OPEN_GRID_COL_GROWTH = 24;\nconst OPEN_GRID_VERTICAL_EDGE_PX = 600;\nconst OPEN_GRID_HORIZONTAL_EDGE_PX = 480;\nconst SELECTION_DRAG_THRESHOLD_PX = 4;\nconst IMAGE_MIN_SIZE_PX = 16;\nconst IMAGE_HANDLE_SIZE_PX = 10;\nconst SHEET_SURFACE = \"#ffffff\";\nconst SHEET_GRIDLINE = \"#d9d9d9\";\nconst DEFAULT_CELL_PADDING = \"0 4px\";\nconst IMAGE_HANDLE_POSITIONS: XlsxImageResizeHandlePosition[] = [\"nw\", \"n\", \"ne\", \"e\", \"se\", \"s\", \"sw\", \"w\"];\n\nconst IMAGE_HANDLE_CURSOR: Record<XlsxImageResizeHandlePosition, React.CSSProperties[\"cursor\"]> = {\n e: \"ew-resize\",\n n: \"ns-resize\",\n ne: \"nesw-resize\",\n nw: \"nwse-resize\",\n s: \"ns-resize\",\n se: \"nwse-resize\",\n sw: \"nesw-resize\",\n w: \"ew-resize\"\n};\n\nfunction observeZoomedElementRect(\n instance: Virtualizer<HTMLDivElement, Element>,\n zoomFactor: number,\n cb: (rect: Rect) => void\n) {\n return observeElementRect(instance, (rect) => {\n cb({\n height: rect.height / zoomFactor,\n width: rect.width / zoomFactor\n });\n });\n}\n\nfunction observeZoomedElementOffset(\n instance: Virtualizer<HTMLDivElement, Element>,\n zoomFactor: number,\n cb: (offset: number, isScrolling: boolean) => void\n) {\n return observeElementOffset(instance, (offset, isScrolling) => {\n cb(offset / zoomFactor, isScrolling);\n });\n}\n\nfunction scrollToZoomedOffset(\n offset: number,\n zoomFactor: number,\n options: Parameters<typeof elementScroll>[1],\n instance: Virtualizer<HTMLDivElement, Element>\n) {\n elementScroll(offset * zoomFactor, options, instance);\n}\n\nfunction formatZoomScale(zoomScale: number) {\n return `${Math.round(zoomScale)}%`;\n}\n\ntype ViewerPalette = {\n border: string;\n buttonSurface: string;\n buttonText: string;\n canvas: string;\n danger: string;\n headerSurface: string;\n mutedSurface: string;\n mutedText: string;\n rowHeaderSurface: string;\n shadow: string;\n sheetActiveSurface: string;\n sheetActiveText: string;\n sheetInactiveSurface: string;\n sheetInactiveText: string;\n strongBorder: string;\n subtleSurface: string;\n surface: string;\n text: string;\n toolbarSurface: string;\n};\n\nconst LIGHT_PALETTE: ViewerPalette = {\n border: \"#e4e4e7\",\n buttonSurface: \"#ffffff\",\n buttonText: \"#18181b\",\n canvas: \"#fafafa\",\n danger: \"#dc2626\",\n headerSurface: \"#f4f4f5\",\n mutedSurface: \"#f5f5f5\",\n mutedText: \"#71717a\",\n rowHeaderSurface: \"#f4f4f5\",\n shadow: \"0 1px 2px rgba(0, 0, 0, 0.04)\",\n sheetActiveSurface: \"#ffffff\",\n sheetActiveText: \"#18181b\",\n sheetInactiveSurface: \"#e4e4e7\",\n sheetInactiveText: \"#52525b\",\n strongBorder: \"#d4d4d8\",\n subtleSurface: \"#fafafa\",\n surface: \"#ffffff\",\n text: \"#18181b\",\n toolbarSurface: \"#f5f5f5\"\n};\n\nconst DARK_PALETTE: ViewerPalette = {\n border: \"rgba(255, 255, 255, 0.10)\",\n buttonSurface: \"rgba(255, 255, 255, 0.06)\",\n buttonText: \"#f4f4f5\",\n canvas: \"#09090b\",\n danger: \"#f87171\",\n headerSurface: \"#18181b\",\n mutedSurface: \"#111113\",\n mutedText: \"#a1a1aa\",\n rowHeaderSurface: \"#18181b\",\n shadow: \"0 1px 2px rgba(0, 0, 0, 0.28)\",\n sheetActiveSurface: \"#27272a\",\n sheetActiveText: \"#fafafa\",\n sheetInactiveSurface: \"#18181b\",\n sheetInactiveText: \"#a1a1aa\",\n strongBorder: \"rgba(255, 255, 255, 0.16)\",\n subtleSurface: \"#101012\",\n surface: \"#111113\",\n text: \"#f4f4f5\",\n toolbarSurface: \"#101012\"\n};\n\nfunction parseRgbColor(color: string) {\n const match = /^#?([0-9a-f]{6})$/i.exec(color);\n if (!match) {\n return null;\n }\n return {\n blue: Number.parseInt(match[1].slice(4, 6), 16),\n green: Number.parseInt(match[1].slice(2, 4), 16),\n red: Number.parseInt(match[1].slice(0, 2), 16)\n };\n}\n\nfunction mixRgbColor(color: string, mixWith: string, ratio: number) {\n const base = parseRgbColor(color);\n const target = parseRgbColor(mixWith);\n if (!base || !target) {\n return color;\n }\n const clamped = Math.max(0, Math.min(1, ratio));\n const mixChannel = (left: number, right: number) => Math.round(left + (right - left) * clamped);\n return `#${[\n mixChannel(base.red, target.red),\n mixChannel(base.green, target.green),\n mixChannel(base.blue, target.blue)\n ].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction lightenColor(color: string, ratio: number) {\n return mixRgbColor(color, \"#ffffff\", ratio);\n}\n\nfunction darkenColor(color: string, ratio: number) {\n return mixRgbColor(color, \"#000000\", ratio);\n}\n\nconst ViewerContext = React.createContext<XlsxViewerController | null>(null);\n\ntype WorksheetWithRowsBatch = Worksheet & {\n getRowsBatch?: (startRow: number, maxRows: number, options?: unknown) => unknown;\n};\n\ntype WorksheetBatchCellEntry = {\n col?: unknown;\n formula?: unknown;\n hyperlink?: unknown;\n isMergedSecondary?: unknown;\n mergeSpan?: unknown;\n style?: unknown;\n value?: unknown;\n};\n\ntype WorksheetBatchRowEntry = {\n cells?: unknown;\n index?: unknown;\n};\n\ntype BatchedCellData = {\n formula: string | null;\n hyperlink: {\n location?: string;\n target?: string;\n tooltip?: string;\n } | null;\n isMergedSecondary: boolean;\n mergeSpan: { colSpan?: number; rowSpan?: number } | null;\n style: Record<string, unknown> | null;\n value: string;\n};\n\ntype WorksheetBatchWindow = {\n cells: Map<string, BatchedCellData>;\n endRow: number;\n startRow: number;\n};\n\nfunction classNames(...values: Array<string | false | null | undefined>) {\n return values.filter(Boolean).join(\" \");\n}\n\nfunction resolveDarkModeSurface(themePalette: XlsxSheetData[\"themePalette\"] | undefined, palette: ViewerPalette) {\n return \"hsl(225 4% 6%)\";\n}\n\nfunction resolveSheetSurface(sheet: XlsxSheetData | null, palette: ViewerPalette) {\n return paletteIsDark(palette)\n ? resolveDarkModeSurface(sheet?.themePalette, palette)\n : sheet?.themePalette.colorsByIndex[0] ?? SHEET_SURFACE;\n}\n\nfunction normalizeRange(range: XlsxCellRange): XlsxCellRange {\n return {\n start: {\n col: Math.min(range.start.col, range.end.col),\n row: Math.min(range.start.row, range.end.row)\n },\n end: {\n col: Math.max(range.start.col, range.end.col),\n row: Math.max(range.start.row, range.end.row)\n }\n };\n}\n\nfunction parseCellAddressAttribute(value: string | null): XlsxCellAddress | null {\n if (!value) {\n return null;\n }\n\n const [rowValue, colValue] = value.split(\":\");\n const row = Number(rowValue);\n const col = Number(colValue);\n if (!Number.isInteger(row) || !Number.isInteger(col) || row < 0 || col < 0) {\n return null;\n }\n\n return { row, col };\n}\n\nfunction isSameCell(left: XlsxCellAddress | null, right: XlsxCellAddress | null) {\n return Boolean(left && right && left.row === right.row && left.col === right.col);\n}\n\nfunction isCellInRange(cell: XlsxCellAddress, range: XlsxCellRange | null) {\n if (!range) {\n return false;\n }\n\n const normalized = normalizeRange(range);\n return (\n cell.row >= normalized.start.row &&\n cell.row <= normalized.end.row &&\n cell.col >= normalized.start.col &&\n cell.col <= normalized.end.col\n );\n}\n\nfunction rangesEqual(left: XlsxCellRange | null, right: XlsxCellRange | null) {\n if (!left || !right) {\n return left === right;\n }\n\n const normalizedLeft = normalizeRange(left);\n const normalizedRight = normalizeRange(right);\n return (\n normalizedLeft.start.row === normalizedRight.start.row &&\n normalizedLeft.start.col === normalizedRight.start.col &&\n normalizedLeft.end.row === normalizedRight.end.row &&\n normalizedLeft.end.col === normalizedRight.end.col\n );\n}\n\nfunction isPrintableKey(event: React.KeyboardEvent) {\n return event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey;\n}\n\nfunction sumSegment(values: number[], startIndex: number, endIndex: number) {\n let total = 0;\n for (let index = startIndex; index <= endIndex; index += 1) {\n total += values[index] ?? 0;\n }\n return total;\n}\n\nfunction findIndexForOffset(values: number[], offset: number) {\n if (offset <= 0) {\n return 0;\n }\n\n let currentOffset = 0;\n for (let index = 0; index < values.length; index += 1) {\n currentOffset += values[index] ?? 0;\n if (offset < currentOffset) {\n return index;\n }\n }\n\n return values.length > 0 ? values.length - 1 : -1;\n}\n\nfunction buildPrefixSums(values: number[]) {\n const prefix = new Array(values.length + 1).fill(0);\n for (let index = 0; index < values.length; index += 1) {\n prefix[index + 1] = prefix[index] + (values[index] ?? 0);\n }\n return prefix;\n}\n\nfunction sumPrefixRange(prefixSums: number[], startIndex: number, endIndex: number) {\n if (startIndex > endIndex) {\n return 0;\n }\n\n return (prefixSums[endIndex + 1] ?? 0) - (prefixSums[startIndex] ?? 0);\n}\n\nfunction buildStickyOffsets(actualIndices: number[], sizesByActualIndex: number[], leadingOffset: number) {\n const offsets = new Map<number, number>();\n let nextOffset = leadingOffset;\n\n for (const actualIndex of actualIndices) {\n offsets.set(actualIndex, nextOffset);\n nextOffset += sizesByActualIndex[actualIndex] ?? 0;\n }\n\n return offsets;\n}\n\nfunction findIndexForOffsetPrefix(prefixSums: number[], offset: number) {\n const count = prefixSums.length - 1;\n if (count <= 0) {\n return -1;\n }\n if (offset <= 0) {\n return 0;\n }\n if (offset >= prefixSums[count]) {\n return count - 1;\n }\n\n let low = 0;\n let high = count - 1;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if ((prefixSums[mid + 1] ?? 0) <= offset) {\n low = mid + 1;\n } else {\n high = mid;\n }\n }\n\n return low;\n}\n\nfunction clampContentOffset(offset: number, maxOffset: number) {\n if (!Number.isFinite(offset) || maxOffset <= 0) {\n return 0;\n }\n\n return Math.max(0, Math.min(offset, Math.max(0, maxOffset - 0.001)));\n}\n\nfunction resolveOpenGridExtent(maxUsedIndex: number, minimum: number, padding: number) {\n return Math.max(maxUsedIndex + 1 + padding, minimum);\n}\n\nfunction buildVisibleAxisIndices(\n precomputed: number[],\n displayLimit: number,\n maxUsedIndex: number,\n hiddenIndices?: Set<number>\n) {\n if (displayLimit <= 0) {\n return [];\n }\n\n if (precomputed.length === 0) {\n const visible: number[] = [];\n const usedLimit = Math.min(displayLimit, Math.max(0, maxUsedIndex + 1));\n for (let index = 0; index < usedLimit; index += 1) {\n if (!hiddenIndices?.has(index)) {\n visible.push(index);\n }\n }\n for (let index = usedLimit; index < displayLimit; index += 1) {\n visible.push(index);\n }\n return visible;\n }\n\n const visible = precomputed.filter((value) => value < displayLimit);\n const appendStart = Math.max(0, maxUsedIndex + 1);\n for (let index = appendStart; index < displayLimit; index += 1) {\n visible.push(index);\n }\n return visible;\n}\n\nfunction resolveInitialDisplayExtent(\n maxUsedIndex: number,\n minimum: number,\n padding: number,\n isWorkerBacked: boolean,\n initialCap: number\n) {\n const fullExtent = resolveOpenGridExtent(maxUsedIndex, minimum, padding);\n return isWorkerBacked ? Math.min(fullExtent, Math.max(minimum, initialCap)) : fullExtent;\n}\n\nfunction sumBeforeActualIndex(actualIndices: number[], sizes: number[], actualIndex: number) {\n let total = 0;\n for (let index = 0; index < actualIndices.length; index += 1) {\n if ((actualIndices[index] ?? 0) >= actualIndex) {\n break;\n }\n total += sizes[index] ?? 0;\n }\n return total;\n}\n\nfunction resolveAxisStartOffset(\n actualIndex: number,\n actualIndices: number[],\n sizes: number[],\n indexByActual?: Map<number, number>,\n prefixSums?: number[],\n actualPrefixSums?: number[]\n) {\n if (actualPrefixSums && actualIndex >= 0 && actualIndex < actualPrefixSums.length) {\n return actualPrefixSums[actualIndex] ?? 0;\n }\n\n const visibleIndex = indexByActual?.get(actualIndex);\n if (visibleIndex !== undefined && prefixSums) {\n return prefixSums[visibleIndex] ?? 0;\n }\n\n return sumBeforeActualIndex(actualIndices, sizes, actualIndex);\n}\n\nfunction resolveAnchoredRect(\n anchor: XlsxImage[\"anchor\"] | XlsxShape[\"anchor\"],\n visibleRows: number[],\n visibleCols: number[],\n rowHeights: number[],\n colWidths: number[],\n options?: {\n actualColPrefixSums?: number[];\n actualRowPrefixSums?: number[];\n colIndexByActual?: Map<number, number>;\n colPrefixSums?: number[];\n rowIndexByActual?: Map<number, number>;\n rowPrefixSums?: number[];\n }\n): XlsxImageRect {\n const resolveMarkerLeft = (col: number, colOffsetEmu: number) =>\n ROW_HEADER_WIDTH +\n resolveAxisStartOffset(\n col,\n visibleCols,\n colWidths,\n options?.colIndexByActual,\n options?.colPrefixSums,\n options?.actualColPrefixSums\n ) +\n emuToPixels(colOffsetEmu);\n const resolveMarkerTop = (row: number, rowOffsetEmu: number) =>\n HEADER_HEIGHT +\n resolveAxisStartOffset(\n row,\n visibleRows,\n rowHeights,\n options?.rowIndexByActual,\n options?.rowPrefixSums,\n options?.actualRowPrefixSums\n ) +\n emuToPixels(rowOffsetEmu);\n\n if (anchor.kind === \"absolute\") {\n return {\n height: Math.max(1, emuToPixels(anchor.sizeEmu.cy)),\n left: ROW_HEADER_WIDTH + emuToPixels(anchor.positionEmu.x),\n top: HEADER_HEIGHT + emuToPixels(anchor.positionEmu.y),\n width: Math.max(1, emuToPixels(anchor.sizeEmu.cx))\n };\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n height: Math.max(1, emuToPixels(anchor.sizeEmu.cy)),\n left: resolveMarkerLeft(anchor.from.col, anchor.from.colOffsetEmu),\n top: resolveMarkerTop(anchor.from.row, anchor.from.rowOffsetEmu),\n width: Math.max(1, emuToPixels(anchor.sizeEmu.cx))\n };\n }\n\n const left = resolveMarkerLeft(anchor.from.col, anchor.from.colOffsetEmu);\n const top = resolveMarkerTop(anchor.from.row, anchor.from.rowOffsetEmu);\n const right = resolveMarkerLeft(anchor.to.col, anchor.to.colOffsetEmu);\n const bottom = resolveMarkerTop(anchor.to.row, anchor.to.rowOffsetEmu);\n\n return {\n height: Math.max(1, bottom - top),\n left,\n top,\n width: Math.max(1, right - left)\n };\n}\n\nfunction resolveImageRect(\n image: XlsxImage,\n visibleRows: number[],\n visibleCols: number[],\n rowHeights: number[],\n colWidths: number[],\n options?: {\n actualColPrefixSums?: number[];\n actualRowPrefixSums?: number[];\n colIndexByActual?: Map<number, number>;\n colPrefixSums?: number[];\n rowIndexByActual?: Map<number, number>;\n rowPrefixSums?: number[];\n }\n): XlsxImageRect {\n return resolveAnchoredRect(image.anchor, visibleRows, visibleCols, rowHeights, colWidths, options);\n}\n\nfunction resolveImageAnchorExtents(image: XlsxImage) {\n if (image.anchor.kind === \"absolute\") {\n return { maxCol: 0, maxRow: 0 };\n }\n\n if (image.anchor.kind === \"one-cell\") {\n return {\n maxCol: image.anchor.from.col,\n maxRow: image.anchor.from.row\n };\n }\n\n return {\n maxCol: Math.max(image.anchor.from.col, image.anchor.to.col),\n maxRow: Math.max(image.anchor.from.row, image.anchor.to.row)\n };\n}\n\nfunction resolveAnchoredBounds(anchor: XlsxImage[\"anchor\"] | XlsxShape[\"anchor\"]) {\n if (anchor.kind === \"absolute\") {\n return null;\n }\n\n if (anchor.kind === \"one-cell\") {\n return {\n maxCol: anchor.from.col,\n maxRow: anchor.from.row,\n minCol: anchor.from.col,\n minRow: anchor.from.row\n };\n }\n\n return {\n maxCol: Math.max(anchor.from.col, anchor.to.col),\n maxRow: Math.max(anchor.from.row, anchor.to.row),\n minCol: Math.min(anchor.from.col, anchor.to.col),\n minRow: Math.min(anchor.from.row, anchor.to.row)\n };\n}\n\nfunction resolveShapeAnchorExtents(shape: XlsxShape) {\n if (shape.anchor.kind === \"absolute\") {\n return { maxCol: 0, maxRow: 0 };\n }\n\n if (shape.anchor.kind === \"one-cell\") {\n return {\n maxCol: shape.anchor.from.col,\n maxRow: shape.anchor.from.row\n };\n }\n\n return {\n maxCol: Math.max(shape.anchor.from.col, shape.anchor.to.col),\n maxRow: Math.max(shape.anchor.from.row, shape.anchor.to.row)\n };\n}\n\nfunction resolveChartAnchorExtents(chart: XlsxChart) {\n if (chart.anchor.kind === \"absolute\") {\n return { maxCol: 0, maxRow: 0 };\n }\n\n if (chart.anchor.kind === \"one-cell\") {\n return {\n maxCol: chart.anchor.from.col,\n maxRow: chart.anchor.from.row\n };\n }\n\n return {\n maxCol: Math.max(chart.anchor.from.col, chart.anchor.to.col),\n maxRow: Math.max(chart.anchor.from.row, chart.anchor.to.row)\n };\n}\n\nfunction rectIntersectsViewport(\n rect: XlsxImageRect,\n viewport: { height: number; left: number; top: number; width: number },\n overscan = 240\n) {\n const viewportLeft = viewport.left - overscan;\n const viewportTop = viewport.top - overscan;\n const viewportRight = viewport.left + viewport.width + overscan;\n const viewportBottom = viewport.top + viewport.height + overscan;\n const rectRight = rect.left + rect.width;\n const rectBottom = rect.top + rect.height;\n return rectRight >= viewportLeft\n && rect.left <= viewportRight\n && rectBottom >= viewportTop\n && rect.top <= viewportBottom;\n}\n\ntype FrozenDrawingPane = \"corner\" | \"left\" | \"scroll\" | \"top\";\ntype DrawingViewport = {\n height: number;\n left: number;\n top: number;\n width: number;\n};\n\nfunction resolveFrozenDrawingPane(\n rect: XlsxImageRect,\n frozenRows: number[],\n frozenCols: number[],\n actualRowHeights: number[],\n actualColWidths: number[],\n freezePanes: XlsxSheetData[\"freezePanes\"] | null,\n stickyTopByRow: Map<number, number>,\n stickyLeftByCol: Map<number, number>\n): FrozenDrawingPane {\n const frozenPaneBottom =\n freezePanes?.row && freezePanes.row > 0 && frozenRows.length > 0\n ? frozenRows.reduce(\n (max, row) => Math.max(max, (stickyTopByRow.get(row) ?? HEADER_HEIGHT) + (actualRowHeights[row] ?? DEFAULT_ROW_HEIGHT)),\n HEADER_HEIGHT\n )\n : null;\n const frozenPaneRight =\n freezePanes?.col && freezePanes.col > 0 && frozenCols.length > 0\n ? frozenCols.reduce(\n (max, col) => Math.max(max, (stickyLeftByCol.get(col) ?? ROW_HEADER_WIDTH) + (actualColWidths[col] ?? DEFAULT_COL_WIDTH)),\n ROW_HEADER_WIDTH\n )\n : null;\n\n const freezeTop = frozenPaneBottom !== null && rect.top + rect.height <= frozenPaneBottom + 0.5;\n const freezeLeft = frozenPaneRight !== null && rect.left + rect.width <= frozenPaneRight + 0.5;\n\n if (freezeTop && freezeLeft) {\n return \"corner\";\n }\n if (freezeTop) {\n return \"top\";\n }\n if (freezeLeft) {\n return \"left\";\n }\n return \"scroll\";\n}\n\nfunction buildShapeContainerStyle(shape: XlsxShape, rect: XlsxImageRect): React.CSSProperties {\n const borderWidth = shape.stroke?.none ? 0 : Math.max(0, shape.stroke?.widthPx ?? 0);\n const strokeColor = shape.stroke?.color ?? \"transparent\";\n const fillColor = shape.fill?.none ? \"transparent\" : (shape.fill?.color ?? \"transparent\");\n const hasVisibleText = shape.paragraphs.some((paragraph) => paragraph.runs.some((run) => run.text.trim().length > 0));\n const transformParts = [\n shape.rotationDeg ? `rotate(${shape.rotationDeg}deg)` : \"\",\n shape.flipH ? \"scaleX(-1)\" : \"\",\n shape.flipV ? \"scaleY(-1)\" : \"\"\n ].filter(Boolean);\n\n let borderRadius: React.CSSProperties[\"borderRadius\"] = 0;\n if (shape.geometry === \"ellipse\") {\n borderRadius = \"9999px\";\n } else if (shape.geometry === \"roundRect\") {\n borderRadius = 12;\n }\n\n return {\n alignItems:\n shape.textBox?.verticalAlign === \"middle\"\n ? \"center\"\n : shape.textBox?.verticalAlign === \"bottom\"\n ? \"flex-end\"\n : \"flex-start\",\n backgroundColor: fillColor,\n border: borderWidth > 0 ? `${borderWidth}px solid ${strokeColor}` : \"none\",\n borderRadius,\n boxSizing: \"border-box\",\n display: \"flex\",\n flexDirection: \"column\",\n height: rect.height,\n justifyContent: \"flex-start\",\n left: rect.left,\n opacity: Math.min(shape.fill?.opacity ?? 1, shape.stroke?.opacity ?? 1),\n overflow: hasVisibleText ? \"hidden\" : \"visible\",\n position: \"absolute\",\n top: rect.top,\n transform: transformParts.join(\" \") || undefined,\n transformOrigin: \"center center\",\n width: rect.width,\n zIndex: shape.zIndex\n };\n}\n\nfunction clampPercent(value: number, fallback: number) {\n if (!Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.min(100, value));\n}\n\nfunction resolveShapeAdjustment(shape: XlsxShape, name: string, fallback: number) {\n const rawValue = shape.geometryAdjustments?.[name];\n if (typeof rawValue !== \"number\") {\n return fallback;\n }\n return clampPercent(rawValue / 1000, fallback);\n}\n\nfunction buildClosedPath(points: Array<[number, number]>) {\n if (points.length === 0) {\n return \"\";\n }\n\n return points\n .map(([x, y], index) => `${index === 0 ? \"M\" : \"L\"} ${x} ${y}`)\n .join(\" \") + \" Z\";\n}\n\nfunction pointOnCircle(radius: number, angleDeg: number, center = 50): [number, number] {\n const radians = angleDeg * (Math.PI / 180);\n return [\n center + Math.cos(radians) * radius,\n center + Math.sin(radians) * radius\n ];\n}\n\nfunction buildRegularPolygonPath(sides: number, rotationDeg = -90, radius = 50) {\n return buildClosedPath(\n Array.from({ length: sides }, (_, index) => pointOnCircle(radius, rotationDeg + (360 / sides) * index))\n );\n}\n\nfunction buildStarPath(points: number, innerRadius: number, rotationDeg = -90, outerRadius = 50) {\n return buildClosedPath(\n Array.from({ length: points * 2 }, (_, index) => {\n const radius = index % 2 === 0 ? outerRadius : innerRadius;\n return pointOnCircle(radius, rotationDeg + (360 / (points * 2)) * index);\n })\n );\n}\n\nfunction buildRoundRectPath(radius: number) {\n const cornerRadius = Math.max(0, Math.min(50, radius));\n const edge = 100 - cornerRadius;\n return [\n `M ${cornerRadius} 0`,\n `L ${edge} 0`,\n `Q 100 0 100 ${cornerRadius}`,\n `L 100 ${edge}`,\n `Q 100 100 ${edge} 100`,\n `L ${cornerRadius} 100`,\n `Q 0 100 0 ${edge}`,\n `L 0 ${cornerRadius}`,\n `Q 0 0 ${cornerRadius} 0`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction buildEllipsePath() {\n return \"M 50 0 A 50 50 0 1 1 49.999 0 Z\";\n}\n\nfunction buildPiePath(startAngleDeg: number, endAngleDeg: number) {\n const [startX, startY] = pointOnCircle(50, startAngleDeg);\n const [endX, endY] = pointOnCircle(50, endAngleDeg);\n const sweep = endAngleDeg >= startAngleDeg ? endAngleDeg - startAngleDeg : 360 - (startAngleDeg - endAngleDeg);\n const largeArcFlag = sweep > 180 ? 1 : 0;\n return [\n \"M 50 50\",\n `L ${startX} ${startY}`,\n `A 50 50 0 ${largeArcFlag} 1 ${endX} ${endY}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction buildChordPath(startAngleDeg: number, endAngleDeg: number) {\n const [startX, startY] = pointOnCircle(50, startAngleDeg);\n const [endX, endY] = pointOnCircle(50, endAngleDeg);\n const sweep = endAngleDeg >= startAngleDeg ? endAngleDeg - startAngleDeg : 360 - (startAngleDeg - endAngleDeg);\n const largeArcFlag = sweep > 180 ? 1 : 0;\n return [\n `M ${startX} ${startY}`,\n `A 50 50 0 ${largeArcFlag} 1 ${endX} ${endY}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction buildPlusPath(thickness: number) {\n const arm = Math.max(10, Math.min(40, thickness));\n const inner = 50 - arm / 2;\n const outer = 50 + arm / 2;\n return buildClosedPath([\n [inner, 0],\n [outer, 0],\n [outer, inner],\n [100, inner],\n [100, outer],\n [outer, outer],\n [outer, 100],\n [inner, 100],\n [inner, outer],\n [0, outer],\n [0, inner],\n [inner, inner]\n ]);\n}\n\nfunction buildPentagonArrowPath() {\n return buildClosedPath([\n [0, 20],\n [70, 20],\n [70, 0],\n [100, 50],\n [70, 100],\n [70, 80],\n [0, 80]\n ]);\n}\n\nfunction buildChevronArrowPath() {\n return buildClosedPath([\n [0, 20],\n [54, 20],\n [54, 0],\n [100, 50],\n [54, 100],\n [54, 80],\n [0, 80],\n [32, 50]\n ]);\n}\n\nfunction buildNotchedRightArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 36);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 20);\n const notchDepth = Math.min(24, headLength * 0.7);\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n const headStart = 100 - headLength;\n return buildClosedPath([\n [0, bodyTop],\n [headStart, bodyTop],\n [headStart, 0],\n [100, 50],\n [headStart, 100],\n [headStart, bodyBottom],\n [notchDepth, bodyBottom],\n [0, 50],\n [notchDepth, bodyTop]\n ]);\n}\n\nfunction buildStripedRightArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 34);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 20);\n const stripeWidth = 12;\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n const headStart = 100 - headLength;\n return [\n `M 0 ${bodyTop} L ${stripeWidth} ${bodyTop} L ${stripeWidth} ${bodyBottom} L 0 ${bodyBottom} Z`,\n buildClosedPath([\n [stripeWidth * 1.6, bodyTop],\n [headStart, bodyTop],\n [headStart, 0],\n [100, 50],\n [headStart, 100],\n [headStart, bodyBottom],\n [stripeWidth * 1.6, bodyBottom]\n ])\n ].join(\" \");\n}\n\nfunction buildLeftUpArrowPath(shape: XlsxShape) {\n const stemWidth = resolveShapeAdjustment(shape, \"adj1\", 28);\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 34);\n return buildClosedPath([\n [100, 100 - stemWidth],\n [stemWidth, 100 - stemWidth],\n [stemWidth, 100],\n [0, 50],\n [stemWidth, 0],\n [stemWidth, headLength],\n [100, headLength]\n ]);\n}\n\nfunction buildBentUpArrowPath(shape: XlsxShape) {\n const stemWidth = resolveShapeAdjustment(shape, \"adj1\", 26);\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 28);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj3\", 12);\n const verticalCenter = 50;\n const bodyTop = verticalCenter - shaftHalf;\n const bodyBottom = verticalCenter + shaftHalf;\n return buildClosedPath([\n [0, bodyTop],\n [100 - stemWidth, bodyTop],\n [100 - stemWidth, headLength],\n [100 - stemWidth * 0.5, headLength],\n [100, 0],\n [100 - stemWidth * 1.5, headLength],\n [100 - stemWidth, headLength],\n [100 - stemWidth, 100],\n [100 - stemWidth * 2, 100],\n [100 - stemWidth * 2, bodyBottom],\n [0, bodyBottom]\n ]);\n}\n\nfunction buildUturnArrowPath(shape: XlsxShape) {\n const stemWidth = resolveShapeAdjustment(shape, \"adj1\", 22);\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 28);\n return buildClosedPath([\n [100, 100],\n [100, 55],\n [45, 55],\n [45, 100],\n [0, 50],\n [45, 0],\n [45, 45],\n [100 - stemWidth, 45],\n [100 - stemWidth, 100]\n ]);\n}\n\nfunction buildLeftRightUpArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 22);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 16);\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n const bodyLeft = 50 - shaftHalf;\n const bodyRight = 50 + shaftHalf;\n return buildClosedPath([\n [headLength, bodyTop],\n [bodyLeft, bodyTop],\n [bodyLeft, headLength],\n [0, headLength],\n [50, 0],\n [100, headLength],\n [bodyRight, headLength],\n [bodyRight, bodyTop],\n [100 - headLength, bodyTop],\n [100 - headLength, 0],\n [100, 50],\n [100 - headLength, 100],\n [100 - headLength, bodyBottom],\n [headLength, bodyBottom],\n [headLength, 100],\n [0, 50],\n [headLength, 0]\n ]);\n}\n\nfunction buildQuadArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 22);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 14);\n const bodyLeft = 50 - shaftHalf;\n const bodyRight = 50 + shaftHalf;\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n return buildClosedPath([\n [bodyLeft, headLength],\n [headLength, headLength],\n [headLength, bodyTop],\n [0, 50],\n [headLength, 100 - bodyTop],\n [headLength, bodyBottom],\n [bodyLeft, bodyBottom],\n [bodyLeft, 100 - headLength],\n [bodyTop, 100 - headLength],\n [50, 100],\n [100 - bodyTop, 100 - headLength],\n [bodyRight, 100 - headLength],\n [bodyRight, bodyBottom],\n [100 - headLength, bodyBottom],\n [100 - headLength, 100 - bodyTop],\n [100, 50],\n [100 - headLength, bodyTop],\n [100 - headLength, headLength],\n [bodyRight, headLength],\n [bodyRight, bodyTop],\n [100 - bodyTop, headLength],\n [50, 0],\n [bodyTop, headLength],\n [bodyLeft, headLength]\n ]);\n}\n\nfunction buildHeartPath() {\n return [\n \"M 50 92\",\n \"C 18 72 0 52 0 28\",\n \"C 0 10 14 0 28 0\",\n \"C 38 0 46 6 50 16\",\n \"C 54 6 62 0 72 0\",\n \"C 86 0 100 10 100 28\",\n \"C 100 52 82 72 50 92\",\n \"Z\"\n ].join(\" \");\n}\n\nfunction buildLightningBoltPath() {\n return buildClosedPath([\n [42, 0],\n [10, 58],\n [38, 58],\n [24, 100],\n [90, 36],\n [58, 36],\n [72, 0]\n ]);\n}\n\nfunction buildTeardropPath() {\n return [\n \"M 50 0\",\n \"C 20 24 0 44 0 68\",\n \"C 0 86 14 100 32 100\",\n \"C 60 100 82 78 82 50\",\n \"C 82 26 68 10 50 0\",\n \"Z\"\n ].join(\" \");\n}\n\nfunction buildCloudPath() {\n return [\n \"M 22 70\",\n \"C 8 70 0 62 0 50\",\n \"C 0 40 6 32 18 30\",\n \"C 20 16 30 8 44 8\",\n \"C 54 8 62 12 68 20\",\n \"C 72 14 80 12 88 14\",\n \"C 98 18 100 26 100 34\",\n \"C 100 44 94 50 88 52\",\n \"C 92 66 82 76 68 76\",\n \"C 62 84 52 88 42 88\",\n \"C 32 88 24 82 22 70\",\n \"Z\"\n ].join(\" \");\n}\n\nfunction buildRightArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 38);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 20);\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n const headStart = 100 - headLength;\n return buildClosedPath([\n [0, bodyTop],\n [headStart, bodyTop],\n [headStart, 0],\n [100, 50],\n [headStart, 100],\n [headStart, bodyBottom],\n [0, bodyBottom]\n ]);\n}\n\nfunction buildLeftArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 38);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 20);\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n const headEnd = headLength;\n return buildClosedPath([\n [100, bodyTop],\n [headEnd, bodyTop],\n [headEnd, 0],\n [0, 50],\n [headEnd, 100],\n [headEnd, bodyBottom],\n [100, bodyBottom]\n ]);\n}\n\nfunction buildUpArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 38);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 20);\n const bodyLeft = 50 - shaftHalf;\n const bodyRight = 50 + shaftHalf;\n const headEnd = headLength;\n return buildClosedPath([\n [bodyLeft, 100],\n [bodyLeft, headEnd],\n [0, headEnd],\n [50, 0],\n [100, headEnd],\n [bodyRight, headEnd],\n [bodyRight, 100]\n ]);\n}\n\nfunction buildDownArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 38);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 20);\n const bodyLeft = 50 - shaftHalf;\n const bodyRight = 50 + shaftHalf;\n const headStart = 100 - headLength;\n return buildClosedPath([\n [bodyLeft, 0],\n [bodyLeft, headStart],\n [0, headStart],\n [50, 100],\n [100, headStart],\n [bodyRight, headStart],\n [bodyRight, 0]\n ]);\n}\n\nfunction buildLeftRightArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 24);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 18);\n const bodyTop = 50 - shaftHalf;\n const bodyBottom = 50 + shaftHalf;\n return buildClosedPath([\n [headLength, bodyTop],\n [100 - headLength, bodyTop],\n [100 - headLength, 0],\n [100, 50],\n [100 - headLength, 100],\n [100 - headLength, bodyBottom],\n [headLength, bodyBottom],\n [headLength, 100],\n [0, 50],\n [headLength, 0]\n ]);\n}\n\nfunction buildUpDownArrowPath(shape: XlsxShape) {\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 24);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj1\", 18);\n const bodyLeft = 50 - shaftHalf;\n const bodyRight = 50 + shaftHalf;\n return buildClosedPath([\n [bodyLeft, headLength],\n [bodyLeft, 100 - headLength],\n [0, 100 - headLength],\n [50, 100],\n [100, 100 - headLength],\n [bodyRight, 100 - headLength],\n [bodyRight, headLength],\n [100, headLength],\n [50, 0],\n [0, headLength]\n ]);\n}\n\nfunction buildBentArrowPath(shape: XlsxShape) {\n const stemWidth = resolveShapeAdjustment(shape, \"adj1\", 25);\n const headLength = resolveShapeAdjustment(shape, \"adj2\", 27);\n const shaftHalf = resolveShapeAdjustment(shape, \"adj3\", 12.5);\n const bendY = resolveShapeAdjustment(shape, \"adj4\", 43.75);\n const bodyTop = bendY - shaftHalf;\n const bodyBottom = bendY + shaftHalf;\n const headStart = 100 - headLength;\n return buildClosedPath([\n [0, bodyTop],\n [headStart, bodyTop],\n [headStart, 0],\n [100, bendY],\n [headStart, 100],\n [headStart, bodyBottom],\n [stemWidth, bodyBottom],\n [stemWidth, 100],\n [0, 100]\n ]);\n}\n\nfunction buildPresetShapePath(shape: XlsxShape) {\n switch (shape.geometry) {\n case \"arc\":\n return {\n path: \"M 8 74 C 18 24 82 24 92 74\",\n viewBox: { width: 100, height: 100 }\n };\n case \"bentArrow\":\n return {\n path: buildBentArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"bentUpArrow\":\n return {\n path: buildBentUpArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"blockArc\":\n return {\n path: \"M 12 78 A 38 38 0 1 1 78 12 L 62 28 A 16 16 0 1 0 28 62 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"can\":\n return {\n path: \"M 18 14 C 18 6 82 6 82 14 L 82 86 C 82 94 18 94 18 86 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"chevron\":\n return {\n path: \"M 0 0 L 62 0 L 100 50 L 62 100 L 0 100 L 38 50 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"chevronArrow\":\n return {\n path: buildChevronArrowPath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"chord\":\n return {\n path: buildChordPath(-30, 210),\n viewBox: { width: 100, height: 100 }\n };\n case \"cloud\":\n case \"cloudCallout\":\n return {\n path: buildCloudPath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"diamond\":\n case \"flowChartDecision\":\n return {\n path: \"M 50 0 L 100 50 L 50 100 L 0 50 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"downArrow\":\n return {\n path: buildDownArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"line\":\n return {\n path: \"M 0 0 L 100 100\",\n viewBox: { width: 100, height: 100 }\n };\n case \"ellipse\":\n case \"flowChartTerminator\":\n return {\n path: buildEllipsePath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartAlternateProcess\":\n case \"flowChartDelay\":\n case \"roundRect\":\n return {\n path: buildRoundRectPath(resolveShapeAdjustment(shape, \"adj\", 18)),\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartCollate\":\n return {\n path: \"M 0 0 L 100 0 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartData\":\n case \"flowChartInputOutput\":\n return {\n path: \"M 24 0 L 100 0 L 76 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartDocument\":\n return {\n path: \"M 0 0 L 100 0 L 100 82 C 78 70 60 94 40 82 C 24 72 12 88 0 82 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartMagneticDisk\":\n return {\n path: \"M 18 14 C 18 6 82 6 82 14 L 82 86 C 82 94 18 94 18 86 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartManualInput\":\n return {\n path: \"M 16 0 L 100 0 L 84 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartPreparation\":\n case \"hexagon\":\n return {\n path: \"M 25 0 L 75 0 L 100 50 L 75 100 L 25 100 L 0 50 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"flowChartProcess\":\n case \"rect\":\n return {\n path: \"M 0 0 L 100 0 L 100 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"heart\":\n return {\n path: buildHeartPath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"heptagon\":\n return {\n path: buildRegularPolygonPath(7),\n viewBox: { width: 100, height: 100 }\n };\n case \"homePlate\":\n case \"flowChartOffpageConnector\":\n return {\n path: \"M 0 0 L 70 0 L 100 50 L 70 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"leftArrow\":\n return {\n path: buildLeftArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"leftBracket\":\n return {\n path: \"M 72 0 L 28 0 L 28 100 L 72 100\",\n viewBox: { width: 100, height: 100 }\n };\n case \"leftBrace\":\n return {\n path: \"M 82 0 C 46 0 52 24 52 38 C 52 46 46 50 24 50 C 46 50 52 54 52 62 C 52 76 46 100 82 100\",\n viewBox: { width: 100, height: 100 }\n };\n case \"leftRightArrowCallout\":\n return {\n path: buildLeftRightArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"leftRightArrow\":\n return {\n path: buildLeftRightArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"leftRightUpArrow\":\n return {\n path: buildLeftRightUpArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"leftUpArrow\":\n return {\n path: buildLeftUpArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"lightningBolt\":\n return {\n path: buildLightningBoltPath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"mathPlus\":\n case \"plus\":\n return {\n path: buildPlusPath(resolveShapeAdjustment(shape, \"adj\", 26)),\n viewBox: { width: 100, height: 100 }\n };\n case \"cross\":\n return {\n path: buildPlusPath(resolveShapeAdjustment(shape, \"adj\", 22)),\n viewBox: { width: 100, height: 100 }\n };\n case \"mathMinus\":\n case \"minus\":\n return {\n path: \"M 0 40 L 100 40 L 100 60 L 0 60 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"mathMultiply\":\n case \"multiply\":\n return {\n path: \"M 18 0 L 50 32 L 82 0 L 100 18 L 68 50 L 100 82 L 82 100 L 50 68 L 18 100 L 0 82 L 32 50 L 0 18 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"mathDivide\":\n return {\n path: \"M 0 42 L 100 42 L 100 58 L 0 58 Z M 50 12 A 8 8 0 1 1 49.999 12 Z M 50 88 A 8 8 0 1 1 49.999 88 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"moon\":\n return {\n path: \"M 70 6 C 42 10 22 34 22 62 C 22 80 32 94 48 100 C 20 98 0 76 0 48 C 0 20 20 0 48 0 C 56 0 64 2 70 6 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"notchedRightArrow\":\n return {\n path: buildNotchedRightArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"octagon\":\n return {\n path: \"M 30 0 L 70 0 L 100 30 L 100 70 L 70 100 L 30 100 L 0 70 L 0 30 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"parallelogram\":\n return {\n path: \"M 24 0 L 100 0 L 76 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"pentagon\":\n return {\n path: \"M 50 0 L 100 38 L 81 100 L 19 100 L 0 38 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"pie\":\n case \"pieWedge\":\n return {\n path: buildPiePath(-35, 225),\n viewBox: { width: 100, height: 100 }\n };\n case \"pentagonArrow\":\n return {\n path: buildPentagonArrowPath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"plaque\":\n return {\n path: \"M 12 0 L 88 0 L 100 12 L 100 88 L 88 100 L 12 100 L 0 88 L 0 12 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"quadArrow\":\n return {\n path: buildQuadArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"rightArrow\":\n return {\n path: buildRightArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"rightArrowCallout\":\n return {\n path: \"M 0 18 L 62 18 L 62 0 L 100 50 L 62 100 L 62 82 L 0 82 L 0 18 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"rightBracket\":\n return {\n path: \"M 28 0 L 72 0 L 72 100 L 28 100\",\n viewBox: { width: 100, height: 100 }\n };\n case \"downArrowCallout\":\n return {\n path: \"M 18 0 L 82 0 L 82 58 L 100 58 L 50 100 L 0 58 L 18 58 L 18 0 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"rightBrace\":\n return {\n path: \"M 18 0 C 54 0 48 24 48 38 C 48 46 54 50 76 50 C 54 50 48 54 48 62 C 48 76 54 100 18 100\",\n viewBox: { width: 100, height: 100 }\n };\n case \"round1Rect\":\n return {\n path: \"M 18 0 L 100 0 L 100 100 L 18 100 Q 0 100 0 82 L 0 18 Q 0 0 18 0 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"round2DiagRect\":\n return {\n path: \"M 18 0 L 100 0 L 100 82 Q 100 100 82 100 L 0 100 L 0 18 Q 0 0 18 0 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"round2SameRect\":\n return {\n path: \"M 18 0 L 82 0 Q 100 0 100 18 L 100 82 Q 100 100 82 100 L 0 100 L 0 0 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"decagon\":\n return {\n path: buildRegularPolygonPath(10),\n viewBox: { width: 100, height: 100 }\n };\n case \"dodecagon\":\n return {\n path: buildRegularPolygonPath(12),\n viewBox: { width: 100, height: 100 }\n };\n case \"rtTriangle\":\n return {\n path: \"M 0 0 L 100 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"star4\":\n return {\n path: buildStarPath(4, 20),\n viewBox: { width: 100, height: 100 }\n };\n case \"star5\":\n return {\n path: buildStarPath(5, 21),\n viewBox: { width: 100, height: 100 }\n };\n case \"star6\":\n return {\n path: buildStarPath(6, 23),\n viewBox: { width: 100, height: 100 }\n };\n case \"star7\":\n return {\n path: buildStarPath(7, 24),\n viewBox: { width: 100, height: 100 }\n };\n case \"star8\":\n return {\n path: buildStarPath(8, 25),\n viewBox: { width: 100, height: 100 }\n };\n case \"star10\":\n return {\n path: buildStarPath(10, 26),\n viewBox: { width: 100, height: 100 }\n };\n case \"star12\":\n return {\n path: buildStarPath(12, 26),\n viewBox: { width: 100, height: 100 }\n };\n case \"star16\":\n return {\n path: buildStarPath(16, 27),\n viewBox: { width: 100, height: 100 }\n };\n case \"star24\":\n return {\n path: buildStarPath(24, 28),\n viewBox: { width: 100, height: 100 }\n };\n case \"star32\":\n return {\n path: buildStarPath(32, 29),\n viewBox: { width: 100, height: 100 }\n };\n case \"stripedRightArrow\":\n return {\n path: buildStripedRightArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"sun\":\n return {\n path: buildStarPath(12, 36),\n viewBox: { width: 100, height: 100 }\n };\n case \"teardrop\":\n return {\n path: buildTeardropPath(),\n viewBox: { width: 100, height: 100 }\n };\n case \"triangle\":\n return {\n path: \"M 50 0 L 100 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"trapezoid\":\n return {\n path: \"M 20 0 L 80 0 L 100 100 L 0 100 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"upArrow\":\n return {\n path: buildUpArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"upArrowCallout\":\n return {\n path: \"M 50 0 L 100 42 L 82 42 L 82 100 L 18 100 L 18 42 L 0 42 L 50 0 Z\",\n viewBox: { width: 100, height: 100 }\n };\n case \"upDownArrow\":\n return {\n path: buildUpDownArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"upDownArrowCallout\":\n return {\n path: buildUpDownArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n case \"uturnArrow\":\n return {\n path: buildUturnArrowPath(shape),\n viewBox: { width: 100, height: 100 }\n };\n default:\n return null;\n }\n}\n\nfunction resolveShapeVector(shape: XlsxShape) {\n if (shape.svgPath && shape.svgViewBox) {\n return {\n path: shape.svgPath,\n viewBox: shape.svgViewBox\n };\n }\n\n return buildPresetShapePath(shape);\n}\n\nfunction resolveShapeLineEndMarker(\n type: string | undefined,\n markerId: string,\n color: string,\n strokeWidth: number,\n rect: XlsxImageRect,\n viewBox: { height: number; width: number }\n) {\n if (type !== \"triangle\") {\n return null;\n }\n\n const pxToUserSpace = ((viewBox.width / Math.max(1, rect.width)) + (viewBox.height / Math.max(1, rect.height))) / 2;\n const markerSize = Math.max(pxToUserSpace * 8, pxToUserSpace * strokeWidth * 4);\n return (\n <marker\n id={markerId}\n key={markerId}\n markerHeight={markerSize}\n markerUnits=\"userSpaceOnUse\"\n markerWidth={markerSize}\n orient=\"auto-start-reverse\"\n overflow=\"visible\"\n refX={markerSize}\n refY={markerSize / 2}\n viewBox={`0 0 ${markerSize} ${markerSize}`}\n >\n <path d={`M 0 0 L ${markerSize} ${markerSize / 2} L 0 ${markerSize} z`} fill={color} />\n </marker>\n );\n}\n\nfunction renderShapeParagraph(\n paragraph: XlsxShape[\"paragraphs\"][number],\n index: number,\n fallbackAlign: React.CSSProperties[\"textAlign\"] = \"left\",\n textScale = 1\n) {\n return (\n <p\n key={index}\n style={{\n margin: 0,\n textAlign: paragraph.align ?? fallbackAlign,\n whiteSpace: \"pre-wrap\"\n }}\n >\n {paragraph.runs.map((run, runIndex) => (\n <span\n key={runIndex}\n style={{\n color: run.color,\n fontFamily: run.fontFamily,\n fontSize: run.fontSizePt ? `${run.fontSizePt * textScale}pt` : undefined,\n fontStyle: run.italic ? \"italic\" : undefined,\n fontWeight: run.bold ? 700 : undefined,\n textDecoration: run.underline ? \"underline\" : undefined\n }}\n >\n {run.text}\n </span>\n ))}\n </p>\n );\n}\n\nfunction clampImageRect(rect: XlsxImageRect): XlsxImageRect {\n return {\n height: Math.max(IMAGE_MIN_SIZE_PX, rect.height),\n left: Math.max(ROW_HEADER_WIDTH, rect.left),\n top: Math.max(HEADER_HEIGHT, rect.top),\n width: Math.max(IMAGE_MIN_SIZE_PX, rect.width)\n };\n}\n\nfunction resolveImageHandleStyle(position: XlsxImageResizeHandlePosition, stroke: string, surface: string): React.CSSProperties {\n const offset = IMAGE_HANDLE_SIZE_PX / 2;\n const style: React.CSSProperties = {\n backgroundColor: surface,\n border: `1px solid ${stroke}`,\n borderRadius: 6,\n cursor: IMAGE_HANDLE_CURSOR[position],\n height: IMAGE_HANDLE_SIZE_PX,\n pointerEvents: \"auto\",\n position: \"absolute\",\n width: IMAGE_HANDLE_SIZE_PX\n };\n\n if (position.includes(\"n\")) {\n style.top = -offset;\n }\n if (position.includes(\"s\")) {\n style.bottom = -offset;\n }\n if (position.includes(\"w\")) {\n style.left = -offset;\n }\n if (position.includes(\"e\")) {\n style.right = -offset;\n }\n if (position === \"n\" || position === \"s\") {\n style.left = `calc(50% - ${offset}px)`;\n }\n if (position === \"e\" || position === \"w\") {\n style.top = `calc(50% - ${offset}px)`;\n }\n\n return style;\n}\n\nfunction resolveIsDarkMode() {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n const classList = document.documentElement.classList;\n if (classList.contains(\"dark\")) {\n return true;\n }\n if (classList.contains(\"light\")) {\n return false;\n }\n\n return typeof window !== \"undefined\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n}\n\nfunction useViewerPalette() {\n const [isDarkMode, setIsDarkMode] = React.useState(resolveIsDarkMode);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const update = () => setIsDarkMode(resolveIsDarkMode());\n const mediaQuery = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const observer = new MutationObserver(update);\n\n observer.observe(document.documentElement, {\n attributeFilter: [\"class\", \"data-theme\"],\n attributes: true\n });\n\n mediaQuery.addEventListener?.(\"change\", update);\n update();\n\n return () => {\n observer.disconnect();\n mediaQuery.removeEventListener?.(\"change\", update);\n };\n }, []);\n\n return isDarkMode ? DARK_PALETTE : LIGHT_PALETTE;\n}\n\nfunction columnLabel(col: number): string {\n let label = \"\";\n let nextValue = col;\n\n while (nextValue >= 0) {\n label = String.fromCharCode(65 + (nextValue % 26)) + label;\n nextValue = Math.floor(nextValue / 26) - 1;\n }\n\n return label;\n}\n\nfunction cellAddressToA1(cell: XlsxCellAddress): string {\n return `${columnLabel(cell.col)}${cell.row + 1}`;\n}\n\nfunction parseA1CellReference(reference: string): XlsxCellAddress | null {\n const match = /^([A-Z]+)(\\d+)$/i.exec(reference.trim());\n if (!match) {\n return null;\n }\n\n const [, columnPart, rowPart] = match;\n let col = 0;\n for (const char of columnPart.toUpperCase()) {\n col = col * 26 + (char.charCodeAt(0) - 64);\n }\n\n return {\n col: col - 1,\n row: Number(rowPart) - 1\n };\n}\n\nfunction resolveInheritedCellStyle(sheet: XlsxSheetData | null | undefined, row: number, col: number) {\n if (!sheet) {\n return null;\n }\n\n const rowStyleId = sheet.rowStyleIds[row];\n if (rowStyleId !== undefined) {\n return sheet.styleById[rowStyleId] ?? null;\n }\n\n const colStyleId = sheet.colStyleIds[col];\n if (colStyleId !== undefined) {\n return sheet.styleById[colStyleId] ?? null;\n }\n\n return null;\n}\n\nfunction parseInternalSheetLink(target?: string | null) {\n if (!target) {\n return null;\n }\n\n const normalized = target.startsWith(\"#\") ? target.slice(1) : target;\n const separatorIndex = normalized.lastIndexOf(\"!\");\n if (separatorIndex < 0) {\n return null;\n }\n\n const rawSheetName = normalized.slice(0, separatorIndex).trim();\n const rawCellRef = normalized.slice(separatorIndex + 1).trim();\n const cell = parseA1CellReference(rawCellRef);\n if (!cell) {\n return null;\n }\n\n const sheetName = rawSheetName.startsWith(\"'\") && rawSheetName.endsWith(\"'\")\n ? rawSheetName.slice(1, -1).replace(/''/g, \"'\")\n : rawSheetName;\n\n return {\n cell,\n sheetName\n };\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/"/g, \"\\\"\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction mapBorder(edge: { style: string; color?: Record<string, unknown> }, themePalette?: XlsxSheetData[\"themePalette\"]): string {\n const color = resolveWorkbookColor(edge.color as Record<string, unknown> | undefined, themePalette) ?? \"#000\";\n const widthMap: Record<string, string> = {\n dashed: \"1px\",\n dotted: \"1px\",\n double: \"3px\",\n hair: \"1px\",\n medium: \"2px\",\n thick: \"3px\",\n thin: \"1px\"\n };\n const styleMap: Record<string, string> = {\n dashDot: \"dashed\",\n dashDotDot: \"dotted\",\n dashed: \"dashed\",\n dotted: \"dotted\",\n double: \"double\",\n hair: \"solid\",\n medium: \"solid\",\n mediumDashDot: \"dashed\",\n mediumDashDotDot: \"dotted\",\n mediumDashed: \"dashed\",\n slantDashDot: \"dashed\",\n thick: \"solid\",\n thin: \"solid\"\n };\n\n return `${widthMap[edge.style] ?? \"1px\"} ${styleMap[edge.style] ?? \"solid\"} ${color}`;\n}\n\nfunction paletteIsDark(palette: ViewerPalette) {\n return palette.surface === DARK_PALETTE.surface;\n}\n\nfunction parseHexColor(color: string): [number, number, number] | null {\n const normalized = color.trim().toLowerCase();\n const hexMatch = /^#([0-9a-f]{6})$/.exec(normalized);\n if (hexMatch) {\n const hex = hexMatch[1];\n return [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16)\n ];\n }\n\n const rgbMatch = /^rgb\\(\\s*(\\d{1,3})\\s*[,\\s]\\s*(\\d{1,3})\\s*[,\\s]\\s*(\\d{1,3})\\s*\\)$/.exec(normalized);\n if (rgbMatch) {\n return [\n Math.max(0, Math.min(255, Number.parseInt(rgbMatch[1], 10))),\n Math.max(0, Math.min(255, Number.parseInt(rgbMatch[2], 10))),\n Math.max(0, Math.min(255, Number.parseInt(rgbMatch[3], 10)))\n ];\n }\n\n const hslMatch = /^hsl\\(\\s*(-?\\d+(?:\\.\\d+)?)\\s*(?:deg)?(?:\\s+|,\\s*)(\\d+(?:\\.\\d+)?)%(?:\\s+|,\\s*)(\\d+(?:\\.\\d+)?)%\\s*\\)$/.exec(normalized);\n if (!hslMatch) {\n return null;\n }\n\n const hue = ((Number.parseFloat(hslMatch[1]) % 360) + 360) % 360 / 360;\n const saturation = Math.max(0, Math.min(1, Number.parseFloat(hslMatch[2]) / 100));\n const lightness = Math.max(0, Math.min(1, Number.parseFloat(hslMatch[3]) / 100));\n return hslToRgb(hue, saturation, lightness);\n}\n\nfunction relativeLuminance(color: string) {\n const rgb = parseHexColor(color);\n if (!rgb) {\n return null;\n }\n\n const [red, green, blue] = rgb.map((channel) => {\n const normalized = channel / 255;\n return normalized <= 0.03928 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;\n });\n\n return 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n}\n\nfunction contrastRatio(foreground: string, background: string) {\n const foregroundLuminance = relativeLuminance(foreground);\n const backgroundLuminance = relativeLuminance(background);\n if (foregroundLuminance === null || backgroundLuminance === null) {\n return null;\n }\n\n const lighter = Math.max(foregroundLuminance, backgroundLuminance);\n const darker = Math.min(foregroundLuminance, backgroundLuminance);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\nfunction resolveReadableTextColor(\n requestedColor: string | null,\n backgroundColor: string,\n palette: ViewerPalette\n) {\n if (!paletteIsDark(palette)) {\n return requestedColor ?? \"#000000\";\n }\n\n if (!requestedColor) {\n return palette.text;\n }\n\n const requestedContrast = contrastRatio(requestedColor, backgroundColor);\n const paletteContrast = contrastRatio(palette.text, backgroundColor);\n if (requestedContrast !== null && requestedContrast >= 4.5) {\n return requestedColor;\n }\n if (paletteContrast !== null && (requestedContrast === null || paletteContrast > requestedContrast)) {\n return palette.text;\n }\n\n return requestedColor;\n}\n\nfunction rgbToHsl(red: number, green: number, blue: number): [number, number, number] {\n const normalizedRed = red / 255;\n const normalizedGreen = green / 255;\n const normalizedBlue = blue / 255;\n const max = Math.max(normalizedRed, normalizedGreen, normalizedBlue);\n const min = Math.min(normalizedRed, normalizedGreen, normalizedBlue);\n const lightness = (max + min) / 2;\n\n if (max === min) {\n return [0, 0, lightness];\n }\n\n const delta = max - min;\n const saturation = lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);\n let hue = 0;\n\n switch (max) {\n case normalizedRed:\n hue = (normalizedGreen - normalizedBlue) / delta + (normalizedGreen < normalizedBlue ? 6 : 0);\n break;\n case normalizedGreen:\n hue = (normalizedBlue - normalizedRed) / delta + 2;\n break;\n default:\n hue = (normalizedRed - normalizedGreen) / delta + 4;\n break;\n }\n\n return [hue / 6, saturation, lightness];\n}\n\nfunction hueToRgb(p: number, q: number, t: number) {\n let nextT = t;\n if (nextT < 0) {\n nextT += 1;\n }\n if (nextT > 1) {\n nextT -= 1;\n }\n if (nextT < 1 / 6) {\n return p + (q - p) * 6 * nextT;\n }\n if (nextT < 1 / 2) {\n return q;\n }\n if (nextT < 2 / 3) {\n return p + (q - p) * (2 / 3 - nextT) * 6;\n }\n return p;\n}\n\nfunction hslToRgb(hue: number, saturation: number, lightness: number): [number, number, number] {\n if (saturation === 0) {\n const gray = Math.round(lightness * 255);\n return [gray, gray, gray];\n }\n\n const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;\n const p = 2 * lightness - q;\n\n return [\n Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n Math.round(hueToRgb(p, q, hue) * 255),\n Math.round(hueToRgb(p, q, hue - 1 / 3) * 255)\n ];\n}\n\nfunction rgbToHex(red: number, green: number, blue: number) {\n return `#${[red, green, blue]\n .map((channel) => channel.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nfunction invertHexLightness(color: string): string | null {\n const rgb = parseHexColor(color);\n if (!rgb) {\n return null;\n }\n\n const [hue, saturation, lightness] = rgbToHsl(rgb[0], rgb[1], rgb[2]);\n const [nextRed, nextGreen, nextBlue] = hslToRgb(hue, saturation, 1 - lightness);\n return rgbToHex(nextRed, nextGreen, nextBlue);\n}\n\nfunction escapeCssFontFamily(name: string) {\n return /[\\s\"'(),]/.test(name) ? `\"${name.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"` : name;\n}\n\nfunction resolveSpreadsheetThemeFont(\n font: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette\n) {\n const scheme = typeof font?.scheme === \"string\" ? font.scheme : null;\n if (scheme === \"major\") {\n return themePalette?.majorLatinFont;\n }\n if (scheme === \"minor\") {\n return themePalette?.minorLatinFont;\n }\n return undefined;\n}\n\nfunction buildSpreadsheetFontFamily(\n font: Record<string, unknown> | undefined,\n themePalette?: XlsxThemePalette\n) {\n const candidates = [\n typeof font?.name === \"string\" ? font.name.trim() : \"\",\n resolveSpreadsheetThemeFont(font, themePalette)?.trim() ?? \"\"\n ].filter((value, index, array) => value.length > 0 && array.indexOf(value) === index);\n\n if (candidates.length === 0) {\n return undefined;\n }\n\n const primaryFont = candidates[0]?.toLowerCase();\n if (primaryFont === \"calibri\") {\n return [\n \"Calibri\",\n \"Carlito\",\n \"\\\"Aptos\\\"\",\n \"\\\"Segoe UI\\\"\",\n \"Tahoma\",\n \"Arial\",\n \"sans-serif\"\n ].join(\", \");\n }\n\n return [\n ...candidates.map(escapeCssFontFamily),\n \"\\\"Segoe UI\\\"\",\n \"Tahoma\",\n \"Arial\",\n \"sans-serif\"\n ].join(\", \");\n}\n\nfunction resolveSpreadsheetLineHeight(fontSizePt?: number) {\n const sizePt = typeof fontSizePt === \"number\" && Number.isFinite(fontSizePt) ? fontSizePt : 11;\n if (sizePt <= 11) {\n return 1.2;\n }\n if (sizePt <= 14) {\n return 1.25;\n }\n return 1.3;\n}\n\nfunction buildGridlineShadow(color: string, options?: { bottom?: boolean; right?: boolean }) {\n const parts: string[] = [];\n if (options?.right !== false) {\n parts.push(`inset -1px 0 0 ${color}`);\n }\n if (options?.bottom !== false) {\n parts.push(`inset 0 -1px 0 ${color}`);\n }\n return parts.join(\", \");\n}\n\nfunction buildCellStyle(\n style: Record<string, unknown> | null | undefined,\n palette: ViewerPalette,\n themePalette?: XlsxSheetData[\"themePalette\"],\n options?: { showGridLines?: boolean }\n): React.CSSProperties {\n const showGridLines = options?.showGridLines ?? true;\n const baseSurface = paletteIsDark(palette)\n ? resolveDarkModeSurface(themePalette, palette)\n : themePalette?.colorsByIndex[0] ?? SHEET_SURFACE;\n const gridlineShadow = showGridLines ? buildGridlineShadow(palette.border) : undefined;\n const css: React.CSSProperties = {\n backgroundColor: baseSurface,\n borderBottom: \"none\",\n borderRight: \"none\",\n boxShadow: gridlineShadow,\n color: resolveReadableTextColor(null, baseSurface, palette),\n fontFamily: buildSpreadsheetFontFamily({ scheme: \"minor\" }, themePalette) ?? \"\\\"Segoe UI\\\", Tahoma, Arial, sans-serif\",\n fontSize: \"12px\",\n lineHeight: String(resolveSpreadsheetLineHeight(11)),\n overflow: \"hidden\",\n padding: DEFAULT_CELL_PADDING,\n textOverflow: \"clip\",\n verticalAlign: \"bottom\",\n whiteSpace: \"nowrap\"\n };\n\n if (!style) {\n return css;\n }\n\n const fill = style.fill as Record<string, unknown> | undefined;\n let resolvedFillColor: string | null = null;\n let hasExplicitFill = false;\n if (fill) {\n const fillStyle = resolveWorkbookFillStyle(fill, themePalette);\n if (fillStyle.backgroundColor || fillStyle.backgroundImage) {\n hasExplicitFill = true;\n resolvedFillColor = fillStyle.backgroundColor;\n if (fillStyle.backgroundColor) {\n css.backgroundColor = fillStyle.backgroundColor;\n }\n if (fillStyle.backgroundImage) {\n css.backgroundImage = fillStyle.backgroundImage;\n }\n }\n }\n\n const font = style.font as Record<string, unknown> | undefined;\n let resolvedFontColor: string | null = null;\n let resolvedFontSizePt = 11;\n if (font) {\n if (font.bold) {\n css.fontWeight = \"bold\";\n }\n if (font.italic) {\n css.fontStyle = \"italic\";\n }\n if (font.underline && font.underline !== \"none\") {\n css.textDecoration = \"underline\";\n }\n if (font.strikethrough) {\n css.textDecoration = `${css.textDecoration ?? \"\"} line-through`.trim();\n }\n const fontColor = resolveWorkbookColor(font.color as Record<string, unknown> | undefined, themePalette);\n if (fontColor) {\n resolvedFontColor = fontColor;\n css.color = fontColor;\n }\n if (typeof font.size === \"number\" && font.size !== 11) {\n resolvedFontSizePt = font.size;\n css.fontSize = `${font.size}pt`;\n } else if (typeof font.size === \"number\") {\n resolvedFontSizePt = font.size;\n }\n\n const fontFamily = buildSpreadsheetFontFamily(font, themePalette);\n if (fontFamily) {\n css.fontFamily = fontFamily;\n }\n }\n\n css.lineHeight = String(resolveSpreadsheetLineHeight(resolvedFontSizePt));\n\n if (paletteIsDark(palette) && !css.backgroundImage) {\n const effectiveBackgroundColor = typeof css.backgroundColor === \"string\" ? css.backgroundColor : baseSurface;\n css.color = resolveReadableTextColor(resolvedFontColor, effectiveBackgroundColor, palette);\n } else if (!hasExplicitFill) {\n css.color = resolveReadableTextColor(resolvedFontColor, baseSurface, palette);\n }\n\n const alignment = style.alignment as Record<string, unknown> | undefined;\n if (alignment) {\n if (alignment.horizontal && alignment.horizontal !== \"general\") {\n css.textAlign = alignment.horizontal as React.CSSProperties[\"textAlign\"];\n }\n if (alignment.vertical) {\n const verticalMap: Record<string, string> = {\n bottom: \"bottom\",\n center: \"middle\",\n top: \"top\"\n };\n const verticalValue = verticalMap[String(alignment.vertical)];\n if (verticalValue) {\n css.verticalAlign = verticalValue as React.CSSProperties[\"verticalAlign\"];\n }\n }\n if (alignment.wrapText) {\n css.whiteSpace = \"pre-wrap\";\n css.wordBreak = \"break-word\";\n }\n }\n\n const border = style.border as Record<string, Record<string, unknown>> | undefined;\n if (border) {\n const hasRightBorder = Boolean(border.right?.style && border.right.style !== \"none\");\n const hasBottomBorder = Boolean(border.bottom?.style && border.bottom.style !== \"none\");\n if (showGridLines && (hasRightBorder || hasBottomBorder)) {\n css.boxShadow = buildGridlineShadow(palette.border, {\n bottom: !hasBottomBorder,\n right: !hasRightBorder\n }) || undefined;\n }\n if (border.top?.style && border.top.style !== \"none\") {\n css.borderTop = mapBorder(border.top as { style: string; color?: Record<string, unknown> }, themePalette);\n }\n if (border.right?.style && border.right.style !== \"none\") {\n css.borderRight = mapBorder(border.right as { style: string; color?: Record<string, unknown> }, themePalette);\n }\n if (border.bottom?.style && border.bottom.style !== \"none\") {\n css.borderBottom = mapBorder(border.bottom as { style: string; color?: Record<string, unknown> }, themePalette);\n }\n if (border.left?.style && border.left.style !== \"none\") {\n css.borderLeft = mapBorder(border.left as { style: string; color?: Record<string, unknown> }, themePalette);\n }\n }\n\n return css;\n}\n\nlet textMeasureCanvas: HTMLCanvasElement | null = null;\n\nfunction getHorizontalPadding(padding: React.CSSProperties[\"padding\"]) {\n if (typeof padding !== \"string\") {\n return 8;\n }\n\n const values = padding\n .trim()\n .split(/\\s+/)\n .map((value) => Number.parseFloat(value))\n .filter((value) => Number.isFinite(value));\n\n if (values.length === 1) {\n return values[0] * 2;\n }\n if (values.length === 2) {\n return values[1] * 2;\n }\n if (values.length === 3) {\n return values[1] * 2;\n }\n if (values.length >= 4) {\n return values[1] + values[3];\n }\n\n return 8;\n}\n\nfunction buildCanvasFont(style: React.CSSProperties) {\n const fontStyle = typeof style.fontStyle === \"string\" ? style.fontStyle : \"normal\";\n const fontWeight =\n typeof style.fontWeight === \"string\" || typeof style.fontWeight === \"number\" ? String(style.fontWeight) : \"400\";\n const fontSize = typeof style.fontSize === \"string\" ? style.fontSize : \"12px\";\n const fontFamily = typeof style.fontFamily === \"string\" ? style.fontFamily : \"sans-serif\";\n return `${fontStyle} ${fontWeight} ${fontSize} ${fontFamily}`;\n}\n\nfunction measureTextWidth(value: string, style: React.CSSProperties) {\n if (!value) {\n return 0;\n }\n\n if (typeof document === \"undefined\") {\n return value.length * 7;\n }\n\n textMeasureCanvas ??= document.createElement(\"canvas\");\n const context = textMeasureCanvas.getContext(\"2d\");\n if (!context) {\n return value.length * 7;\n }\n\n context.font = buildCanvasFont(style);\n return context.measureText(value).width;\n}\n\nfunction canCellTextOverflow(data: CellRenderData) {\n if (!data.value || data.colSpan || data.isMergedSecondary || data.style.whiteSpace === \"pre-wrap\") {\n return false;\n }\n\n const textAlign = data.style.textAlign;\n if (textAlign && textAlign !== \"left\" && textAlign !== \"start\") {\n return false;\n }\n\n return true;\n}\n\nfunction canReceiveOverflowText(data: CellRenderData) {\n return !data.isMergedSecondary && !data.colSpan && data.value.length === 0;\n}\n\nfunction getCellDisplayValue(worksheet: Worksheet, row: number, col: number, activeSheet?: XlsxSheetData | null): string {\n const formula = worksheet.getFormulaAt(row, col);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1({ row, col })] : undefined;\n const formatted = worksheet.getFormattedValueAt(row, col);\n if (formatted && !(formula && cachedFormulaValue !== undefined && formatted.startsWith(\"#\"))) {\n return decodeHtmlEntities(formatted);\n }\n\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (formula && cachedFormulaValue !== undefined && cellValue.is_error) {\n return cachedFormulaValue;\n }\n if (cellValue.is_error) {\n return cellValue.asError() ?? \"\";\n }\n if (cellValue.is_empty) {\n return \"\";\n }\n\n return cellValue.toString();\n}\n\nfunction getCellNumericValue(worksheet: Worksheet, row: number, col: number) {\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (cellValue.is_number) {\n return cellValue.asNumber() ?? null;\n }\n if (cellValue.is_boolean) {\n return cellValue.asBoolean() ? 1 : 0;\n }\n if (cellValue.is_empty || cellValue.is_error) {\n return null;\n }\n\n const parsedValue = Number(cellValue.asText() ?? cellValue.toString());\n return Number.isFinite(parsedValue) ? parsedValue : null;\n}\n\nfunction getCellBooleanValue(worksheet: Worksheet, row: number, col: number) {\n const cellValue = worksheet.getCalculatedValueAt(row, col);\n if (cellValue.is_boolean) {\n return cellValue.asBoolean() ?? null;\n }\n if (cellValue.is_number) {\n const numeric = cellValue.asNumber();\n return numeric == null ? null : numeric !== 0;\n }\n const text = (cellValue.asText() ?? cellValue.toString()).trim().toLowerCase();\n if (text === \"true\") {\n return true;\n }\n if (text === \"false\") {\n return false;\n }\n return null;\n}\n\nfunction parseA1RangeReference(reference: string): XlsxCellRange | null {\n const [startRef, endRef = startRef] = reference.split(\":\");\n const start = parseA1CellReference(startRef ?? \"\");\n const end = parseA1CellReference(endRef ?? \"\");\n return start && end ? { end, start } : null;\n}\n\nfunction clampSparklineValue(value: number, min: number, max: number) {\n if (max <= min) {\n return 0.5;\n }\n return Math.max(0, Math.min(1, (value - min) / (max - min)));\n}\n\nfunction renderSparkline(\n sparkline: XlsxSheetData[\"sparklines\"][number],\n values: Array<number | null>,\n palette: ViewerPalette\n) {\n const width = 100;\n const height = 18;\n const innerWidth = width - 2;\n const innerHeight = height - 4;\n const points = values.map((value, index) => ({ index, value })).filter((entry): entry is { index: number; value: number } => typeof entry.value === \"number\" && Number.isFinite(entry.value));\n if (points.length === 0) {\n return null;\n }\n\n const negativeColor = sparkline.negativeColor ?? \"#c2410c\";\n const seriesColor = sparkline.color ?? \"#2563eb\";\n const markerColor = sparkline.markerColor ?? seriesColor;\n\n if (sparkline.type === \"winLoss\") {\n const normalizedValues = points.map((entry) => ({ ...entry, value: entry.value >= 0 ? 1 : -1 }));\n const segmentWidth = Math.max(4, innerWidth / Math.max(normalizedValues.length * 1.9, 1));\n const gap = normalizedValues.length > 1 ? (innerWidth - segmentWidth * normalizedValues.length) / (normalizedValues.length - 1) : 0;\n const positiveY = 4.5;\n const negativeY = height - 4.5;\n\n return (\n <svg aria-hidden=\"true\" height={height} style={{ display: \"block\", overflow: \"visible\", width: \"100%\" }} viewBox={`0 0 ${width} ${height}`} width=\"100%\">\n {normalizedValues.map((entry, index) => {\n const left = 1 + index * (segmentWidth + Math.max(0, gap));\n const y = entry.value >= 0 ? positiveY : negativeY;\n return (\n <line\n key={`spark-winloss-${index}`}\n stroke={seriesColor}\n strokeLinecap=\"round\"\n strokeWidth={1.8}\n x1={left}\n x2={left + segmentWidth}\n y1={y}\n y2={y}\n />\n );\n })}\n </svg>\n );\n }\n\n if (sparkline.type === \"column\") {\n const normalizedValues = points;\n const minValue = Math.min(0, ...normalizedValues.map((entry) => entry.value));\n const maxValue = Math.max(0, ...normalizedValues.map((entry) => entry.value));\n const zeroY = 2 + innerHeight - clampSparklineValue(0, minValue, maxValue) * innerHeight;\n const barWidth = Math.max(2, innerWidth / Math.max(normalizedValues.length * 1.8, 1));\n const gap = normalizedValues.length > 1 ? (innerWidth - barWidth * normalizedValues.length) / (normalizedValues.length - 1) : 0;\n\n return (\n <svg aria-hidden=\"true\" height={height} style={{ display: \"block\", overflow: \"visible\", width: \"100%\" }} viewBox={`0 0 ${width} ${height}`} width=\"100%\">\n <line stroke={palette.border} strokeWidth={1} x1={1} x2={width - 1} y1={zeroY} y2={zeroY} />\n {normalizedValues.map((entry, index) => {\n const left = 1 + index * (barWidth + Math.max(0, gap));\n const y = 2 + innerHeight - clampSparklineValue(entry.value, minValue, maxValue) * innerHeight;\n const top = Math.min(y, zeroY);\n const barHeight = Math.max(1, Math.abs(y - zeroY));\n const fill = entry.value < 0 ? negativeColor : seriesColor;\n return (\n <rect\n fill={fill}\n height={barHeight}\n key={`spark-bar-${index}`}\n rx={sparkline.type === \"column\" ? 0 : 0.8}\n ry={sparkline.type === \"column\" ? 0 : 0.8}\n width={barWidth}\n x={left}\n y={top}\n />\n );\n })}\n </svg>\n );\n }\n\n const minValue = Math.min(...points.map((entry) => entry.value));\n const maxValue = Math.max(...points.map((entry) => entry.value));\n const xStep = points.length > 1 ? innerWidth / (points.length - 1) : 0;\n const path = points.map((entry, index) => {\n const x = 1 + index * xStep;\n const y = 2 + innerHeight - clampSparklineValue(entry.value, minValue, maxValue) * innerHeight;\n return `${index === 0 ? \"M\" : \"L\"} ${x.toFixed(2)} ${y.toFixed(2)}`;\n }).join(\" \");\n\n const highValue = Math.max(...points.map((entry) => entry.value));\n const lowValue = Math.min(...points.map((entry) => entry.value));\n\n return (\n <svg aria-hidden=\"true\" height={height} style={{ display: \"block\", overflow: \"visible\", width: \"100%\" }} viewBox={`0 0 ${width} ${height}`} width=\"100%\">\n <path d={path} fill=\"none\" stroke={seriesColor} strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.6} />\n {sparkline.markers ? points.map((entry, index) => {\n const x = 1 + index * xStep;\n const y = 2 + innerHeight - clampSparklineValue(entry.value, minValue, maxValue) * innerHeight;\n let fill = markerColor;\n if (entry.value === highValue && sparkline.highColor) {\n fill = sparkline.highColor;\n } else if (entry.value === lowValue && sparkline.lowColor) {\n fill = sparkline.lowColor;\n } else if (index === 0 && sparkline.firstColor) {\n fill = sparkline.firstColor;\n } else if (index === points.length - 1 && sparkline.lastColor) {\n fill = sparkline.lastColor;\n } else if (entry.value < 0 && sparkline.negative && sparkline.negativeColor) {\n fill = sparkline.negativeColor;\n }\n return <circle cx={x} cy={y} fill={fill} key={`spark-point-${index}`} r={1.75} />;\n }) : null}\n </svg>\n );\n}\n\nfunction asNonNegativeInteger(value: unknown) {\n return typeof value === \"number\" && Number.isInteger(value) && value >= 0 ? value : null;\n}\n\nfunction asRecord(value: unknown) {\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : null;\n}\n\nfunction normalizeBatchedHyperlink(value: unknown): BatchedCellData[\"hyperlink\"] {\n const hyperlink = asRecord(value);\n if (!hyperlink) {\n return null;\n }\n\n return {\n location: typeof hyperlink.location === \"string\" ? hyperlink.location : undefined,\n target: typeof hyperlink.target === \"string\" ? hyperlink.target : undefined,\n tooltip: typeof hyperlink.tooltip === \"string\" ? hyperlink.tooltip : undefined\n };\n}\n\nfunction normalizeBatchedMergeSpan(value: unknown): BatchedCellData[\"mergeSpan\"] {\n const mergeSpan = asRecord(value);\n if (!mergeSpan) {\n return null;\n }\n\n const rowSpan = asNonNegativeInteger(mergeSpan.rowSpan);\n const colSpan = asNonNegativeInteger(mergeSpan.colSpan);\n if (rowSpan === null && colSpan === null) {\n return null;\n }\n\n return {\n colSpan: colSpan ?? undefined,\n rowSpan: rowSpan ?? undefined\n };\n}\n\nfunction normalizeBatchedCellValue(\n rawValue: unknown,\n formula: string | null,\n row: number,\n col: number,\n activeSheet?: XlsxSheetData | null\n) {\n const value =\n typeof rawValue === \"string\"\n ? decodeHtmlEntities(rawValue)\n : rawValue === null || rawValue === undefined\n ? \"\"\n : String(rawValue);\n const cachedFormulaValue = formula ? activeSheet?.cachedFormulaValues?.[cellAddressToA1({ row, col })] : undefined;\n\n if (formula && cachedFormulaValue !== undefined && value.startsWith(\"#\")) {\n return cachedFormulaValue;\n }\n\n return value;\n}\n\nfunction buildWorksheetBatchWindow(\n rows: unknown[] | null,\n activeSheet: XlsxSheetData | null,\n startRow: number,\n endRow: number\n): WorksheetBatchWindow {\n const cells = new Map<string, BatchedCellData>();\n\n if (Array.isArray(rows)) {\n for (const rowEntry of rows as WorksheetBatchRowEntry[]) {\n const row = asNonNegativeInteger(rowEntry.index);\n if (row === null || !Array.isArray(rowEntry.cells)) {\n continue;\n }\n\n for (const cellEntry of rowEntry.cells as WorksheetBatchCellEntry[]) {\n const col = asNonNegativeInteger(cellEntry.col);\n if (col === null) {\n continue;\n }\n\n const formula = typeof cellEntry.formula === \"string\" ? cellEntry.formula : null;\n cells.set(`${row}:${col}`, {\n formula,\n hyperlink: normalizeBatchedHyperlink(cellEntry.hyperlink),\n isMergedSecondary: cellEntry.isMergedSecondary === true,\n mergeSpan: normalizeBatchedMergeSpan(cellEntry.mergeSpan),\n style: asRecord(cellEntry.style),\n value: normalizeBatchedCellValue(cellEntry.value, formula, row, col, activeSheet)\n });\n }\n }\n }\n\n return {\n cells,\n endRow,\n startRow\n };\n}\n\nfunction getTableAtCell(tables: XlsxTable[], row: number, col: number) {\n return tables.find(\n (table) =>\n row >= table.start.row &&\n row <= table.end.row &&\n col >= table.start.col &&\n col <= table.end.col\n ) ?? null;\n}\n\nfunction mergeResolvedCellStyle(\n base: Record<string, unknown> | null | undefined,\n overlay: Record<string, unknown> | null | undefined\n) {\n if (!base && !overlay) {\n return null;\n }\n\n const nextStyle: Record<string, unknown> = {\n ...(base ?? {}),\n ...(overlay ?? {})\n };\n\n const baseAlignment = base?.alignment as Record<string, unknown> | undefined;\n const overlayAlignment = overlay?.alignment as Record<string, unknown> | undefined;\n if (baseAlignment || overlayAlignment) {\n nextStyle.alignment = {\n ...(baseAlignment ?? {}),\n ...(overlayAlignment ?? {})\n };\n }\n\n const baseBorder = base?.border as Record<string, Record<string, unknown>> | undefined;\n const overlayBorder = overlay?.border as Record<string, Record<string, unknown>> | undefined;\n if (baseBorder || overlayBorder) {\n nextStyle.border = {\n ...(baseBorder ?? {}),\n ...(overlayBorder ?? {})\n };\n }\n\n const baseFill = base?.fill as Record<string, unknown> | undefined;\n const overlayFill = overlay?.fill as Record<string, unknown> | undefined;\n if (baseFill || overlayFill) {\n nextStyle.fill = overlayFill ?? baseFill;\n }\n\n const baseFont = base?.font as Record<string, unknown> | undefined;\n const overlayFont = overlay?.font as Record<string, unknown> | undefined;\n if (baseFont || overlayFont) {\n nextStyle.font = {\n ...(baseFont ?? {}),\n ...(overlayFont ?? {})\n };\n }\n\n return nextStyle;\n}\n\nfunction normalizeTableStyleEdges(\n style: Record<string, unknown> | null | undefined,\n table: XlsxTable,\n row: number,\n col: number\n) {\n if (!style) {\n return null;\n }\n\n const border = style.border as Record<string, Record<string, unknown>> | undefined;\n if (!border) {\n return style;\n }\n\n const nextBorder: Record<string, Record<string, unknown>> = { ...border };\n if (nextBorder.horizontal) {\n if (row < table.end.row) {\n nextBorder.bottom = nextBorder.bottom ?? nextBorder.horizontal;\n }\n delete nextBorder.horizontal;\n }\n if (nextBorder.vertical) {\n if (col < table.end.col) {\n nextBorder.right = nextBorder.right ?? nextBorder.vertical;\n }\n delete nextBorder.vertical;\n }\n\n return {\n ...style,\n border: nextBorder\n };\n}\n\nfunction resolveTableCellStyle(\n table: XlsxTable | null,\n row: number,\n col: number,\n activeSheet: XlsxSheetData | null | undefined\n) {\n if (!table || !activeSheet) {\n return null;\n }\n\n const styleName = table.styleInfo?.name;\n if (!styleName) {\n return null;\n }\n\n const tableStyle = activeSheet.tableStyleByName[styleName];\n if (!tableStyle) {\n return null;\n }\n\n let resolved: Record<string, unknown> | null = null;\n const applyElement = (elementType: string, enabled = true) => {\n if (!enabled) {\n return;\n }\n\n const nextStyle = normalizeTableStyleEdges(tableStyle[elementType] ?? null, table, row, col);\n if (!nextStyle) {\n return;\n }\n resolved = mergeResolvedCellStyle(resolved, nextStyle);\n };\n\n applyElement(\"wholeTable\");\n applyElement(\"firstColumn\", Boolean(table.styleInfo?.showFirstColumn) && col === table.start.col);\n applyElement(\"lastColumn\", Boolean(table.styleInfo?.showLastColumn) && col === table.end.col);\n\n const headerRowCount = Math.max(table.headerRowCount, 1);\n const isHeaderRow = row >= table.start.row && row < table.start.row + headerRowCount;\n applyElement(\"headerRow\", isHeaderRow);\n\n if (isHeaderRow && table.headerRowCellStyle) {\n const namedHeaderStyle = activeSheet.namedCellStyleByName[table.headerRowCellStyle];\n if (namedHeaderStyle) {\n resolved = mergeResolvedCellStyle(resolved, namedHeaderStyle);\n }\n }\n\n if (table.totalsRowShown) {\n const totalsRowCount = Math.max(table.totalsRowCount, 1);\n applyElement(\"totalRow\", row > table.end.row - totalsRowCount);\n }\n\n return resolved;\n}\n\nfunction getTableHeaderColumn(table: XlsxTable | null, row: number, col: number): XlsxTableColumn | null {\n if (!table || row !== table.start.row) {\n return null;\n }\n\n const index = col - table.start.col;\n return table.columns[index] ?? null;\n}\n\nfunction DefaultTableHeaderMenu({\n close,\n direction,\n sortAscending,\n sortDescending\n}: XlsxTableHeaderMenuRenderProps) {\n return (\n <div\n style={{\n backgroundColor: \"var(--xlsx-menu-surface)\",\n border: \"1px solid var(--xlsx-menu-border)\",\n borderRadius: 10,\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.16)\",\n display: \"grid\",\n gap: 4,\n minWidth: 160,\n padding: 6\n }}\n >\n <button\n onClick={() => {\n sortAscending();\n close();\n }}\n style={{\n background: direction === \"ascending\" ? \"var(--xlsx-menu-active)\" : \"transparent\",\n border: \"none\",\n borderRadius: 8,\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: 12,\n padding: \"8px 10px\",\n textAlign: \"left\"\n }}\n type=\"button\"\n >\n Sort A to Z\n </button>\n <button\n onClick={() => {\n sortDescending();\n close();\n }}\n style={{\n background: direction === \"descending\" ? \"var(--xlsx-menu-active)\" : \"transparent\",\n border: \"none\",\n borderRadius: 8,\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: 12,\n padding: \"8px 10px\",\n textAlign: \"left\"\n }}\n type=\"button\"\n >\n Sort Z to A\n </button>\n </div>\n );\n}\n\nfunction DefaultToolbar({ controller, palette }: { controller: XlsxViewerController; palette: ViewerPalette }) {\n const {\n activeTabIndex,\n canDownload,\n canZoomIn,\n canZoomOut,\n defaultZoomScale,\n displayFileName,\n download,\n resetZoom,\n setActiveTabIndex,\n tabs,\n zoomIn,\n zoomOut,\n zoomScale\n } = controller;\n\n return (\n <>\n <div\n style={{\n alignItems: \"center\",\n backgroundColor: palette.toolbarSurface,\n borderBottom: `1px solid ${palette.border}`,\n color: palette.text,\n display: \"flex\",\n gap: 12,\n justifyContent: \"space-between\",\n minHeight: 48,\n padding: \"0 16px\"\n }}\n >\n <div style={{ minWidth: 0 }}>\n <div\n style={{\n color: palette.text,\n fontSize: 14,\n fontWeight: 600,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\"\n }}\n >\n {displayFileName}\n </div>\n </div>\n <div style={{ alignItems: \"center\", display: \"flex\", gap: 8 }}>\n <div\n style={{\n alignItems: \"center\",\n background: palette.buttonSurface,\n border: `1px solid ${palette.strongBorder}`,\n borderRadius: 8,\n display: \"flex\",\n overflow: \"hidden\"\n }}\n >\n <button\n disabled={!canZoomOut}\n onClick={zoomOut}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: canZoomOut ? palette.buttonText : palette.mutedText,\n cursor: canZoomOut ? \"pointer\" : \"default\",\n fontSize: 14,\n fontWeight: 600,\n padding: \"6px 10px\"\n }}\n type=\"button\"\n >\n -\n </button>\n <button\n onClick={resetZoom}\n style={{\n background: Math.round(zoomScale) === Math.round(defaultZoomScale) ? \"transparent\" : palette.subtleSurface,\n border: \"none\",\n borderLeft: `1px solid ${palette.strongBorder}`,\n borderRight: `1px solid ${palette.strongBorder}`,\n color: palette.buttonText,\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 600,\n minWidth: 60,\n padding: \"6px 10px\"\n }}\n type=\"button\"\n >\n {formatZoomScale(zoomScale)}\n </button>\n <button\n disabled={!canZoomIn}\n onClick={zoomIn}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: canZoomIn ? palette.buttonText : palette.mutedText,\n cursor: canZoomIn ? \"pointer\" : \"default\",\n fontSize: 14,\n fontWeight: 600,\n padding: \"6px 10px\"\n }}\n type=\"button\"\n >\n +\n </button>\n </div>\n {canDownload ? (\n <button\n onClick={download}\n style={{\n background: palette.buttonSurface,\n border: `1px solid ${palette.strongBorder}`,\n borderRadius: 8,\n color: palette.buttonText,\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 500,\n padding: \"6px 10px\"\n }}\n type=\"button\"\n >\n Download\n </button>\n ) : null}\n </div>\n </div>\n {tabs.length > 1 ? (\n <div\n style={{\n backgroundColor: palette.subtleSurface,\n borderBottom: `1px solid ${palette.border}`,\n display: \"flex\",\n gap: 6,\n overflowX: \"auto\",\n padding: \"8px 12px\"\n }}\n >\n {tabs.map((tab, index) => (\n <button\n key={tab.id}\n onClick={() => setActiveTabIndex(index)}\n style={{\n backgroundColor: index === activeTabIndex ? palette.sheetActiveSurface : palette.sheetInactiveSurface,\n border: `1px solid ${index === activeTabIndex ? palette.strongBorder : \"transparent\"}`,\n borderRadius: 8,\n boxShadow: index === activeTabIndex ? palette.shadow : \"none\",\n color: index === activeTabIndex ? palette.sheetActiveText : palette.sheetInactiveText,\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 500,\n padding: \"6px 12px\",\n whiteSpace: \"nowrap\"\n }}\n type=\"button\"\n >\n {tab.name}\n </button>\n ))}\n </div>\n ) : null}\n </>\n );\n}\n\nfunction resolveToolbar(\n toolbar: XlsxViewerProps[\"toolbar\"],\n showDefaultToolbar: boolean,\n controller: XlsxViewerController,\n palette: ViewerPalette\n) {\n if (typeof toolbar === \"function\") {\n return toolbar(controller);\n }\n\n if (toolbar !== undefined) {\n return toolbar;\n }\n\n if (!showDefaultToolbar) {\n return null;\n }\n\n return <DefaultToolbar controller={controller} palette={palette} />;\n}\n\nfunction renderError(errorState: XlsxViewerProps[\"errorState\"], error: Error, palette: ViewerPalette) {\n if (typeof errorState === \"function\") {\n return errorState(error);\n }\n if (errorState !== undefined) {\n return errorState;\n }\n\n return (\n <div\n style={{\n alignItems: \"center\",\n color: palette.danger,\n display: \"flex\",\n fontSize: 14,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 16,\n textAlign: \"center\"\n }}\n >\n {error.message}\n </div>\n );\n}\n\nfunction renderLoading(\n loadingComponent: XlsxViewerProps[\"loadingComponent\"],\n loadingState: XlsxViewerProps[\"loadingState\"],\n palette: ViewerPalette\n) {\n if (loadingComponent !== undefined) {\n return loadingComponent;\n }\n\n if (loadingState !== undefined) {\n return loadingState;\n }\n\n return (\n <div\n style={{\n alignItems: \"center\",\n color: palette.mutedText,\n display: \"flex\",\n fontSize: 14,\n height: \"100%\",\n justifyContent: \"center\"\n }}\n >\n Loading workbook...\n </div>\n );\n}\n\nfunction renderEmpty(emptyState: XlsxViewerProps[\"emptyState\"], palette: ViewerPalette) {\n if (emptyState !== undefined) {\n return emptyState;\n }\n\n return (\n <div\n style={{\n alignItems: \"center\",\n color: palette.mutedText,\n display: \"flex\",\n fontSize: 14,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 16,\n textAlign: \"center\"\n }}\n >\n No workbook loaded.\n </div>\n );\n}\n\nfunction formatBinaryBytes(bytes: number) {\n if (!Number.isFinite(bytes) || bytes <= 0) {\n return \"0 B\";\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let value = bytes;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n\n return `${value >= 10 || unitIndex === 0 ? value.toFixed(0) : value.toFixed(1)} ${units[unitIndex]}`;\n}\n\nfunction renderFileTooLarge(\n fileTooLargeState: XlsxViewerProps[\"fileTooLargeState\"],\n renderProps: {\n displayFileName: string;\n fileSizeBytes: number;\n maxFileSizeBytes: number;\n },\n palette: ViewerPalette\n) {\n const defaultNode = (\n <div\n style={{\n alignItems: \"center\",\n color: palette.mutedText,\n display: \"flex\",\n flexDirection: \"column\",\n fontSize: 14,\n gap: 8,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 24,\n textAlign: \"center\"\n }}\n >\n <div style={{ color: palette.text, fontWeight: 600 }}>\n {renderProps.displayFileName}\n </div>\n <div>\n File size {formatBinaryBytes(renderProps.fileSizeBytes)} exceeds the configured limit of{\" \"}\n {formatBinaryBytes(renderProps.maxFileSizeBytes)}.\n </div>\n </div>\n );\n\n if (typeof fileTooLargeState === \"function\") {\n return fileTooLargeState({\n defaultNode,\n displayFileName: renderProps.displayFileName,\n fileSizeBytes: renderProps.fileSizeBytes,\n maxFileSizeBytes: renderProps.maxFileSizeBytes\n });\n }\n\n if (fileTooLargeState !== undefined) {\n return fileTooLargeState;\n }\n\n return defaultNode;\n}\n\nfunction renderDefaultChartLoadingCard(rect: XlsxImageRect) {\n const bars = [18, 32, 24];\n const barWidth = Math.max(8, Math.min(12, Math.round(rect.width * 0.018)));\n const barGap = 8;\n\n return (\n <div\n style={{\n backgroundColor: \"#ffffff\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 10,\n boxSizing: \"border-box\",\n display: \"flex\",\n height: \"100%\",\n justifyContent: \"center\",\n padding: 12,\n width: \"100%\"\n }}\n >\n <div\n style={{\n alignItems: \"flex-end\",\n display: \"flex\",\n gap: barGap,\n justifyContent: \"center\"\n }}\n >\n {bars.map((heightPx, index) => (\n <div\n key={index}\n style={{\n backgroundColor: \"#e5e7eb\",\n borderRadius: 999,\n height: heightPx,\n width: barWidth\n }}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction renderChartLoadingNode(\n renderChartLoading: XlsxViewerProps[\"renderChartLoading\"],\n chart: XlsxChart,\n rect: XlsxImageRect\n) {\n const defaultNode = renderDefaultChartLoadingCard(rect);\n if (!renderChartLoading) {\n return defaultNode;\n }\n\n return renderChartLoading({\n chart,\n defaultNode,\n rect\n });\n}\n\nfunction formatBytes(value: number) {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0 B\";\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\"];\n let size = value;\n let unitIndex = 0;\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex += 1;\n }\n\n return `${size >= 10 || unitIndex === 0 ? size.toFixed(0) : size.toFixed(1)} ${units[unitIndex]}`;\n}\n\nfunction renderDeferredLoad(\n controller: XlsxViewerController,\n palette: ViewerPalette\n) {\n return (\n <div\n style={{\n alignItems: \"center\",\n color: palette.text,\n display: \"flex\",\n height: \"100%\",\n justifyContent: \"center\",\n padding: 24\n }}\n >\n <div\n style={{\n backgroundColor: palette.surface,\n border: `1px solid ${palette.strongBorder}`,\n borderRadius: 12,\n boxShadow: palette.shadow,\n maxWidth: 420,\n padding: 20,\n width: \"100%\"\n }}\n >\n <div style={{ fontSize: 16, fontWeight: 600 }}>Large workbook detected</div>\n <div style={{ color: palette.mutedText, fontSize: 13, lineHeight: 1.5, marginTop: 8 }}>\n This workbook is {formatBytes(controller.deferredLoadFileSize ?? 0)}. Loading it immediately can block the main thread and freeze the page.\n </div>\n <div style={{ color: palette.mutedText, fontSize: 13, lineHeight: 1.5, marginTop: 8 }}>\n Best practice is to gate large files or move parsing into a worker. You can still load it manually below.\n </div>\n <div style={{ display: \"flex\", gap: 10, marginTop: 16 }}>\n <button\n onClick={controller.continueDeferredLoad}\n style={{\n background: palette.buttonSurface,\n border: `1px solid ${palette.strongBorder}`,\n borderRadius: 8,\n color: palette.buttonText,\n cursor: controller.canLoadDeferred ? \"pointer\" : \"default\",\n fontSize: 12,\n fontWeight: 600,\n opacity: controller.canLoadDeferred ? 1 : 0.6,\n padding: \"8px 12px\"\n }}\n type=\"button\"\n >\n Load Anyway\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction resolveSelectionColors({\n palette,\n selectionColor,\n selectionFillColor,\n selectionHeaderColor\n}: {\n palette: ViewerPalette;\n selectionColor?: string;\n selectionFillColor?: string;\n selectionHeaderColor?: string;\n}) {\n const stroke = selectionColor ?? (paletteIsDark(palette) ? \"#60a5fa\" : \"#2563eb\");\n const fill =\n selectionFillColor ??\n `color-mix(in srgb, ${stroke} ${paletteIsDark(palette) ? \"16%\" : \"10%\"}, transparent)`;\n const header =\n selectionHeaderColor ??\n `color-mix(in srgb, ${stroke} ${paletteIsDark(palette) ? \"24%\" : \"16%\"}, ${palette.headerSurface})`;\n\n return {\n fill,\n header,\n stroke\n };\n}\n\ntype CellRenderData = {\n checkboxState?: boolean | null;\n conditionalColorScale?: {\n color: string;\n } | null;\n colSpan?: number;\n conditionalDataBar?: {\n axisColor?: string;\n border?: boolean;\n borderColor?: string;\n color: string;\n gradient?: boolean;\n negativeBorderColor?: string;\n negativeFillColor?: string;\n widthPercent: number;\n } | null;\n conditionalIcon?: {\n backgroundColor?: string;\n borderColor?: string;\n color?: string;\n glyph?: string;\n rotationDeg?: number;\n shape?: \"arrow\";\n } | null;\n hyperlink?: {\n location?: string;\n target?: string;\n tooltip?: string;\n } | null;\n isMergedSecondary: boolean;\n isTableHeader?: boolean;\n rowSpan?: number;\n sparkline?: {\n config: XlsxSheetData[\"sparklines\"][number];\n values: Array<number | null>;\n } | null;\n spillWidth?: number;\n style: React.CSSProperties;\n validation?: {\n message?: string;\n showDropdown: boolean;\n validationType: string;\n } | null;\n value: string;\n};\n\nfunction buildConditionalFormatRuleKey(rule: XlsxSheetData[\"conditionalFormatRules\"][number]) {\n return `${rule.kind}:${rule.priority}:${rule.ranges\n .map((range) => `${range.start.row}:${range.start.col}-${range.end.row}:${range.end.col}`)\n .join(\"|\")}`;\n}\n\nfunction resolveConditionalRuleThreshold(\n threshold: XlsxSheetData[\"conditionalFormatRules\"][number][\"cfvos\"][number] | undefined,\n numericValues: number[]\n) {\n if (!threshold) {\n return null;\n }\n\n const fallbackValue = typeof threshold.value === \"number\" ? threshold.value : null;\n if (threshold.type === \"num\" || threshold.type === \"formula\") {\n return fallbackValue;\n }\n\n if (numericValues.length === 0) {\n return fallbackValue;\n }\n\n const minValue = Math.min(...numericValues);\n const maxValue = Math.max(...numericValues);\n if (threshold.type === \"min\") {\n return minValue;\n }\n if (threshold.type === \"max\") {\n return maxValue;\n }\n\n if ((threshold.type === \"percent\" || threshold.type === \"percentile\") && fallbackValue !== null) {\n return minValue + (maxValue - minValue) * (fallbackValue / 100);\n }\n\n return fallbackValue;\n}\n\nfunction buildConditionalIcon(iconSet: string, iconId: number): NonNullable<CellRenderData[\"conditionalIcon\"]> | null {\n switch (iconSet) {\n case \"NoIcons\":\n return null;\n case \"4TrafficLights\": {\n const definitions = [\n { backgroundColor: \"#111827\", borderColor: \"#6b7280\" },\n { backgroundColor: \"#22c55e\", borderColor: \"#166534\" },\n { backgroundColor: \"#ef4444\", borderColor: \"#991b1b\" },\n { backgroundColor: \"#facc15\", borderColor: \"#a16207\" }\n ];\n return definitions[iconId] ?? definitions[definitions.length - 1] ?? null;\n }\n case \"3TrafficLights1\":\n case \"3TrafficLights2\": {\n const definitions = [\n { backgroundColor: \"#22c55e\", borderColor: iconSet === \"3TrafficLights2\" ? \"#111827\" : \"#166534\" },\n { backgroundColor: \"#facc15\", borderColor: iconSet === \"3TrafficLights2\" ? \"#111827\" : \"#a16207\" },\n { backgroundColor: \"#ef4444\", borderColor: iconSet === \"3TrafficLights2\" ? \"#111827\" : \"#991b1b\" }\n ];\n return definitions[iconId] ?? definitions[definitions.length - 1] ?? null;\n }\n case \"4RedToBlack\": {\n const definitions = [\n { backgroundColor: \"#ef4444\", borderColor: \"#991b1b\" },\n { backgroundColor: \"#fca5a5\", borderColor: \"#b91c1c\" },\n { backgroundColor: \"#9ca3af\", borderColor: \"#4b5563\" },\n { backgroundColor: \"#111827\", borderColor: \"#6b7280\" }\n ];\n return definitions[iconId] ?? definitions[definitions.length - 1] ?? null;\n }\n case \"3Symbols\":\n return [\n { backgroundColor: \"#22c55e\", color: \"#ffffff\", glyph: \"✓\" },\n { backgroundColor: \"#facc15\", color: \"#111827\", glyph: \"!\" },\n { backgroundColor: \"#ef4444\", color: \"#ffffff\", glyph: \"×\" }\n ][iconId] ?? null;\n case \"3Symbols2\":\n return [\n { color: \"#16a34a\", glyph: \"✓\" },\n { color: \"#ca8a04\", glyph: \"!\" },\n { color: \"#dc2626\", glyph: \"×\" }\n ][iconId] ?? null;\n case \"3Signs\":\n return [\n { backgroundColor: \"#22c55e\", borderColor: \"#166534\" },\n { backgroundColor: \"#facc15\", borderColor: \"#a16207\", glyph: \"▲\", color: \"#111827\" },\n { backgroundColor: \"#ef4444\", borderColor: \"#991b1b\", glyph: \"◆\", color: \"#ffffff\" }\n ][iconId] ?? null;\n default:\n if (iconSet.includes(\"Arrows\")) {\n const arrowColors = iconSet.includes(\"Gray\")\n ? [\"#9ca3af\", \"#9ca3af\", \"#9ca3af\", \"#9ca3af\", \"#9ca3af\"]\n : [\"#16a34a\", \"#ca8a04\", \"#ca8a04\", \"#ca8a04\", \"#dc2626\"];\n const arrowRotations = iconSet.startsWith(\"3\")\n ? [-90, 0, 90]\n : iconSet.startsWith(\"4\")\n ? [-90, -35, 35, 90]\n : [-90, -35, 0, 35, 90];\n const resolvedIndex = Math.min(iconId, arrowColors.length - 1, arrowRotations.length - 1);\n return {\n borderColor: iconSet.includes(\"Gray\") ? \"#6b7280\" : darkenColor(arrowColors[resolvedIndex] ?? \"#16a34a\", 0.34),\n color: arrowColors[resolvedIndex],\n rotationDeg: arrowRotations[resolvedIndex] ?? 0,\n shape: \"arrow\"\n };\n }\n\n return {\n backgroundColor: \"#111827\",\n borderColor: \"#6b7280\"\n };\n }\n}\n\nfunction renderConditionalIcon(icon: NonNullable<CellRenderData[\"conditionalIcon\"]>) {\n if (icon.shape === \"arrow\") {\n const fill = icon.color ?? \"#111827\";\n const stroke = icon.borderColor ?? darkenColor(fill, 0.32);\n return (\n <svg\n aria-hidden=\"true\"\n height={14}\n style={{ display: \"block\" }}\n viewBox=\"0 0 16 16\"\n width={14}\n >\n <g transform={`rotate(${icon.rotationDeg ?? 0} 8 8)`}>\n <path\n d=\"M2.5 8 L8.4 2.4 L8.4 5.2 L13.5 5.2 L13.5 10.8 L8.4 10.8 L8.4 13.6 Z\"\n fill={fill}\n stroke={stroke}\n strokeLinejoin=\"round\"\n strokeWidth={1.25}\n />\n </g>\n </svg>\n );\n }\n if (icon.glyph) {\n return (\n <span\n style={{\n alignItems: \"center\",\n color: icon.color ?? \"#111827\",\n display: \"inline-flex\",\n fontSize: 13,\n fontWeight: 700,\n height: 14,\n justifyContent: \"center\",\n lineHeight: 1,\n width: 14\n }}\n >\n {icon.glyph}\n </span>\n );\n }\n\n return (\n <span\n style={{\n backgroundColor: icon.backgroundColor ?? \"#111827\",\n border: icon.borderColor ? `1px solid ${icon.borderColor}` : \"none\",\n borderRadius: \"999px\",\n display: \"inline-block\",\n height: 12,\n width: 12\n }}\n />\n );\n}\n\nfunction renderCheckboxControl(checked: boolean, palette: ViewerPalette) {\n const stroke = paletteIsDark(palette) ? \"#cbd5e1\" : \"#475569\";\n const fill = checked ? (paletteIsDark(palette) ? \"#60a5fa\" : \"#2563eb\") : \"transparent\";\n const check = paletteIsDark(palette) ? \"#020617\" : \"#ffffff\";\n return (\n <svg aria-hidden=\"true\" height={14} style={{ display: \"block\" }} viewBox=\"0 0 16 16\" width={14}>\n <rect fill={fill} height={11} rx={2} ry={2} stroke={stroke} strokeWidth={1.2} width={11} x={2.5} y={2.5} />\n {checked ? (\n <path\n d=\"M5 8.1 7.1 10.2 11.3 5.8\"\n fill=\"none\"\n stroke={check}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.8}\n />\n ) : null}\n </svg>\n );\n}\n\nfunction resolveConditionalDataBarForCell(\n row: number,\n col: number,\n worksheet: Worksheet,\n sheet: XlsxSheetData | null | undefined,\n metricsCache: Map<string, number[]>\n): CellRenderData[\"conditionalDataBar\"] {\n const rules = sheet?.conditionalFormatRules ?? [];\n const matchingRule = rules.find(\n (rule): rule is Extract<XlsxSheetData[\"conditionalFormatRules\"][number], { kind: \"dataBar\" }> =>\n rule.kind === \"dataBar\" && rule.ranges.some((range) => isCellInRange({ row, col }, range))\n );\n if (!matchingRule) {\n return null;\n }\n\n const numericValue = getCellNumericValue(worksheet, row, col);\n if (numericValue === null) {\n return null;\n }\n\n const cacheKey = buildConditionalFormatRuleKey(matchingRule);\n let ruleValues = metricsCache.get(cacheKey);\n if (!ruleValues) {\n ruleValues = matchingRule.ranges.flatMap((range) => {\n const values: number[] = [];\n for (let targetRow = range.start.row; targetRow <= range.end.row; targetRow += 1) {\n for (let targetCol = range.start.col; targetCol <= range.end.col; targetCol += 1) {\n const value = getCellNumericValue(worksheet, targetRow, targetCol);\n if (value !== null) {\n values.push(value);\n }\n }\n }\n return values;\n });\n metricsCache.set(cacheKey, ruleValues);\n }\n\n const minValue = resolveConditionalRuleThreshold(matchingRule.cfvos[0], ruleValues);\n const maxValue = resolveConditionalRuleThreshold(matchingRule.cfvos[matchingRule.cfvos.length - 1], ruleValues);\n if (minValue === null || maxValue === null) {\n return null;\n }\n\n const minLength = Number.isFinite(matchingRule.minLength ?? Number.NaN) ? (matchingRule.minLength ?? 0) : 0;\n const maxLength = Number.isFinite(matchingRule.maxLength ?? Number.NaN) ? (matchingRule.maxLength ?? 100) : 100;\n const span = maxValue - minValue;\n const ratio = span === 0 ? (numericValue >= maxValue ? 1 : 0) : (numericValue - minValue) / span;\n const widthPercent = minLength + Math.max(0, Math.min(1, ratio)) * (maxLength - minLength);\n const color = resolveWorkbookColor(matchingRule.color, sheet?.themePalette);\n if (!color || widthPercent <= 0) {\n return null;\n }\n\n return {\n axisColor: resolveWorkbookColor(matchingRule.axisColor, sheet?.themePalette) ?? undefined,\n border: matchingRule.border ?? undefined,\n borderColor: resolveWorkbookColor(matchingRule.borderColor, sheet?.themePalette) ?? undefined,\n color,\n gradient: matchingRule.gradient ?? undefined,\n negativeBorderColor: resolveWorkbookColor(matchingRule.negativeBorderColor, sheet?.themePalette) ?? undefined,\n negativeFillColor: resolveWorkbookColor(matchingRule.negativeFillColor, sheet?.themePalette) ?? undefined,\n widthPercent\n };\n}\n\nfunction resolveConditionalColorScaleForCell(\n row: number,\n col: number,\n worksheet: Worksheet,\n sheet: XlsxSheetData | null | undefined,\n metricsCache: Map<string, number[]>\n): CellRenderData[\"conditionalColorScale\"] {\n const rules = sheet?.conditionalFormatRules ?? [];\n const matchingRule = rules.find(\n (rule): rule is Extract<XlsxSheetData[\"conditionalFormatRules\"][number], { kind: \"colorScale\" }> =>\n rule.kind === \"colorScale\" && rule.ranges.some((range) => isCellInRange({ row, col }, range))\n );\n if (!matchingRule) {\n return null;\n }\n\n const numericValue = getCellNumericValue(worksheet, row, col);\n if (numericValue === null) {\n return null;\n }\n\n const cacheKey = buildConditionalFormatRuleKey(matchingRule);\n let ruleValues = metricsCache.get(cacheKey);\n if (!ruleValues) {\n ruleValues = matchingRule.ranges.flatMap((range) => {\n const values: number[] = [];\n for (let targetRow = range.start.row; targetRow <= range.end.row; targetRow += 1) {\n for (let targetCol = range.start.col; targetCol <= range.end.col; targetCol += 1) {\n const value = getCellNumericValue(worksheet, targetRow, targetCol);\n if (value !== null) {\n values.push(value);\n }\n }\n }\n return values;\n });\n metricsCache.set(cacheKey, ruleValues);\n }\n\n const colors = matchingRule.colors\n .map((color) => resolveWorkbookColor(color, sheet?.themePalette))\n .filter((color): color is string => typeof color === \"string\");\n const thresholds = matchingRule.cfvos\n .map((threshold) => resolveConditionalRuleThreshold(threshold, ruleValues))\n .filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n if (colors.length < 2 || thresholds.length < 2) {\n return null;\n }\n\n const segments = Math.min(colors.length, thresholds.length) - 1;\n let resolvedColor = colors[colors.length - 1];\n for (let index = 0; index < segments; index += 1) {\n const startValue = thresholds[index] ?? thresholds[0];\n const endValue = thresholds[index + 1] ?? thresholds[thresholds.length - 1];\n if (numericValue <= endValue || index === segments - 1) {\n const ratio = endValue === startValue ? 1 : (numericValue - startValue) / (endValue - startValue);\n resolvedColor = mixRgbColor(colors[index] ?? colors[0], colors[index + 1] ?? colors[colors.length - 1], Math.max(0, Math.min(1, ratio)));\n break;\n }\n }\n\n return { color: resolvedColor };\n}\n\nfunction resolveConditionalIconForCell(\n row: number,\n col: number,\n worksheet: Worksheet,\n sheet: XlsxSheetData | null | undefined,\n metricsCache: Map<string, number[]>\n): CellRenderData[\"conditionalIcon\"] {\n const rules = sheet?.conditionalFormatRules ?? [];\n const matchingRule = rules.find(\n (rule): rule is Extract<XlsxSheetData[\"conditionalFormatRules\"][number], { kind: \"iconSet\" }> =>\n rule.kind === \"iconSet\" && rule.ranges.some((range) => isCellInRange({ row, col }, range))\n );\n if (!matchingRule) {\n return null;\n }\n\n const numericValue = getCellNumericValue(worksheet, row, col);\n if (numericValue === null) {\n return null;\n }\n\n const cacheKey = buildConditionalFormatRuleKey(matchingRule);\n let ruleValues = metricsCache.get(cacheKey);\n if (!ruleValues) {\n ruleValues = matchingRule.ranges.flatMap((range) => {\n const values: number[] = [];\n for (let targetRow = range.start.row; targetRow <= range.end.row; targetRow += 1) {\n for (let targetCol = range.start.col; targetCol <= range.end.col; targetCol += 1) {\n const value = getCellNumericValue(worksheet, targetRow, targetCol);\n if (value !== null) {\n values.push(value);\n }\n }\n }\n return values;\n });\n metricsCache.set(cacheKey, ruleValues);\n }\n\n const thresholds = matchingRule.cfvos.map((threshold) => resolveConditionalRuleThreshold(threshold, ruleValues));\n let selectedIndex = 0;\n thresholds.forEach((threshold, index) => {\n if (threshold !== null && numericValue >= threshold) {\n selectedIndex = index;\n }\n });\n\n const iconIndex = matchingRule.reverse\n ? Math.max(0, matchingRule.icons.length - 1 - selectedIndex)\n : selectedIndex;\n const icon = matchingRule.icons[Math.min(iconIndex, matchingRule.icons.length - 1)];\n return icon ? buildConditionalIcon(icon.iconSet, icon.iconId) : null;\n}\n\nfunction resolveCellDataValidation(\n row: number,\n col: number,\n sheet: XlsxSheetData | null | undefined\n): CellRenderData[\"validation\"] {\n const validation = sheet?.dataValidations.find((entry) => entry.ranges.some((range) => isCellInRange({ row, col }, range)));\n if (!validation) {\n return null;\n }\n\n const messageParts = [validation.inputMessage, validation.errorMessage].filter(\n (value): value is string => typeof value === \"string\" && value.trim().length > 0\n );\n\n return {\n message: messageParts.join(\"\\n\"),\n showDropdown: validation.showDropdown !== false,\n validationType: validation.validationType\n };\n}\n\nfunction resolveCellContentJustify(verticalAlign: React.CSSProperties[\"verticalAlign\"]) {\n if (verticalAlign === \"middle\") {\n return \"center\";\n }\n if (verticalAlign === \"top\") {\n return \"flex-start\";\n }\n return \"flex-end\";\n}\n\ntype RenderedAxisItem = {\n end: number;\n index: number;\n key: React.Key;\n size: number;\n start: number;\n};\n\ntype RenderedColumn = {\n actualCol: number;\n key: React.Key;\n size: number;\n virtualIndex: number;\n};\n\ntype GridRowProps = {\n actualRow: number;\n editingCell: XlsxCellAddress | null;\n editingValue: string;\n getCellData: (row: number, col: number) => CellRenderData;\n leadingSpacerWidth: number;\n onCellDoubleClick: (cell: XlsxCellAddress) => void;\n onCellClick: (cell: XlsxCellAddress, cellData: CellRenderData) => void;\n onCellPointerDown: (event: React.PointerEvent<HTMLTableCellElement>, cell: XlsxCellAddress) => void;\n onEditingCancel: () => void;\n onEditingCommit: () => void;\n onEditingValueChange: (value: string) => void;\n onRowHeaderRef: (actualRow: number, element: HTMLTableCellElement | null) => void;\n onRowPointerDown: (event: React.PointerEvent<HTMLTableCellElement>, actualRow: number) => void;\n onRowResizePointerDown: (event: React.PointerEvent<HTMLDivElement>, actualRow: number, rowHeight: number) => void;\n palette: ViewerPalette;\n readOnly: boolean;\n renderCellAdornment?: (cell: XlsxCellAddress) => React.ReactNode;\n rowHeight: number;\n stickyLeftByCol: Map<number, number>;\n stickyTop?: number;\n trailingSpacerWidth: number;\n visibleCols: RenderedColumn[];\n};\n\nfunction GridRow({\n actualRow,\n editingCell,\n editingValue,\n getCellData,\n leadingSpacerWidth,\n onCellClick,\n onCellDoubleClick,\n onCellPointerDown,\n onEditingCancel,\n onEditingCommit,\n onEditingValueChange,\n onRowHeaderRef,\n onRowPointerDown,\n onRowResizePointerDown,\n palette,\n readOnly,\n renderCellAdornment,\n rowHeight,\n stickyLeftByCol,\n stickyTop,\n trailingSpacerWidth,\n visibleCols\n}: GridRowProps) {\n const gutterSeparatorShadow = `inset -1px 0 0 ${palette.border}, inset 0 -1px 0 ${palette.border}`;\n\n return (\n <tr data-xlsx-row={actualRow} style={{ height: rowHeight }}>\n <td\n ref={(element) => onRowHeaderRef(actualRow, element)}\n onPointerDown={(event) => onRowPointerDown(event, actualRow)}\n style={{\n backgroundColor: palette.rowHeaderSurface,\n borderBottom: \"none\",\n borderRight: \"none\",\n boxSizing: \"border-box\",\n boxShadow: gutterSeparatorShadow,\n color: palette.mutedText,\n fontSize: \"11px\",\n height: rowHeight,\n left: 0,\n maxHeight: rowHeight,\n minWidth: ROW_HEADER_WIDTH,\n padding: \"2px 4px\",\n position: \"sticky\",\n top: stickyTop,\n textAlign: \"center\",\n userSelect: \"none\",\n width: ROW_HEADER_WIDTH,\n zIndex: stickyTop !== undefined ? 45 : 35\n }}\n >\n <div style={{ position: \"relative\" }}>\n {actualRow + 1}\n <div\n onPointerDown={(event) => onRowResizePointerDown(event, actualRow, rowHeight)}\n style={{\n backgroundColor: \"transparent\",\n bottom: -8,\n cursor: \"row-resize\",\n height: 16,\n left: 0,\n position: \"absolute\",\n width: \"100%\",\n zIndex: 5\n }}\n />\n </div>\n </td>\n {leadingSpacerWidth > 0 ? (\n <td\n aria-hidden=\"true\"\n style={{\n backgroundColor: \"transparent\",\n border: \"none\",\n padding: 0,\n width: leadingSpacerWidth\n }}\n />\n ) : null}\n {visibleCols.map(({ actualCol, key }) => {\n const cellData = getCellData(actualRow, actualCol);\n if (cellData.isMergedSecondary) {\n return null;\n }\n\n const cell = { row: actualRow, col: actualCol };\n const isEditing = isSameCell(editingCell, cell);\n const isSpilling = Boolean(cellData.spillWidth && cellData.spillWidth > 0);\n const adornment = renderCellAdornment ? renderCellAdornment(cell) : null;\n const stickyLeft = stickyLeftByCol.get(actualCol);\n const validationRight = adornment ? 24 : 4;\n const conditionalIconRight = validationRight;\n const cellStyle: React.CSSProperties = {\n ...cellData.style,\n boxSizing: \"border-box\",\n cursor: isEditing ? \"text\" : cellData.hyperlink ? \"pointer\" : \"cell\"\n };\n\n if (!cellData.rowSpan) {\n cellStyle.height = rowHeight;\n cellStyle.maxHeight = rowHeight;\n }\n\n if (isSpilling) {\n cellStyle.position = \"relative\";\n cellStyle.zIndex = 2;\n }\n if (cellData.conditionalColorScale) {\n cellStyle.backgroundColor = cellData.conditionalColorScale.color;\n }\n if (cellData.conditionalColorScale || cellData.conditionalDataBar || cellData.conditionalIcon) {\n cellStyle.position = \"relative\";\n }\n if (cellData.isTableHeader) {\n cellStyle.position = \"relative\";\n cellStyle.zIndex = Math.max(Number(cellStyle.zIndex ?? 0), 4);\n }\n if (stickyTop !== undefined) {\n cellStyle.position = \"sticky\";\n cellStyle.top = stickyTop;\n cellStyle.zIndex = Math.max(Number(cellStyle.zIndex ?? 0), 28);\n }\n if (stickyLeft !== undefined) {\n cellStyle.left = stickyLeft;\n cellStyle.position = \"sticky\";\n cellStyle.zIndex = Math.max(Number(cellStyle.zIndex ?? 0), stickyTop !== undefined ? 30 : 24);\n }\n if (isSpilling) {\n cellStyle.overflow = \"visible\";\n cellStyle.textOverflow = \"clip\";\n cellStyle.position = cellStyle.position ?? \"relative\";\n cellStyle.zIndex = Math.max(Number(cellStyle.zIndex ?? 0), stickyTop !== undefined ? 32 : 6);\n }\n if (isEditing) {\n cellStyle.padding = 0;\n }\n\n const cellContentStyle: React.CSSProperties = {\n alignItems: \"stretch\",\n display: \"flex\",\n flexDirection: \"column\",\n font: \"inherit\",\n height: \"100%\",\n justifyContent: resolveCellContentJustify(cellStyle.verticalAlign),\n maxHeight: rowHeight,\n minHeight: 0,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n textAlign: \"inherit\",\n textDecoration: \"inherit\",\n textOverflow: \"inherit\",\n whiteSpace: \"inherit\",\n width: \"100%\",\n wordBreak: \"inherit\"\n };\n const trailingInset = (adornment ? 20 : 0) + (cellData.conditionalIcon ? 18 : 0);\n if (cellData.conditionalDataBar) {\n cellContentStyle.position = \"relative\";\n cellContentStyle.zIndex = 1;\n }\n if (trailingInset > 0) {\n cellContentStyle.paddingRight = trailingInset + 4;\n }\n if (cellData.conditionalIcon) {\n cellContentStyle.position = \"relative\";\n cellContentStyle.zIndex = 1;\n }\n if (cellData.sparkline || cellData.checkboxState !== null) {\n cellContentStyle.alignItems = \"center\";\n cellContentStyle.justifyContent = \"center\";\n }\n const title = [cellData.hyperlink?.tooltip, cellData.validation?.message, cellData.value]\n .filter((value, index, values): value is string => typeof value === \"string\" && value.length > 0 && values.indexOf(value) === index)\n .join(\"\\n\");\n\n return (\n <td\n data-xlsx-cell={`${actualRow}:${actualCol}`}\n key={key}\n colSpan={cellData.colSpan}\n rowSpan={cellData.rowSpan}\n onDoubleClick={() => {\n if (readOnly) {\n return;\n }\n\n onCellDoubleClick(cell);\n }}\n onClick={() => onCellClick(cell, cellData)}\n onPointerDown={(event) => onCellPointerDown(event, cell)}\n style={cellStyle}\n title={title}\n >\n {cellData.conditionalDataBar ? (\n <div\n aria-hidden=\"true\"\n style={{\n alignItems: \"center\",\n bottom: 4,\n display: \"flex\",\n left: 4,\n pointerEvents: \"none\",\n position: \"absolute\",\n right: 4,\n top: 4,\n zIndex: 0\n }}\n >\n <div\n style={{\n background: cellData.conditionalDataBar.gradient === false\n ? cellData.conditionalDataBar.color\n : `linear-gradient(90deg, ${lightenColor(cellData.conditionalDataBar.color, 0.28)} 0%, ${cellData.conditionalDataBar.color} 100%)`,\n border: cellData.conditionalDataBar.border !== false && cellData.conditionalDataBar.borderColor\n ? `1px solid ${cellData.conditionalDataBar.borderColor}`\n : \"none\",\n borderRadius: 2,\n height: \"100%\",\n opacity: 1,\n width: `${cellData.conditionalDataBar.widthPercent}%`\n }}\n />\n </div>\n ) : null}\n {adornment}\n {cellData.conditionalIcon ? (\n <div\n aria-hidden=\"true\"\n style={{\n alignItems: \"center\",\n display: \"inline-flex\",\n justifyContent: \"center\",\n pointerEvents: \"none\",\n position: \"absolute\",\n right: conditionalIconRight,\n top: \"50%\",\n transform: \"translateY(-50%)\",\n zIndex: 2\n }}\n >\n {renderConditionalIcon(cellData.conditionalIcon)}\n </div>\n ) : null}\n {isEditing ? (\n <input\n autoFocus\n onBlur={onEditingCommit}\n onChange={(event) => onEditingValueChange(event.target.value)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") {\n event.preventDefault();\n onEditingCommit();\n return;\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n onEditingCancel();\n }\n }}\n style={{\n backgroundColor: \"transparent\",\n border: 0,\n color: \"inherit\",\n font: \"inherit\",\n height: \"100%\",\n margin: 0,\n outline: \"none\",\n padding: DEFAULT_CELL_PADDING,\n width: \"100%\"\n }}\n value={editingValue}\n />\n ) : isSpilling ? (\n <div\n style={{\n maxWidth: cellData.spillWidth,\n overflow: \"visible\",\n pointerEvents: \"none\",\n position: \"relative\",\n whiteSpace: \"inherit\",\n width: cellData.spillWidth\n }}\n >\n {cellData.value}\n </div>\n ) : cellData.sparkline ? (\n <div\n style={{\n alignItems: \"center\",\n display: \"flex\",\n height: \"100%\",\n justifyContent: \"center\",\n pointerEvents: \"none\",\n width: \"100%\"\n }}\n >\n {renderSparkline(cellData.sparkline.config, cellData.sparkline.values, palette)}\n </div>\n ) : cellData.checkboxState != null ? (\n <div\n style={{\n alignItems: \"center\",\n display: \"flex\",\n height: \"100%\",\n justifyContent: \"center\",\n pointerEvents: \"none\",\n width: \"100%\"\n }}\n >\n {renderCheckboxControl(cellData.checkboxState, palette)}\n </div>\n ) : (\n <div style={cellContentStyle}>{cellData.value}</div>\n )}\n </td>\n );\n })}\n {trailingSpacerWidth > 0 ? (\n <td\n aria-hidden=\"true\"\n style={{\n backgroundColor: \"transparent\",\n border: \"none\",\n padding: 0,\n width: trailingSpacerWidth\n }}\n />\n ) : null}\n </tr>\n );\n}\n\nconst MemoGridRow = React.memo(GridRow, (prev, next) => {\n if (\n prev.actualRow !== next.actualRow ||\n prev.rowHeight !== next.rowHeight ||\n prev.palette !== next.palette ||\n prev.readOnly !== next.readOnly ||\n prev.visibleCols !== next.visibleCols ||\n prev.leadingSpacerWidth !== next.leadingSpacerWidth ||\n prev.stickyLeftByCol !== next.stickyLeftByCol ||\n prev.stickyTop !== next.stickyTop ||\n prev.trailingSpacerWidth !== next.trailingSpacerWidth ||\n prev.getCellData !== next.getCellData ||\n prev.onCellClick !== next.onCellClick ||\n prev.onCellDoubleClick !== next.onCellDoubleClick ||\n prev.onCellPointerDown !== next.onCellPointerDown ||\n prev.onEditingCancel !== next.onEditingCancel ||\n prev.onEditingCommit !== next.onEditingCommit ||\n prev.onEditingValueChange !== next.onEditingValueChange ||\n prev.onRowHeaderRef !== next.onRowHeaderRef ||\n prev.onRowPointerDown !== next.onRowPointerDown ||\n prev.onRowResizePointerDown !== next.onRowResizePointerDown ||\n prev.renderCellAdornment !== next.renderCellAdornment\n ) {\n return false;\n }\n\n const prevEditingCol = prev.editingCell?.row === prev.actualRow ? prev.editingCell.col : -1;\n const nextEditingCol = next.editingCell?.row === next.actualRow ? next.editingCell.col : -1;\n if (prevEditingCol !== nextEditingCol) {\n return false;\n }\n\n if (prevEditingCol !== -1 && prev.editingValue !== next.editingValue) {\n return false;\n }\n\n return true;\n});\n\nfunction XlsxGrid({\n controller,\n emptyState,\n errorState,\n fileTooLargeState,\n loadingComponent,\n loadingState,\n renderChartLoading,\n palette,\n renderImage,\n renderImageSelection,\n renderTableHeaderMenu,\n selectionColor,\n selectionFillColor,\n selectionHeaderColor,\n showImages = true\n}: Pick<\n XlsxViewerProps,\n \"emptyState\" | \"errorState\" | \"fileTooLargeState\" | \"loadingComponent\" | \"loadingState\" | \"renderChartLoading\" | \"renderImage\" | \"renderImageSelection\" | \"renderTableHeaderMenu\" | \"selectionColor\" | \"selectionFillColor\" | \"selectionHeaderColor\" | \"showImages\"\n> & {\n controller: XlsxViewerController;\n palette: ViewerPalette;\n}) {\n const {\n activeCell,\n activeSheet,\n activeSheetIndex,\n activeTab,\n activeTabIndex,\n canLoadDeferred,\n charts,\n clearSelectedChart,\n clearSelectedImage,\n clearSelectedCells,\n continueDeferredLoad,\n deferredLoadFileSize,\n displayFileName,\n error,\n fillSelection,\n getActiveWorksheet,\n getChartById,\n getRowsBatchAsync,\n getClipboardData,\n getCellDisplayValue: getControllerCellDisplayValue,\n images,\n shapes,\n isLoadDeferred,\n isLoading,\n isChartsLoading,\n isWorkerBacked,\n copySelectionToClipboard,\n pasteFromClipboard,\n pasteStructuredClipboardData,\n pasteText,\n readOnly,\n redo,\n revision,\n selectedChart,\n selectedChartId,\n selectedImage,\n selectedImageId,\n selectCell,\n selectChart,\n selectImage,\n selectRange,\n selection,\n setActiveSheetIndex,\n setChartRect,\n setImageRect,\n setCellValue,\n sheets,\n tabs,\n sortState,\n sortTable,\n tables,\n undo,\n zoomScale\n } = controller;\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const tableRef = React.useRef<HTMLTableElement>(null);\n const selectionOverlayRef = React.useRef<HTMLDivElement>(null);\n const activeValidationOverlayRef = React.useRef<HTMLDivElement>(null);\n const fillHandleRef = React.useRef<HTMLDivElement>(null);\n const tableMenuRef = React.useRef<HTMLDivElement>(null);\n const colElementRefs = React.useRef(new Map<number, HTMLTableColElement>());\n const colHeaderCellRefs = React.useRef(new Map<number, HTMLTableCellElement>());\n const rowElementRefs = React.useRef(new Map<number, HTMLTableRowElement>());\n const rowHeaderCellRefs = React.useRef(new Map<number, HTMLTableCellElement>());\n const columnPreviewRef = React.useRef<{ actualIndex: number; size: number } | null>(null);\n const rowPreviewRef = React.useRef<{ actualIndex: number; size: number } | null>(null);\n const activeCellRef = React.useRef<XlsxCellAddress | null>(activeCell);\n const selectedChartIdRef = React.useRef<string | null>(selectedChartId);\n const selectedImageIdRef = React.useRef<string | null>(selectedImageId);\n const pendingSelectionCommitRef = React.useRef<XlsxCellRange | null>(null);\n const selectionCommitFrameRef = React.useRef<number | null>(null);\n const selectionRef = React.useRef<XlsxCellRange | null>(null);\n const editingCellRef = React.useRef<XlsxCellAddress | null>(null);\n const readOnlyRef = React.useRef(readOnly);\n const displayedSelectionRef = React.useRef<XlsxCellRange | null>(null);\n const firstVisibleColRef = React.useRef<number | undefined>(undefined);\n const lastVisibleColRef = React.useRef<number | undefined>(undefined);\n const firstVisibleRowRef = React.useRef<number | undefined>(undefined);\n const lastVisibleRowRef = React.useRef<number | undefined>(undefined);\n const cellRenderCacheRef = React.useRef(new Map<string, CellRenderData>());\n const conditionalFormatMetricsCacheRef = React.useRef(new Map<string, number[]>());\n const resizeStateRef = React.useRef<\n | {\n actualIndex: number;\n initialPx: number;\n pointerId: number;\n startPosition: number;\n type: \"column\" | \"row\";\n }\n | null\n >(null);\n const resizeFrameRef = React.useRef<number | null>(null);\n const pendingResizePreviewRef = React.useRef<\n | {\n actualIndex: number;\n size: number;\n type: \"column\" | \"row\";\n }\n | null\n >(null);\n const selectionDragRef = React.useRef<\n | {\n anchor: XlsxCellAddress;\n axis: \"cell\" | \"column\" | \"row\";\n contentScaleX: number;\n contentScaleY: number;\n committedOnPointerDown: boolean;\n didDrag: boolean;\n originCell: XlsxCellAddress;\n originOverlayRect: { height: number; left: number; top: number; width: number } | null;\n originContentX: number;\n originContentY: number;\n previewRange: XlsxCellRange;\n pointerId: number;\n startClientX: number;\n startClientY: number;\n }\n | null\n >(null);\n const fillDragRef = React.useRef<\n | {\n pointerId: number;\n previewRange: XlsxCellRange;\n sourceRange: XlsxCellRange;\n }\n | null\n >(null);\n const selectionDragCleanupRef = React.useRef<(() => void) | null>(null);\n const fillDragCleanupRef = React.useRef<(() => void) | null>(null);\n const cachedScrollerRectRef = React.useRef<DOMRect | null>(null);\n const imageInteractionCleanupRef = React.useRef<(() => void) | null>(null);\n const imageInteractionRef = React.useRef<\n | {\n baseRect: XlsxImageRect;\n didMove: boolean;\n imageId: string;\n pointerId: number;\n startClientX: number;\n startClientY: number;\n type: \"move\";\n }\n | {\n baseRect: XlsxImageRect;\n didMove: boolean;\n handle: XlsxImageResizeHandlePosition;\n imageId: string;\n pointerId: number;\n startClientX: number;\n startClientY: number;\n type: \"resize\";\n }\n | null\n >(null);\n const chartInteractionCleanupRef = React.useRef<(() => void) | null>(null);\n const chartInteractionRef = React.useRef<\n | {\n baseRect: XlsxImageRect;\n didMove: boolean;\n chartId: string;\n pointerId: number;\n startClientX: number;\n startClientY: number;\n type: \"move\";\n }\n | {\n baseRect: XlsxImageRect;\n didMove: boolean;\n chartId: string;\n handle: XlsxImageResizeHandlePosition;\n pointerId: number;\n startClientX: number;\n startClientY: number;\n type: \"resize\";\n }\n | null\n >(null);\n const [editingCell, setEditingCell] = React.useState<XlsxCellAddress | null>(null);\n const [editingValue, setEditingValue] = React.useState(\"\");\n const [openTableMenu, setOpenTableMenu] = React.useState<{ col: number; row: number; tableName: string } | null>(null);\n const [fillPreviewRange, setFillPreviewRange] = React.useState<XlsxCellRange | null>(null);\n const [chartPreviewRect, setChartPreviewRect] = React.useState<{ id: string; rect: XlsxImageRect } | null>(null);\n const chartPreviewRectRef = React.useRef<{ id: string; rect: XlsxImageRect } | null>(null);\n const skipNextChartClickRef = React.useRef<string | null>(null);\n const paneDrawingNodesCacheRef = React.useRef<{\n chartRects: Array<{ chart: XlsxChart; rect: XlsxImageRect }>;\n drawingViewport: DrawingViewport;\n imageRects: Array<{ image: XlsxImage; rect: XlsxImageRect }>;\n palette: ViewerPalette;\n readOnly: boolean;\n renderChartLoading: XlsxViewerProps[\"renderChartLoading\"];\n renderImage: XlsxViewerProps[\"renderImage\"];\n renderImageSelection: XlsxViewerProps[\"renderImageSelection\"];\n isChartsLoading: boolean;\n selectedChartId: string | null;\n selectedImageId: string | null;\n selectionStroke: string;\n shapeRects: Array<{ rect: XlsxImageRect; shape: XlsxShape }>;\n showImages: boolean;\n value: Record<FrozenDrawingPane, React.ReactNode>;\n } | null>(null);\n const [drawingViewport, setDrawingViewport] = React.useState<DrawingViewport>({\n height: 0,\n left: 0,\n top: 0,\n width: 0\n });\n const selectionPreviewRangeRef = React.useRef<XlsxCellRange | null>(null);\n const [imagePreviewRect, setImagePreviewRect] = React.useState<{ id: string; rect: XlsxImageRect } | null>(null);\n const imagePreviewRectRef = React.useRef<{ id: string; rect: XlsxImageRect } | null>(null);\n const imagePreviewFrameRef = React.useRef<number | null>(null);\n const pendingImagePreviewRef = React.useRef<{ id: string; rect: XlsxImageRect } | null>(null);\n const chartPreviewFrameRef = React.useRef<number | null>(null);\n const pendingChartPreviewRef = React.useRef<{ id: string; rect: XlsxImageRect } | null>(null);\n const skipNextImageClickRef = React.useRef<string | null>(null);\n const [pendingNavigation, setPendingNavigation] = React.useState<{ cell: XlsxCellAddress; sheetIndex: number } | null>(null);\n const interactionModeRef = React.useRef<\"idle\" | \"fill\" | \"select\">(\"idle\");\n const setInteractionMode = React.useCallback((mode: \"idle\" | \"fill\" | \"select\") => {\n interactionModeRef.current = mode;\n }, []);\n const worksheet = getActiveWorksheet();\n const normalizedSelection = React.useMemo(() => (selection ? normalizeRange(selection) : null), [selection]);\n const zoomFactor = React.useMemo(() => Math.max(0.1, zoomScale / 100), [zoomScale]);\n const previousZoomFactorRef = React.useRef(zoomFactor);\n const effectiveTables = tables;\n const [displayRowLimit, setDisplayRowLimit] = React.useState(() =>\n resolveInitialDisplayExtent(\n activeSheet?.maxUsedRow ?? -1,\n MIN_OPEN_GRID_ROWS,\n OPEN_GRID_ROW_PADDING,\n Boolean(isWorkerBacked),\n INITIAL_WORKER_GRID_ROWS\n )\n );\n const [displayColLimit, setDisplayColLimit] = React.useState(() =>\n resolveInitialDisplayExtent(\n activeSheet?.maxUsedCol ?? -1,\n MIN_OPEN_GRID_COLS,\n OPEN_GRID_COL_PADDING,\n Boolean(isWorkerBacked),\n INITIAL_WORKER_GRID_COLS\n )\n );\n const hiddenRowSet = React.useMemo(() => new Set(activeSheet?.hiddenRows ?? []), [activeSheet?.hiddenRows]);\n const hiddenColSet = React.useMemo(() => new Set(activeSheet?.hiddenCols ?? []), [activeSheet?.hiddenCols]);\n const syncDrawingViewport = React.useCallback((scroller: HTMLDivElement | null) => {\n if (!scroller) {\n return;\n }\n\n setDrawingViewport((current) => {\n const next = {\n height: scroller.clientHeight / zoomFactor,\n left: scroller.scrollLeft / zoomFactor,\n top: scroller.scrollTop / zoomFactor,\n width: scroller.clientWidth / zoomFactor\n };\n return current.left === next.left\n && current.top === next.top\n && current.width === next.width\n && current.height === next.height\n ? current\n : next;\n });\n }, [zoomFactor]);\n const visibleRows = React.useMemo(() => {\n return buildVisibleAxisIndices(\n activeSheet?.visibleRows ?? [],\n displayRowLimit,\n activeSheet?.maxUsedRow ?? -1,\n hiddenRowSet\n );\n }, [activeSheet?.maxUsedRow, activeSheet?.visibleRows, displayRowLimit, hiddenRowSet]);\n const visibleCols = React.useMemo(() => {\n return buildVisibleAxisIndices(\n activeSheet?.visibleCols ?? [],\n displayColLimit,\n activeSheet?.maxUsedCol ?? -1,\n hiddenColSet\n );\n }, [activeSheet?.maxUsedCol, activeSheet?.visibleCols, displayColLimit, hiddenColSet]);\n const frozenRows = React.useMemo(() => {\n const freezeRow = activeSheet?.freezePanes?.row ?? 0;\n if (freezeRow <= 0) {\n return [];\n }\n\n return visibleRows.filter((row) => row < freezeRow);\n }, [activeSheet?.freezePanes?.row, visibleRows]);\n const frozenCols = React.useMemo(() => {\n const freezeCol = activeSheet?.freezePanes?.col ?? 0;\n if (freezeCol <= 0) {\n return [];\n }\n\n return visibleCols.filter((col) => col < freezeCol);\n }, [activeSheet?.freezePanes?.col, visibleCols]);\n const actualColWidths = React.useMemo(\n () => {\n const widths = new Array(displayColLimit).fill(0);\n const showGridLines = activeSheet?.showGridLines ?? true;\n const fallbackWidth = Math.max(\n resolveRenderedSheetAxisPixels(activeSheet?.defaultColWidthPx ?? DEFAULT_COL_WIDTH, showGridLines),\n DEFAULT_COL_WIDTH / 2\n );\n\n if (worksheet) {\n for (let col = 0; col < displayColLimit; col += 1) {\n if (worksheet.isColumnHidden(col)) {\n continue;\n }\n\n const width = worksheet.getColumnWidth(col);\n if (width !== undefined && width !== null) {\n widths[col] = Math.max(\n resolveRenderedSheetAxisPixels(\n resolveSheetColumnWidthPixels(width, activeSheet?.columnWidthCharacterWidthPx),\n showGridLines\n ),\n DEFAULT_COL_WIDTH / 2\n );\n continue;\n }\n\n widths[col] = Math.max(\n resolveRenderedSheetAxisPixels(\n activeSheet?.colWidthOverridesPx[col] ?? activeSheet?.defaultColWidthPx ?? DEFAULT_COL_WIDTH,\n showGridLines\n ),\n DEFAULT_COL_WIDTH / 2\n );\n }\n\n return widths;\n }\n\n const precomputedCols = activeSheet?.visibleCols ?? [];\n const precomputedWidths = activeSheet?.colWidths ?? [];\n for (let index = 0; index < precomputedCols.length; index += 1) {\n const col = precomputedCols[index];\n if (col === undefined || col >= displayColLimit) {\n continue;\n }\n\n widths[col] = Math.max(\n resolveRenderedSheetAxisPixels(precomputedWidths[index] ?? activeSheet?.defaultColWidthPx ?? DEFAULT_COL_WIDTH, showGridLines),\n DEFAULT_COL_WIDTH / 2\n );\n }\n\n for (let col = Math.max(0, (activeSheet?.maxUsedCol ?? -1) + 1); col < displayColLimit; col += 1) {\n widths[col] = fallbackWidth;\n }\n\n return widths;\n },\n [\n activeSheet?.colWidthOverridesPx,\n activeSheet?.colWidths,\n activeSheet?.defaultColWidthPx,\n activeSheet?.maxUsedCol,\n activeSheet?.showGridLines,\n activeSheet?.visibleCols,\n displayColLimit,\n worksheet,\n revision\n ]\n );\n const actualRowHeights = React.useMemo(\n () => {\n const heights = new Array(displayRowLimit).fill(0);\n const showGridLines = activeSheet?.showGridLines ?? true;\n const fallbackHeight = Math.max(\n resolveRenderedSheetAxisPixels(activeSheet?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT, showGridLines),\n DEFAULT_ROW_HEIGHT / 1.5\n );\n\n if (worksheet) {\n for (let row = 0; row < displayRowLimit; row += 1) {\n if (worksheet.isRowHidden(row)) {\n continue;\n }\n\n const height = worksheet.getRowHeight(row);\n if (height !== undefined && height !== null) {\n heights[row] = Math.max(\n resolveRenderedSheetAxisPixels(resolveSheetRowHeightPixels(height), showGridLines),\n DEFAULT_ROW_HEIGHT / 1.5\n );\n continue;\n }\n\n heights[row] = Math.max(\n resolveRenderedSheetAxisPixels(\n activeSheet?.rowHeightOverridesPx[row] ?? activeSheet?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT,\n showGridLines\n ),\n DEFAULT_ROW_HEIGHT / 1.5\n );\n }\n\n return heights;\n }\n\n const precomputedRows = activeSheet?.visibleRows ?? [];\n const precomputedHeights = activeSheet?.rowHeights ?? [];\n for (let index = 0; index < precomputedRows.length; index += 1) {\n const row = precomputedRows[index];\n if (row === undefined || row >= displayRowLimit) {\n continue;\n }\n\n heights[row] = Math.max(\n resolveRenderedSheetAxisPixels(precomputedHeights[index] ?? activeSheet?.defaultRowHeightPx ?? DEFAULT_ROW_HEIGHT, showGridLines),\n DEFAULT_ROW_HEIGHT / 1.5\n );\n }\n\n for (let row = Math.max(0, (activeSheet?.maxUsedRow ?? -1) + 1); row < displayRowLimit; row += 1) {\n heights[row] = fallbackHeight;\n }\n\n return heights;\n },\n [\n activeSheet?.defaultRowHeightPx,\n activeSheet?.maxUsedRow,\n activeSheet?.rowHeightOverridesPx,\n activeSheet?.rowHeights,\n activeSheet?.showGridLines,\n activeSheet?.visibleRows,\n displayRowLimit,\n worksheet,\n revision\n ]\n );\n const effectiveColWidths = React.useMemo(\n () => visibleCols.map((col) => actualColWidths[col] ?? DEFAULT_COL_WIDTH),\n [actualColWidths, visibleCols]\n );\n const effectiveRowHeights = React.useMemo(\n () => visibleRows.map((row) => actualRowHeights[row] ?? DEFAULT_ROW_HEIGHT),\n [actualRowHeights, visibleRows]\n );\n const rowIndexByActual = React.useMemo(() => new Map(visibleRows.map((row, index) => [row, index])), [visibleRows]);\n const colIndexByActual = React.useMemo(() => new Map(visibleCols.map((col, index) => [col, index])), [visibleCols]);\n const visibleRowsRef = React.useRef<number[]>(visibleRows);\n const visibleColsRef = React.useRef<number[]>(visibleCols);\n const effectiveRowHeightsRef = React.useRef<number[]>(effectiveRowHeights);\n const effectiveColWidthsRef = React.useRef<number[]>(effectiveColWidths);\n const rowPrefixSums = React.useMemo(() => buildPrefixSums(effectiveRowHeights), [effectiveRowHeights]);\n const colPrefixSums = React.useMemo(() => buildPrefixSums(effectiveColWidths), [effectiveColWidths]);\n const actualRowPrefixSums = React.useMemo(() => buildPrefixSums(actualRowHeights), [actualRowHeights]);\n const actualColPrefixSums = React.useMemo(() => buildPrefixSums(actualColWidths), [actualColWidths]);\n const stickyTopByRow = React.useMemo(\n () => buildStickyOffsets(frozenRows, actualRowHeights, HEADER_HEIGHT),\n [actualRowHeights, frozenRows]\n );\n const stickyLeftByCol = React.useMemo(\n () => buildStickyOffsets(frozenCols, actualColWidths, ROW_HEADER_WIDTH),\n [actualColWidths, frozenCols]\n );\n const frozenPaneBottom = React.useMemo(\n () => (\n frozenRows.length > 0\n ? frozenRows.reduce(\n (max, row) => Math.max(max, (stickyTopByRow.get(row) ?? HEADER_HEIGHT) + (actualRowHeights[row] ?? DEFAULT_ROW_HEIGHT)),\n HEADER_HEIGHT\n )\n : HEADER_HEIGHT\n ),\n [actualRowHeights, frozenRows, stickyTopByRow]\n );\n const frozenPaneRight = React.useMemo(\n () => (\n frozenCols.length > 0\n ? frozenCols.reduce(\n (max, col) => Math.max(max, (stickyLeftByCol.get(col) ?? ROW_HEADER_WIDTH) + (actualColWidths[col] ?? DEFAULT_COL_WIDTH)),\n ROW_HEADER_WIDTH\n )\n : ROW_HEADER_WIDTH\n ),\n [actualColWidths, frozenCols, stickyLeftByCol]\n );\n const useNativeZoomForStickyLayout = zoomFactor !== 1;\n const rowPrefixSumsRef = React.useRef<number[]>(rowPrefixSums);\n const colPrefixSumsRef = React.useRef<number[]>(colPrefixSums);\n const firstVisibleRow = visibleRows[0];\n const lastVisibleRow = visibleRows[visibleRows.length - 1];\n const firstVisibleCol = visibleCols[0];\n const lastVisibleCol = visibleCols[visibleCols.length - 1];\n const displayedSelection = fillPreviewRange ?? normalizedSelection;\n const drawingExtents = React.useMemo(() => {\n const imageExtents = images.reduce(\n (current, image) => {\n const extents = resolveImageAnchorExtents(image);\n return {\n maxCol: Math.max(current.maxCol, extents.maxCol),\n maxRow: Math.max(current.maxRow, extents.maxRow)\n };\n },\n { maxCol: -1, maxRow: -1 }\n );\n const shapeExtents = shapes.reduce(\n (current, shape) => {\n const extents = resolveShapeAnchorExtents(shape);\n return {\n maxCol: Math.max(current.maxCol, extents.maxCol),\n maxRow: Math.max(current.maxRow, extents.maxRow)\n };\n },\n { maxCol: -1, maxRow: -1 }\n );\n const chartExtents = charts.reduce(\n (current, chart) => {\n const extents = resolveChartAnchorExtents(chart);\n return {\n maxCol: Math.max(current.maxCol, extents.maxCol),\n maxRow: Math.max(current.maxRow, extents.maxRow)\n };\n },\n { maxCol: -1, maxRow: -1 }\n );\n\n return {\n maxCol: Math.max(imageExtents.maxCol, shapeExtents.maxCol, chartExtents.maxCol),\n maxRow: Math.max(imageExtents.maxRow, shapeExtents.maxRow, chartExtents.maxRow)\n };\n }, [charts, images, shapes]);\n const frozenRowCount = activeSheet?.freezePanes?.row ?? 0;\n const shouldVirtualizeRows = !activeSheet?.hasVerticalMerges\n || (activeSheet.maxVerticalMergeEndRow >= 0 && activeSheet.maxVerticalMergeEndRow < frozenRowCount);\n const shouldVirtualizeCols = !activeSheet?.hasHorizontalMerges && frozenCols.length === 0;\n\n const rowVirtualizer = useVirtualizer({\n count: visibleRows.length,\n estimateSize: (index) => effectiveRowHeights[index] ?? DEFAULT_ROW_HEIGHT,\n getScrollElement: () => scrollRef.current,\n getItemKey: (index) => visibleRows[index] ?? index,\n observeElementOffset: (instance, cb) => observeZoomedElementOffset(instance, zoomFactor, cb),\n observeElementRect: (instance, cb) => observeZoomedElementRect(instance, zoomFactor, cb),\n overscan: 10,\n scrollToFn: (offset, options, instance) => scrollToZoomedOffset(offset, zoomFactor, options, instance)\n });\n const colVirtualizer = useVirtualizer({\n count: visibleCols.length,\n estimateSize: (index) => effectiveColWidths[index] ?? DEFAULT_COL_WIDTH,\n getScrollElement: () => scrollRef.current,\n getItemKey: (index) => visibleCols[index] ?? index,\n horizontal: true,\n observeElementOffset: (instance, cb) => observeZoomedElementOffset(instance, zoomFactor, cb),\n observeElementRect: (instance, cb) => observeZoomedElementRect(instance, zoomFactor, cb),\n overscan: 6,\n scrollToFn: (offset, options, instance) => scrollToZoomedOffset(offset, zoomFactor, options, instance)\n });\n const currentRowVirtualItems = rowVirtualizer.getVirtualItems();\n const currentColVirtualItems = colVirtualizer.getVirtualItems();\n const frozenRowVirtualIndices = React.useMemo(\n () => frozenRows\n .map((row) => rowIndexByActual.get(row))\n .filter((index): index is number => index !== undefined),\n [frozenRows, rowIndexByActual]\n );\n const maxRowDisplayLimit = React.useMemo(\n () => resolveOpenGridExtent(activeSheet?.maxUsedRow ?? -1, MIN_OPEN_GRID_ROWS, OPEN_GRID_ROW_PADDING),\n [activeSheet?.maxUsedRow]\n );\n const maxColDisplayLimit = React.useMemo(\n () => resolveOpenGridExtent(activeSheet?.maxUsedCol ?? -1, MIN_OPEN_GRID_COLS, OPEN_GRID_COL_PADDING),\n [activeSheet?.maxUsedCol]\n );\n\n React.useEffect(() => {\n if (!isWorkerBacked) {\n return;\n }\n\n const lastVirtualRowIndex = currentRowVirtualItems[currentRowVirtualItems.length - 1]?.index ?? -1;\n const lastVirtualColIndex = currentColVirtualItems[currentColVirtualItems.length - 1]?.index ?? -1;\n\n if (\n lastVirtualRowIndex >= visibleRows.length - WORKER_GRID_GROW_THRESHOLD_ROWS\n && displayRowLimit < maxRowDisplayLimit\n ) {\n setDisplayRowLimit((current) => Math.min(maxRowDisplayLimit, current + WORKER_GRID_GROW_ROWS));\n }\n\n if (\n lastVirtualColIndex >= visibleCols.length - WORKER_GRID_GROW_THRESHOLD_COLS\n && displayColLimit < maxColDisplayLimit\n ) {\n setDisplayColLimit((current) => Math.min(maxColDisplayLimit, current + WORKER_GRID_GROW_COLS));\n }\n }, [\n currentColVirtualItems,\n currentRowVirtualItems,\n displayColLimit,\n displayRowLimit,\n isWorkerBacked,\n maxColDisplayLimit,\n maxRowDisplayLimit,\n visibleCols.length,\n visibleRows.length\n ]);\n\n React.useEffect(() => {\n activeCellRef.current = activeCell;\n }, [activeCell]);\n\n React.useEffect(() => {\n selectedChartIdRef.current = selectedChartId;\n }, [selectedChartId]);\n\n React.useEffect(() => {\n selectedImageIdRef.current = selectedImageId;\n }, [selectedImageId]);\n\n React.useEffect(() => {\n selectionRef.current = normalizedSelection;\n }, [normalizedSelection]);\n\n React.useEffect(() => {\n editingCellRef.current = editingCell;\n }, [editingCell]);\n\n React.useEffect(() => {\n readOnlyRef.current = readOnly;\n }, [readOnly]);\n\n React.useEffect(() => {\n chartPreviewRectRef.current = chartPreviewRect;\n }, [chartPreviewRect]);\n\n React.useEffect(() => {\n imagePreviewRectRef.current = imagePreviewRect;\n }, [imagePreviewRect]);\n\n React.useEffect(() => () => {\n if (selectionCommitFrameRef.current !== null) {\n window.cancelAnimationFrame(selectionCommitFrameRef.current);\n selectionCommitFrameRef.current = null;\n }\n if (imagePreviewFrameRef.current !== null) {\n window.cancelAnimationFrame(imagePreviewFrameRef.current);\n imagePreviewFrameRef.current = null;\n }\n if (chartPreviewFrameRef.current !== null) {\n window.cancelAnimationFrame(chartPreviewFrameRef.current);\n chartPreviewFrameRef.current = null;\n }\n }, []);\n\n const scheduleImagePreviewRect = React.useCallback((preview: { id: string; rect: XlsxImageRect }) => {\n pendingImagePreviewRef.current = preview;\n if (imagePreviewFrameRef.current !== null) {\n return;\n }\n imagePreviewFrameRef.current = window.requestAnimationFrame(() => {\n imagePreviewFrameRef.current = null;\n const nextPreview = pendingImagePreviewRef.current;\n pendingImagePreviewRef.current = null;\n if (!nextPreview) {\n return;\n }\n imagePreviewRectRef.current = nextPreview;\n setImagePreviewRect(nextPreview);\n });\n }, []);\n\n const scheduleChartPreviewRect = React.useCallback((preview: { id: string; rect: XlsxImageRect }) => {\n pendingChartPreviewRef.current = preview;\n if (chartPreviewFrameRef.current !== null) {\n return;\n }\n chartPreviewFrameRef.current = window.requestAnimationFrame(() => {\n chartPreviewFrameRef.current = null;\n const nextPreview = pendingChartPreviewRef.current;\n pendingChartPreviewRef.current = null;\n if (!nextPreview) {\n return;\n }\n chartPreviewRectRef.current = nextPreview;\n setChartPreviewRect(nextPreview);\n });\n }, []);\n\n React.useEffect(() => {\n displayedSelectionRef.current = selectionPreviewRangeRef.current ?? displayedSelection;\n }, [displayedSelection]);\n\n React.useEffect(() => {\n const previewRange = selectionPreviewRangeRef.current;\n if (!previewRange || selectionDragRef.current || fillDragRef.current) {\n return;\n }\n\n if (normalizedSelection && rangesEqual(previewRange, normalizedSelection)) {\n selectionPreviewRangeRef.current = null;\n displayedSelectionRef.current = displayedSelection;\n return;\n }\n\n if (!normalizedSelection && !displayedSelection) {\n selectionPreviewRangeRef.current = null;\n displayedSelectionRef.current = null;\n }\n }, [displayedSelection, normalizedSelection]);\n\n React.useEffect(() => {\n firstVisibleColRef.current = firstVisibleCol;\n lastVisibleColRef.current = lastVisibleCol;\n firstVisibleRowRef.current = firstVisibleRow;\n lastVisibleRowRef.current = lastVisibleRow;\n }, [firstVisibleCol, firstVisibleRow, lastVisibleCol, lastVisibleRow]);\n\n React.useEffect(() => {\n visibleRowsRef.current = visibleRows;\n visibleColsRef.current = visibleCols;\n effectiveRowHeightsRef.current = effectiveRowHeights;\n effectiveColWidthsRef.current = effectiveColWidths;\n rowPrefixSumsRef.current = rowPrefixSums;\n colPrefixSumsRef.current = colPrefixSums;\n }, [colPrefixSums, effectiveColWidths, effectiveRowHeights, rowPrefixSums, visibleCols, visibleRows]);\n\n React.useLayoutEffect(() => {\n const scroller = scrollRef.current;\n const previousZoomFactor = previousZoomFactorRef.current;\n if (!scroller || previousZoomFactor === zoomFactor) {\n previousZoomFactorRef.current = zoomFactor;\n return;\n }\n\n scroller.scrollLeft = (scroller.scrollLeft / previousZoomFactor) * zoomFactor;\n scroller.scrollTop = (scroller.scrollTop / previousZoomFactor) * zoomFactor;\n previousZoomFactorRef.current = zoomFactor;\n rowVirtualizer.measure();\n colVirtualizer.measure();\n syncDrawingViewport(scroller);\n }, [colVirtualizer, rowVirtualizer, syncDrawingViewport, zoomFactor]);\n\n React.useLayoutEffect(() => {\n syncDrawingViewport(scrollRef.current);\n }, [activeSheet, activeTabIndex, displayColLimit, displayRowLimit, syncDrawingViewport, zoomFactor]);\n\n React.useLayoutEffect(() => {\n const scroller = scrollRef.current;\n if (!scroller) {\n return;\n }\n syncDrawingViewport(scroller);\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n const observer = new ResizeObserver(() => {\n syncDrawingViewport(scroller);\n });\n observer.observe(scroller);\n return () => {\n observer.disconnect();\n };\n }, [activeSheet, syncDrawingViewport]);\n\n React.useEffect(() => {\n setDisplayRowLimit(\n resolveInitialDisplayExtent(\n activeSheet?.maxUsedRow ?? -1,\n MIN_OPEN_GRID_ROWS,\n OPEN_GRID_ROW_PADDING,\n Boolean(isWorkerBacked),\n INITIAL_WORKER_GRID_ROWS\n )\n );\n setDisplayColLimit(\n resolveInitialDisplayExtent(\n activeSheet?.maxUsedCol ?? -1,\n MIN_OPEN_GRID_COLS,\n OPEN_GRID_COL_PADDING,\n Boolean(isWorkerBacked),\n INITIAL_WORKER_GRID_COLS\n )\n );\n }, [activeSheet?.maxUsedCol, activeSheet?.maxUsedRow, activeSheetIndex, isWorkerBacked]);\n\n React.useEffect(() => {\n const selectionEndRow = normalizedSelection?.end.row ?? -1;\n const selectionEndCol = normalizedSelection?.end.col ?? -1;\n const nextRowLimit = Math.max(\n resolveInitialDisplayExtent(\n activeSheet?.maxUsedRow ?? -1,\n MIN_OPEN_GRID_ROWS,\n OPEN_GRID_ROW_PADDING,\n false,\n INITIAL_WORKER_GRID_ROWS\n ),\n (activeCell?.row ?? -1) + OPEN_GRID_ROW_PADDING + 1,\n selectionEndRow + OPEN_GRID_ROW_PADDING + 1,\n drawingExtents.maxRow + OPEN_GRID_ROW_PADDING + 1\n );\n const nextColLimit = Math.max(\n resolveInitialDisplayExtent(\n activeSheet?.maxUsedCol ?? -1,\n MIN_OPEN_GRID_COLS,\n OPEN_GRID_COL_PADDING,\n false,\n INITIAL_WORKER_GRID_COLS\n ),\n (activeCell?.col ?? -1) + OPEN_GRID_COL_PADDING + 1,\n selectionEndCol + OPEN_GRID_COL_PADDING + 1,\n drawingExtents.maxCol + OPEN_GRID_COL_PADDING + 1\n );\n\n setDisplayRowLimit((current) => (current < nextRowLimit ? nextRowLimit : current));\n setDisplayColLimit((current) => (current < nextColLimit ? nextColLimit : current));\n }, [\n activeCell,\n activeSheet?.maxUsedCol,\n activeSheet?.maxUsedRow,\n drawingExtents.maxCol,\n drawingExtents.maxRow,\n normalizedSelection?.end.col,\n normalizedSelection?.end.row\n ]);\n\n React.useEffect(() => {\n if (shouldVirtualizeRows) {\n rowVirtualizer.scrollToOffset(0);\n } else if (scrollRef.current) {\n scrollRef.current.scrollTop = 0;\n }\n if (scrollRef.current) {\n scrollRef.current.scrollLeft = 0;\n }\n }, [activeSheetIndex, rowVirtualizer, shouldVirtualizeRows]);\n\n React.useEffect(() => {\n setOpenTableMenu(null);\n }, [activeSheet, activeSheetIndex]);\n\n React.useEffect(() => {\n if (!pendingNavigation || pendingNavigation.sheetIndex !== activeSheetIndex) {\n return;\n }\n\n selectCell(pendingNavigation.cell);\n setPendingNavigation(null);\n }, [activeSheetIndex, pendingNavigation, selectCell]);\n\n React.useEffect(() => {\n if (shouldVirtualizeRows) {\n rowVirtualizer.measure();\n }\n if (shouldVirtualizeCols) {\n colVirtualizer.measure();\n }\n }, [activeSheetIndex, colVirtualizer, revision, rowVirtualizer, shouldVirtualizeCols, shouldVirtualizeRows, visibleCols.length, visibleRows.length]);\n\n const handleScrollerScroll = React.useCallback((event: React.UIEvent<HTMLDivElement>) => {\n const currentScroller = event.currentTarget;\n cachedScrollerRectRef.current = null;\n syncDrawingViewport(currentScroller);\n if (\n (currentScroller.scrollHeight - (currentScroller.scrollTop + currentScroller.clientHeight)) / zoomFactor <\n OPEN_GRID_VERTICAL_EDGE_PX\n ) {\n setDisplayRowLimit((current) => current + OPEN_GRID_ROW_GROWTH);\n }\n\n if (\n (currentScroller.scrollWidth - (currentScroller.scrollLeft + currentScroller.clientWidth)) / zoomFactor <\n OPEN_GRID_HORIZONTAL_EDGE_PX\n ) {\n setDisplayColLimit((current) => current + OPEN_GRID_COL_GROWTH);\n }\n }, [syncDrawingViewport, zoomFactor]);\n\n React.useEffect(() => {\n if (!openTableMenu) {\n return;\n }\n\n function handlePointerDown(event: PointerEvent) {\n if (tableMenuRef.current?.contains(event.target as Node)) {\n return;\n }\n setOpenTableMenu(null);\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\") {\n setOpenTableMenu(null);\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [openTableMenu]);\n\n const resolvePointerCellFromGeometry = React.useCallback((clientX: number, clientY: number): XlsxCellAddress | null => {\n const wrapper = wrapperRef.current;\n const scroller = scrollRef.current;\n const visibleRowsCurrent = visibleRowsRef.current;\n const visibleColsCurrent = visibleColsRef.current;\n const rowPrefixSumsCurrent = rowPrefixSumsRef.current;\n const colPrefixSumsCurrent = colPrefixSumsRef.current;\n\n if (!wrapper || !scroller || visibleRowsCurrent.length === 0 || visibleColsCurrent.length === 0) {\n return null;\n }\n\n const scrollerRect = cachedScrollerRectRef.current ?? scroller.getBoundingClientRect();\n if (\n clientX < scrollerRect.left ||\n clientX > scrollerRect.right ||\n clientY < scrollerRect.top ||\n clientY > scrollerRect.bottom\n ) {\n return null;\n }\n\n const pointerOffsetX = clientX - scrollerRect.left;\n const pointerOffsetY = clientY - scrollerRect.top;\n const localX =\n (pointerOffsetX / zoomFactor)\n + (pointerOffsetX >= frozenPaneRight * zoomFactor ? (scroller.scrollLeft / zoomFactor) : 0);\n const localY =\n (pointerOffsetY / zoomFactor)\n + (pointerOffsetY >= frozenPaneBottom * zoomFactor ? (scroller.scrollTop / zoomFactor) : 0);\n const rowContentOffset = localY - HEADER_HEIGHT;\n const colContentOffset = localX - ROW_HEADER_WIDTH;\n let geometryCell: XlsxCellAddress | null = null;\n\n if (localY >= HEADER_HEIGHT && localX < ROW_HEADER_WIDTH) {\n const rowIndex = findIndexForOffsetPrefix(rowPrefixSumsCurrent, rowContentOffset);\n const actualRow = visibleRowsCurrent[rowIndex];\n if (actualRow !== undefined && firstVisibleColRef.current !== undefined) {\n geometryCell = { row: actualRow, col: firstVisibleColRef.current };\n }\n } else if (localY < HEADER_HEIGHT && localX >= ROW_HEADER_WIDTH) {\n const colIndex = findIndexForOffsetPrefix(colPrefixSumsCurrent, colContentOffset);\n const actualCol = visibleColsCurrent[colIndex];\n if (actualCol !== undefined && firstVisibleRowRef.current !== undefined) {\n geometryCell = { row: firstVisibleRowRef.current, col: actualCol };\n }\n } else if (localY >= HEADER_HEIGHT && localX >= ROW_HEADER_WIDTH) {\n const rowIndex = findIndexForOffsetPrefix(rowPrefixSumsCurrent, rowContentOffset);\n const colIndex = findIndexForOffsetPrefix(colPrefixSumsCurrent, colContentOffset);\n const actualRow = visibleRowsCurrent[rowIndex];\n const actualCol = visibleColsCurrent[colIndex];\n if (actualRow !== undefined && actualCol !== undefined) {\n geometryCell = { row: actualRow, col: actualCol };\n }\n }\n\n return geometryCell;\n }, [frozenPaneBottom, frozenPaneRight, zoomFactor]);\n\n const resolvePointerCellFromHitTest = React.useCallback((clientX: number, clientY: number): XlsxCellAddress | null => {\n const elementsAtPoint = typeof document.elementsFromPoint === \"function\"\n ? document.elementsFromPoint(clientX, clientY)\n : [document.elementFromPoint(clientX, clientY)].filter((element): element is Element => Boolean(element));\n for (const element of elementsAtPoint) {\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n\n const cell = parseCellAddressAttribute(element.closest<HTMLElement>(\"[data-xlsx-cell]\")?.getAttribute(\"data-xlsx-cell\") ?? null);\n if (cell) {\n return cell;\n }\n\n const colHeader = element.closest<HTMLElement>(\"[data-xlsx-col-header]\");\n if (colHeader && firstVisibleRowRef.current !== undefined) {\n const actualCol = Number(colHeader.getAttribute(\"data-xlsx-col-header\"));\n if (Number.isInteger(actualCol) && actualCol >= 0) {\n return { row: firstVisibleRowRef.current, col: actualCol };\n }\n }\n\n const rowElement = element.closest<HTMLTableRowElement>(\"tr[data-xlsx-row]\");\n if (rowElement && firstVisibleColRef.current !== undefined) {\n const actualRow = Number(rowElement.getAttribute(\"data-xlsx-row\"));\n if (Number.isInteger(actualRow) && actualRow >= 0) {\n return { row: actualRow, col: firstVisibleColRef.current };\n }\n }\n }\n\n return null;\n }, []);\n\n const resolvePointerCellFromClient = React.useCallback((clientX: number, clientY: number): XlsxCellAddress | null => {\n const geometryCell = resolvePointerCellFromGeometry(clientX, clientY);\n if (geometryCell && !worksheet?.isMergedSecondary(geometryCell.row, geometryCell.col)) {\n return geometryCell;\n }\n\n return resolvePointerCellFromHitTest(clientX, clientY) ?? geometryCell;\n }, [resolvePointerCellFromGeometry, resolvePointerCellFromHitTest, worksheet]);\n\n const resolveDraggedSelectionCell = React.useCallback((\n dragState: {\n axis: \"cell\" | \"column\" | \"row\";\n contentScaleX: number;\n contentScaleY: number;\n originCell: XlsxCellAddress;\n originContentX: number;\n originContentY: number;\n startClientX: number;\n startClientY: number;\n },\n clientX: number,\n clientY: number\n ): XlsxCellAddress | null => {\n const geometryCell = resolvePointerCellFromGeometry(clientX, clientY);\n const hitCell = resolvePointerCellFromHitTest(clientX, clientY);\n const actualRow =\n hitCell && rowIndexByActual.has(hitCell.row)\n ? hitCell.row\n : geometryCell?.row;\n const actualCol = geometryCell?.col ?? hitCell?.col;\n if (actualRow === undefined || actualCol === undefined) {\n return null;\n }\n\n if (dragState.axis === \"row\") {\n return { row: actualRow, col: dragState.originCell.col };\n }\n\n if (dragState.axis === \"column\") {\n return { row: dragState.originCell.row, col: actualCol };\n }\n\n if (worksheet?.isMergedSecondary(actualRow, actualCol)) {\n return hitCell ?? geometryCell;\n }\n\n return { row: actualRow, col: actualCol };\n }, [resolvePointerCellFromGeometry, resolvePointerCellFromHitTest, rowIndexByActual, worksheet]);\n\n const resolveCellPointerOrigin = React.useCallback((\n cell: XlsxCellAddress,\n rect: DOMRect,\n clientX: number,\n clientY: number\n ) => {\n const rowIndex = rowIndexByActual.get(cell.row);\n const colIndex = colIndexByActual.get(cell.col);\n if (rowIndex === undefined || colIndex === undefined) {\n return null;\n }\n\n const logicalWidth = effectiveColWidths[colIndex] ?? DEFAULT_COL_WIDTH;\n const logicalHeight = effectiveRowHeights[rowIndex] ?? DEFAULT_ROW_HEIGHT;\n const contentScaleX = Math.max(0.0001, rect.width > 0 ? rect.width / logicalWidth : zoomFactor);\n const contentScaleY = Math.max(0.0001, rect.height > 0 ? rect.height / logicalHeight : zoomFactor);\n\n return {\n contentScaleX,\n contentScaleY,\n originContentX:\n (colPrefixSums[colIndex] ?? 0)\n + clampContentOffset((clientX - rect.left) / contentScaleX, logicalWidth),\n originContentY:\n (rowPrefixSums[rowIndex] ?? 0)\n + clampContentOffset((clientY - rect.top) / contentScaleY, logicalHeight)\n };\n }, [colIndexByActual, colPrefixSums, effectiveColWidths, effectiveRowHeights, rowIndexByActual, rowPrefixSums, zoomFactor]);\n\n const resolveRowPointerOrigin = React.useCallback((\n actualRow: number,\n rect: DOMRect,\n clientY: number\n ) => {\n const rowIndex = rowIndexByActual.get(actualRow);\n if (rowIndex === undefined) {\n return null;\n }\n\n const logicalHeight = effectiveRowHeights[rowIndex] ?? DEFAULT_ROW_HEIGHT;\n const contentScaleY = Math.max(0.0001, rect.height > 0 ? rect.height / logicalHeight : zoomFactor);\n return {\n contentScaleX: Math.max(0.0001, zoomFactor),\n contentScaleY,\n originContentX: colPrefixSums[0] ?? 0,\n originContentY:\n (rowPrefixSums[rowIndex] ?? 0)\n + clampContentOffset((clientY - rect.top) / contentScaleY, logicalHeight)\n };\n }, [colPrefixSums, effectiveRowHeights, rowIndexByActual, rowPrefixSums, zoomFactor]);\n\n const resolveColumnPointerOrigin = React.useCallback((\n actualCol: number,\n rect: DOMRect,\n clientX: number\n ) => {\n const colIndex = colIndexByActual.get(actualCol);\n if (colIndex === undefined) {\n return null;\n }\n\n const logicalWidth = effectiveColWidths[colIndex] ?? DEFAULT_COL_WIDTH;\n const contentScaleX = Math.max(0.0001, rect.width > 0 ? rect.width / logicalWidth : zoomFactor);\n return {\n contentScaleX,\n contentScaleY: Math.max(0.0001, zoomFactor),\n originContentX:\n (colPrefixSums[colIndex] ?? 0)\n + clampContentOffset((clientX - rect.left) / contentScaleX, logicalWidth),\n originContentY: rowPrefixSums[0] ?? 0\n };\n }, [colIndexByActual, colPrefixSums, effectiveColWidths, rowPrefixSums, zoomFactor]);\n\n const applyColumnPreview = React.useCallback((actualCol: number, widthPx: number | null) => {\n const colElement = colElementRefs.current.get(actualCol);\n if (colElement) {\n colElement.style.width = widthPx === null ? \"\" : `${widthPx}px`;\n }\n\n const baseIndex = visibleCols.indexOf(actualCol);\n const baseWidth = baseIndex >= 0 ? (effectiveColWidths[baseIndex] ?? DEFAULT_COL_WIDTH) : DEFAULT_COL_WIDTH;\n const previewWidth = widthPx ?? baseWidth;\n const baseTotalWidth = effectiveColWidths.reduce((sum, width) => sum + width, 0) + ROW_HEADER_WIDTH;\n const widthDelta = previewWidth - baseWidth;\n if (tableRef.current) {\n tableRef.current.style.width = `${baseTotalWidth + widthDelta}px`;\n }\n }, [effectiveColWidths, visibleCols]);\n\n const applyRowPreview = React.useCallback((actualRow: number, heightPx: number | null) => {\n const rowElement =\n rowElementRefs.current.get(actualRow) ??\n wrapperRef.current?.querySelector<HTMLTableRowElement>(`tr[data-xlsx-row=\"${actualRow}\"]`) ??\n null;\n if (rowElement) {\n rowElementRefs.current.set(actualRow, rowElement);\n rowElement.style.height = heightPx === null ? \"\" : `${heightPx}px`;\n }\n }, []);\n\n React.useEffect(() => {\n selectionDragCleanupRef.current?.();\n fillDragCleanupRef.current?.();\n chartInteractionCleanupRef.current?.();\n imageInteractionCleanupRef.current?.();\n selectionDragCleanupRef.current = null;\n fillDragCleanupRef.current = null;\n chartInteractionCleanupRef.current = null;\n imageInteractionCleanupRef.current = null;\n selectionDragRef.current = null;\n fillDragRef.current = null;\n chartInteractionRef.current = null;\n imageInteractionRef.current = null;\n pendingResizePreviewRef.current = null;\n if (columnPreviewRef.current) {\n applyColumnPreview(columnPreviewRef.current.actualIndex, null);\n }\n if (rowPreviewRef.current) {\n applyRowPreview(rowPreviewRef.current.actualIndex, null);\n }\n columnPreviewRef.current = null;\n rowPreviewRef.current = null;\n setEditingCell(null);\n setEditingValue(\"\");\n setFillPreviewRange(null);\n chartPreviewRectRef.current = null;\n setChartPreviewRect(null);\n imagePreviewRectRef.current = null;\n setImagePreviewRect(null);\n selectionPreviewRangeRef.current = null;\n setInteractionMode(\"idle\");\n }, [activeSheetIndex, revision]);\n\n const focusGrid = React.useCallback(() => {\n scrollRef.current?.focus();\n }, []);\n\n const openHyperlink = React.useCallback((target?: string | null, location?: string | null) => {\n const internalTarget = parseInternalSheetLink(location ?? target);\n if (internalTarget) {\n const targetSheetIndex = sheets.findIndex((sheet) => sheet.name === internalTarget.sheetName);\n if (targetSheetIndex >= 0) {\n if (targetSheetIndex === activeSheetIndex) {\n selectCell(internalTarget.cell);\n } else {\n setPendingNavigation({\n cell: internalTarget.cell,\n sheetIndex: targetSheetIndex\n });\n setActiveSheetIndex(targetSheetIndex);\n }\n return;\n }\n }\n\n const externalTarget = target && !target.startsWith(\"#\") ? target : null;\n if (externalTarget && typeof window !== \"undefined\") {\n window.open(externalTarget, \"_blank\", \"noopener,noreferrer\");\n }\n }, [activeSheetIndex, selectCell, setActiveSheetIndex, sheets]);\n\n const startEditing = React.useCallback(\n (cell: XlsxCellAddress, initialValue?: string) => {\n if (readOnly) {\n return;\n }\n\n selectCell(cell);\n setEditingCell(cell);\n setEditingValue(initialValue ?? getControllerCellDisplayValue(cell));\n },\n [getControllerCellDisplayValue, readOnly, selectCell]\n );\n\n const commitEditing = React.useCallback(() => {\n if (!editingCell) {\n return;\n }\n\n if (readOnly) {\n setEditingCell(null);\n setEditingValue(\"\");\n focusGrid();\n return;\n }\n\n setCellValue(editingCell, editingValue);\n setEditingCell(null);\n setEditingValue(\"\");\n focusGrid();\n }, [editingCell, editingValue, focusGrid, readOnly, setCellValue]);\n\n const cancelEditing = React.useCallback(() => {\n setEditingCell(null);\n setEditingValue(\"\");\n focusGrid();\n }, [focusGrid]);\n\n const [, startBatchTransition] = React.useTransition();\n const [, startSelectionTransition] = React.useTransition();\n const [asyncViewportRowBatch, setAsyncViewportRowBatch] = React.useState<WorksheetBatchWindow | null>(null);\n const viewportRequest = React.useMemo(() => {\n const firstVirtualRowIndex = currentRowVirtualItems[0]?.index;\n const lastVirtualRowIndex = currentRowVirtualItems[currentRowVirtualItems.length - 1]?.index;\n const firstVisibleRow = firstVirtualRowIndex === undefined ? undefined : visibleRows[firstVirtualRowIndex];\n const lastVisibleRow = lastVirtualRowIndex === undefined ? undefined : visibleRows[lastVirtualRowIndex];\n if (firstVisibleRow === undefined || lastVisibleRow === undefined || lastVisibleRow < firstVisibleRow) {\n return null;\n }\n\n const overscan = 48;\n const startRow = Math.max(0, firstVisibleRow - overscan);\n const endRow = lastVisibleRow + overscan;\n return {\n endRow,\n startRow\n };\n }, [currentRowVirtualItems, visibleRows]);\n\n const syncViewportRowBatch = React.useMemo<WorksheetBatchWindow | null>(() => {\n if (!shouldVirtualizeRows || !worksheet || getRowsBatchAsync || !viewportRequest) {\n return null;\n }\n\n const worksheetWithRowsBatch = worksheet as WorksheetWithRowsBatch;\n if (typeof worksheetWithRowsBatch.getRowsBatch !== \"function\") {\n return null;\n }\n\n try {\n const rows = worksheetWithRowsBatch.getRowsBatch(viewportRequest.startRow, viewportRequest.endRow - viewportRequest.startRow + 1, {\n includeFormulas: true,\n includeHyperlinks: true,\n includeMergeInfo: true,\n includeStyles: true,\n useFormattedValues: true\n });\n return buildWorksheetBatchWindow(rows as unknown[] | null, activeSheet ?? null, viewportRequest.startRow, viewportRequest.endRow);\n } catch {\n return null;\n }\n }, [activeSheet, getRowsBatchAsync, shouldVirtualizeRows, viewportRequest, worksheet]);\n\n React.useEffect(() => {\n if (!shouldVirtualizeRows || !getRowsBatchAsync || !activeSheet || !viewportRequest) {\n setAsyncViewportRowBatch(null);\n return;\n }\n\n if (\n asyncViewportRowBatch\n && viewportRequest.startRow >= asyncViewportRowBatch.startRow\n && viewportRequest.endRow <= asyncViewportRowBatch.endRow\n ) {\n return;\n }\n\n let isCurrent = true;\n void getRowsBatchAsync(\n activeSheet.workbookSheetIndex,\n viewportRequest.startRow,\n viewportRequest.endRow - viewportRequest.startRow + 1\n )\n .then((rows) => {\n if (!isCurrent) {\n return;\n }\n\n const nextBatch = buildWorksheetBatchWindow(\n rows,\n activeSheet,\n viewportRequest.startRow,\n viewportRequest.endRow\n );\n startBatchTransition(() => {\n setAsyncViewportRowBatch(nextBatch);\n });\n })\n .catch(() => {\n if (!isCurrent) {\n return;\n }\n\n startBatchTransition(() => {\n setAsyncViewportRowBatch(null);\n });\n });\n\n return () => {\n isCurrent = false;\n };\n }, [activeSheet, asyncViewportRowBatch, getRowsBatchAsync, shouldVirtualizeRows, startBatchTransition, viewportRequest]);\n\n const viewportRowBatch = getRowsBatchAsync ? asyncViewportRowBatch : syncViewportRowBatch;\n\n React.useEffect(() => {\n cellRenderCacheRef.current.clear();\n }, [activeSheetIndex, displayColLimit, displayRowLimit, palette, revision, viewportRowBatch, worksheet]);\n\n React.useEffect(() => {\n setAsyncViewportRowBatch(null);\n }, [activeSheetIndex, revision]);\n\n const sparklinesByCell = React.useMemo(() => {\n const map = new Map<string, XlsxSheetData[\"sparklines\"][number]>();\n for (const sparkline of activeSheet?.sparklines ?? []) {\n map.set(`${sparkline.target.row}:${sparkline.target.col}`, sparkline);\n }\n return map;\n }, [activeSheet?.sparklines]);\n\n const getCellData = React.useCallback((row: number, col: number): CellRenderData => {\n const cacheKey = `${row}:${col}`;\n const cached = cellRenderCacheRef.current.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const batchCoversRow = viewportRowBatch ? row >= viewportRowBatch.startRow && row <= viewportRowBatch.endRow : false;\n const batchedCell = batchCoversRow ? viewportRowBatch?.cells.get(cacheKey) : undefined;\n\n if (!worksheet && !batchedCell) {\n const emptyData: CellRenderData = {\n isMergedSecondary: false,\n style: {\n backgroundColor: resolveSheetSurface(activeSheet, palette),\n borderBottom: \"none\",\n borderRight: \"none\",\n boxShadow: activeSheet?.showGridLines ? buildGridlineShadow(palette.border) : undefined,\n padding: DEFAULT_CELL_PADDING,\n verticalAlign: \"bottom\",\n whiteSpace: \"nowrap\"\n },\n value: \"\"\n };\n cellRenderCacheRef.current.set(cacheKey, emptyData);\n return emptyData;\n }\n\n if (batchedCell?.isMergedSecondary) {\n const mergedSecondaryData: CellRenderData = {\n isMergedSecondary: true,\n style: {},\n value: \"\"\n };\n cellRenderCacheRef.current.set(cacheKey, mergedSecondaryData);\n return mergedSecondaryData;\n }\n\n if (!batchedCell && !batchCoversRow && worksheet?.isMergedSecondary(row, col)) {\n const mergedSecondaryData: CellRenderData = {\n isMergedSecondary: true,\n style: {},\n value: \"\"\n };\n cellRenderCacheRef.current.set(cacheKey, mergedSecondaryData);\n return mergedSecondaryData;\n }\n\n const merge = batchCoversRow\n ? batchedCell?.mergeSpan\n : (worksheet?.getMergeSpan(row, col) as { colSpan?: number; rowSpan?: number } | null | undefined);\n const inheritedStyle = resolveInheritedCellStyle(activeSheet, row, col);\n const worksheetStyle = batchCoversRow\n ? batchedCell?.style ?? null\n : (worksheet?.getCellStyleAt(row, col) as Record<string, unknown> | null | undefined) ?? null;\n const rawStyle = mergeResolvedCellStyle(inheritedStyle, worksheetStyle);\n const table = getTableAtCell(effectiveTables, row, col);\n const tableStyle = resolveTableCellStyle(table, row, col, activeSheet);\n const mergedStyle = mergeResolvedCellStyle(rawStyle, tableStyle);\n const headerRowCount = table ? Math.max(table.headerRowCount, 1) : 0;\n const rawHyperlink = batchCoversRow\n ? batchedCell?.hyperlink\n : (worksheet?.getHyperlinkAt(row, col) as\n | { location?: string; target?: string; tooltip?: string }\n | null\n | undefined);\n const sparkline = sparklinesByCell.get(cacheKey) ?? null;\n const sparklineValues = sparkline && worksheet\n ? (\n sparkline.range.start.row === sparkline.range.end.row\n ? Array.from(\n { length: Math.abs(sparkline.range.end.col - sparkline.range.start.col) + 1 },\n (_, index) => getCellNumericValue(\n worksheet,\n sparkline.range.start.row,\n Math.min(sparkline.range.start.col, sparkline.range.end.col) + index\n )\n )\n : Array.from(\n { length: Math.abs(sparkline.range.end.row - sparkline.range.start.row) + 1 },\n (_, index) => getCellNumericValue(\n worksheet,\n Math.min(sparkline.range.start.row, sparkline.range.end.row) + index,\n sparkline.range.start.col\n )\n )\n )\n : null;\n const checkboxState = mergedStyle?.cellControl && worksheet\n ? getCellBooleanValue(worksheet, row, col)\n : null;\n const nextData: CellRenderData = {\n checkboxState,\n colSpan: merge?.colSpan,\n conditionalDataBar: worksheet\n ? resolveConditionalDataBarForCell(\n row,\n col,\n worksheet,\n activeSheet,\n conditionalFormatMetricsCacheRef.current\n )\n : null,\n conditionalColorScale: worksheet\n ? resolveConditionalColorScaleForCell(\n row,\n col,\n worksheet,\n activeSheet,\n conditionalFormatMetricsCacheRef.current\n )\n : null,\n conditionalIcon: worksheet\n ? resolveConditionalIconForCell(\n row,\n col,\n worksheet,\n activeSheet,\n conditionalFormatMetricsCacheRef.current\n )\n : null,\n hyperlink: rawHyperlink ?? null,\n isMergedSecondary: false,\n isTableHeader: Boolean(table && row >= table.start.row && row < table.start.row + headerRowCount),\n rowSpan: merge?.rowSpan,\n sparkline: sparkline && sparklineValues ? { config: sparkline, values: sparklineValues } : null,\n style: buildCellStyle(mergedStyle, palette, activeSheet?.themePalette, {\n showGridLines: activeSheet?.showGridLines\n }),\n validation: resolveCellDataValidation(row, col, activeSheet),\n value: sparkline\n ? \"\"\n : checkboxState !== null\n ? \"\"\n : batchCoversRow || !worksheet\n ? batchedCell?.value ?? \"\"\n : getCellDisplayValue(worksheet, row, col, activeSheet)\n };\n\n if (canCellTextOverflow(nextData)) {\n const startColIndex = colIndexByActual.get(col);\n if (startColIndex !== undefined) {\n const horizontalPadding = getHorizontalPadding(nextData.style.padding);\n const textWidth = measureTextWidth(nextData.value, nextData.style);\n const requiredWidth = textWidth + horizontalPadding + 2;\n let availableWidth = effectiveColWidths[startColIndex] ?? DEFAULT_COL_WIDTH;\n\n if (requiredWidth > availableWidth) {\n for (let nextColIndex = startColIndex + 1; nextColIndex < visibleCols.length; nextColIndex += 1) {\n const nextActualCol = visibleCols[nextColIndex];\n if (nextActualCol === undefined) {\n break;\n }\n\n const neighborData = getCellData(row, nextActualCol);\n if (!canReceiveOverflowText(neighborData)) {\n break;\n }\n\n availableWidth += effectiveColWidths[nextColIndex] ?? DEFAULT_COL_WIDTH;\n if (requiredWidth <= availableWidth) {\n break;\n }\n }\n\n if (availableWidth > (effectiveColWidths[startColIndex] ?? DEFAULT_COL_WIDTH)) {\n nextData.spillWidth = Math.max(0, availableWidth - horizontalPadding);\n }\n }\n }\n }\n\n cellRenderCacheRef.current.set(cacheKey, nextData);\n return nextData;\n }, [activeSheet, colIndexByActual, effectiveColWidths, effectiveTables, palette, sparklinesByCell, viewportRowBatch, visibleCols, worksheet]);\n\n React.useEffect(() => {\n conditionalFormatMetricsCacheRef.current.clear();\n }, [activeSheet?.conditionalFormatRules, activeSheet?.workbookSheetIndex, revision]);\n\n const selectionOverlay = React.useMemo(() => {\n if (!displayedSelection) {\n return null;\n }\n\n const normalized = normalizeRange(displayedSelection);\n const startRowIndex = rowIndexByActual.get(normalized.start.row);\n const endRowIndex = rowIndexByActual.get(normalized.end.row);\n const startColIndex = colIndexByActual.get(normalized.start.col);\n const endColIndex = colIndexByActual.get(normalized.end.col);\n\n if (\n startRowIndex === undefined ||\n endRowIndex === undefined ||\n startColIndex === undefined ||\n endColIndex === undefined\n ) {\n return null;\n }\n\n return {\n height: sumPrefixRange(rowPrefixSums, startRowIndex, endRowIndex),\n left: ROW_HEADER_WIDTH + sumPrefixRange(colPrefixSums, 0, startColIndex - 1),\n top: HEADER_HEIGHT + sumPrefixRange(rowPrefixSums, 0, startRowIndex - 1),\n width: sumPrefixRange(colPrefixSums, startColIndex, endColIndex)\n };\n }, [colIndexByActual, colPrefixSums, displayedSelection, rowIndexByActual, rowPrefixSums]);\n const resolvedSelectionOverlay = selectionOverlay;\n const virtualCols = React.useMemo<RenderedAxisItem[]>(\n () =>\n shouldVirtualizeCols\n ? colVirtualizer.getVirtualItems().map((virtualCol) => ({\n end: virtualCol.end,\n index: virtualCol.index,\n key: virtualCol.key,\n size: virtualCol.size,\n start: virtualCol.start\n }))\n : visibleCols.map((_, index) => ({\n end: colPrefixSums[index + 1] ?? 0,\n index,\n key: visibleCols[index] ?? index,\n size: effectiveColWidths[index] ?? DEFAULT_COL_WIDTH,\n start: colPrefixSums[index] ?? 0\n })),\n [colPrefixSums, colVirtualizer, effectiveColWidths, shouldVirtualizeCols, visibleCols]\n );\n const renderedCols = React.useMemo<RenderedColumn[]>(\n () => {\n const columns: RenderedColumn[] = [];\n virtualCols.forEach((virtualCol) => {\n const actualCol = visibleCols[virtualCol.index];\n if (actualCol === undefined) {\n return;\n }\n\n columns.push({\n actualCol,\n key: actualCol,\n size: virtualCol.size,\n virtualIndex: virtualCol.index\n });\n });\n return columns;\n },\n [effectiveColWidths, virtualCols, visibleCols]\n );\n const totalContentWidth = colPrefixSums[colPrefixSums.length - 1] ?? 0;\n const leadingColumnSpacerWidth = shouldVirtualizeCols ? (virtualCols[0]?.start ?? 0) : 0;\n const trailingColumnSpacerWidth = shouldVirtualizeCols\n ? totalContentWidth - (virtualCols[virtualCols.length - 1]?.end ?? 0)\n : 0;\n const imageRects = React.useMemo(\n () =>\n showImages\n ? images.map((image) => ({\n image,\n rect:\n imagePreviewRect && imagePreviewRect.id === image.id\n ? imagePreviewRect.rect\n : resolveImageRect(image, visibleRows, visibleCols, effectiveRowHeights, effectiveColWidths, {\n actualColPrefixSums,\n actualRowPrefixSums,\n colIndexByActual,\n colPrefixSums,\n rowIndexByActual,\n rowPrefixSums\n })\n }))\n : [],\n [\n colIndexByActual,\n colPrefixSums,\n actualColPrefixSums,\n actualRowPrefixSums,\n effectiveColWidths,\n effectiveRowHeights,\n imagePreviewRect,\n images,\n rowIndexByActual,\n rowPrefixSums,\n showImages,\n visibleCols,\n visibleRows\n ]\n );\n const shapeRects = React.useMemo(\n () =>\n showImages\n ? shapes.map((shape) => ({\n rect: resolveAnchoredRect(shape.anchor, visibleRows, visibleCols, effectiveRowHeights, effectiveColWidths, {\n actualColPrefixSums,\n actualRowPrefixSums,\n colIndexByActual,\n colPrefixSums,\n rowIndexByActual,\n rowPrefixSums\n }),\n shape\n }))\n : [],\n [\n colIndexByActual,\n colPrefixSums,\n actualColPrefixSums,\n actualRowPrefixSums,\n effectiveColWidths,\n effectiveRowHeights,\n rowIndexByActual,\n rowPrefixSums,\n shapes,\n showImages,\n visibleCols,\n visibleRows\n ]\n );\n const chartRects = React.useMemo(\n () =>\n showImages\n ? charts.map((chart) => ({\n chart,\n rect:\n chartPreviewRect && chartPreviewRect.id === chart.id\n ? chartPreviewRect.rect\n : resolveAnchoredRect(chart.anchor, visibleRows, visibleCols, effectiveRowHeights, effectiveColWidths, {\n actualColPrefixSums,\n actualRowPrefixSums,\n colIndexByActual,\n colPrefixSums,\n rowIndexByActual,\n rowPrefixSums\n })\n }))\n : [],\n [\n actualColPrefixSums,\n actualRowPrefixSums,\n chartPreviewRect,\n charts,\n colIndexByActual,\n colPrefixSums,\n effectiveColWidths,\n effectiveRowHeights,\n rowIndexByActual,\n rowPrefixSums,\n showImages,\n visibleCols,\n visibleRows\n ]\n );\n\n const resolveMountedCellOverlayRect = React.useCallback((element: HTMLElement) => {\n const wrapper = wrapperRef.current;\n if (!wrapper) {\n return null;\n }\n\n const wrapperRect = wrapper.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n const logicalWidth = wrapper.offsetWidth || 1;\n const logicalHeight = wrapper.offsetHeight || 1;\n const scaleX = Math.max(0.0001, wrapperRect.width > 0 ? wrapperRect.width / logicalWidth : 1);\n const scaleY = Math.max(0.0001, wrapperRect.height > 0 ? wrapperRect.height / logicalHeight : 1);\n\n return {\n height: elementRect.height / scaleY,\n left: (elementRect.left - wrapperRect.left) / scaleX,\n top: (elementRect.top - wrapperRect.top) / scaleY,\n width: elementRect.width / scaleX\n };\n }, []);\n\n const resolveMountedCellOverlayRectForAddress = React.useCallback((cell: XlsxCellAddress) => {\n const wrapper = wrapperRef.current;\n if (!wrapper) {\n return null;\n }\n\n const element = wrapper.querySelector<HTMLElement>(`[data-xlsx-cell=\"${cell.row}:${cell.col}\"]`);\n if (!element) {\n return null;\n }\n\n return resolveMountedCellOverlayRect(element);\n }, [resolveMountedCellOverlayRect]);\n\n const resolveGeometryOverlayRect = React.useCallback((range: XlsxCellRange) => {\n const normalized = normalizeRange(range);\n const startRowIndex = rowIndexByActual.get(normalized.start.row);\n const endRowIndex = rowIndexByActual.get(normalized.end.row);\n const startColIndex = colIndexByActual.get(normalized.start.col);\n const endColIndex = colIndexByActual.get(normalized.end.col);\n\n if (\n startRowIndex === undefined ||\n endRowIndex === undefined ||\n startColIndex === undefined ||\n endColIndex === undefined\n ) {\n return null;\n }\n\n let left = ROW_HEADER_WIDTH + sumPrefixRange(colPrefixSums, 0, startColIndex - 1);\n let top = HEADER_HEIGHT + sumPrefixRange(rowPrefixSums, 0, startRowIndex - 1);\n let width = sumPrefixRange(colPrefixSums, startColIndex, endColIndex);\n let height = sumPrefixRange(rowPrefixSums, startRowIndex, endRowIndex);\n\n const columnPreview = columnPreviewRef.current;\n if (columnPreview) {\n const previewIndex = colIndexByActual.get(columnPreview.actualIndex);\n if (previewIndex !== undefined) {\n const baseWidth = effectiveColWidths[previewIndex] ?? DEFAULT_COL_WIDTH;\n const widthDelta = columnPreview.size - baseWidth;\n if (previewIndex < startColIndex) {\n left += widthDelta;\n }\n if (previewIndex >= startColIndex && previewIndex <= endColIndex) {\n width += widthDelta;\n }\n }\n }\n\n const rowPreview = rowPreviewRef.current;\n if (rowPreview) {\n const previewIndex = rowIndexByActual.get(rowPreview.actualIndex);\n if (previewIndex !== undefined) {\n const baseHeight = effectiveRowHeights[previewIndex] ?? DEFAULT_ROW_HEIGHT;\n const heightDelta = rowPreview.size - baseHeight;\n if (previewIndex < startRowIndex) {\n top += heightDelta;\n }\n if (previewIndex >= startRowIndex && previewIndex <= endRowIndex) {\n height += heightDelta;\n }\n }\n }\n\n return {\n height: Math.max(0, height),\n left: Math.max(ROW_HEADER_WIDTH, left),\n top: Math.max(HEADER_HEIGHT, top),\n width: Math.max(0, width)\n };\n }, [colIndexByActual, colPrefixSums, effectiveColWidths, effectiveRowHeights, rowIndexByActual, rowPrefixSums]);\n\n const resolveMountedRangeOverlayRect = React.useCallback((range: XlsxCellRange, geometryRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n }) => {\n const normalized = normalizeRange(range);\n const startRect = resolveMountedCellOverlayRectForAddress(normalized.start);\n const topRightRect = resolveMountedCellOverlayRectForAddress({ row: normalized.start.row, col: normalized.end.col });\n const bottomLeftRect = resolveMountedCellOverlayRectForAddress({ row: normalized.end.row, col: normalized.start.col });\n const endRect = resolveMountedCellOverlayRectForAddress(normalized.end);\n\n const leftRect = startRect ?? bottomLeftRect;\n const topRect = startRect ?? topRightRect;\n const rightRect = topRightRect ?? endRect;\n const bottomRect = bottomLeftRect ?? endRect;\n\n const left = leftRect ? leftRect.left : geometryRect.left;\n const top = topRect ? topRect.top : geometryRect.top;\n const right = rightRect ? rightRect.left + rightRect.width : geometryRect.left + geometryRect.width;\n const bottom = bottomRect ? bottomRect.top + bottomRect.height : geometryRect.top + geometryRect.height;\n\n return {\n height: Math.max(0, bottom - top),\n left: Math.max(ROW_HEADER_WIDTH, left),\n top: Math.max(HEADER_HEIGHT, top),\n width: Math.max(0, right - left)\n };\n }, [resolveMountedCellOverlayRectForAddress]);\n\n const resolveDragPreviewRect = React.useCallback((range: XlsxCellRange) => {\n const dragState = selectionDragRef.current;\n if (!dragState || !dragState.didDrag || dragState.axis !== \"cell\" || !dragState.originOverlayRect) {\n return null;\n }\n\n const rangeRect = resolveGeometryOverlayRect(range);\n if (!rangeRect) {\n return null;\n }\n\n const originRect = dragState.originOverlayRect;\n const normalized = normalizeRange(range);\n if (rangesEqual(normalized, { start: dragState.originCell, end: dragState.originCell })) {\n return originRect;\n }\n\n const originCell = dragState.originCell;\n const originOnLeft = originCell.col === normalized.start.col;\n const originOnTop = originCell.row === normalized.start.row;\n const adjustedRangeRect = resolveMountedRangeOverlayRect(range, rangeRect);\n const geometryRight = adjustedRangeRect.left + adjustedRangeRect.width;\n const geometryBottom = adjustedRangeRect.top + adjustedRangeRect.height;\n const originRight = originRect.left + originRect.width;\n const originBottom = originRect.top + originRect.height;\n const left = originOnLeft ? originRect.left : Math.min(originRect.left, adjustedRangeRect.left);\n const top = originOnTop ? originRect.top : Math.min(originRect.top, adjustedRangeRect.top);\n const right = originOnLeft ? Math.max(originRight, geometryRight) : originRight;\n const bottom = originOnTop ? Math.max(originBottom, geometryBottom) : originBottom;\n\n return {\n height: Math.max(originRect.height, bottom - top),\n left,\n top,\n width: Math.max(originRect.width, right - left)\n };\n }, [resolveGeometryOverlayRect, resolveMountedRangeOverlayRect]);\n\n const resolveOverlayRect = React.useCallback((range: XlsxCellRange) => {\n const normalized = normalizeRange(range);\n if (normalized.start.row === normalized.end.row && normalized.start.col === normalized.end.col) {\n const rect = resolveMountedCellOverlayRectForAddress(normalized.start);\n if (rect) {\n return rect;\n }\n }\n\n const geometryRect = resolveGeometryOverlayRect(range);\n if (geometryRect) {\n return resolveMountedRangeOverlayRect(range, geometryRect);\n }\n\n return null;\n }, [\n resolveGeometryOverlayRect,\n resolveMountedRangeOverlayRect,\n ]);\n\n const openTableMenuState = React.useMemo(() => {\n if (!openTableMenu) {\n return null;\n }\n\n const table = effectiveTables.find((entry) => entry.name === openTableMenu.tableName) ?? null;\n const column = getTableHeaderColumn(table, openTableMenu.row, openTableMenu.col);\n const wrapper = wrapperRef.current;\n if (!table || !column || !wrapper) {\n return null;\n }\n\n const cell = wrapper.querySelector<HTMLElement>(`[data-xlsx-cell=\"${openTableMenu.row}:${openTableMenu.col}\"]`);\n if (!cell) {\n return null;\n }\n\n return {\n column,\n left: cell.offsetLeft + cell.offsetWidth - 170,\n table,\n top: cell.offsetTop + cell.offsetHeight - 2\n };\n }, [effectiveTables, openTableMenu]);\n\n const applyHeaderSelection = React.useCallback((range: XlsxCellRange | null) => {\n const normalized = range ? normalizeRange(range) : null;\n\n rowHeaderCellRefs.current.forEach((element, actualRow) => {\n element.style.backgroundColor = normalized && actualRow >= normalized.start.row && actualRow <= normalized.end.row\n ? \"var(--xlsx-selection-header)\"\n : palette.rowHeaderSurface;\n });\n\n colHeaderCellRefs.current.forEach((element, actualCol) => {\n element.style.backgroundColor = normalized && actualCol >= normalized.start.col && actualCol <= normalized.end.col\n ? \"var(--xlsx-selection-header)\"\n : palette.headerSurface;\n });\n }, [palette.headerSurface, palette.rowHeaderSurface]);\n\n const setRowHeaderRef = React.useCallback((actualRow: number, element: HTMLTableCellElement | null) => {\n if (element) {\n rowHeaderCellRefs.current.set(actualRow, element);\n const range = selectionPreviewRangeRef.current ?? displayedSelectionRef.current;\n element.style.backgroundColor = range && actualRow >= range.start.row && actualRow <= range.end.row\n ? \"var(--xlsx-selection-header)\"\n : palette.rowHeaderSurface;\n return;\n }\n\n rowHeaderCellRefs.current.delete(actualRow);\n }, [palette.rowHeaderSurface]);\n\n const setColHeaderRef = React.useCallback((actualCol: number, element: HTMLTableCellElement | null) => {\n if (element) {\n colHeaderCellRefs.current.set(actualCol, element);\n const range = selectionPreviewRangeRef.current ?? displayedSelectionRef.current;\n element.style.backgroundColor = range && actualCol >= range.start.col && actualCol <= range.end.col\n ? \"var(--xlsx-selection-header)\"\n : palette.headerSurface;\n return;\n }\n\n colHeaderCellRefs.current.delete(actualCol);\n }, [palette.headerSurface]);\n\n const applyPreviewOverlay = React.useCallback((range: XlsxCellRange | null) => {\n const overlay = selectionOverlayRef.current;\n if (!overlay || !range) {\n applyHeaderSelection(range);\n return;\n }\n\n const nextRect =\n selectionDragRef.current?.didDrag || fillDragRef.current\n ? resolveDragPreviewRect(range) ?? resolveGeometryOverlayRect(range) ?? resolveOverlayRect(range)\n : resolveOverlayRect(range);\n if (!nextRect) {\n applyHeaderSelection(range);\n return;\n }\n\n overlay.style.left = `${nextRect.left}px`;\n overlay.style.top = `${nextRect.top}px`;\n overlay.style.width = `${nextRect.width}px`;\n overlay.style.height = `${nextRect.height}px`;\n overlay.style.opacity = \"1\";\n overlay.style.visibility = \"visible\";\n const fillHandle = fillHandleRef.current;\n if (fillHandle) {\n fillHandle.style.left = `${nextRect.left + nextRect.width - 4}px`;\n fillHandle.style.top = `${nextRect.top + nextRect.height - 4}px`;\n }\n applyHeaderSelection(range);\n }, [applyHeaderSelection, resolveDragPreviewRect, resolveGeometryOverlayRect, resolveOverlayRect]);\n\n const applyPreviewOverlayFromElement = React.useCallback((element: HTMLElement, range: XlsxCellRange) => {\n const overlay = selectionOverlayRef.current;\n if (!overlay) {\n return;\n }\n\n const nextRect = resolveMountedCellOverlayRect(element) ?? resolveOverlayRect(range);\n if (!nextRect) {\n applyHeaderSelection(range);\n return;\n }\n\n overlay.style.left = `${nextRect.left}px`;\n overlay.style.top = `${nextRect.top}px`;\n overlay.style.width = `${nextRect.width}px`;\n overlay.style.height = `${nextRect.height}px`;\n overlay.style.opacity = \"1\";\n overlay.style.visibility = \"visible\";\n const fillHandle = fillHandleRef.current;\n if (fillHandle) {\n fillHandle.style.left = `${nextRect.left + nextRect.width - 4}px`;\n fillHandle.style.top = `${nextRect.top + nextRect.height - 4}px`;\n }\n applyHeaderSelection(range);\n }, [applyHeaderSelection, resolveMountedCellOverlayRect, resolveOverlayRect]);\n\n const syncActiveValidationOverlay = React.useCallback((cell: XlsxCellAddress | null) => {\n const overlay = activeValidationOverlayRef.current;\n if (!overlay || !cell || editingCellRef.current || selectionDragRef.current || fillDragRef.current) {\n if (overlay) {\n overlay.style.opacity = \"0\";\n overlay.style.visibility = \"hidden\";\n }\n return;\n }\n\n const cellData = getCellData(cell.row, cell.col);\n const shouldShow = cellData.validation?.validationType === \"list\" && cellData.validation.showDropdown;\n const rect = shouldShow ? resolveOverlayRect({ start: cell, end: cell }) : null;\n if (!rect) {\n overlay.style.opacity = \"0\";\n overlay.style.visibility = \"hidden\";\n return;\n }\n\n overlay.style.left = `${rect.left + rect.width - 16}px`;\n overlay.style.top = `${rect.top + (rect.height / 2)}px`;\n overlay.style.opacity = \"1\";\n overlay.style.visibility = \"visible\";\n }, [getCellData, resolveOverlayRect]);\n\n const commitSelectionRange = React.useCallback((range: XlsxCellRange) => {\n const normalized = normalizeRange(range);\n if (\n selectionRef.current &&\n rangesEqual(selectionRef.current, normalized) &&\n isSameCell(activeCellRef.current, normalized.end) &&\n selectedChartIdRef.current === null &&\n selectedImageIdRef.current === null\n ) {\n return;\n }\n\n pendingSelectionCommitRef.current = normalized;\n if (selectionCommitFrameRef.current !== null) {\n return;\n }\n\n selectionCommitFrameRef.current = window.requestAnimationFrame(() => {\n selectionCommitFrameRef.current = null;\n const pendingRange = pendingSelectionCommitRef.current;\n pendingSelectionCommitRef.current = null;\n if (!pendingRange) {\n return;\n }\n\n if (\n selectionRef.current &&\n rangesEqual(selectionRef.current, pendingRange) &&\n isSameCell(activeCellRef.current, pendingRange.end) &&\n selectedChartIdRef.current === null &&\n selectedImageIdRef.current === null\n ) {\n return;\n }\n\n startSelectionTransition(() => {\n selectRange(pendingRange);\n });\n });\n }, [selectRange, startSelectionTransition]);\n\n const refreshOverlayFromCurrentSelection = React.useCallback(() => {\n if (displayedSelectionRef.current) {\n applyPreviewOverlay(displayedSelectionRef.current);\n }\n }, [applyPreviewOverlay]);\n\n React.useEffect(() => {\n function handlePointerMove(event: PointerEvent) {\n const state = resizeStateRef.current;\n if (!state) {\n return;\n }\n\n pendingResizePreviewRef.current = {\n actualIndex: state.actualIndex,\n size:\n state.type === \"column\"\n ? Math.max(DEFAULT_COL_WIDTH / 2, state.initialPx + ((event.clientX - state.startPosition) / zoomFactor))\n : Math.max(DEFAULT_ROW_HEIGHT / 1.5, state.initialPx + ((event.clientY - state.startPosition) / zoomFactor)),\n type: state.type\n };\n\n if (resizeFrameRef.current !== null) {\n return;\n }\n\n resizeFrameRef.current = window.requestAnimationFrame(() => {\n resizeFrameRef.current = null;\n const preview = pendingResizePreviewRef.current;\n if (!preview) {\n return;\n }\n\n if (preview.type === \"column\") {\n columnPreviewRef.current = { actualIndex: preview.actualIndex, size: preview.size };\n applyColumnPreview(preview.actualIndex, preview.size);\n } else {\n rowPreviewRef.current = { actualIndex: preview.actualIndex, size: preview.size };\n applyRowPreview(preview.actualIndex, preview.size);\n }\n refreshOverlayFromCurrentSelection();\n });\n }\n\n function handlePointerUp(event: PointerEvent) {\n if (resizeStateRef.current?.pointerId === event.pointerId) {\n const resizeState = resizeStateRef.current;\n const preview = pendingResizePreviewRef.current;\n resizeStateRef.current = null;\n pendingResizePreviewRef.current = null;\n setInteractionMode(\"idle\");\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n\n if (resizeFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeFrameRef.current);\n resizeFrameRef.current = null;\n }\n\n if (resizeState.type === \"column\") {\n applyColumnPreview(resizeState.actualIndex, null);\n columnPreviewRef.current = null;\n } else {\n applyRowPreview(resizeState.actualIndex, null);\n rowPreviewRef.current = null;\n if (shouldVirtualizeRows) {\n rowVirtualizer.measure();\n }\n }\n if (preview && preview.actualIndex === resizeState.actualIndex && preview.type === resizeState.type) {\n if (preview.type === \"column\") {\n controller.resizeColumn(preview.actualIndex, preview.size);\n } else {\n controller.resizeRow(preview.actualIndex, preview.size);\n }\n }\n }\n }\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerUp);\n\n return () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerUp);\n if (resizeFrameRef.current !== null) {\n window.cancelAnimationFrame(resizeFrameRef.current);\n resizeFrameRef.current = null;\n }\n };\n }, [applyColumnPreview, applyRowPreview, controller, refreshOverlayFromCurrentSelection, rowVirtualizer, shouldVirtualizeRows, zoomFactor]);\n\n function buildDraggedSelectionRange(\n dragState: { anchor: XlsxCellAddress; axis: \"cell\" | \"column\" | \"row\" },\n cell: XlsxCellAddress\n ): XlsxCellRange | null {\n if (dragState.axis === \"row\") {\n if (firstVisibleCol === undefined || lastVisibleCol === undefined) {\n return null;\n }\n\n return normalizeRange({\n start: { row: dragState.anchor.row, col: firstVisibleCol },\n end: { row: cell.row, col: lastVisibleCol }\n });\n }\n\n if (dragState.axis === \"column\") {\n if (firstVisibleRow === undefined || lastVisibleRow === undefined) {\n return null;\n }\n\n return normalizeRange({\n start: { row: firstVisibleRow, col: dragState.anchor.col },\n end: { row: lastVisibleRow, col: cell.col }\n });\n }\n\n return normalizeRange({ start: dragState.anchor, end: cell });\n }\n\n function installSelectionDragListeners(pointerId: number) {\n selectionDragCleanupRef.current?.();\n let pendingClientPoint: { x: number; y: number } | null = null;\n let pointerMoveFrame: number | null = null;\n\n const flushPointerMove = () => {\n pointerMoveFrame = null;\n const pendingPoint = pendingClientPoint;\n pendingClientPoint = null;\n if (!pendingPoint) {\n return;\n }\n\n const dragState = selectionDragRef.current;\n if (!dragState) {\n return;\n }\n\n if (!dragState.didDrag) {\n const deltaX = Math.abs(pendingPoint.x - dragState.startClientX);\n const deltaY = Math.abs(pendingPoint.y - dragState.startClientY);\n if (deltaX < SELECTION_DRAG_THRESHOLD_PX && deltaY < SELECTION_DRAG_THRESHOLD_PX) {\n return;\n }\n\n dragState.didDrag = true;\n }\n\n const nextCell = resolveDraggedSelectionCell(dragState, pendingPoint.x, pendingPoint.y);\n if (!nextCell) {\n return;\n }\n\n const nextRange = buildDraggedSelectionRange(dragState, nextCell);\n if (!nextRange || rangesEqual(nextRange, dragState.previewRange)) {\n return;\n }\n\n dragState.previewRange = nextRange;\n selectionPreviewRangeRef.current = nextRange;\n displayedSelectionRef.current = nextRange;\n applyPreviewOverlay(nextRange);\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n pendingClientPoint = { x: event.clientX, y: event.clientY };\n if (pointerMoveFrame !== null) {\n return;\n }\n pointerMoveFrame = window.requestAnimationFrame(flushPointerMove);\n };\n\n const finishSelectionDrag = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n if (pointerMoveFrame !== null) {\n window.cancelAnimationFrame(pointerMoveFrame);\n pointerMoveFrame = null;\n }\n pendingClientPoint = null;\n\n const dragState = selectionDragRef.current;\n const nextCell = dragState ? resolveDraggedSelectionCell(dragState, event.clientX, event.clientY) : null;\n let nextRange = dragState?.previewRange ?? null;\n if (dragState?.didDrag && nextCell && dragState) {\n nextRange = buildDraggedSelectionRange(dragState, nextCell);\n }\n\n selectionDragRef.current = null;\n cachedScrollerRectRef.current = null;\n if (nextRange && (dragState?.didDrag || !dragState?.committedOnPointerDown)) {\n selectionPreviewRangeRef.current = nextRange;\n displayedSelectionRef.current = nextRange;\n commitSelectionRange(nextRange);\n } else if (!nextRange) {\n selectionPreviewRangeRef.current = null;\n }\n setInteractionMode(\"idle\");\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n selectionDragCleanupRef.current?.();\n selectionDragCleanupRef.current = null;\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", finishSelectionDrag);\n window.addEventListener(\"pointercancel\", finishSelectionDrag);\n selectionDragCleanupRef.current = () => {\n if (pointerMoveFrame !== null) {\n window.cancelAnimationFrame(pointerMoveFrame);\n pointerMoveFrame = null;\n }\n pendingClientPoint = null;\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", finishSelectionDrag);\n window.removeEventListener(\"pointercancel\", finishSelectionDrag);\n };\n }\n\n function installFillDragListeners(pointerId: number, sourceRange: XlsxCellRange) {\n fillDragCleanupRef.current?.();\n let pendingClientPoint: { x: number; y: number } | null = null;\n let pointerMoveFrame: number | null = null;\n\n const flushPointerMove = () => {\n pointerMoveFrame = null;\n const pendingPoint = pendingClientPoint;\n pendingClientPoint = null;\n if (!pendingPoint) {\n return;\n }\n const nextCell = resolvePointerCellFromClient(pendingPoint.x, pendingPoint.y);\n if (nextCell) {\n updateFillPreview(nextCell);\n }\n };\n\n const handlePointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n pendingClientPoint = { x: event.clientX, y: event.clientY };\n if (pointerMoveFrame !== null) {\n return;\n }\n pointerMoveFrame = window.requestAnimationFrame(flushPointerMove);\n };\n\n const finishFillDrag = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n if (pointerMoveFrame !== null) {\n window.cancelAnimationFrame(pointerMoveFrame);\n pointerMoveFrame = null;\n }\n pendingClientPoint = null;\n\n const nextCell = resolvePointerCellFromClient(event.clientX, event.clientY);\n if (nextCell) {\n updateFillPreview(nextCell);\n }\n\n const nextRange = fillDragRef.current?.previewRange ?? sourceRange;\n fillDragRef.current = null;\n cachedScrollerRectRef.current = null;\n setInteractionMode(\"idle\");\n setFillPreviewRange(null);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n fillSelection(nextRange);\n fillDragCleanupRef.current?.();\n fillDragCleanupRef.current = null;\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", finishFillDrag);\n window.addEventListener(\"pointercancel\", finishFillDrag);\n fillDragCleanupRef.current = () => {\n if (pointerMoveFrame !== null) {\n window.cancelAnimationFrame(pointerMoveFrame);\n pointerMoveFrame = null;\n }\n pendingClientPoint = null;\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", finishFillDrag);\n window.removeEventListener(\"pointercancel\", finishFillDrag);\n };\n }\n\n React.useLayoutEffect(() => {\n const overlayRange = selectionPreviewRangeRef.current ?? displayedSelection;\n if (!overlayRange || !wrapperRef.current) {\n applyHeaderSelection(null);\n if (selectionOverlayRef.current) {\n selectionOverlayRef.current.style.opacity = \"0\";\n selectionOverlayRef.current.style.visibility = \"hidden\";\n }\n return;\n }\n\n applyPreviewOverlay(overlayRange);\n }, [applyHeaderSelection, applyPreviewOverlay, displayedSelection, revision]);\n\n React.useLayoutEffect(() => {\n syncActiveValidationOverlay(activeCell);\n }, [activeCell, editingCell, revision, syncActiveValidationOverlay]);\n\n const handleCellDoubleClick = React.useCallback((cell: XlsxCellAddress) => {\n startEditing(cell);\n }, [startEditing]);\n\n const handleCellClick = React.useCallback((cell: XlsxCellAddress, cellData: CellRenderData) => {\n if (!cellData.hyperlink) {\n return;\n }\n\n openHyperlink(cellData.hyperlink.target, cellData.hyperlink.location);\n }, [openHyperlink]);\n\n const handleCellPointerDown = React.useCallback((\n event: React.PointerEvent<HTMLTableCellElement>,\n cell: XlsxCellAddress\n ) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n focusGrid();\n const currentSelection = selectionRef.current;\n const anchor = event.shiftKey && currentSelection ? currentSelection.start : cell;\n const initialRange = normalizeRange({ start: anchor, end: cell });\n const isActive = isSameCell(activeCellRef.current, cell);\n const committedOnPointerDown = !isActive || !editingCellRef.current;\n const pointerOrigin = resolveCellPointerOrigin(cell, event.currentTarget.getBoundingClientRect(), event.clientX, event.clientY);\n const originOverlayRect = resolveMountedCellOverlayRect(event.currentTarget);\n if (!pointerOrigin) {\n return;\n }\n\n startCellSelection(\n event.pointerId,\n anchor,\n \"cell\",\n cell,\n pointerOrigin,\n originOverlayRect,\n committedOnPointerDown,\n initialRange,\n event.clientX,\n event.clientY\n );\n applyPreviewOverlayFromElement(event.currentTarget, initialRange);\n if (committedOnPointerDown) {\n commitSelectionRange(initialRange);\n }\n }, [applyPreviewOverlayFromElement, commitSelectionRange, focusGrid, resolveCellPointerOrigin, resolveMountedCellOverlayRect]);\n\n const handleRowPointerDown = React.useCallback((\n event: React.PointerEvent<HTMLTableCellElement>,\n actualRow: number\n ) => {\n if (event.button !== 0 || firstVisibleCol === undefined || lastVisibleCol === undefined) {\n return;\n }\n\n event.preventDefault();\n focusGrid();\n const currentSelection = selectionRef.current;\n const anchorRow = event.shiftKey && currentSelection ? currentSelection.start.row : actualRow;\n const initialRange = normalizeRange({\n start: { row: anchorRow, col: firstVisibleCol },\n end: { row: actualRow, col: lastVisibleCol }\n });\n const pointerOrigin = resolveRowPointerOrigin(actualRow, event.currentTarget.getBoundingClientRect(), event.clientY);\n if (!pointerOrigin) {\n return;\n }\n\n startCellSelection(\n event.pointerId,\n { row: anchorRow, col: firstVisibleCol },\n \"row\",\n { row: actualRow, col: firstVisibleCol },\n pointerOrigin,\n null,\n true,\n initialRange,\n event.clientX,\n event.clientY\n );\n commitSelectionRange(initialRange);\n }, [commitSelectionRange, firstVisibleCol, focusGrid, lastVisibleCol, resolveRowPointerOrigin]);\n\n const handleColumnPointerDown = React.useCallback((\n event: React.PointerEvent<HTMLTableCellElement>,\n actualCol: number\n ) => {\n if (event.button !== 0 || firstVisibleRow === undefined || lastVisibleRow === undefined) {\n return;\n }\n\n event.preventDefault();\n focusGrid();\n const currentSelection = selectionRef.current;\n const anchorCol =\n event.shiftKey && currentSelection ? currentSelection.start.col : actualCol;\n const initialRange = normalizeRange({\n start: { row: firstVisibleRow, col: anchorCol },\n end: { row: lastVisibleRow, col: actualCol }\n });\n const pointerOrigin = resolveColumnPointerOrigin(actualCol, event.currentTarget.getBoundingClientRect(), event.clientX);\n if (!pointerOrigin) {\n return;\n }\n\n startCellSelection(\n event.pointerId,\n { row: firstVisibleRow, col: anchorCol },\n \"column\",\n { row: firstVisibleRow, col: actualCol },\n pointerOrigin,\n null,\n true,\n initialRange,\n event.clientX,\n event.clientY\n );\n commitSelectionRange(initialRange);\n }, [commitSelectionRange, firstVisibleRow, focusGrid, lastVisibleRow, resolveColumnPointerOrigin]);\n\n const handleRowResizePointerDown = React.useCallback((\n event: React.PointerEvent<HTMLDivElement>,\n actualRow: number,\n rowHeight: number\n ) => {\n if (readOnlyRef.current) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n startRowResize(event.pointerId, actualRow, rowHeight, event.clientY);\n }, []);\n\n const renderCellAdornment = React.useCallback((cell: XlsxCellAddress) => {\n const table = getTableAtCell(effectiveTables, cell.row, cell.col);\n const tableColumn = getTableHeaderColumn(table, cell.row, cell.col);\n if (!table || !tableColumn) {\n return null;\n }\n\n const direction =\n sortState && sortState.tableName === table.name && sortState.columnIndex === tableColumn.index\n ? sortState.direction\n : null;\n\n return (\n <button\n onPointerDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n setOpenTableMenu((current) =>\n current &&\n current.tableName === table.name &&\n current.row === cell.row &&\n current.col === cell.col\n ? null\n : { col: cell.col, row: cell.row, tableName: table.name }\n );\n }}\n style={{\n alignItems: \"center\",\n background: \"transparent\",\n border: \"none\",\n color: palette.mutedText,\n cursor: \"pointer\",\n display: \"inline-flex\",\n fontSize: 10,\n height: 16,\n justifyContent: \"center\",\n padding: 0,\n position: \"absolute\",\n right: 4,\n top: 3,\n width: 16,\n zIndex: 6\n }}\n type=\"button\"\n >\n {direction === \"ascending\" ? \"▲\" : direction === \"descending\" ? \"▼\" : \"▾\"}\n </button>\n );\n }, [effectiveTables, palette.mutedText, sortState]);\n\n const startChartMove = React.useCallback((\n event: React.PointerEvent<HTMLElement>,\n chart: XlsxChart,\n rect: XlsxImageRect\n ) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n focusGrid();\n selectChart(chart.id);\n\n if (readOnlyRef.current || chart.editable === false) {\n return;\n }\n\n event.currentTarget.setPointerCapture?.(event.pointerId);\n chartInteractionRef.current = {\n baseRect: rect,\n chartId: chart.id,\n didMove: false,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n type: \"move\"\n };\n chartPreviewRectRef.current = { id: chart.id, rect };\n setChartPreviewRect({ id: chart.id, rect });\n setInteractionMode(\"select\");\n document.body.style.cursor = \"move\";\n document.body.style.userSelect = \"none\";\n installChartInteractionListeners(event.pointerId);\n }, [focusGrid, selectChart]);\n\n const startChartResize = React.useCallback((\n event: React.PointerEvent<HTMLElement>,\n chart: XlsxChart,\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition\n ) => {\n if (readOnlyRef.current || chart.editable === false || event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n focusGrid();\n selectChart(chart.id);\n event.currentTarget.setPointerCapture?.(event.pointerId);\n chartInteractionRef.current = {\n baseRect: rect,\n chartId: chart.id,\n didMove: false,\n handle,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n type: \"resize\"\n };\n chartPreviewRectRef.current = { id: chart.id, rect };\n setChartPreviewRect({ id: chart.id, rect });\n setInteractionMode(\"select\");\n document.body.style.cursor = String(IMAGE_HANDLE_CURSOR[handle]);\n document.body.style.userSelect = \"none\";\n installChartInteractionListeners(event.pointerId);\n }, [focusGrid, selectChart]);\n\n const startImageMove = React.useCallback((\n event: React.PointerEvent<HTMLElement>,\n image: XlsxImage,\n rect: XlsxImageRect\n ) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n focusGrid();\n selectImage(image.id);\n\n if (readOnlyRef.current || image.editable === false) {\n return;\n }\n\n event.currentTarget.setPointerCapture?.(event.pointerId);\n imageInteractionRef.current = {\n baseRect: rect,\n didMove: false,\n imageId: image.id,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n type: \"move\"\n };\n imagePreviewRectRef.current = { id: image.id, rect };\n setImagePreviewRect({ id: image.id, rect });\n setInteractionMode(\"select\");\n document.body.style.cursor = \"move\";\n document.body.style.userSelect = \"none\";\n installImageInteractionListeners(event.pointerId);\n }, [focusGrid, selectImage]);\n\n const startImageResize = React.useCallback((\n event: React.PointerEvent<HTMLElement>,\n image: XlsxImage,\n rect: XlsxImageRect,\n handle: XlsxImageResizeHandlePosition\n ) => {\n if (readOnlyRef.current || image.editable === false || event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n focusGrid();\n selectImage(image.id);\n event.currentTarget.setPointerCapture?.(event.pointerId);\n imageInteractionRef.current = {\n baseRect: rect,\n didMove: false,\n handle,\n imageId: image.id,\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n type: \"resize\"\n };\n imagePreviewRectRef.current = { id: image.id, rect };\n setImagePreviewRect({ id: image.id, rect });\n setInteractionMode(\"select\");\n document.body.style.cursor = String(IMAGE_HANDLE_CURSOR[handle]);\n document.body.style.userSelect = \"none\";\n installImageInteractionListeners(event.pointerId);\n }, [focusGrid, selectImage]);\n\n const handleImageClick = React.useCallback((image: XlsxImage) => {\n if (skipNextImageClickRef.current === image.id) {\n skipNextImageClickRef.current = null;\n return;\n }\n\n if (image.hyperlink) {\n openHyperlink(image.hyperlink);\n }\n }, [openHyperlink]);\n\n const handleShapeClick = React.useCallback((shape: XlsxShape) => {\n if (shape.hyperlink) {\n openHyperlink(shape.hyperlink);\n }\n }, [openHyperlink]);\n\n const handleChartClick = React.useCallback((chart: XlsxChart) => {\n if (skipNextChartClickRef.current === chart.id) {\n skipNextChartClickRef.current = null;\n return;\n }\n\n selectChart(chart.id);\n }, [selectChart]);\n\n if (isLoading) {\n return <>{renderLoading(loadingComponent, loadingState, palette)}</>;\n }\n\n if (isLoadDeferred) {\n return <>{renderDeferredLoad({ ...controller, canLoadDeferred, continueDeferredLoad, deferredLoadFileSize, isLoadDeferred }, palette)}</>;\n }\n\n if (error) {\n if (error instanceof XlsxFileSizeLimitExceededError) {\n return (\n <>\n {renderFileTooLarge(\n fileTooLargeState,\n {\n displayFileName,\n fileSizeBytes: error.fileSizeBytes,\n maxFileSizeBytes: error.maxFileSizeBytes\n },\n palette\n )}\n </>\n );\n }\n\n return <>{renderError(errorState, error, palette)}</>;\n }\n\n if (!activeSheet && activeTab?.kind === \"chartsheet\") {\n return (\n <div\n style={{\n alignItems: \"stretch\",\n backgroundColor: palette.canvas,\n display: \"flex\",\n flex: 1,\n justifyContent: \"center\",\n minHeight: 0,\n minWidth: 0,\n padding: 16\n }}\n >\n <div\n style={{\n backgroundColor: palette.surface,\n border: `1px solid ${palette.border}`,\n borderRadius: 12,\n display: \"grid\",\n gap: 16,\n gridTemplateColumns: charts.length > 1 ? \"repeat(auto-fit, minmax(320px, 1fr))\" : \"minmax(320px, 1fr)\",\n padding: 16,\n width: \"100%\"\n }}\n >\n {charts.length > 0 ? charts.map((chart) => {\n const chartsheetRect = { height: 320, left: 0, top: 0, width: 640 };\n return (\n <div key={chart.id} style={{ minHeight: 320, position: \"relative\" }}>\n {isChartsLoading\n ? renderChartLoadingNode(renderChartLoading, chart, chartsheetRect)\n : <MemoChartSvg chart={chart} palette={palette} rect={chartsheetRect} />}\n </div>\n );\n }) : (\n <div\n style={{\n alignItems: \"center\",\n color: palette.mutedText,\n display: \"flex\",\n fontSize: 13,\n justifyContent: \"center\",\n minHeight: 320\n }}\n >\n Chartsheet metadata is present, but no embedded chart payload was exposed for this tab.\n </div>\n )}\n </div>\n </div>\n );\n }\n\n if (!activeSheet) {\n return <>{renderEmpty(emptyState, palette)}</>;\n }\n\n const virtualRows = !shouldVirtualizeRows\n ? visibleRows.map((actualRow, index) => ({\n end: rowPrefixSums[index + 1] ?? 0,\n index,\n key: actualRow,\n size: effectiveRowHeights[index] ?? DEFAULT_ROW_HEIGHT,\n start: rowPrefixSums[index] ?? 0\n }))\n : (() => {\n const renderedRowsByIndex = new Map<number, RenderedAxisItem>();\n currentRowVirtualItems.forEach((virtualRow) => {\n renderedRowsByIndex.set(virtualRow.index, {\n end: virtualRow.end,\n index: virtualRow.index,\n key: visibleRows[virtualRow.index] ?? virtualRow.index,\n size: virtualRow.size,\n start: virtualRow.start\n });\n });\n\n frozenRowVirtualIndices.forEach((index) => {\n if (renderedRowsByIndex.has(index)) {\n return;\n }\n renderedRowsByIndex.set(index, {\n end: rowPrefixSums[index + 1] ?? 0,\n index,\n key: visibleRows[index] ?? index,\n size: effectiveRowHeights[index] ?? DEFAULT_ROW_HEIGHT,\n start: rowPrefixSums[index] ?? 0\n });\n });\n\n return Array.from(renderedRowsByIndex.values()).sort((left, right) => left.index - right.index);\n })();\n const totalHeight = shouldVirtualizeRows\n ? rowVirtualizer.getTotalSize()\n : (rowPrefixSums[rowPrefixSums.length - 1] ?? 0);\n const totalWidth = totalContentWidth + ROW_HEADER_WIDTH;\n const sheetContentHeight = HEADER_HEIGHT + totalHeight;\n const zoomedSheetHeight = sheetContentHeight * zoomFactor;\n const zoomedSheetWidth = totalWidth * zoomFactor;\n const { fill: selectionFill, header: selectionHeaderSurface, stroke: selectionStroke } = resolveSelectionColors({\n palette,\n selectionColor,\n selectionFillColor,\n selectionHeaderColor\n });\n const selectionBorderWidth = 1.5;\n const rowColSpan = renderedCols.length + 1 + (leadingColumnSpacerWidth > 0 ? 1 : 0) + (trailingColumnSpacerWidth > 0 ? 1 : 0);\n const gutterSeparatorShadow = `inset -1px 0 0 ${palette.border}, inset 0 -1px 0 ${palette.border}`;\n const headerCellStyle: React.CSSProperties = {\n backgroundColor: palette.headerSurface,\n borderBottom: \"none\",\n borderRight: \"none\",\n boxShadow: gutterSeparatorShadow,\n color: palette.mutedText,\n fontSize: \"11px\",\n fontWeight: 600,\n height: HEADER_HEIGHT,\n overflow: \"hidden\",\n padding: \"2px 4px\",\n position: \"sticky\",\n textAlign: \"center\",\n top: 0,\n userSelect: \"none\",\n whiteSpace: \"nowrap\",\n zIndex: 50\n };\n const columnResizeHandleStyle: React.CSSProperties = {\n backgroundColor: \"transparent\",\n cursor: \"col-resize\",\n position: \"absolute\",\n right: -8,\n top: 0,\n width: 16,\n height: \"100%\",\n zIndex: 5\n };\n function resolveDrawingPane(rect: XlsxImageRect) {\n return resolveFrozenDrawingPane(\n rect,\n frozenRows,\n frozenCols,\n actualRowHeights,\n actualColWidths,\n activeSheet?.freezePanes ?? null,\n stickyTopByRow,\n stickyLeftByCol\n );\n }\n\n function renderShapeDrawing(shape: XlsxShape, rect: XlsxImageRect, pane: FrozenDrawingPane) {\n const drawingPane = resolveDrawingPane(rect);\n if (drawingPane !== pane) {\n return null;\n }\n const hasMeasuredViewport = drawingViewport.width > 0 && drawingViewport.height > 0;\n if (pane === \"scroll\" && hasMeasuredViewport && !rectIntersectsViewport(rect, drawingViewport)) {\n return null;\n }\n\n const isFrozenDrawing = pane !== \"scroll\";\n const inset = shape.textBox?.insetPx;\n const groupScaleX = shape.scaleX ?? 1;\n const groupScaleY = shape.scaleY ?? 1;\n const strokeScale = Math.max(groupScaleX, groupScaleY);\n const textScale = strokeScale;\n const textWidth = groupScaleX !== 0 ? rect.width / groupScaleX : rect.width;\n const textHeight = groupScaleY !== 0 ? rect.height / groupScaleY : rect.height;\n const vectorShape = resolveShapeVector(shape);\n const strokeColor = shape.stroke?.none ? \"transparent\" : (shape.stroke?.color ?? \"transparent\");\n const scaledStrokeWidth = (shape.stroke?.widthPx ?? (shape.geometry === \"line\" ? 2 : 1)) * strokeScale;\n const headMarkerId = `${shape.id}-${pane}-head-marker`;\n const tailMarkerId = `${shape.id}-${pane}-tail-marker`;\n const headMarker = vectorShape\n ? resolveShapeLineEndMarker(\n shape.stroke?.headEndType,\n headMarkerId,\n strokeColor,\n scaledStrokeWidth,\n rect,\n vectorShape.viewBox\n )\n : null;\n const tailMarker = vectorShape\n ? resolveShapeLineEndMarker(\n shape.stroke?.tailEndType,\n tailMarkerId,\n strokeColor,\n scaledStrokeWidth,\n rect,\n vectorShape.viewBox\n )\n : null;\n const style = {\n ...buildShapeContainerStyle(shape, rect),\n ...(vectorShape ? {\n backgroundColor: \"transparent\",\n border: \"none\"\n } : null)\n };\n\n return (\n <div\n key={`${pane}-${shape.id}`}\n onClick={() => handleShapeClick(shape)}\n style={{\n ...style,\n contain: \"layout paint\",\n cursor: shape.hyperlink ? \"pointer\" : \"default\",\n left: style.left,\n pointerEvents: shape.hyperlink ? \"auto\" : \"none\",\n top: style.top,\n zIndex: isFrozenDrawing ? shape.zIndex + 20 : style.zIndex\n }}\n title={shape.description}\n >\n {vectorShape ? (\n <svg\n aria-hidden=\"true\"\n preserveAspectRatio=\"none\"\n style={{\n height: \"100%\",\n inset: 0,\n position: \"absolute\",\n width: \"100%\"\n }}\n viewBox={`0 0 ${vectorShape.viewBox.width} ${vectorShape.viewBox.height}`}\n >\n {headMarker || tailMarker ? <defs>{headMarker}{tailMarker}</defs> : null}\n <path\n d={vectorShape.path}\n fill={shape.fill?.none ? \"transparent\" : (shape.fill?.color ?? \"transparent\")}\n fillOpacity={shape.fill?.opacity ?? 1}\n markerEnd={tailMarker ? `url(#${tailMarkerId})` : undefined}\n markerStart={headMarker ? `url(#${headMarkerId})` : undefined}\n stroke={strokeColor}\n strokeOpacity={shape.stroke?.opacity ?? 1}\n strokeWidth={scaledStrokeWidth}\n vectorEffect=\"non-scaling-stroke\"\n />\n </svg>\n ) : null}\n <div\n style={{\n color: \"#000000\",\n display: \"flex\",\n flex: 1,\n flexDirection: \"column\",\n gap: 2,\n height: textHeight,\n justifyContent:\n shape.textBox?.verticalAlign === \"middle\"\n ? \"center\"\n : shape.textBox?.verticalAlign === \"bottom\"\n ? \"flex-end\"\n : \"flex-start\",\n paddingBottom: inset?.bottom ?? 4,\n paddingLeft: inset?.left ?? 6,\n paddingRight: inset?.right ?? 6,\n paddingTop: inset?.top ?? 4,\n pointerEvents: \"none\",\n position: \"relative\",\n transform:\n groupScaleX !== 1 || groupScaleY !== 1\n ? `scale(${groupScaleX}, ${groupScaleY})`\n : undefined,\n transformOrigin: \"top left\",\n width: textWidth,\n zIndex: 1\n }}\n >\n {shape.paragraphs.map((paragraph, index) => renderShapeParagraph(\n paragraph,\n index,\n shape.textBox?.horizontalAlign ?? \"left\",\n textScale\n ))}\n </div>\n </div>\n );\n }\n\n function renderImageDrawing(\n image: XlsxImage,\n rect: XlsxImageRect,\n pane: FrozenDrawingPane\n ) {\n const drawingPane = resolveDrawingPane(rect);\n if (drawingPane !== pane) {\n return null;\n }\n const hasMeasuredViewport = drawingViewport.width > 0 && drawingViewport.height > 0;\n if (pane === \"scroll\" && hasMeasuredViewport && !rectIntersectsViewport(rect, drawingViewport)) {\n return null;\n }\n\n const isFrozenDrawing = pane !== \"scroll\";\n const canEditImage = !readOnly && image.editable !== false;\n const style: React.CSSProperties = {\n contain: \"layout paint\",\n height: rect.height,\n left: rect.left,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n position: \"absolute\",\n top: rect.top,\n width: rect.width,\n zIndex: isFrozenDrawing ? image.zIndex + 20 : image.zIndex\n };\n const defaultNode = (\n <img\n alt={image.description ?? image.name ?? \"\"}\n draggable={false}\n src={image.src}\n style={{\n display: \"block\",\n height: \"100%\",\n pointerEvents: \"none\",\n userSelect: \"none\",\n width: \"100%\"\n }}\n />\n );\n const selectionNode = selectedImageId === image.id ? (\n <div\n style={{\n ...style,\n overflow: \"visible\",\n pointerEvents: \"none\",\n zIndex: isFrozenDrawing ? image.zIndex + 22 : image.zIndex + 2\n }}\n >\n {renderImageSelection\n ? renderImageSelection({\n defaultNode: (\n <div\n style={{\n border: `1.5px solid ${selectionStroke}`,\n boxShadow: `0 0 0 1px ${palette.surface}`,\n boxSizing: \"border-box\",\n inset: 0,\n pointerEvents: \"none\",\n position: \"absolute\"\n }}\n >\n {canEditImage\n ? IMAGE_HANDLE_POSITIONS.map((position) => (\n <div\n key={position}\n onPointerDown={(event) => startImageResize(event, image, rect, position)}\n style={resolveImageHandleStyle(position, selectionStroke, palette.surface)}\n />\n ))\n : null}\n </div>\n ),\n getHandleProps: (position) => ({\n onPointerDown: (event) => {\n if (canEditImage) {\n startImageResize(event, image, rect, position);\n }\n },\n style: canEditImage\n ? resolveImageHandleStyle(position, selectionStroke, palette.surface)\n : { ...resolveImageHandleStyle(position, selectionStroke, palette.surface), display: \"none\" }\n }),\n image,\n rect\n })\n : (\n <div\n style={{\n border: `1.5px solid ${selectionStroke}`,\n boxShadow: `0 0 0 1px ${palette.surface}`,\n boxSizing: \"border-box\",\n inset: 0,\n pointerEvents: \"none\",\n position: \"absolute\"\n }}\n >\n {canEditImage\n ? IMAGE_HANDLE_POSITIONS.map((position) => (\n <div\n key={position}\n onPointerDown={(event) => startImageResize(event, image, rect, position)}\n style={resolveImageHandleStyle(position, selectionStroke, palette.surface)}\n />\n ))\n : null}\n </div>\n )}\n </div>\n ) : null;\n\n return (\n <React.Fragment key={`${pane}-${image.id}`}>\n {renderImage\n ? <div style={style}>{renderImage({ defaultNode, image, rect, style })}</div>\n : <div style={style}>{defaultNode}</div>}\n <div\n onClick={() => handleImageClick(image)}\n onPointerDown={(event) => startImageMove(event, image, rect)}\n style={{\n ...style,\n background: \"transparent\",\n cursor: canEditImage && selectedImageId === image.id ? \"move\" : image.hyperlink ? \"pointer\" : \"cell\",\n pointerEvents: \"auto\",\n zIndex: isFrozenDrawing ? image.zIndex + 21 : image.zIndex + 1\n }}\n />\n {selectionNode}\n </React.Fragment>\n );\n }\n\n function renderChartDrawing(\n chart: XlsxChart,\n rect: XlsxImageRect,\n pane: FrozenDrawingPane\n ) {\n const drawingPane = resolveDrawingPane(rect);\n if (drawingPane !== pane) {\n return null;\n }\n const hasMeasuredViewport = drawingViewport.width > 0 && drawingViewport.height > 0;\n if (pane === \"scroll\" && hasMeasuredViewport && !rectIntersectsViewport(rect, drawingViewport)) {\n return null;\n }\n\n const isFrozenDrawing = pane !== \"scroll\";\n const canEditChart = !readOnly && chart.editable !== false;\n const style: React.CSSProperties = {\n contain: \"layout paint\",\n height: rect.height,\n left: rect.left,\n overflow: \"hidden\",\n pointerEvents: \"none\",\n position: \"absolute\",\n top: rect.top,\n width: rect.width,\n zIndex: isFrozenDrawing ? chart.zIndex + 20 : chart.zIndex\n };\n const selectionNode = selectedChartId === chart.id ? (\n <div\n style={{\n ...style,\n overflow: \"visible\",\n pointerEvents: \"none\",\n zIndex: isFrozenDrawing ? chart.zIndex + 22 : chart.zIndex + 2\n }}\n >\n <div\n style={{\n border: `1.5px solid ${selectionStroke}`,\n boxShadow: `0 0 0 1px ${palette.surface}`,\n boxSizing: \"border-box\",\n inset: 0,\n pointerEvents: \"none\",\n position: \"absolute\"\n }}\n >\n {canEditChart\n ? IMAGE_HANDLE_POSITIONS.map((position) => (\n <div\n key={position}\n onPointerDown={(event) => startChartResize(event, chart, rect, position)}\n style={resolveImageHandleStyle(position, selectionStroke, palette.surface)}\n />\n ))\n : null}\n </div>\n </div>\n ) : null;\n\n return (\n <React.Fragment key={`${pane}-${chart.id}`}>\n <div style={style}>\n {isChartsLoading\n ? renderChartLoadingNode(renderChartLoading, chart, rect)\n : <MemoChartSvg chart={chart} palette={palette} rect={rect} />}\n </div>\n <div\n onClick={() => handleChartClick(chart)}\n onPointerDown={(event) => startChartMove(event, chart, rect)}\n style={{\n ...style,\n background: \"transparent\",\n cursor: canEditChart && selectedChartId === chart.id ? \"move\" : \"cell\",\n pointerEvents: \"auto\",\n zIndex: isFrozenDrawing ? chart.zIndex + 21 : chart.zIndex + 1\n }}\n />\n {selectionNode}\n </React.Fragment>\n );\n }\n\n const scrollOverlayStyle: React.CSSProperties = {\n inset: 0,\n pointerEvents: \"none\",\n position: \"absolute\",\n zIndex: 20\n };\n const topOverlayStyle: React.CSSProperties = {\n height: 0,\n overflow: \"visible\",\n pointerEvents: \"none\",\n position: \"sticky\",\n top: 0,\n width: 0,\n zIndex: 40\n };\n const leftOverlayStyle: React.CSSProperties = {\n height: 0,\n left: 0,\n overflow: \"visible\",\n pointerEvents: \"none\",\n position: \"sticky\",\n width: 0,\n zIndex: 40\n };\n const cornerOverlayStyle: React.CSSProperties = {\n height: 0,\n left: 0,\n overflow: \"visible\",\n pointerEvents: \"none\",\n position: \"sticky\",\n top: 0,\n width: 0,\n zIndex: 40\n };\n const previousPaneDrawingNodes = paneDrawingNodesCacheRef.current;\n const canReusePaneDrawingNodes =\n previousPaneDrawingNodes !== null\n && previousPaneDrawingNodes.showImages === showImages\n && previousPaneDrawingNodes.chartRects === chartRects\n && previousPaneDrawingNodes.shapeRects === shapeRects\n && previousPaneDrawingNodes.imageRects === imageRects\n && previousPaneDrawingNodes.selectedChartId === selectedChartId\n && previousPaneDrawingNodes.selectedImageId === selectedImageId\n && previousPaneDrawingNodes.readOnly === readOnly\n && previousPaneDrawingNodes.selectionStroke === selectionStroke\n && previousPaneDrawingNodes.renderChartLoading === renderChartLoading\n && previousPaneDrawingNodes.renderImage === renderImage\n && previousPaneDrawingNodes.renderImageSelection === renderImageSelection\n && previousPaneDrawingNodes.isChartsLoading === isChartsLoading\n && previousPaneDrawingNodes.palette === palette\n && previousPaneDrawingNodes.drawingViewport.left === drawingViewport.left\n && previousPaneDrawingNodes.drawingViewport.top === drawingViewport.top\n && previousPaneDrawingNodes.drawingViewport.width === drawingViewport.width\n && previousPaneDrawingNodes.drawingViewport.height === drawingViewport.height;\n const paneDrawingNodes = canReusePaneDrawingNodes\n ? previousPaneDrawingNodes.value\n : (!showImages\n ? {\n corner: null,\n left: null,\n scroll: null,\n top: null\n }\n : {\n corner: (\n <>\n {chartRects.map(({ chart, rect }) => renderChartDrawing(chart, rect, \"corner\"))}\n {shapeRects.map(({ shape, rect }) => renderShapeDrawing(shape, rect, \"corner\"))}\n {imageRects.map(({ image, rect }) => renderImageDrawing(image, rect, \"corner\"))}\n </>\n ),\n left: (\n <>\n {chartRects.map(({ chart, rect }) => renderChartDrawing(chart, rect, \"left\"))}\n {shapeRects.map(({ shape, rect }) => renderShapeDrawing(shape, rect, \"left\"))}\n {imageRects.map(({ image, rect }) => renderImageDrawing(image, rect, \"left\"))}\n </>\n ),\n scroll: (\n <>\n {chartRects.map(({ chart, rect }) => renderChartDrawing(chart, rect, \"scroll\"))}\n {shapeRects.map(({ shape, rect }) => renderShapeDrawing(shape, rect, \"scroll\"))}\n {imageRects.map(({ image, rect }) => renderImageDrawing(image, rect, \"scroll\"))}\n </>\n ),\n top: (\n <>\n {chartRects.map(({ chart, rect }) => renderChartDrawing(chart, rect, \"top\"))}\n {shapeRects.map(({ shape, rect }) => renderShapeDrawing(shape, rect, \"top\"))}\n {imageRects.map(({ image, rect }) => renderImageDrawing(image, rect, \"top\"))}\n </>\n )\n }) satisfies Record<FrozenDrawingPane, React.ReactNode>;\n\n if (!canReusePaneDrawingNodes) {\n paneDrawingNodesCacheRef.current = {\n chartRects,\n drawingViewport,\n imageRects,\n isChartsLoading,\n palette,\n readOnly,\n renderChartLoading,\n renderImage,\n renderImageSelection,\n selectedChartId,\n selectedImageId,\n selectionStroke,\n shapeRects,\n showImages,\n value: paneDrawingNodes\n };\n }\n\n function startColumnResize(pointerId: number, actualCol: number, widthPx: number, startX: number) {\n if (readOnly) {\n return;\n }\n\n resizeStateRef.current = {\n actualIndex: actualCol,\n initialPx: widthPx,\n pointerId,\n startPosition: startX,\n type: \"column\"\n };\n columnPreviewRef.current = { actualIndex: actualCol, size: widthPx };\n setInteractionMode(\"select\");\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n }\n\n function startRowResize(pointerId: number, actualRow: number, heightPx: number, startY: number) {\n if (readOnly) {\n return;\n }\n\n resizeStateRef.current = {\n actualIndex: actualRow,\n initialPx: heightPx,\n pointerId,\n startPosition: startY,\n type: \"row\"\n };\n rowPreviewRef.current = { actualIndex: actualRow, size: heightPx };\n setInteractionMode(\"select\");\n document.body.style.cursor = \"row-resize\";\n document.body.style.userSelect = \"none\";\n }\n\n function startCellSelection(\n pointerId: number,\n anchor: XlsxCellAddress,\n axis: \"cell\" | \"column\" | \"row\",\n originCell: XlsxCellAddress,\n pointerOrigin: {\n contentScaleX: number;\n contentScaleY: number;\n originContentX: number;\n originContentY: number;\n },\n originOverlayRect: { height: number; left: number; top: number; width: number } | null,\n committedOnPointerDown: boolean,\n initialRange: XlsxCellRange,\n startClientX: number,\n startClientY: number\n ) {\n cachedScrollerRectRef.current = scrollRef.current?.getBoundingClientRect() ?? null;\n selectionDragRef.current = {\n anchor,\n axis,\n contentScaleX: pointerOrigin.contentScaleX,\n contentScaleY: pointerOrigin.contentScaleY,\n committedOnPointerDown,\n didDrag: false,\n originCell,\n originOverlayRect,\n originContentX: pointerOrigin.originContentX,\n originContentY: pointerOrigin.originContentY,\n pointerId,\n previewRange: normalizeRange(initialRange),\n startClientX,\n startClientY\n };\n selectionPreviewRangeRef.current = normalizeRange(initialRange);\n displayedSelectionRef.current = selectionPreviewRangeRef.current;\n applyPreviewOverlay(selectionPreviewRangeRef.current);\n setInteractionMode(\"select\");\n document.body.style.userSelect = \"none\";\n installSelectionDragListeners(pointerId);\n }\n\n function resolveFillRange(sourceRange: XlsxCellRange, cell: XlsxCellAddress): XlsxCellRange {\n const normalizedSource = normalizeRange(sourceRange);\n if (isCellInRange(cell, normalizedSource)) {\n return normalizedSource;\n }\n\n const distanceAbove = Math.max(0, normalizedSource.start.row - cell.row);\n const distanceBelow = Math.max(0, cell.row - normalizedSource.end.row);\n const distanceLeft = Math.max(0, normalizedSource.start.col - cell.col);\n const distanceRight = Math.max(0, cell.col - normalizedSource.end.col);\n const verticalDistance = Math.max(distanceAbove, distanceBelow);\n const horizontalDistance = Math.max(distanceLeft, distanceRight);\n\n if (verticalDistance >= horizontalDistance) {\n return normalizeRange({\n start: {\n row: distanceAbove > 0 ? cell.row : normalizedSource.start.row,\n col: normalizedSource.start.col\n },\n end: {\n row: distanceBelow > 0 ? cell.row : normalizedSource.end.row,\n col: normalizedSource.end.col\n }\n });\n }\n\n return normalizeRange({\n start: {\n row: normalizedSource.start.row,\n col: distanceLeft > 0 ? cell.col : normalizedSource.start.col\n },\n end: {\n row: normalizedSource.end.row,\n col: distanceRight > 0 ? cell.col : normalizedSource.end.col\n }\n });\n }\n\n function startFillDrag(pointerId: number, sourceRange: XlsxCellRange) {\n if (readOnly) {\n return;\n }\n\n cachedScrollerRectRef.current = scrollRef.current?.getBoundingClientRect() ?? null;\n const normalizedSource = normalizeRange(sourceRange);\n fillDragRef.current = {\n pointerId,\n previewRange: normalizedSource,\n sourceRange: normalizedSource\n };\n setFillPreviewRange(normalizedSource);\n setInteractionMode(\"fill\");\n document.body.style.cursor = \"crosshair\";\n document.body.style.userSelect = \"none\";\n installFillDragListeners(pointerId, normalizedSource);\n }\n\n function updateFillPreview(cell: XlsxCellAddress) {\n const fillState = fillDragRef.current;\n if (!fillState) {\n return;\n }\n\n const nextRange = resolveFillRange(fillState.sourceRange, cell);\n fillState.previewRange = nextRange;\n applyPreviewOverlay(nextRange);\n }\n\n function installImageInteractionListeners(pointerId: number) {\n imageInteractionCleanupRef.current?.();\n\n const handlePointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n\n const interaction = imageInteractionRef.current;\n if (!interaction) {\n return;\n }\n\n const deltaX = (event.clientX - interaction.startClientX) / zoomFactor;\n const deltaY = (event.clientY - interaction.startClientY) / zoomFactor;\n if (!interaction.didMove && (Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3)) {\n interaction.didMove = true;\n }\n const nextRect = clampImageRect(\n interaction.type === \"move\"\n ? {\n ...interaction.baseRect,\n left: interaction.baseRect.left + deltaX,\n top: interaction.baseRect.top + deltaY\n }\n : resizeImageRect(interaction.baseRect, interaction.handle, deltaX, deltaY, IMAGE_MIN_SIZE_PX)\n );\n\n scheduleImagePreviewRect({ id: interaction.imageId, rect: nextRect });\n };\n\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerUp);\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n\n const interaction = imageInteractionRef.current;\n if (imagePreviewFrameRef.current !== null) {\n window.cancelAnimationFrame(imagePreviewFrameRef.current);\n imagePreviewFrameRef.current = null;\n }\n const pendingPreview = pendingImagePreviewRef.current;\n pendingImagePreviewRef.current = null;\n if (pendingPreview) {\n imagePreviewRectRef.current = pendingPreview;\n setImagePreviewRect(pendingPreview);\n }\n const preview = pendingPreview ?? imagePreviewRectRef.current;\n imageInteractionRef.current = null;\n imageInteractionCleanupRef.current = null;\n setInteractionMode(\"idle\");\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n cleanup();\n if (interaction && preview && preview.id === interaction.imageId) {\n if (interaction.didMove) {\n skipNextImageClickRef.current = interaction.imageId;\n }\n setImageRect(interaction.imageId, preview.rect);\n }\n imagePreviewRectRef.current = null;\n setImagePreviewRect(null);\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerUp);\n imageInteractionCleanupRef.current = cleanup;\n }\n\n function installChartInteractionListeners(pointerId: number) {\n chartInteractionCleanupRef.current?.();\n\n const handlePointerMove = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n\n const interaction = chartInteractionRef.current;\n if (!interaction) {\n return;\n }\n\n const deltaX = (event.clientX - interaction.startClientX) / zoomFactor;\n const deltaY = (event.clientY - interaction.startClientY) / zoomFactor;\n if (!interaction.didMove && (Math.abs(deltaX) > 3 || Math.abs(deltaY) > 3)) {\n interaction.didMove = true;\n }\n const nextRect = clampImageRect(\n interaction.type === \"move\"\n ? {\n ...interaction.baseRect,\n left: interaction.baseRect.left + deltaX,\n top: interaction.baseRect.top + deltaY\n }\n : resizeImageRect(interaction.baseRect, interaction.handle, deltaX, deltaY, 48)\n );\n\n scheduleChartPreviewRect({ id: interaction.chartId, rect: nextRect });\n };\n\n const cleanup = () => {\n window.removeEventListener(\"pointermove\", handlePointerMove);\n window.removeEventListener(\"pointerup\", handlePointerUp);\n window.removeEventListener(\"pointercancel\", handlePointerUp);\n };\n\n const handlePointerUp = (event: PointerEvent) => {\n if (event.pointerId !== pointerId) {\n return;\n }\n\n const interaction = chartInteractionRef.current;\n if (chartPreviewFrameRef.current !== null) {\n window.cancelAnimationFrame(chartPreviewFrameRef.current);\n chartPreviewFrameRef.current = null;\n }\n const pendingPreview = pendingChartPreviewRef.current;\n pendingChartPreviewRef.current = null;\n if (pendingPreview) {\n chartPreviewRectRef.current = pendingPreview;\n setChartPreviewRect(pendingPreview);\n }\n const preview = pendingPreview ?? chartPreviewRectRef.current;\n chartInteractionRef.current = null;\n chartInteractionCleanupRef.current = null;\n setInteractionMode(\"idle\");\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n cleanup();\n if (interaction && preview && preview.id === interaction.chartId) {\n if (interaction.didMove) {\n skipNextChartClickRef.current = interaction.chartId;\n }\n setChartRect(interaction.chartId, preview.rect);\n }\n chartPreviewRectRef.current = null;\n setChartPreviewRect(null);\n };\n\n window.addEventListener(\"pointermove\", handlePointerMove);\n window.addEventListener(\"pointerup\", handlePointerUp);\n window.addEventListener(\"pointercancel\", handlePointerUp);\n chartInteractionCleanupRef.current = cleanup;\n }\n\n function resolveCurrentCell() {\n if (activeCell && rowIndexByActual.has(activeCell.row) && colIndexByActual.has(activeCell.col)) {\n return activeCell;\n }\n if (firstVisibleRow === undefined || firstVisibleCol === undefined) {\n return null;\n }\n return { row: firstVisibleRow, col: firstVisibleCol };\n }\n\n function moveSelection(nextRowIndex: number, nextColIndex: number, extend: boolean) {\n const nextRow = visibleRows[nextRowIndex];\n const nextCol = visibleCols[nextColIndex];\n if (nextRow === undefined || nextCol === undefined) {\n return;\n }\n\n selectCell({ row: nextRow, col: nextCol }, extend ? { extend: true } : undefined);\n }\n\n\n return (\n <div style={{ backgroundColor: palette.canvas, display: \"flex\", flex: 1, minHeight: 0, minWidth: 0 }}>\n <div\n key={activeTabIndex}\n ref={scrollRef}\n onScroll={handleScrollerScroll}\n onCopy={(event) => {\n if (editingCell) {\n return;\n }\n\n const clipboard = event.clipboardData;\n const clipboardData = getClipboardData();\n if (!clipboardData) {\n return;\n }\n\n event.preventDefault();\n if (clipboard) {\n clipboard.setData(\"text/plain\", clipboardData.text);\n clipboard.setData(\"text/html\", clipboardData.html);\n clipboard.setData(INTERNAL_CLIPBOARD_MIME, clipboardData.structured);\n return;\n }\n\n void copySelectionToClipboard();\n }}\n onKeyDown={(event) => {\n if (editingCell) {\n return;\n }\n\n if (!readOnly && (event.metaKey || event.ctrlKey) && !event.altKey) {\n const normalizedKey = event.key.toLowerCase();\n if (normalizedKey === \"z\" && event.shiftKey) {\n event.preventDefault();\n redo();\n return;\n }\n\n if (normalizedKey === \"z\") {\n event.preventDefault();\n undo();\n return;\n }\n\n if (normalizedKey === \"y\") {\n event.preventDefault();\n redo();\n return;\n }\n }\n\n const currentCell = resolveCurrentCell();\n if (!currentCell) {\n return;\n }\n\n const currentRowIndex = rowIndexByActual.get(currentCell.row) ?? 0;\n const currentColIndex = colIndexByActual.get(currentCell.col) ?? 0;\n\n if (!readOnly && isPrintableKey(event)) {\n event.preventDefault();\n startEditing(currentCell, event.key);\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection(Math.min(currentRowIndex + 1, visibleRows.length - 1), currentColIndex, event.shiftKey);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection(Math.max(currentRowIndex - 1, 0), currentColIndex, event.shiftKey);\n break;\n case \"ArrowLeft\":\n event.preventDefault();\n moveSelection(currentRowIndex, Math.max(currentColIndex - 1, 0), event.shiftKey);\n break;\n case \"ArrowRight\":\n event.preventDefault();\n moveSelection(currentRowIndex, Math.min(currentColIndex + 1, visibleCols.length - 1), event.shiftKey);\n break;\n case \"Tab\":\n event.preventDefault();\n moveSelection(\n currentRowIndex,\n event.shiftKey ? Math.max(currentColIndex - 1, 0) : Math.min(currentColIndex + 1, visibleCols.length - 1),\n false\n );\n break;\n case \"Enter\":\n event.preventDefault();\n if (event.metaKey || event.ctrlKey || event.altKey) {\n break;\n }\n if (event.shiftKey) {\n moveSelection(Math.max(currentRowIndex - 1, 0), currentColIndex, false);\n break;\n }\n moveSelection(Math.min(currentRowIndex + 1, visibleRows.length - 1), currentColIndex, false);\n break;\n case \"Backspace\":\n case \"Delete\":\n if (!readOnly) {\n event.preventDefault();\n clearSelectedCells();\n }\n break;\n case \"F2\":\n if (!readOnly) {\n event.preventDefault();\n startEditing(currentCell);\n }\n break;\n default:\n break;\n }\n }}\n onPaste={(event) => {\n if (editingCell || readOnly) {\n return;\n }\n\n const clipboard = event.clipboardData;\n if (!clipboard) {\n event.preventDefault();\n void pasteFromClipboard();\n return;\n }\n\n const structuredPayload = clipboard.getData(INTERNAL_CLIPBOARD_MIME);\n const textPayload = clipboard.getData(\"text/plain\");\n if (!structuredPayload && !textPayload) {\n return;\n }\n\n event.preventDefault();\n if (structuredPayload) {\n pasteStructuredClipboardData(structuredPayload);\n return;\n }\n\n pasteText(textPayload);\n }}\n tabIndex={0}\n style={{\n [\"--xlsx-menu-active\" as string]: selectionFill,\n [\"--xlsx-menu-border\" as string]: palette.strongBorder,\n [\"--xlsx-menu-surface\" as string]: palette.surface,\n [\"--xlsx-selection-header\" as string]: selectionHeaderSurface,\n backgroundColor: palette.canvas,\n color: palette.text,\n flex: 1,\n height: \"100%\",\n minHeight: 0,\n minWidth: 0,\n outline: \"none\",\n overflow: \"auto\",\n width: \"100%\"\n }}\n >\n <div\n style={{\n backgroundColor: resolveSheetSurface(activeSheet, palette),\n minHeight: \"100%\",\n minWidth: \"100%\",\n position: \"relative\",\n width: zoomedSheetWidth,\n height: zoomedSheetHeight\n }}\n >\n <div\n ref={wrapperRef}\n style={{\n height: sheetContentHeight,\n left: 0,\n position: \"absolute\",\n top: 0,\n transform: undefined,\n transformOrigin: \"top left\",\n zoom: useNativeZoomForStickyLayout ? zoomFactor : undefined,\n width: totalWidth\n }}\n >\n {showImages ? (\n <>\n <div style={topOverlayStyle}>{paneDrawingNodes.top}</div>\n <div style={leftOverlayStyle}>{paneDrawingNodes.left}</div>\n <div style={cornerOverlayStyle}>{paneDrawingNodes.corner}</div>\n <div style={scrollOverlayStyle}>{paneDrawingNodes.scroll}</div>\n </>\n ) : null}\n <table\n ref={tableRef}\n style={{\n borderCollapse: \"collapse\",\n color: \"#000000\",\n flex: \"0 0 auto\",\n tableLayout: \"fixed\",\n width: totalWidth\n }}\n >\n <colgroup>\n <col style={{ width: ROW_HEADER_WIDTH }} />\n {leadingColumnSpacerWidth > 0 ? <col style={{ width: leadingColumnSpacerWidth }} /> : null}\n {renderedCols.map((column) => (\n <col\n key={column.key}\n ref={(element) => {\n if (element) {\n colElementRefs.current.set(column.actualCol, element);\n } else {\n colElementRefs.current.delete(column.actualCol);\n }\n }}\n style={{ width: column.size }}\n />\n ))}\n {trailingColumnSpacerWidth > 0 ? <col style={{ width: trailingColumnSpacerWidth }} /> : null}\n </colgroup>\n <thead style={{ position: \"sticky\", top: 0, zIndex: 50 }}>\n <tr>\n <th\n style={{\n ...headerCellStyle,\n backgroundColor: palette.headerSurface,\n left: 0,\n width: ROW_HEADER_WIDTH,\n zIndex: 60\n }}\n />\n {leadingColumnSpacerWidth > 0 ? (\n <th aria-hidden=\"true\" style={{ ...headerCellStyle, padding: 0, width: leadingColumnSpacerWidth }} />\n ) : null}\n {renderedCols.map((column) => (\n <th\n data-xlsx-col-header={column.actualCol}\n key={column.key}\n ref={(element) => setColHeaderRef(column.actualCol, element)}\n onPointerDown={(event) => handleColumnPointerDown(event, column.actualCol)}\n style={{\n ...headerCellStyle,\n left: stickyLeftByCol.get(column.actualCol),\n zIndex: stickyLeftByCol.has(column.actualCol) ? 55 : headerCellStyle.zIndex\n }}\n >\n <div style={{ position: \"relative\" }}>\n {columnLabel(column.actualCol)}\n <div\n onPointerDown={(event) => {\n if (readOnly) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n startColumnResize(\n event.pointerId,\n column.actualCol,\n column.size,\n event.clientX\n );\n }}\n style={columnResizeHandleStyle}\n />\n </div>\n </th>\n ))}\n {trailingColumnSpacerWidth > 0 ? (\n <th aria-hidden=\"true\" style={{ ...headerCellStyle, padding: 0, width: trailingColumnSpacerWidth }} />\n ) : null}\n </tr>\n </thead>\n <tbody>\n {virtualRows.map((virtualRow, index) => {\n const actualRow = visibleRows[virtualRow.index];\n if (actualRow === undefined) {\n return null;\n }\n\n const previousEnd = index === 0 ? 0 : (virtualRows[index - 1]?.end ?? 0);\n const gapHeight = Math.max(0, virtualRow.start - previousEnd);\n\n return (\n <React.Fragment key={`row-fragment-${virtualRow.key}`}>\n {gapHeight > 0 ? (\n <tr aria-hidden=\"true\" style={{ height: gapHeight }}>\n <td colSpan={rowColSpan} />\n </tr>\n ) : null}\n <MemoGridRow\n actualRow={actualRow}\n editingCell={editingCell}\n editingValue={editingValue}\n getCellData={getCellData}\n key={virtualRow.key}\n leadingSpacerWidth={leadingColumnSpacerWidth}\n onCellClick={handleCellClick}\n onCellDoubleClick={handleCellDoubleClick}\n onCellPointerDown={handleCellPointerDown}\n onEditingCancel={cancelEditing}\n onEditingCommit={commitEditing}\n onEditingValueChange={setEditingValue}\n onRowHeaderRef={setRowHeaderRef}\n onRowPointerDown={handleRowPointerDown}\n onRowResizePointerDown={handleRowResizePointerDown}\n palette={palette}\n readOnly={readOnly}\n renderCellAdornment={renderCellAdornment}\n rowHeight={virtualRow.size}\n stickyLeftByCol={stickyLeftByCol}\n stickyTop={stickyTopByRow.get(actualRow)}\n trailingSpacerWidth={trailingColumnSpacerWidth}\n visibleCols={renderedCols}\n />\n </React.Fragment>\n );\n })}\n {virtualRows.length > 0 && totalHeight - (virtualRows[virtualRows.length - 1]?.end ?? totalHeight) > 0 ? (\n <tr\n style={{\n height: totalHeight - (virtualRows[virtualRows.length - 1]?.end ?? totalHeight)\n }}\n >\n <td colSpan={rowColSpan} />\n </tr>\n ) : null}\n </tbody>\n </table>\n <div\n ref={selectionOverlayRef}\n style={{\n backgroundColor: selectionFill,\n boxSizing: \"border-box\",\n boxShadow: `inset 0 0 0 ${selectionBorderWidth}px ${selectionStroke}`,\n contain: \"layout paint\",\n height: resolvedSelectionOverlay?.height ?? 0,\n left: resolvedSelectionOverlay?.left ?? 0,\n opacity: resolvedSelectionOverlay ? 1 : 0,\n pointerEvents: \"none\",\n position: \"absolute\",\n top: resolvedSelectionOverlay?.top ?? 0,\n visibility: resolvedSelectionOverlay ? \"visible\" : \"hidden\",\n width: resolvedSelectionOverlay?.width ?? 0,\n zIndex: 24\n }}\n />\n <div\n ref={activeValidationOverlayRef}\n aria-hidden=\"true\"\n style={{\n alignItems: \"center\",\n color: palette.mutedText,\n display: \"inline-flex\",\n fontSize: 10,\n fontWeight: 700,\n height: 16,\n justifyContent: \"center\",\n opacity: 0,\n pointerEvents: \"none\",\n position: \"absolute\",\n transform: \"translateY(-50%)\",\n visibility: \"hidden\",\n width: 12,\n zIndex: 26\n }}\n >\n ▾\n </div>\n <div\n ref={fillHandleRef}\n onPointerDown={(event) => {\n if (readOnly || event.button !== 0 || !normalizedSelection || !resolvedSelectionOverlay) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n startFillDrag(event.pointerId, normalizedSelection);\n }}\n style={{\n backgroundColor: selectionStroke,\n border: `1px solid ${palette.surface}`,\n contain: \"layout paint\",\n cursor: \"crosshair\",\n display: !readOnly && resolvedSelectionOverlay ? \"block\" : \"none\",\n height: 8,\n left: resolvedSelectionOverlay ? resolvedSelectionOverlay.left + resolvedSelectionOverlay.width - 4 : 0,\n pointerEvents: \"auto\",\n position: \"absolute\",\n top: resolvedSelectionOverlay ? resolvedSelectionOverlay.top + resolvedSelectionOverlay.height - 4 : 0,\n width: 8,\n zIndex: 25\n }}\n />\n {openTableMenuState ? (\n <div\n ref={tableMenuRef}\n style={{\n color: palette.text,\n left: Math.max(ROW_HEADER_WIDTH + 4, openTableMenuState.left),\n position: \"absolute\",\n top: openTableMenuState.top,\n zIndex: 50\n }}\n >\n {renderTableHeaderMenu\n ? renderTableHeaderMenu({\n close: () => setOpenTableMenu(null),\n column: openTableMenuState.column,\n direction:\n sortState &&\n sortState.tableName === openTableMenuState.table.name &&\n sortState.columnIndex === openTableMenuState.column.index\n ? sortState.direction\n : null,\n sortAscending: () => sortTable(openTableMenuState.table.name, openTableMenuState.column.index, \"ascending\"),\n sortDescending: () => sortTable(openTableMenuState.table.name, openTableMenuState.column.index, \"descending\"),\n table: openTableMenuState.table\n })\n : (\n <DefaultTableHeaderMenu\n close={() => setOpenTableMenu(null)}\n column={openTableMenuState.column}\n direction={\n sortState &&\n sortState.tableName === openTableMenuState.table.name &&\n sortState.columnIndex === openTableMenuState.column.index\n ? sortState.direction\n : null\n }\n sortAscending={() => sortTable(openTableMenuState.table.name, openTableMenuState.column.index, \"ascending\")}\n sortDescending={() => sortTable(openTableMenuState.table.name, openTableMenuState.column.index, \"descending\")}\n table={openTableMenuState.table}\n />\n )}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction XlsxViewerInner({\n className,\n controller,\n emptyState,\n errorState,\n fileTooLargeState,\n height = \"100%\",\n loadingComponent,\n loadingState,\n renderChartLoading,\n renderImage,\n renderImageSelection,\n renderTableHeaderMenu,\n rounded = true,\n selectionColor,\n selectionFillColor,\n selectionHeaderColor,\n showImages = true,\n showDefaultToolbar = true,\n toolbar\n}: XlsxViewerProps & {\n controller: XlsxViewerController;\n}) {\n const palette = useViewerPalette();\n\n return (\n <ViewerContext.Provider value={controller}>\n <div\n className={classNames(\"react-xlsx-viewer\", className)}\n style={{\n blockSize: height,\n backgroundColor: palette.surface,\n border: `1px solid ${palette.border}`,\n borderRadius: rounded ? 12 : 0,\n color: palette.text,\n display: \"flex\",\n flex: \"1 1 auto\",\n flexDirection: \"column\",\n inlineSize: \"100%\",\n maxHeight: \"100%\",\n maxWidth: \"100%\",\n minHeight: 0,\n minWidth: 0,\n overflow: \"hidden\",\n width: \"100%\"\n }}\n >\n {resolveToolbar(toolbar, showDefaultToolbar, controller, palette)}\n <div style={{ display: \"flex\", flex: 1, minHeight: 0, minWidth: 0 }}>\n <XlsxGrid\n controller={controller}\n emptyState={emptyState}\n errorState={errorState}\n fileTooLargeState={fileTooLargeState}\n loadingComponent={loadingComponent}\n loadingState={loadingState}\n palette={palette}\n renderChartLoading={renderChartLoading}\n renderImage={renderImage}\n renderImageSelection={renderImageSelection}\n renderTableHeaderMenu={renderTableHeaderMenu}\n selectionColor={selectionColor}\n selectionFillColor={selectionFillColor}\n selectionHeaderColor={selectionHeaderColor}\n showImages={showImages}\n />\n </div>\n </div>\n </ViewerContext.Provider>\n );\n}\n\nfunction XlsxViewerWithInlineController(props: XlsxViewerProps) {\n const controller = useXlsxViewerController(props);\n return <XlsxViewerInner {...props} controller={controller} />;\n}\n\nfunction XlsxViewerProviderWithInlineController({\n children,\n ...options\n}: Omit<XlsxViewerProviderProps, \"controller\">) {\n const controller = useXlsxViewerController(options);\n return <ViewerContext.Provider value={controller}>{children}</ViewerContext.Provider>;\n}\n\nexport function XlsxViewerProvider({ children, controller, ...options }: XlsxViewerProviderProps) {\n if (controller) {\n return <ViewerContext.Provider value={controller}>{children}</ViewerContext.Provider>;\n }\n\n return <XlsxViewerProviderWithInlineController {...options}>{children}</XlsxViewerProviderWithInlineController>;\n}\n\nexport function useXlsxViewer() {\n const context = React.useContext(ViewerContext);\n if (!context) {\n throw new Error(\"useXlsxViewer must be used inside XlsxViewer or XlsxViewerProvider.\");\n }\n\n return context;\n}\n\nexport function useXlsxViewerSelection(): XlsxViewerSelection {\n const {\n activeCell,\n activeCellAddress,\n clearSelection,\n selectedRangeAddress,\n selectCell,\n selectRange,\n selection\n } = useXlsxViewer();\n\n return React.useMemo(\n () => ({\n activeCell,\n activeCellAddress,\n clearSelection,\n selectedRangeAddress,\n selectCell,\n selectRange,\n selection\n }),\n [activeCell, activeCellAddress, clearSelection, selectedRangeAddress, selectCell, selectRange, selection]\n );\n}\n\nexport function useXlsxViewerZoom(): XlsxViewerZoom {\n const {\n canZoomIn,\n canZoomOut,\n defaultZoomScale,\n maxZoomScale,\n minZoomScale,\n resetZoom,\n setZoomScale,\n zoomIn,\n zoomOut,\n zoomScale\n } = useXlsxViewer();\n\n return React.useMemo(\n () => ({\n canZoomIn,\n canZoomOut,\n defaultZoomScale,\n maxZoomScale,\n minZoomScale,\n resetZoom,\n setZoomScale,\n zoomIn,\n zoomOut,\n zoomScale\n }),\n [\n canZoomIn,\n canZoomOut,\n defaultZoomScale,\n maxZoomScale,\n minZoomScale,\n resetZoom,\n setZoomScale,\n zoomIn,\n zoomOut,\n zoomScale\n ]\n );\n}\n\nexport function useXlsxViewerEditing(): XlsxViewerEditing {\n const {\n addSheet,\n canRedo,\n canUndo,\n clearSelectedCells,\n copySelectionToClipboard,\n defineNamedRange,\n fillSelection,\n getClipboardData,\n getCellDisplayValue,\n getCellFormula,\n mergeSelection,\n pasteFromClipboard,\n pasteStructuredClipboardData,\n pasteText,\n removeActiveSheet,\n readOnly,\n redo,\n selectedFormula,\n selectedValue,\n setCellFormula,\n setCellValue,\n setSelectedCellFormula,\n setSelectedCellValue,\n undo,\n unmergeSelection\n } = useXlsxViewer();\n\n return React.useMemo(\n () => ({\n addSheet,\n canRedo,\n canUndo,\n clearSelectedCells,\n copySelectionToClipboard,\n defineNamedRange,\n fillSelection,\n getClipboardData,\n getCellDisplayValue,\n getCellFormula,\n mergeSelection,\n pasteFromClipboard,\n pasteStructuredClipboardData,\n pasteText,\n removeActiveSheet,\n readOnly,\n redo,\n selectedFormula,\n selectedValue,\n setCellFormula,\n setCellValue,\n setSelectedCellFormula,\n setSelectedCellValue,\n undo,\n unmergeSelection\n }),\n [\n addSheet,\n canRedo,\n canUndo,\n clearSelectedCells,\n copySelectionToClipboard,\n defineNamedRange,\n fillSelection,\n getClipboardData,\n getCellDisplayValue,\n getCellFormula,\n mergeSelection,\n pasteFromClipboard,\n pasteStructuredClipboardData,\n pasteText,\n removeActiveSheet,\n readOnly,\n redo,\n selectedFormula,\n selectedValue,\n setCellFormula,\n setCellValue,\n setSelectedCellFormula,\n setSelectedCellValue,\n undo,\n unmergeSelection\n ]\n );\n}\n\nexport function useXlsxViewerTables(): XlsxViewerTables {\n const { sortState, sortTable, tables } = useXlsxViewer();\n\n return React.useMemo(\n () => ({\n sortState,\n sortTable,\n tables\n }),\n [sortState, sortTable, tables]\n );\n}\n\nexport function useXlsxViewerImages(): XlsxViewerImages {\n const {\n charts,\n clearSelectedChart,\n clearSelectedImage,\n getChartById,\n getSheetCharts,\n getImageById,\n getSheetImages,\n images,\n isChartsLoading,\n moveChartBy,\n moveImageBy,\n readOnly,\n resizeChartBy,\n resizeImageBy,\n selectedChart,\n selectedChartId,\n selectedImage,\n selectedImageId,\n selectChart,\n selectImage,\n setChartRect,\n setImageRect,\n updateChart\n } = useXlsxViewer();\n\n return React.useMemo(\n () => ({\n charts,\n clearSelectedChart,\n clearSelectedImage,\n getChartById,\n getSheetCharts,\n getImageById,\n getSheetImages,\n images,\n isChartsLoading,\n moveChartBy,\n moveImageBy,\n readOnly,\n resizeChartBy,\n resizeImageBy,\n selectedChart,\n selectedChartId,\n selectedImage,\n selectedImageId,\n selectChart,\n selectImage,\n setChartRect,\n setImageRect,\n updateChart\n }),\n [\n charts,\n clearSelectedChart,\n clearSelectedImage,\n getChartById,\n getSheetCharts,\n getImageById,\n getSheetImages,\n images,\n isChartsLoading,\n moveChartBy,\n moveImageBy,\n readOnly,\n resizeChartBy,\n resizeImageBy,\n selectedChart,\n selectedChartId,\n selectedImage,\n selectedImageId,\n selectChart,\n selectImage,\n setChartRect,\n setImageRect,\n updateChart\n ]\n );\n}\n\nexport function useXlsxViewerCharts(): XlsxViewerCharts {\n const {\n activeTab,\n activeTabIndex,\n charts,\n chartsheets,\n clearSelectedChart,\n getChartById,\n getChartsheetById,\n getSheetCharts,\n isChartsLoading,\n moveChartBy,\n readOnly,\n resizeChartBy,\n selectChart,\n selectedChart,\n selectedChartId,\n setActiveTabIndex,\n setChartRect,\n tabs,\n updateChart\n } = useXlsxViewer();\n\n return React.useMemo(\n () => ({\n activeTab,\n activeTabIndex,\n charts,\n chartsheets,\n clearSelectedChart,\n getChartById,\n getChartsheetById,\n getSheetCharts,\n isChartsLoading,\n moveChartBy,\n readOnly,\n resizeChartBy,\n selectChart,\n selectedChart,\n selectedChartId,\n setActiveTabIndex,\n setChartRect,\n tabs,\n updateChart\n }),\n [\n activeTab,\n activeTabIndex,\n charts,\n chartsheets,\n clearSelectedChart,\n getChartById,\n getChartsheetById,\n getSheetCharts,\n isChartsLoading,\n moveChartBy,\n readOnly,\n resizeChartBy,\n selectChart,\n selectedChart,\n selectedChartId,\n setActiveTabIndex,\n setChartRect,\n tabs,\n updateChart\n ]\n );\n}\n\nexport function XlsxViewer(props: XlsxViewerProps) {\n const contextController = React.useContext(ViewerContext);\n\n if (props.controller) {\n return <XlsxViewerInner {...props} controller={props.controller} />;\n }\n\n if (contextController) {\n return <XlsxViewerInner {...props} controller={contextController} />;\n }\n\n return <XlsxViewerWithInlineController {...props} />;\n}\n\nexport function DefaultXlsxToolbar() {\n const controller = useXlsxViewer();\n const palette = useViewerPalette();\n return <DefaultToolbar controller={controller} palette={palette} />;\n}\n","import { hierarchy as d3Hierarchy, partition as d3Partition, treemap as d3Treemap, treemapBinary, treemapDice, treemapSquarify } from \"d3-hierarchy\";\nimport { geoIdentity, geoMercator, geoNaturalEarth1, geoPath } from \"d3-geo\";\nimport * as React from \"react\";\nimport { scaleBand, scaleLinear, scalePoint } from \"d3-scale\";\nimport {\n arc as d3Arc,\n area as d3Area,\n curveCatmullRom,\n curveLinear,\n curveLinearClosed,\n line as d3Line,\n pie as d3Pie,\n symbol as d3Symbol,\n symbolCircle,\n symbolCross,\n symbolDiamond,\n symbolSquare,\n symbolStar,\n symbolTriangle\n} from \"d3-shape\";\nimport type { CurveFactory } from \"d3-shape\";\nimport { feature as topojsonFeature } from \"topojson-client\";\nimport countiesAlbers10m from \"us-atlas/counties-albers-10m.json\";\nimport countries50m from \"world-atlas/countries-50m.json\";\nimport { MemoSurfaceChartComposite } from \"./surface-regl\";\nimport type { HierarchyNode, HierarchyRectangularNode } from \"d3-hierarchy\";\nimport type { Feature, FeatureCollection, Geometry } from \"geojson\";\nimport type { XlsxChart, XlsxChartAxis, XlsxChartSeries, XlsxChartTypeGroup, XlsxImageRect } from \"./types\";\n\ntype ChartRendererPalette = {\n border: string;\n mutedText: string;\n surface: string;\n text: string;\n};\n\ntype ChartSvgProps = {\n chart: XlsxChart;\n palette: ChartRendererPalette;\n rect: XlsxImageRect;\n};\n\ntype LegendItem = {\n color: string;\n label: string;\n};\n\ntype PlotRect = {\n height: number;\n left: number;\n top: number;\n width: number;\n};\n\ntype ChartLayout = {\n height: number;\n legendItems: LegendItem[];\n legendPosition: string | undefined;\n plot: PlotRect;\n titleHeight: number;\n width: number;\n};\n\ntype BarRect = {\n capEnd?: boolean;\n capStart?: boolean;\n categoryIndex: number;\n bottomScale?: number;\n color: string;\n depthOrder?: number;\n depthOffsetX?: number;\n depthOffsetY?: number;\n depthX?: number;\n depthY?: number;\n gradientId?: string;\n height: number;\n invertedNegative?: boolean;\n isHorizontal: boolean;\n key: string;\n left: number;\n shape3d?: string;\n seriesIndex: number;\n stroke: string;\n strokeWidth: number;\n topScale?: number;\n value: number;\n width: number;\n top: number;\n};\n\ntype ChartHierarchyDatum = {\n children?: ChartHierarchyDatum[];\n colorIndex?: number;\n name: string;\n value?: number;\n};\n\ntype ComboRenderableGroup = {\n axisIds: number[];\n categoryAxis: XlsxChartAxis | null;\n chartType: string;\n gapWidth?: number;\n is3d?: boolean;\n raw?: Record<string, unknown>;\n series: XlsxChartSeries[];\n valueAxis: XlsxChartAxis | null;\n};\n\ntype ChartStage = {\n color: string;\n isSubtotal: boolean;\n label: string;\n value: number;\n};\n\ntype BoxWhiskerStats = {\n lowerFence: number;\n lowerWhisker: number;\n max: number;\n mean: number;\n median: number;\n min: number;\n outliers: number[];\n q1: number;\n q3: number;\n upperFence: number;\n upperWhisker: number;\n visiblePoints: number[];\n};\n\ntype SurfaceDomain = {\n maxValue: number;\n minValue: number;\n safeMax: number;\n ticks: number[];\n};\n\ntype RegionMapFeature = Feature<Geometry, { name?: string; regionSet?: \"country\" | \"us-state\"; stateCode?: string }>;\n\nconst WORLD_COUNTRY_FEATURES = ((topojsonFeature(\n countries50m as unknown as Parameters<typeof topojsonFeature>[0],\n (countries50m as { objects: { countries: unknown } }).objects.countries as Parameters<typeof topojsonFeature>[1]\n) as unknown) as FeatureCollection<Geometry, { name?: string }>).features as RegionMapFeature[];\n\nconst US_STATE_NAME_BY_ID: Record<string, { code: string; name: string }> = {\n \"01\": { code: \"AL\", name: \"Alabama\" },\n \"02\": { code: \"AK\", name: \"Alaska\" },\n \"04\": { code: \"AZ\", name: \"Arizona\" },\n \"05\": { code: \"AR\", name: \"Arkansas\" },\n \"06\": { code: \"CA\", name: \"California\" },\n \"08\": { code: \"CO\", name: \"Colorado\" },\n \"09\": { code: \"CT\", name: \"Connecticut\" },\n \"10\": { code: \"DE\", name: \"Delaware\" },\n \"11\": { code: \"DC\", name: \"District of Columbia\" },\n \"12\": { code: \"FL\", name: \"Florida\" },\n \"13\": { code: \"GA\", name: \"Georgia\" },\n \"15\": { code: \"HI\", name: \"Hawaii\" },\n \"16\": { code: \"ID\", name: \"Idaho\" },\n \"17\": { code: \"IL\", name: \"Illinois\" },\n \"18\": { code: \"IN\", name: \"Indiana\" },\n \"19\": { code: \"IA\", name: \"Iowa\" },\n \"20\": { code: \"KS\", name: \"Kansas\" },\n \"21\": { code: \"KY\", name: \"Kentucky\" },\n \"22\": { code: \"LA\", name: \"Louisiana\" },\n \"23\": { code: \"ME\", name: \"Maine\" },\n \"24\": { code: \"MD\", name: \"Maryland\" },\n \"25\": { code: \"MA\", name: \"Massachusetts\" },\n \"26\": { code: \"MI\", name: \"Michigan\" },\n \"27\": { code: \"MN\", name: \"Minnesota\" },\n \"28\": { code: \"MS\", name: \"Mississippi\" },\n \"29\": { code: \"MO\", name: \"Missouri\" },\n \"30\": { code: \"MT\", name: \"Montana\" },\n \"31\": { code: \"NE\", name: \"Nebraska\" },\n \"32\": { code: \"NV\", name: \"Nevada\" },\n \"33\": { code: \"NH\", name: \"New Hampshire\" },\n \"34\": { code: \"NJ\", name: \"New Jersey\" },\n \"35\": { code: \"NM\", name: \"New Mexico\" },\n \"36\": { code: \"NY\", name: \"New York\" },\n \"37\": { code: \"NC\", name: \"North Carolina\" },\n \"38\": { code: \"ND\", name: \"North Dakota\" },\n \"39\": { code: \"OH\", name: \"Ohio\" },\n \"40\": { code: \"OK\", name: \"Oklahoma\" },\n \"41\": { code: \"OR\", name: \"Oregon\" },\n \"42\": { code: \"PA\", name: \"Pennsylvania\" },\n \"44\": { code: \"RI\", name: \"Rhode Island\" },\n \"45\": { code: \"SC\", name: \"South Carolina\" },\n \"46\": { code: \"SD\", name: \"South Dakota\" },\n \"47\": { code: \"TN\", name: \"Tennessee\" },\n \"48\": { code: \"TX\", name: \"Texas\" },\n \"49\": { code: \"UT\", name: \"Utah\" },\n \"50\": { code: \"VT\", name: \"Vermont\" },\n \"51\": { code: \"VA\", name: \"Virginia\" },\n \"53\": { code: \"WA\", name: \"Washington\" },\n \"54\": { code: \"WV\", name: \"West Virginia\" },\n \"55\": { code: \"WI\", name: \"Wisconsin\" },\n \"56\": { code: \"WY\", name: \"Wyoming\" }\n};\n\nconst US_STATE_FEATURES = ((topojsonFeature(\n countiesAlbers10m as unknown as Parameters<typeof topojsonFeature>[0],\n (countiesAlbers10m as { objects: { states: unknown } }).objects.states as Parameters<typeof topojsonFeature>[1]\n) as unknown) as FeatureCollection<Geometry, { name?: string }>).features.map((feature) => {\n const id = typeof feature.id === \"string\" ? feature.id : String(feature.id ?? \"\");\n const state = US_STATE_NAME_BY_ID[id];\n return {\n ...feature,\n properties: {\n ...(feature.properties ?? {}),\n name: state?.name,\n regionSet: \"us-state\" as const,\n stateCode: state?.code\n }\n };\n}) as RegionMapFeature[];\n\nconst REGION_MAP_COUNTRY_ALIASES = new Map<string, string>([\n [\"us\", \"united states of america\"],\n [\"usa\", \"united states of america\"],\n [\"u s a\", \"united states of america\"],\n [\"united states\", \"united states of america\"],\n [\"united states america\", \"united states of america\"],\n [\"u s\", \"united states of america\"],\n [\"uk\", \"united kingdom\"],\n [\"u k\", \"united kingdom\"],\n [\"uae\", \"united arab emirates\"],\n [\"u a e\", \"united arab emirates\"],\n [\"south korea\", \"korea, south\"],\n [\"north korea\", \"korea, north\"],\n [\"russia\", \"russian federation\"],\n [\"vietnam\", \"viet nam\"],\n [\"czech republic\", \"czechia\"],\n [\"ivory coast\", \"cote d'ivoire\"],\n [\"côte divoire\", \"cote d'ivoire\"]\n]);\n\nconst REGION_MAP_US_STATE_ALIASES = new Map<string, string>([\n [\"district of columbia\", \"district of columbia\"],\n [\"washington dc\", \"district of columbia\"],\n [\"washington d c\", \"district of columbia\"],\n [\"dc\", \"district of columbia\"],\n [\"d c\", \"district of columbia\"]\n]);\n\nconst REGION_MAP_FEATURES_BY_KEY = (() => {\n const byKey = new Map<string, RegionMapFeature>();\n WORLD_COUNTRY_FEATURES.forEach((feature) => {\n const name = typeof feature.properties?.name === \"string\" ? feature.properties.name : \"\";\n const key = normalizeRegionMapKey(name);\n if (key.length > 0) {\n byKey.set(key, feature);\n }\n });\n return byKey;\n})();\n\nconst REGION_MAP_US_STATE_FEATURES_BY_KEY = (() => {\n const byKey = new Map<string, RegionMapFeature>();\n US_STATE_FEATURES.forEach((feature) => {\n const name = typeof feature.properties?.name === \"string\" ? feature.properties.name : \"\";\n const key = normalizeRegionMapKey(name);\n if (key.length > 0) {\n byKey.set(key, feature);\n }\n const stateCode = normalizeRegionMapKey(feature.properties?.stateCode);\n if (stateCode.length > 0) {\n byKey.set(stateCode, feature);\n }\n });\n REGION_MAP_US_STATE_ALIASES.forEach((value, key) => {\n const feature = byKey.get(normalizeRegionMapKey(value));\n if (feature) {\n byKey.set(normalizeRegionMapKey(key), feature);\n }\n });\n return byKey;\n})();\n\nfunction parseRgbColor(color: string) {\n const match = /^#?([0-9a-f]{6})$/i.exec(color);\n if (!match) {\n return null;\n }\n return {\n blue: Number.parseInt(match[1].slice(4, 6), 16),\n green: Number.parseInt(match[1].slice(2, 4), 16),\n red: Number.parseInt(match[1].slice(0, 2), 16)\n };\n}\n\nfunction mixRgbColor(color: string, mixWith: string, ratio: number) {\n const base = parseRgbColor(color);\n const target = parseRgbColor(mixWith);\n if (!base || !target) {\n return color;\n }\n const clamped = Math.max(0, Math.min(1, ratio));\n const mixChannel = (left: number, right: number) => Math.round(left + (right - left) * clamped);\n return `#${[\n mixChannel(base.red, target.red),\n mixChannel(base.green, target.green),\n mixChannel(base.blue, target.blue)\n ].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction lightenColor(color: string, ratio: number) {\n return mixRgbColor(color, \"#ffffff\", ratio);\n}\n\nfunction darkenColor(color: string, ratio: number) {\n return mixRgbColor(color, \"#000000\", ratio);\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction normalizeRegionMapKey(value: unknown) {\n if (typeof value !== \"string\") {\n return \"\";\n }\n return value\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/&/g, \" and \")\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \");\n}\n\nconst DEFAULT_CHART_FONT_STACK = [\n \"\\\"Aptos\\\"\",\n \"Calibri\",\n \"Carlito\",\n \"\\\"Segoe UI\\\"\",\n \"Tahoma\",\n \"Arial\",\n \"sans-serif\"\n].join(\", \");\n\nconst DEFAULT_CHART_TEXT_COLOR = \"#000000\";\nconst DEFAULT_CHART_MUTED_TEXT_COLOR = \"#7f7f7f\";\n\nfunction escapeCssFontFamilyToken(value: string) {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n if (\n trimmed.startsWith(\"\\\"\")\n || trimmed.startsWith(\"'\")\n || /^(serif|sans-serif|monospace|cursive|fantasy|system-ui|math|emoji|fangsong)$/i.test(trimmed)\n ) {\n return trimmed;\n }\n return /\\s/.test(trimmed) ? `\"${trimmed.replace(/\"/g, \"\\\\\\\"\")}\"` : trimmed;\n}\n\nfunction buildChartFontFamily(fontFamily: string | undefined) {\n if (!fontFamily || fontFamily.trim().length === 0) {\n return DEFAULT_CHART_FONT_STACK;\n }\n const tokens = fontFamily\n .split(\",\")\n .map(escapeCssFontFamilyToken)\n .filter((token) => token.length > 0);\n if (tokens.length === 0) {\n return DEFAULT_CHART_FONT_STACK;\n }\n return [...tokens, \"\\\"Segoe UI\\\"\", \"Tahoma\", \"Arial\", \"sans-serif\"].join(\", \");\n}\n\nfunction resolveChartTextColor(chart: XlsxChart) {\n return chart.textColor ?? chart.titleColor ?? DEFAULT_CHART_TEXT_COLOR;\n}\n\nfunction resolveChartAxisTextColor(chart: XlsxChart) {\n return chart.axisLabelColor ?? chart.textColor ?? chart.titleColor ?? DEFAULT_CHART_TEXT_COLOR;\n}\n\nfunction resolveChartMutedTextColor(chart: XlsxChart) {\n return chart.textColor ?? chart.axisLabelColor ?? DEFAULT_CHART_MUTED_TEXT_COLOR;\n}\n\nfunction safeNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const normalized = value.trim().replace(/,/g, \"\");\n if (!normalized) {\n return null;\n }\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction chartSeriesColor(chart: XlsxChart, seriesIndex: number) {\n const series = chart.series[seriesIndex];\n const paletteColor = chart.chartColorPalette?.[seriesIndex % Math.max(1, chart.chartColorPalette.length)];\n return series?.color ?? series?.lineColor ?? paletteColor ?? chart.textColor ?? \"#222222\";\n}\n\nfunction chartSeriesStrokeColor(chart: XlsxChart, seriesIndex: number) {\n const series = chart.series[seriesIndex];\n const paletteColor = chart.chartColorPalette?.[seriesIndex % Math.max(1, chart.chartColorPalette.length)];\n return series?.lineColor ?? series?.color ?? paletteColor ?? chart.textColor ?? \"#222222\";\n}\n\nfunction chartPointColor(chart: XlsxChart, pointIndex: number, seriesIndex = 0) {\n const pointStyle = chart.series[seriesIndex]?.dataPointStyles?.find((entry) => entry.index === pointIndex);\n if (pointStyle?.color) {\n return pointStyle.color;\n }\n const rawPoint = chart.series[seriesIndex]?.dataPoints?.[pointIndex];\n if (rawPoint && typeof rawPoint === \"object\") {\n const pointRecord = rawPoint as Record<string, unknown>;\n if (typeof pointRecord.color === \"string\") {\n return pointRecord.color;\n }\n if (typeof pointRecord.fillColor === \"string\") {\n return pointRecord.fillColor;\n }\n if (typeof pointRecord.solidFillHex === \"string\") {\n const normalized = pointRecord.solidFillHex.replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return `#${normalized.toLowerCase()}`;\n }\n }\n const shapeProperties = pointRecord.shapeProperties && typeof pointRecord.shapeProperties === \"object\"\n ? pointRecord.shapeProperties as Record<string, unknown>\n : null;\n if (shapeProperties && typeof shapeProperties.solidFillHex === \"string\") {\n const normalized = shapeProperties.solidFillHex.replace(/^#/, \"\");\n if (/^[0-9a-fA-F]{6}$/.test(normalized)) {\n return `#${normalized.toLowerCase()}`;\n }\n }\n }\n const palette = chart.chartColorPalette;\n if (palette && palette.length > 0) {\n const offset = chart.chartColorPaletteOffset ?? 0;\n return palette[(pointIndex + offset) % palette.length] ?? palette[pointIndex % palette.length];\n }\n return chartSeriesColor(chart, seriesIndex);\n}\n\nfunction isHistogramLikeSeries(series: XlsxChartSeries | null | undefined) {\n const raw = series?.raw && typeof series.raw === \"object\"\n ? series.raw as Record<string, unknown>\n : null;\n return Array.isArray(raw?.chartExHistogramBins) && raw.chartExHistogramBins.length > 0;\n}\n\nfunction isHistogramLikeChart(chart: XlsxChart) {\n return chart.series.some((series) => isHistogramLikeSeries(series));\n}\n\nfunction resolveRegionMapFeature(value: unknown, featureSet: \"country\" | \"us-state\" = \"country\") {\n const rawKey = normalizeRegionMapKey(value);\n if (!rawKey) {\n return null;\n }\n if (featureSet === \"us-state\") {\n const canonicalKey = REGION_MAP_US_STATE_ALIASES.get(rawKey) ?? rawKey;\n return REGION_MAP_US_STATE_FEATURES_BY_KEY.get(canonicalKey) ?? null;\n }\n const canonicalKey = REGION_MAP_COUNTRY_ALIASES.get(rawKey) ?? rawKey;\n return REGION_MAP_FEATURES_BY_KEY.get(canonicalKey) ?? null;\n}\n\nfunction resolveRegionMapBaseColor(chart: XlsxChart, seriesIndex: number) {\n return chart.series[seriesIndex]?.color\n ?? chart.series[seriesIndex]?.lineColor\n ?? chart.chartColorPalette?.[0]\n ?? \"#ff006e\";\n}\n\nfunction resolveRegionMapDataColor(chart: XlsxChart, seriesIndex: number) {\n const pointColor = normalizeRendererHexColor(chartPointColor(chart, 0, seriesIndex));\n if (pointColor) {\n return pointColor;\n }\n\n const palette = Array.isArray(chart.chartColorPalette) ? chart.chartColorPalette : [];\n if (palette.length > 0) {\n const offset = chart.chartColorPaletteOffset ?? 0;\n const paletteColor = normalizeRendererHexColor(\n palette[((offset % palette.length) + palette.length) % palette.length]\n );\n if (paletteColor) {\n return paletteColor;\n }\n }\n\n return normalizeRendererHexColor(chart.series[seriesIndex]?.color ?? chart.series[seriesIndex]?.lineColor)\n ?? \"#4f81bd\";\n}\n\nfunction resolveRegionMapValueColors(series: XlsxChartSeries | null | undefined) {\n const raw = series?.raw && typeof series.raw === \"object\"\n ? series.raw as Record<string, unknown>\n : null;\n const colors = Array.isArray(raw?.valueColors)\n ? raw.valueColors\n .map((value) => normalizeRendererHexColor(value))\n .filter((value): value is string => Boolean(value))\n : [];\n return colors.length >= 2 ? colors : null;\n}\n\nfunction resolveRegionMapColorStrings(series: XlsxChartSeries | null | undefined) {\n const raw = series?.raw && typeof series.raw === \"object\"\n ? series.raw as Record<string, unknown>\n : null;\n const values = Array.isArray(raw?.chartExColorStrings)\n ? raw.chartExColorStrings\n .map((value) => (typeof value === \"string\" ? value.trim() : \"\"))\n .filter((value): value is string => value.length > 0)\n : [];\n return values.length > 0 ? values : null;\n}\n\nfunction resolveRegionMapLayoutProperties(series: XlsxChartSeries | null | undefined) {\n const raw = series?.raw && typeof series.raw === \"object\"\n ? series.raw as Record<string, unknown>\n : null;\n return raw?.layoutProperties && typeof raw.layoutProperties === \"object\"\n ? raw.layoutProperties as Record<string, unknown>\n : null;\n}\n\nfunction resolveRegionMapFeatureSet(labels: string[], geography: Record<string, unknown> | null) {\n const cultureRegion = typeof geography?.cultureRegion === \"string\"\n ? geography.cultureRegion.trim().toUpperCase()\n : \"\";\n const countryMatches = labels.filter((label) => resolveRegionMapFeature(label, \"country\") != null).length;\n const stateMatches = labels.filter((label) => resolveRegionMapFeature(label, \"us-state\") != null).length;\n if (cultureRegion === \"US\" && stateMatches > 0 && stateMatches >= countryMatches) {\n return \"us-state\" as const;\n }\n return \"country\" as const;\n}\n\nfunction getRegionMapBaseFeatures(featureSet: \"country\" | \"us-state\") {\n return featureSet === \"us-state\" ? US_STATE_FEATURES : WORLD_COUNTRY_FEATURES;\n}\n\nfunction resolveRegionMapValueColorFromStops(stops: string[], ratio: number) {\n if (stops.length === 0) {\n return \"#4f81bd\";\n }\n if (stops.length === 1) {\n return stops[0];\n }\n const clamped = clamp(ratio, 0, 1);\n const scaled = clamped * (stops.length - 1);\n const lowerIndex = Math.floor(scaled);\n const upperIndex = Math.min(stops.length - 1, lowerIndex + 1);\n const mixRatio = scaled - lowerIndex;\n return mixRgbColor(stops[lowerIndex] ?? stops[0], stops[upperIndex] ?? stops[stops.length - 1], mixRatio);\n}\n\nfunction resolveRegionMapValueColor(chart: XlsxChart, seriesIndex: number, ratio: number) {\n const explicitStops = resolveRegionMapValueColors(chart.series[seriesIndex] ?? null);\n if (explicitStops) {\n return resolveRegionMapValueColorFromStops(explicitStops, ratio);\n }\n const baseColor = resolveRegionMapDataColor(chart, seriesIndex);\n return resolveRegionMapValueColorFromStops([\n lightenColor(baseColor, 0.82),\n lightenColor(baseColor, 0.28),\n darkenColor(baseColor, 0.08)\n ], ratio);\n}\n\nfunction resolveRegionMapNoDataColor(chart: XlsxChart, seriesIndex: number) {\n const baseColor = resolveRegionMapBaseColor(chart, seriesIndex);\n return normalizeRendererHexColor(baseColor) ?? \"#ff006e\";\n}\n\nfunction buildRegionMapLegendItems(chart: XlsxChart): LegendItem[] {\n const primarySeriesIndex = Math.max(0, chart.series.findIndex((series) => series.hidden !== true));\n const categoricalValues = resolveRegionMapColorStrings(chart.series[primarySeriesIndex] ?? null);\n if (categoricalValues) {\n const uniqueValues = Array.from(new Set(categoricalValues));\n return uniqueValues.map((value, index) => ({\n color: chartPointColor(chart, index, primarySeriesIndex),\n label: value\n }));\n }\n const values = (chart.series[primarySeriesIndex]?.values ?? [])\n .map((value) => safeNumber(value))\n .filter((value): value is number => value != null);\n if (values.length === 0) {\n return [];\n }\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n const ticks = buildNumericTickValues(minValue, maxValue, undefined).slice(0, 5);\n return ticks.slice(0, -1).map((tick, index) => {\n const nextTick = ticks[index + 1] ?? maxValue;\n const midpoint = tick + (nextTick - tick) * 0.5;\n const ratio = (midpoint - minValue) / Math.max(1e-6, maxValue - minValue);\n return {\n color: resolveRegionMapValueColor(chart, primarySeriesIndex, ratio),\n label: `${formatTickValue(tick)}-${formatTickValue(nextTick)}`\n };\n });\n}\n\nfunction normalizeBuiltinPieStyleId(styleId: number | undefined) {\n if (typeof styleId !== \"number\" || !Number.isFinite(styleId)) {\n return null;\n }\n return styleId >= 100 ? styleId - 100 : styleId;\n}\n\nfunction getBuiltinPiePalette(chart: XlsxChart, seriesIndex: number) {\n const normalized = normalizeBuiltinPieStyleId(chart.chartStyleId);\n if (normalized !== 32) {\n return null;\n }\n const baseColor = chart.series[seriesIndex]?.color\n ?? chart.series[seriesIndex]?.lineColor\n ?? chart.chartColorPalette?.[0]\n ?? null;\n if (!baseColor) {\n return null;\n }\n return [\n lightenColor(baseColor, 0.16),\n darkenColor(baseColor, 0.42),\n baseColor,\n darkenColor(baseColor, 0.18),\n lightenColor(baseColor, 0.08),\n darkenColor(baseColor, 0.3)\n ];\n}\n\nfunction resolvePiePointColor(chart: XlsxChart, pointIndex: number, seriesIndex = 0) {\n const pointStyle = chart.series[seriesIndex]?.dataPointStyles?.find((entry) => entry.index === pointIndex);\n if (pointStyle?.color) {\n return pointStyle.color;\n }\n const builtinPalette = getBuiltinPiePalette(chart, seriesIndex);\n if (builtinPalette && builtinPalette.length > 0) {\n return builtinPalette[pointIndex % builtinPalette.length] ?? builtinPalette[0];\n }\n return chartPointColor(chart, pointIndex, seriesIndex);\n}\n\nfunction selectPrimaryPieSeriesIndex(chart: XlsxChart) {\n let bestIndex = 0;\n let bestScore = Number.NEGATIVE_INFINITY;\n\n chart.series.forEach((series, index) => {\n let positiveCount = 0;\n let total = 0;\n for (const rawValue of series.values) {\n const value = safeNumber(rawValue);\n if (value != null && value > 0) {\n positiveCount += 1;\n total += value;\n }\n }\n const score = positiveCount * 1_000_000 + total;\n if (score > bestScore) {\n bestScore = score;\n bestIndex = index;\n }\n });\n\n return bestIndex;\n}\n\nfunction chartSeriesBarColors(\n chart: XlsxChart,\n seriesIndex: number,\n value: number,\n negativeFillMode: \"chartArea\" | \"none\" | \"series\"\n) {\n const series = chart.series[seriesIndex];\n const defaultFill = chartSeriesColor(chart, seriesIndex);\n const defaultStroke = chartSeriesStrokeColor(chart, seriesIndex);\n const defaultStrokeWidth = typeof series?.lineWidthPx === \"number\" && Number.isFinite(series.lineWidthPx)\n ? Math.max(0.8, Math.min(4, series.lineWidthPx))\n : 1;\n if (value < 0 && series?.invertIfNegative) {\n const resolvedNegativeFill = negativeFillMode === \"none\"\n ? \"none\"\n : series.negativeColor\n ?? (negativeFillMode === \"chartArea\" ? chart.chartAreaFillColor : undefined)\n ?? defaultFill;\n return {\n fill: resolvedNegativeFill,\n stroke: series.negativeLineColor ?? defaultStroke,\n strokeWidth: defaultStrokeWidth\n };\n }\n return {\n fill: defaultFill,\n stroke: defaultStroke,\n strokeWidth: defaultStrokeWidth\n };\n}\n\nfunction resolveCategoryBandPadding(gapWidth: number | undefined) {\n const normalizedGap = typeof gapWidth === \"number\" && Number.isFinite(gapWidth)\n ? clamp(gapWidth, 0, 500)\n : 150;\n const inner = clamp(normalizedGap / (100 + normalizedGap), 0.05, 0.88);\n const outer = clamp(inner * 0.5, 0, 0.45);\n return { inner, outer };\n}\n\nfunction normalizeLegendPosition(position: string | undefined) {\n switch (position) {\n case \"bottom\":\n return \"bottom\";\n case \"left\":\n return \"left\";\n case \"right\":\n return \"right\";\n case \"top\":\n return \"top\";\n case \"b\":\n return \"bottom\";\n case \"l\":\n return \"left\";\n case \"r\":\n return \"right\";\n case \"t\":\n return \"top\";\n default:\n return position;\n }\n}\n\nfunction normalizeChartMarkerSymbol(value: string | undefined) {\n if (!value || value === \"none\") {\n return \"none\";\n }\n if (value === \"auto\") {\n return \"circle\";\n }\n return value;\n}\n\nfunction normalizeRenderableChartType(chart: XlsxChart) {\n if (chart.chartType === \"ScatterSmooth\") {\n return \"ScatterSmooth\";\n }\n if (chart.chartType === \"Pie\" && chart.is3d) {\n return \"Pie3D\";\n }\n if (\n chart.chartType === \"Pie\"\n && chart.series.some((series) => Array.isArray(series.dataPoints) && series.dataPoints.some((point) => (\n point != null\n && typeof point === \"object\"\n && \"explosion\" in point\n && typeof (point as { explosion?: unknown }).explosion === \"number\"\n && ((point as { explosion?: number }).explosion ?? 0) > 0\n )))\n ) {\n return \"PieExploded\";\n }\n if (chart.chartType === \"Unsupported(c:ofPieChart)\") {\n return \"BarOfPie\";\n }\n return chart.chartType;\n}\n\nfunction normalizeCategoryLabel(value: unknown) {\n if (value == null) {\n return \"\";\n }\n return String(value)\n .replace(/[\\u200B-\\u200D\\uFEFF]/g, \"\")\n .trim();\n}\n\nfunction estimateReferencePointCount(formula: string | undefined) {\n if (!formula) {\n return 0;\n }\n const bang = formula.lastIndexOf(\"!\");\n const rawRange = (bang >= 0 ? formula.slice(bang + 1) : formula).replace(/\\$/g, \"\");\n const match = /^([A-Za-z]+)(\\d+):([A-Za-z]+)(\\d+)$/.exec(rawRange.trim());\n if (!match) {\n return 0;\n }\n const startRow = Number(match[2]);\n const endRow = Number(match[4]);\n if (!Number.isFinite(startRow) || !Number.isFinite(endRow)) {\n return 0;\n }\n return Math.abs(endRow - startRow) + 1;\n}\n\nfunction getCategoryLabels(chart: XlsxChart) {\n const primaryCategories = chart.series[0]?.categories ?? [];\n const includeReferenceCategoryCount = chart.plotVisibleOnly !== true;\n const referenceCategoryCount = includeReferenceCategoryCount\n ? Math.max(\n 0,\n ...chart.series.map((series) => Math.max(\n estimateReferencePointCount(series.categoriesRef?.formula),\n estimateReferencePointCount(series.valuesRef?.formula)\n ))\n )\n : 0;\n const categoryCount = Math.max(\n referenceCategoryCount,\n primaryCategories.length,\n ...chart.series.map((series) => Math.max(series.categories.length, series.values.length))\n );\n if (categoryCount <= 0) {\n return [];\n }\n const hasAnyExplicitCategory = chart.series.some((series) => (\n series.categories.some((value) => normalizeCategoryLabel(value).length > 0)\n ));\n const fallbackToImplicitOrdinal = chart.series.some((series) => {\n const categoriesLength = series.categories.length;\n if (categoriesLength === 0) {\n return false;\n }\n return series.categories.every((value) => normalizeCategoryLabel(value).length === 0);\n }) || !hasAnyExplicitCategory;\n return Array.from({ length: categoryCount }, (_, categoryIndex) => {\n const primary = primaryCategories[categoryIndex];\n if (primary != null) {\n const normalizedPrimary = normalizeCategoryLabel(primary);\n if (normalizedPrimary.length > 0) {\n return formatCategoryLabel(chart, primary, normalizedPrimary);\n }\n }\n const fallback = chart.series\n .map((series) => series.categories[categoryIndex])\n .find((value) => normalizeCategoryLabel(value).length > 0);\n if (fallback != null) {\n return formatCategoryLabel(chart, fallback, normalizeCategoryLabel(fallback));\n }\n return fallbackToImplicitOrdinal ? String(categoryIndex + 1) : \"\";\n });\n}\n\nfunction isComboChart(chart: XlsxChart) {\n const typeGroups = chart.typeGroups ?? [];\n if (typeGroups.length < 2) {\n return false;\n }\n const distinctChartTypes = new Set(typeGroups.map((group) => group.chartType));\n return distinctChartTypes.size > 1;\n}\n\nfunction getComboLegendSeries(chart: XlsxChart) {\n if (!isComboChart(chart)) {\n return chart.series.map((series, index) => ({\n color: chartSeriesColor(chart, index),\n label: series.name ?? `Series ${index + 1}`\n }));\n }\n return (chart.typeGroups ?? []).flatMap((group) => (\n group.series.map((series, seriesIndex) => ({\n color: series.lineColor ?? series.markerColor ?? series.color ?? chartSeriesColor(chart, seriesIndex),\n label: series.name ?? `Series ${seriesIndex + 1}`\n }))\n ));\n}\n\nfunction findAxisForGroup(\n chart: XlsxChart,\n axisIds: number[],\n positionMatcher: (position: string | undefined) => boolean,\n allowAnyMatch = false\n) {\n const positionedMatch = chart.axes.find((axis) => (\n axis.id != null\n && axisIds.includes(axis.id)\n && positionMatcher(axis.position)\n ));\n if (positionedMatch) {\n return positionedMatch;\n }\n if (!allowAnyMatch) {\n return null;\n }\n return chart.axes.find((axis) => axis.id != null && axisIds.includes(axis.id)) ?? null;\n}\n\nfunction buildComboGroups(chart: XlsxChart): ComboRenderableGroup[] {\n return (chart.typeGroups ?? []).map((group) => {\n const axisIds = group.axisIds ?? [];\n const categoryAxis = findAxisForGroup(chart, axisIds, (position) => position === \"b\" || position === \"t\")\n ?? chart.categoryAxis\n ?? null;\n const valueAxis = findAxisForGroup(chart, axisIds, (position) => position === \"l\" || position === \"r\", true)\n ?? chart.valueAxis\n ?? null;\n return {\n axisIds,\n categoryAxis,\n chartType: group.chartType,\n gapWidth: group.gapWidth,\n is3d: group.is3d,\n raw: group.raw,\n series: group.series,\n valueAxis\n };\n }).filter((group) => group.series.length > 0);\n}\n\nfunction resolveRenderableSeriesValue(rawValue: unknown, displayBlanksAs: string | undefined) {\n const numeric = safeNumber(rawValue);\n if (numeric != null) {\n return numeric;\n }\n return displayBlanksAs === \"zero\" ? 0 : null;\n}\n\nfunction coerceLooseNumber(value: unknown): number | null {\n const strict = safeNumber(value);\n if (strict != null) {\n return strict;\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n const nested = coerceLooseNumber(entry);\n if (nested != null) {\n return nested;\n }\n }\n return null;\n }\n if (value && typeof value === \"object\") {\n const record = value as Record<string, unknown>;\n for (const key of [\"x\", \"value\", \"v\", \"num\", \"number\", \"raw\"]) {\n const nested = coerceLooseNumber(record[key]);\n if (nested != null) {\n return nested;\n }\n }\n return null;\n }\n if (typeof value === \"string\") {\n const match = /-?\\d+(?:\\.\\d+)?/.exec(value);\n if (!match) {\n return null;\n }\n const parsed = Number(match[0]);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction buildPieEntries(chart: XlsxChart, seriesIndex = selectPrimaryPieSeriesIndex(chart)) {\n const categories = getCategoryLabels(chart);\n const values = chart.series[seriesIndex]?.values ?? [];\n return values\n .map((rawValue, index) => ({\n color: resolvePiePointColor(chart, index, seriesIndex),\n index,\n label: normalizeCategoryLabel(categories[index]),\n value: Math.max(0, safeNumber(rawValue) ?? 0)\n }))\n .filter((entry) => entry.value > 0);\n}\n\nfunction resolveChartStageSubtotal(series: XlsxChart[\"series\"][number]) {\n const raw = series.raw && typeof series.raw === \"object\"\n ? series.raw as Record<string, unknown>\n : null;\n const layoutProperties = raw?.layoutProperties && typeof raw.layoutProperties === \"object\"\n ? raw.layoutProperties as Record<string, unknown>\n : null;\n const subtotals = Array.isArray(layoutProperties?.subtotals) ? layoutProperties.subtotals : [];\n return subtotals.length > 0 || layoutProperties?.aggregation === true;\n}\n\nfunction buildChartStages(chart: XlsxChart) {\n if (chart.chartType === \"Funnel\" || chart.chartType === \"Waterfall\") {\n const primarySeriesIndex = Math.max(0, chart.series.findIndex((series) => series.hidden !== true));\n const primarySeries = chart.series[primarySeriesIndex] ?? null;\n if (!primarySeries) {\n return [];\n }\n\n const labels = getCategoryLabels(chart);\n return primarySeries.values\n .map((rawValue, index): ChartStage | null => {\n const value = safeNumber(rawValue);\n if (value == null || !Number.isFinite(value)) {\n return null;\n }\n return {\n color: chart.varyColors\n ? chartPointColor(chart, index, primarySeriesIndex)\n : chartSeriesColor(chart, primarySeriesIndex),\n isSubtotal: false,\n label: normalizeCategoryLabel(labels[index]) || String(index + 1),\n value\n };\n })\n .filter((stage): stage is ChartStage => stage != null);\n }\n\n return chart.series\n .map((series, index): ChartStage | null => {\n const value = series.values.reduce<number>((sum, entry) => sum + (safeNumber(entry) ?? 0), 0);\n if (!Number.isFinite(value)) {\n return null;\n }\n const formula = typeof series.valuesRef?.formula === \"string\" ? series.valuesRef.formula : \"\";\n const label = series.name\n ?? (formula.length > 0 ? formula.replace(/^.*!/, \"\").replace(/\\$/g, \"\") : `Series ${index + 1}`);\n return {\n color: chartSeriesColor(chart, typeof series.formatIdx === \"number\" ? series.formatIdx : index),\n isSubtotal: resolveChartStageSubtotal(series),\n label,\n value\n };\n })\n .filter((stage): stage is ChartStage => stage != null);\n}\n\nfunction buildHierarchyData(chart: XlsxChart) {\n const root: ChartHierarchyDatum = {\n children: [],\n name: chart.title ?? chart.name ?? \"Root\"\n };\n const rootChildren = root.children ?? [];\n const topLevelIndexByName = new Map<string, number>();\n const primaryHierarchySeries = chart.series.find((series) => {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n return Array.isArray(raw?.chartExHierarchyCategories);\n }) ?? null;\n const primaryHierarchyPaths = (() => {\n if (!primaryHierarchySeries) {\n return null;\n }\n const raw = primaryHierarchySeries.raw as Record<string, unknown>;\n return Array.isArray(raw.chartExHierarchyCategories)\n ? raw.chartExHierarchyCategories.map((entry) => Array.isArray(entry)\n ? entry.map((value) => normalizeCategoryLabel(value)).filter((value) => value.length > 0)\n : [])\n : null;\n })();\n const rowCount = primaryHierarchyPaths\n ? primaryHierarchyPaths.length\n : Math.max(0, ...chart.series.map((series) => series.values.length));\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex += 1) {\n const path = primaryHierarchyPaths?.[rowIndex] ?? chart.series\n .map((series) => normalizeCategoryLabel(series.categories[rowIndex] ?? series.values[rowIndex]))\n .filter((value) => value.length > 0);\n if (path.length === 0) {\n continue;\n }\n\n let current = root;\n path.forEach((part, levelIndex) => {\n current.children = current.children ?? [];\n const preserveDuplicateLeaf = levelIndex === path.length - 1 && path.length === 1;\n let next = preserveDuplicateLeaf\n ? undefined\n : current.children.find((child) => child.name === part);\n if (!next) {\n next = { children: [], name: part };\n if (levelIndex === 0) {\n const topLevelIndex = topLevelIndexByName.size;\n topLevelIndexByName.set(part, topLevelIndex);\n next.colorIndex = topLevelIndex;\n } else {\n next.colorIndex = current.colorIndex;\n }\n current.children.push(next);\n }\n current = next;\n });\n\n const valueSource = primaryHierarchySeries ?? chart.series[chart.series.length - 1] ?? null;\n current.value = (current.value ?? 0) + Math.max(0.0001, safeNumber(valueSource?.values[rowIndex]) ?? 1);\n }\n\n return rootChildren.length > 0 ? root : null;\n}\n\nfunction resolveBoxWhiskerQuartileMethod(series: XlsxChartSeries) {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n const layoutProperties = raw?.layoutProperties && typeof raw.layoutProperties === \"object\"\n ? raw.layoutProperties as Record<string, unknown>\n : null;\n const statistics = layoutProperties?.statistics && typeof layoutProperties.statistics === \"object\"\n ? layoutProperties.statistics as Record<string, unknown>\n : null;\n return statistics?.quartileMethod === \"inclusive\" ? \"inclusive\" : \"exclusive\";\n}\n\nfunction resolveBoxWhiskerVisibility(series: XlsxChartSeries) {\n const raw = series.raw && typeof series.raw === \"object\" ? series.raw as Record<string, unknown> : null;\n const layoutProperties = raw?.layoutProperties && typeof raw.layoutProperties === \"object\"\n ? raw.layoutProperties as Record<string, unknown>\n : null;\n const visibility = layoutProperties?.visibility && typeof layoutProperties.visibility === \"object\"\n ? layoutProperties.visibility as Record<string, unknown>\n : null;\n return {\n meanLine: visibility?.meanLine === true,\n meanMarker: visibility?.meanMarker !== false,\n nonoutliers: visibility?.nonoutliers === true,\n outliers: visibility?.outliers !== false\n };\n}\n\nfunction computePercentile(sortedValues: number[], percentile: number, method: \"exclusive\" | \"inclusive\") {\n const count = sortedValues.length;\n if (count === 0) {\n return 0;\n }\n if (count === 1) {\n return sortedValues[0] ?? 0;\n }\n\n const rank = method === \"exclusive\"\n ? percentile * (count + 1)\n : 1 + percentile * (count - 1);\n if (rank <= 1) {\n return sortedValues[0] ?? 0;\n }\n if (rank >= count) {\n return sortedValues[count - 1] ?? 0;\n }\n\n const lowerIndex = Math.floor(rank) - 1;\n const upperIndex = Math.ceil(rank) - 1;\n const fraction = rank - Math.floor(rank);\n const lower = sortedValues[Math.max(0, lowerIndex)] ?? sortedValues[0] ?? 0;\n const upper = sortedValues[Math.max(0, upperIndex)] ?? sortedValues[count - 1] ?? 0;\n return lower + (upper - lower) * fraction;\n}\n\nfunction computeBoxWhiskerStats(series: XlsxChartSeries): BoxWhiskerStats | null {\n const sortedValues = series.values\n .map((value) => safeNumber(value))\n .filter((value): value is number => value != null)\n .sort((left, right) => left - right);\n if (sortedValues.length === 0) {\n return null;\n }\n\n const quartileMethod = resolveBoxWhiskerQuartileMethod(series);\n const q1 = computePercentile(sortedValues, 0.25, quartileMethod);\n const median = computePercentile(sortedValues, 0.5, quartileMethod);\n const q3 = computePercentile(sortedValues, 0.75, quartileMethod);\n const iqr = q3 - q1;\n const lowerFence = q1 - iqr * 1.5;\n const upperFence = q3 + iqr * 1.5;\n const visiblePoints = sortedValues.filter((value) => value >= lowerFence && value <= upperFence);\n const outliers = sortedValues.filter((value) => value < lowerFence || value > upperFence);\n const lowerWhisker = visiblePoints[0] ?? sortedValues[0] ?? 0;\n const upperWhisker = visiblePoints[visiblePoints.length - 1] ?? sortedValues[sortedValues.length - 1] ?? 0;\n const mean = sortedValues.reduce((sum, value) => sum + value, 0) / sortedValues.length;\n\n return {\n lowerFence,\n lowerWhisker,\n max: sortedValues[sortedValues.length - 1] ?? 0,\n mean,\n median,\n min: sortedValues[0] ?? 0,\n outliers,\n q1,\n q3,\n upperFence,\n upperWhisker,\n visiblePoints\n };\n}\n\nfunction resolveHierarchyNodeColor(chart: XlsxChart, node: HierarchyNode<ChartHierarchyDatum>) {\n const lineage = node.ancestors().reverse();\n const topLevel = lineage[1];\n const baseIndex = topLevel?.data.colorIndex ?? 0;\n const baseColor = chartSeriesColor(chart, baseIndex);\n const depth = Math.max(0, node.depth - 1);\n return depth === 0 ? baseColor : lightenColor(baseColor, clamp(depth * 0.16, 0, 0.5));\n}\n\nfunction resolveTreemapNodeColor(chart: XlsxChart, node: HierarchyNode<ChartHierarchyDatum>) {\n const lineage = node.ancestors().reverse();\n const topLevel = lineage[1];\n return chartSeriesColor(chart, topLevel?.data.colorIndex ?? 0);\n}\n\nfunction excelTreemapTile(node: HierarchyRectangularNode<ChartHierarchyDatum>, x0: number, y0: number, x1: number, y1: number) {\n if (!node.children || node.children.length === 0) {\n return;\n }\n if (node.depth === 0) {\n treemapDice(node, x0, y0, x1, y1);\n node.children.forEach((child) => excelTreemapTile(child, child.x0, child.y0, child.x1, child.y1));\n return;\n }\n treemapBinary(node, x0, y0, x1, y1);\n node.children.forEach((child) => excelTreemapTile(child, child.x0, child.y0, child.x1, child.y1));\n}\n\nfunction resolveSurfaceBaseColor(chart: XlsxChart, palette: ChartRendererPalette) {\n return chart.chartColorPalette?.[0]\n ?? chart.series[0]?.color\n ?? chart.series[0]?.lineColor\n ?? chart.axisLineColor\n ?? chart.textColor\n ?? palette.text;\n}\n\nfunction normalizeBuiltinSurfaceStyleId(styleId: number | undefined) {\n if (typeof styleId !== \"number\" || !Number.isFinite(styleId)) {\n return null;\n }\n return styleId >= 100 ? styleId - 100 : styleId;\n}\n\nfunction hasExplicitSurfaceBaseColor(chart: XlsxChart) {\n const primarySeriesColor = normalizeRendererHexColor(chart.series[0]?.color ?? chart.series[0]?.lineColor);\n if (!primarySeriesColor) {\n return null;\n }\n const paletteColor = normalizeRendererHexColor(chart.chartColorPalette?.[0]);\n return paletteColor && paletteColor === primarySeriesColor ? null : primarySeriesColor;\n}\n\nfunction buildMonochromeSurfacePalette(baseColor: string, count: number) {\n if (count <= 3) {\n return [\n lightenColor(baseColor, 0.22),\n baseColor,\n darkenColor(baseColor, 0.2)\n ];\n }\n return [\n lightenColor(baseColor, 0.3),\n lightenColor(baseColor, 0.14),\n baseColor,\n darkenColor(baseColor, 0.1),\n darkenColor(baseColor, 0.22)\n ];\n}\n\nfunction getBuiltinSurfacePalette(chart: XlsxChart) {\n const normalized = normalizeBuiltinSurfaceStyleId(chart.chartStyleId);\n const explicitBaseColor = hasExplicitSurfaceBaseColor(chart);\n if (normalized === 26) {\n return buildMonochromeSurfacePalette(explicitBaseColor ?? \"#ff006e\", 3);\n }\n if (normalized === 34 && explicitBaseColor) {\n return buildMonochromeSurfacePalette(explicitBaseColor, 3);\n }\n if (normalized === 34 || (chart.wireframe === true && normalized == null)) {\n return [\"#5b9bd5\", \"#ed7d31\", \"#a5a5a5\"];\n }\n if (normalized === 35 || normalized === 36 || (chart.wireframe !== true && normalized == null)) {\n return [\"#2f5597\", \"#4472c4\", \"#5b9bd5\", \"#8faadc\", \"#d9e2f3\"];\n }\n return null;\n}\n\nfunction shouldPreferBuiltinSurfacePalette(chart: XlsxChart) {\n const normalized = normalizeBuiltinSurfaceStyleId(chart.chartStyleId);\n const rawChartType = chart.raw && typeof chart.raw === \"object\" && typeof (chart.raw as Record<string, unknown>).xmlChartType === \"string\"\n ? String((chart.raw as Record<string, unknown>).xmlChartType)\n : \"\";\n return (\n (rawChartType === \"surfaceChart\" || rawChartType === \"surface3DChart\")\n && (normalized === 26 || normalized === 34 || normalized === 35 || normalized === 36)\n );\n}\n\nfunction getSurfaceBandCount(chart: XlsxChart) {\n const raw = chart.raw && typeof chart.raw === \"object\" ? chart.raw as Record<string, unknown> : null;\n const explicitBandCount = typeof raw?.bandFormatCount === \"number\" && Number.isFinite(raw.bandFormatCount)\n ? raw.bandFormatCount\n : null;\n if (explicitBandCount != null && explicitBandCount > 0 && !(isContourSurfaceChart(chart) && chart.wireframe !== true)) {\n return explicitBandCount;\n }\n const builtinPalette = getBuiltinSurfacePalette(chart);\n if (shouldPreferBuiltinSurfacePalette(chart) && builtinPalette && builtinPalette.length > 0) {\n return builtinPalette.length;\n }\n if (chart.chartColorPalette && chart.chartColorPalette.length > 1) {\n return chart.chartColorPalette.length;\n }\n if (builtinPalette && builtinPalette.length > 0) {\n return builtinPalette.length;\n }\n return chart.wireframe ? 3 : 5;\n}\n\nfunction getSurfaceColorStops(chart: XlsxChart, palette: ChartRendererPalette) {\n const builtinPalette = getBuiltinSurfacePalette(chart);\n if (shouldPreferBuiltinSurfacePalette(chart) && builtinPalette && builtinPalette.length >= 2) {\n return builtinPalette;\n }\n const explicitStops = (chart.chartColorPalette ?? []).filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (explicitStops.length >= 2) {\n return explicitStops;\n }\n if (builtinPalette && builtinPalette.length >= 2) {\n return builtinPalette;\n }\n const baseColor = resolveSurfaceBaseColor(chart, palette);\n return [\n darkenColor(baseColor, 0.42),\n darkenColor(baseColor, 0.24),\n baseColor,\n lightenColor(baseColor, 0.18),\n lightenColor(baseColor, 0.34),\n lightenColor(baseColor, 0.5)\n ];\n}\n\nfunction resolveSurfaceBandPaletteColor(chart: XlsxChart, palette: ChartRendererPalette, domain: SurfaceDomain, value: number) {\n const stops = getSurfaceColorStops(chart, palette);\n if (stops.length === 0) {\n return resolveSurfaceBaseColor(chart, palette);\n }\n const bandIndex = resolveSurfaceBandIndex(domain, value);\n return stops[Math.min(stops.length - 1, Math.max(0, bandIndex))] ?? stops[stops.length - 1] ?? resolveSurfaceBaseColor(chart, palette);\n}\n\nfunction getSurfaceDomain(chart: XlsxChart): SurfaceDomain | null {\n const numericValues = chart.series.flatMap((series) => (\n series.values\n .map((value) => safeNumber(value))\n .filter((value): value is number => value != null)\n ));\n if (numericValues.length === 0) {\n return null;\n }\n const explicitMin = typeof chart.valueAxis?.min === \"number\" && Number.isFinite(chart.valueAxis.min)\n ? chart.valueAxis.min\n : null;\n const explicitMax = typeof chart.valueAxis?.max === \"number\" && Number.isFinite(chart.valueAxis.max)\n ? chart.valueAxis.max\n : null;\n const rawMin = Math.min(...numericValues);\n const rawMax = Math.max(...numericValues);\n const bandCount = Math.max(1, getSurfaceBandCount(chart));\n const spanBase = Math.max(1e-6, rawMax - Math.min(0, rawMin));\n const roughStep = spanBase / bandCount;\n const magnitude = 10 ** Math.floor(Math.log10(Math.max(roughStep, 1e-6)));\n const normalized = roughStep / magnitude;\n const niceNormalized = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10;\n const step = typeof chart.valueAxis?.majorUnit === \"number\" && chart.valueAxis.majorUnit > 0\n ? chart.valueAxis.majorUnit\n : niceNormalized * magnitude;\n const minValue = explicitMin ?? (rawMin >= 0 ? 0 : Math.floor(rawMin / step) * step);\n const maxValue = explicitMax ?? Math.ceil(rawMax / step) * step;\n const safeMax = maxValue <= minValue ? minValue + step : maxValue;\n const ticks: number[] = [];\n for (let current = minValue; current <= safeMax + step * 0.001; current += step) {\n ticks.push(Number(current.toFixed(8)));\n }\n return {\n maxValue,\n minValue,\n safeMax,\n ticks: ticks.length >= 2 ? ticks : [minValue, safeMax]\n };\n}\n\nfunction resolveSurfaceColor(chart: XlsxChart, palette: ChartRendererPalette, ratio: number) {\n const stops = getSurfaceColorStops(chart, palette);\n if (stops.length === 0) {\n return resolveSurfaceBaseColor(chart, palette);\n }\n if (stops.length === 1) {\n return stops[0];\n }\n const clamped = clamp(ratio, 0, 1) * (stops.length - 1);\n const lowerIndex = Math.floor(clamped);\n const upperIndex = Math.min(stops.length - 1, lowerIndex + 1);\n const mixRatio = clamped - lowerIndex;\n return mixRgbColor(stops[lowerIndex] ?? stops[0], stops[upperIndex] ?? stops[stops.length - 1], mixRatio);\n}\n\nfunction resolveSurfaceBandColor(chart: XlsxChart, palette: ChartRendererPalette, domain: SurfaceDomain, value: number) {\n return resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n}\n\nfunction resolveSurfaceBandIndex(domain: SurfaceDomain, value: number) {\n const ticks = domain.ticks;\n for (let index = 0; index < ticks.length - 1; index += 1) {\n const end = ticks[index + 1] ?? domain.safeMax;\n if (value <= end || index === ticks.length - 2) {\n return index;\n }\n }\n return Math.max(0, ticks.length - 2);\n}\n\ntype SurfacePathPoint = { x: number; y: number };\n\nfunction buildSurfaceSmoothPath(points: SurfacePathPoint[], smooth: boolean) {\n if (points.length < 2) {\n return \"\";\n }\n return d3Line<SurfacePathPoint>()\n .x((point) => point.x)\n .y((point) => point.y)\n .curve(points.length >= 3 && smooth ? curveCatmullRom.alpha(0.5) : curveLinear)(points) ?? \"\";\n}\n\nfunction splitSurfacePointRuns<T extends { hasValue: boolean; x: number; y: number }>(points: T[]) {\n const runs: SurfacePathPoint[][] = [];\n let currentRun: SurfacePathPoint[] = [];\n points.forEach((point) => {\n if (!point.hasValue) {\n if (currentRun.length >= 2) {\n runs.push(currentRun);\n }\n currentRun = [];\n return;\n }\n const nextPoint = { x: point.x, y: point.y };\n const previous = currentRun[currentRun.length - 1];\n if (!previous || Math.abs(previous.x - nextPoint.x) > 0.01 || Math.abs(previous.y - nextPoint.y) > 0.01) {\n currentRun.push(nextPoint);\n }\n });\n if (currentRun.length >= 2) {\n runs.push(currentRun);\n }\n return runs;\n}\n\ntype SurfaceContourSegment = {\n end: SurfacePathPoint;\n start: SurfacePathPoint;\n};\n\nfunction connectSurfaceContourSegments(segments: SurfaceContourSegment[]) {\n const remaining = [...segments];\n const epsilon = 0.75;\n const within = (left: SurfacePathPoint, right: SurfacePathPoint) => (\n Math.abs(left.x - right.x) <= epsilon && Math.abs(left.y - right.y) <= epsilon\n );\n const paths: SurfacePathPoint[][] = [];\n\n while (remaining.length > 0) {\n const seed = remaining.shift();\n if (!seed) {\n break;\n }\n const chain: SurfacePathPoint[] = [seed.start, seed.end];\n let changed = true;\n while (changed) {\n changed = false;\n for (let index = remaining.length - 1; index >= 0; index -= 1) {\n const candidate = remaining[index];\n if (!candidate) {\n continue;\n }\n if (within(chain[chain.length - 1] ?? candidate.start, candidate.start)) {\n chain.push(candidate.end);\n } else if (within(chain[chain.length - 1] ?? candidate.start, candidate.end)) {\n chain.push(candidate.start);\n } else if (within(chain[0] ?? candidate.start, candidate.end)) {\n chain.unshift(candidate.start);\n } else if (within(chain[0] ?? candidate.start, candidate.start)) {\n chain.unshift(candidate.end);\n } else {\n continue;\n }\n remaining.splice(index, 1);\n changed = true;\n }\n }\n const deduped = chain.filter((point, index) => {\n if (index === 0) {\n return true;\n }\n const previous = chain[index - 1];\n return !previous || !within(previous, point);\n });\n if (deduped.length >= 2) {\n paths.push(deduped);\n }\n }\n\n return paths;\n}\n\nfunction getSurfaceWireframePalette(chart: XlsxChart, palette: ChartRendererPalette) {\n const raw = chart.raw && typeof chart.raw === \"object\" ? chart.raw as Record<string, unknown> : null;\n const explicit = Array.isArray(raw?.bandFormatLineColors)\n ? raw.bandFormatLineColors.filter((color): color is string => typeof color === \"string\" && color.length > 0)\n : [];\n if (explicit.length > 0) {\n return explicit;\n }\n return getSurfaceColorStops(chart, palette);\n}\n\nfunction resolveSurfaceWireframeColor(chart: XlsxChart, palette: ChartRendererPalette, domain: SurfaceDomain, value: number) {\n const stops = getSurfaceWireframePalette(chart, palette);\n if (stops.length === 0) {\n return resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n }\n const bandIndex = resolveSurfaceBandIndex(domain, value);\n return stops[Math.min(stops.length - 1, Math.max(0, bandIndex))] ?? resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n}\n\nfunction resolveSurfacePlotRect(chart: XlsxChart, layout: ChartLayout) {\n if (!isContourSurfaceChart(chart)) {\n return layout.plot;\n }\n const columnCount = Math.max(1, getCategoryLabels(chart).length);\n const rowCount = Math.max(1, chart.series.length);\n const targetAspect = Math.max(0.72, columnCount / Math.max(1, rowCount));\n const widthScale = chart.wireframe ? 0.78 : 0.84;\n const heightScale = chart.wireframe ? 0.72 : 0.8;\n let width = layout.plot.width * widthScale;\n let height = layout.plot.height * heightScale;\n if (width / Math.max(1e-6, height) > targetAspect) {\n width = height * targetAspect;\n } else {\n height = width / Math.max(1e-6, targetAspect);\n }\n return {\n height,\n left: layout.plot.left + (layout.plot.width - width) / 2,\n top: layout.plot.top + (layout.plot.height - height) / 2,\n width\n };\n}\n\nfunction buildSurfaceLegendItems(chart: XlsxChart, palette: ChartRendererPalette) {\n const domain = getSurfaceDomain(chart);\n if (!domain) {\n return [];\n }\n const items: LegendItem[] = [];\n for (let index = 0; index < domain.ticks.length - 1; index += 1) {\n const start = domain.ticks[index] ?? domain.minValue;\n const end = domain.ticks[index + 1] ?? domain.safeMax;\n const midpoint = start + (end - start) * 0.5;\n const ratio = (midpoint - domain.minValue) / Math.max(1e-6, domain.safeMax - domain.minValue);\n items.push({\n color: resolveSurfaceColor(chart, palette, ratio),\n label: `${formatTickValue(start)}-${formatTickValue(end)}`\n });\n }\n return items.reverse();\n}\n\nfunction isContourSurfaceChart(chart: XlsxChart) {\n const rawChartType = chart.raw && typeof chart.raw === \"object\" && typeof (chart.raw as Record<string, unknown>).xmlChartType === \"string\"\n ? (chart.raw as Record<string, unknown>).xmlChartType\n : \"\";\n if (rawChartType === \"surfaceChart\") {\n return true;\n }\n if (rawChartType === \"surface3DChart\") {\n return false;\n }\n return chart.chartType === \"Surface\" && chart.is3d !== true;\n}\n\nfunction renderSurfaceAxes(chart: XlsxChart, layout: ChartLayout) {\n const plot = resolveSurfacePlotRect(chart, layout);\n const categories = getCategoryLabels(chart);\n const seriesLabels = chart.series.map((series, index) => normalizeCategoryLabel(series.name) || `Q${index + 1}`);\n const labelColor = resolveChartAxisTextColor(chart);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? \"#888888\";\n const rowCount = Math.max(1, seriesLabels.length);\n const columnCount = Math.max(1, categories.length);\n const columnPositions = categories.map((_, index) => (\n plot.left + (columnCount <= 1 ? plot.width / 2 : (index / (columnCount - 1)) * plot.width)\n ));\n const rowPositions = seriesLabels.map((_, index) => (\n plot.top + plot.height - (rowCount <= 1 ? plot.height / 2 : (index / (rowCount - 1)) * plot.height)\n ));\n\n return (\n <g>\n <rect\n fill=\"none\"\n height={plot.height}\n stroke={lightenColor(axisColor, 0.18)}\n strokeWidth={0.8}\n width={plot.width}\n x={plot.left}\n y={plot.top}\n />\n {categories.map((label, index) => (\n <text\n key={`surface-x-label-${index}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={columnPositions[index] ?? plot.left}\n y={plot.top + plot.height + 14}\n >\n {label}\n </text>\n ))}\n {seriesLabels.map((label, index) => (\n <text\n key={`surface-y-label-${index}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"start\"\n x={plot.left + plot.width + 8}\n y={(rowPositions[index] ?? plot.top) + 3}\n >\n {label}\n </text>\n ))}\n </g>\n );\n}\n\nfunction normalizeRendererHexColor(value: unknown) {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const normalized = trimmed.startsWith(\"#\") ? trimmed.slice(1) : trimmed;\n return /^[0-9a-f]{6}$/i.test(normalized) ? `#${normalized.toLowerCase()}` : null;\n}\n\nfunction resolveStockRoleIndices(chart: XlsxChart) {\n const roles = {\n close: indexByName(chart.series, /close|last|end/),\n high: indexByName(chart.series, /high|max|top/),\n low: indexByName(chart.series, /low|min|bottom/),\n open: indexByName(chart.series, /open|start/),\n volume: indexByName(chart.series, /volume|vol/)\n };\n const usedIndices = new Set<number>(Object.values(roles).filter((value): value is number => value != null));\n const remainingIndices = chart.series.map((_, index) => index).filter((index) => !usedIndices.has(index));\n const canonicalOrder = chart.series.length >= 4\n ? ([\"open\", \"high\", \"low\", \"close\"] as const)\n : ([\"high\", \"low\", \"close\"] as const);\n canonicalOrder.forEach((role) => {\n if (roles[role] == null) {\n const nextIndex = remainingIndices.shift();\n if (nextIndex != null) {\n roles[role] = nextIndex;\n }\n }\n });\n return roles;\n}\n\nfunction resolveStockPalette(chart: XlsxChart, axisColor: string) {\n const raw = chart.raw && typeof chart.raw === \"object\" ? chart.raw as Record<string, unknown> : null;\n const highLowLines = raw?.highLowLines && typeof raw.highLowLines === \"object\"\n ? raw.highLowLines as Record<string, unknown>\n : null;\n const shapeProperties = highLowLines?.shapeProperties && typeof highLowLines.shapeProperties === \"object\"\n ? highLowLines.shapeProperties as Record<string, unknown>\n : null;\n const lineColor = normalizeRendererHexColor(shapeProperties?.lineColorHex) ?? axisColor ?? \"#333333\";\n const chartStyleId = typeof chart.chartStyleId === \"number\" ? chart.chartStyleId : null;\n const closeAccent = chartStyleId != null && chartStyleId >= 128 ? \"#c0504d\" : lineColor;\n const lowAccent = chartStyleId != null && chartStyleId >= 128 ? \"#d9a3a0\" : lightenColor(lineColor, 0.45);\n return {\n closeAccent,\n downFill: lightenColor(lineColor, 0.4),\n lineColor,\n lowAccent,\n openAccent: lightenColor(lineColor, 0.22),\n upFill: \"#ffffff\",\n volumeFill: lightenColor(lineColor, 0.26)\n };\n}\n\nfunction buildStockLegendItems(chart: XlsxChart, palette: ChartRendererPalette): LegendItem[] {\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const roles = resolveStockRoleIndices(chart);\n const stockPalette = resolveStockPalette(chart, axisColor);\n return chart.series.map((series, index) => {\n let color = stockPalette.lineColor;\n if (roles.volume === index) {\n color = stockPalette.volumeFill;\n } else if (roles.open === index) {\n color = stockPalette.openAccent;\n } else if (roles.low === index) {\n color = stockPalette.lowAccent;\n } else if (roles.close === index) {\n color = stockPalette.closeAccent;\n }\n return {\n color,\n label: series.name ?? `Series ${index + 1}`\n };\n });\n}\n\nfunction getLegendItems(chart: XlsxChart, chartType: string, palette: ChartRendererPalette): LegendItem[] {\n if (!chart.legend) {\n return [];\n }\n if (isComboChart(chart)) {\n return getComboLegendSeries(chart);\n }\n if (chartType === \"Stock\") {\n return buildStockLegendItems(chart, palette);\n }\n if (chartType === \"Surface\") {\n return buildSurfaceLegendItems(chart, palette);\n }\n if (chartType === \"RegionMap\") {\n return buildRegionMapLegendItems(chart);\n }\n if (chartType === \"Sunburst\" || chartType === \"Treemap\") {\n const hierarchyData = buildHierarchyData(chart);\n if (!hierarchyData?.children) {\n return [];\n }\n return hierarchyData.children.map((child, index) => ({\n color: chartSeriesColor(chart, child.colorIndex ?? index),\n label: child.name\n }));\n }\n if (chartType === \"Pie\" || chartType === \"Pie3D\" || chartType === \"PieExploded\" || chartType === \"Doughnut\" || chartType === \"BarOfPie\") {\n if (chartType === \"BarOfPie\") {\n const categories = getCategoryLabels(chart);\n const values = chart.series[0]?.values ?? [];\n return categories\n .map((label, index) => ({\n color: chartPointColor(chart, index),\n label: normalizeCategoryLabel(label),\n value: safeNumber(values[index]) ?? 0\n }))\n .filter((entry) => entry.value > 0 && entry.label.trim().length > 0)\n .map((entry) => ({\n color: entry.color,\n label: entry.label\n }));\n }\n return buildPieEntries(chart).map((entry) => ({\n color: entry.color,\n label: entry.label\n }));\n }\n const isXyLegend = (\n chartType === \"Scatter\"\n || chartType === \"ScatterLines\"\n || chartType === \"ScatterSmooth\"\n || chartType === \"Bubble\"\n );\n return chart.series.map((series, index) => ({\n color: isXyLegend\n ? (series.lineColor ?? series.markerColor ?? series.color ?? chartSeriesColor(chart, index))\n : chartSeriesColor(chart, index),\n label: series.name ?? `Series ${index + 1}`\n }));\n}\n\nfunction buildLayout(chart: XlsxChart, rect: XlsxImageRect, legendItems: LegendItem[]): ChartLayout {\n const width = Math.max(80, Math.round(rect.width));\n const height = Math.max(60, Math.round(rect.height));\n const isSurfaceChart = chart.chartType === \"Surface\"\n || (chart.raw && typeof chart.raw === \"object\" && typeof (chart.raw as Record<string, unknown>).xmlChartType === \"string\" && String((chart.raw as Record<string, unknown>).xmlChartType).includes(\"surface\"));\n const titleHeight = chart.title ? (isSurfaceChart ? 30 : 24) : 8;\n const legendPosition = normalizeLegendPosition(chart.legend?.position);\n\n const legendVertical = legendItems.length > 0 && (legendPosition === \"right\" || legendPosition === \"left\");\n const legendHorizontal = legendItems.length > 0 && (legendPosition === \"top\" || legendPosition === \"bottom\");\n\n const plotLeft = 42 + (legendPosition === \"left\" ? 98 : 0);\n const plotRight = 16 + (legendPosition === \"right\" ? 98 : 0);\n const plotTop = titleHeight + (legendPosition === \"top\" ? 24 : 0);\n const plotBottom = 28 + (legendPosition === \"bottom\" ? 24 : 0);\n\n const plotWidth = Math.max(40, width - plotLeft - plotRight);\n const plotHeight = Math.max(40, height - plotTop - plotBottom);\n\n const compactWidth = width <= 280;\n const compactHeight = height <= 200;\n const finalLegendPosition = compactWidth || compactHeight\n ? (legendVertical ? \"bottom\" : legendPosition)\n : legendPosition;\n\n return {\n height,\n legendItems,\n legendPosition: finalLegendPosition,\n plot: {\n height: Math.max(40, height - plotTop - plotBottom),\n left: plotLeft,\n top: plotTop,\n width: Math.max(40, width - plotLeft - plotRight)\n },\n titleHeight,\n width\n };\n}\n\nfunction buildNiceStep(minValue: number, maxValue: number, preferredTicks = 5) {\n const span = Math.max(1e-6, maxValue - minValue);\n const roughStep = span / Math.max(1, preferredTicks);\n const magnitude = 10 ** Math.floor(Math.log10(roughStep));\n const normalized = roughStep / magnitude;\n const niceNormalized = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10;\n return niceNormalized * magnitude;\n}\n\nfunction buildNumericTickValues(minValue: number, maxValue: number, majorUnit?: number) {\n if (!Number.isFinite(minValue) || !Number.isFinite(maxValue) || maxValue <= minValue) {\n return [];\n }\n const step = typeof majorUnit === \"number\" && majorUnit > 0\n ? majorUnit\n : buildNiceStep(minValue, maxValue, 5);\n if (!Number.isFinite(step) || step <= 0) {\n return [];\n }\n const start = Math.floor(minValue / step) * step;\n const values: number[] = [];\n for (let current = start; current <= maxValue + step * 0.001; current += step) {\n if (current >= minValue - step * 0.001 && current <= maxValue + step * 0.001) {\n values.push(Number(current.toFixed(8)));\n }\n }\n return values;\n}\n\nfunction resolveNumericAxisDomain(minValue: number, maxValue: number, majorUnit?: number, includeZero = false) {\n if (!Number.isFinite(minValue) || !Number.isFinite(maxValue)) {\n return {\n max: 1,\n min: 0,\n ticks: [0, 1]\n };\n }\n let domainMin = includeZero ? Math.min(0, minValue) : minValue;\n let domainMax = includeZero ? Math.max(0, maxValue) : maxValue;\n if (domainMax <= domainMin) {\n domainMax = domainMin + 1;\n }\n const step = typeof majorUnit === \"number\" && majorUnit > 0\n ? majorUnit\n : buildNiceStep(domainMin, domainMax, 5);\n const roundedMin = typeof majorUnit === \"number\" && majorUnit > 0\n ? domainMin\n : Math.floor(domainMin / step) * step;\n const roundedMax = typeof majorUnit === \"number\" && majorUnit > 0\n ? domainMax\n : Math.ceil(domainMax / step) * step;\n const finalMin = includeZero ? Math.min(0, roundedMin) : roundedMin;\n const finalMax = roundedMax <= finalMin ? finalMin + step : roundedMax;\n const ticks = buildNumericTickValues(finalMin, finalMax, step);\n return {\n max: finalMax,\n min: finalMin,\n ticks: ticks.length > 0 ? ticks : [finalMin, finalMax]\n };\n}\n\nfunction resolveAxisDomainWithChartOverrides(\n axis: XlsxChartAxis | null | undefined,\n minValue: number,\n maxValue: number,\n includeZero = false\n) {\n const hasExplicitMin = typeof axis?.min === \"number\" && Number.isFinite(axis.min);\n const hasExplicitMax = typeof axis?.max === \"number\" && Number.isFinite(axis.max);\n const rawMin = hasExplicitMin ? Number(axis?.min) : minValue;\n const rawMax = hasExplicitMax ? Number(axis?.max) : maxValue;\n const domain = resolveNumericAxisDomain(rawMin, rawMax, axis?.majorUnit, includeZero);\n return {\n hasExplicitMax,\n hasExplicitMin,\n majorUnit: axis?.majorUnit,\n max: hasExplicitMax ? Number(axis?.max) : domain.max,\n min: hasExplicitMin ? Number(axis?.min) : domain.min,\n ticks: (hasExplicitMin || hasExplicitMax)\n ? buildNumericTickValues(\n hasExplicitMin ? Number(axis?.min) : domain.min,\n hasExplicitMax ? Number(axis?.max) : domain.max,\n axis?.majorUnit\n )\n : domain.ticks\n };\n}\n\nfunction resolve3dFrameOffsets(chart: XlsxChart, baseDepthX = 11, baseDepthY = 8) {\n const depthRatio = clamp((chart.view3d?.depthPercent ?? 100) / 100, 0.35, 3.2);\n const rotX = clamp(chart.view3d?.rotX ?? 20, -80, 80);\n const rotY = clamp(chart.view3d?.rotY ?? 20, -80, 80);\n const usePerspective = chart.view3d?.rAngAx === false;\n const perspectiveStrength = clamp((chart.view3d?.perspective ?? (usePerspective ? 26 : 0)) / 100, 0, 1);\n const projectedOrigin = projectCartesian3dPoint(\n 0,\n 0,\n 0,\n rotX * (Math.PI / 180),\n rotY * (Math.PI / 180),\n usePerspective,\n perspectiveStrength\n );\n const projectedDepthPoint = projectCartesian3dPoint(\n 0,\n 0,\n 1,\n rotX * (Math.PI / 180),\n rotY * (Math.PI / 180),\n usePerspective,\n perspectiveStrength\n );\n const depthDirectionX = projectedDepthPoint.x - projectedOrigin.x;\n const depthDirectionY = projectedDepthPoint.y - projectedOrigin.y;\n const horizontalBias = clamp(1.42 + Math.abs(rotY) / 48 + depthRatio * 0.06, 1.5, 1.95);\n const verticalBias = clamp(1.18 + Math.abs(rotX) / 78, 1.22, 1.5);\n const biasedDepthDirectionX = depthDirectionX * horizontalBias;\n const biasedDepthDirectionY = depthDirectionY * verticalBias;\n const depthDirectionMagnitude = Math.hypot(biasedDepthDirectionX, biasedDepthDirectionY) || 1;\n const horizontalFactor = clamp(Math.abs(rotY) / 22, 0.55, 2.2);\n const verticalFactor = clamp(Math.abs(rotX) / 18, 0.45, 1.9);\n const legacyDepthX = Math.max(6, baseDepthX * depthRatio * horizontalFactor) * (rotY < 0 ? -1 : 1);\n const legacyDepthY = -Math.max(4, baseDepthY * depthRatio * verticalFactor);\n const depthMagnitude = Math.max(10, Math.hypot(legacyDepthX, legacyDepthY) * 1.34);\n const depthX = biasedDepthDirectionX / depthDirectionMagnitude * depthMagnitude;\n const depthY = biasedDepthDirectionY / depthDirectionMagnitude * depthMagnitude;\n return {\n depthRatio,\n depthX,\n depthY,\n insetBottom: Math.max(6, Math.abs(depthY) + 5),\n insetLeft: depthX < 0 ? Math.abs(depthX) + 4 : 0,\n insetRight: depthX > 0 ? depthX + 4 : 0,\n insetTop: Math.max(4, Math.abs(depthY) + 2)\n };\n}\n\nfunction formatTickValue(value: number) {\n if (Math.abs(value) >= 1000) {\n return value.toLocaleString(undefined, { maximumFractionDigits: 0 });\n }\n return value.toLocaleString(undefined, { maximumFractionDigits: 2 });\n}\n\nfunction formatPercentTickValue(value: number) {\n return `${formatTickValue(value)}%`;\n}\n\nfunction isLikelyDateFormatCode(formatCode: string | undefined) {\n if (!formatCode) {\n return false;\n }\n const normalized = formatCode\n .toLowerCase()\n .replace(/\\[[^\\]]*]/g, \" \")\n .replace(/\"[^\"]*\"/g, \" \")\n .replace(/\\\\./g, \" \");\n return /(?:d|m|y)/.test(normalized);\n}\n\nfunction excelSerialToDate(serial: number, use1904: boolean) {\n const wholeDays = Math.trunc(serial);\n const milliseconds = Math.round((serial - wholeDays) * 86_400_000);\n const baseUtc = use1904\n ? Date.UTC(1904, 0, 1)\n : Date.UTC(1899, 11, 30);\n return new Date(baseUtc + wholeDays * 86_400_000 + milliseconds);\n}\n\nfunction formatExcelDateSerial(value: number, formatCode: string | undefined, use1904: boolean) {\n const date = excelSerialToDate(value, use1904);\n const normalized = (formatCode ?? \"\").toLowerCase();\n const options: Intl.DateTimeFormatOptions = {};\n\n if (/yyyy/.test(normalized)) {\n options.year = \"numeric\";\n } else if (/yy/.test(normalized)) {\n options.year = \"2-digit\";\n }\n\n if (/mmmm/.test(normalized)) {\n options.month = \"long\";\n } else if (/mmm/.test(normalized)) {\n options.month = \"short\";\n } else if (/(^|[^a-z])m([^a-z]|$)|(^|[^a-z])mm([^a-z]|$)/.test(normalized)) {\n options.month = \"numeric\";\n }\n\n if (/dddd/.test(normalized)) {\n options.weekday = \"long\";\n } else if (/ddd/.test(normalized)) {\n options.weekday = \"short\";\n }\n\n if (/d/.test(normalized)) {\n options.day = \"numeric\";\n }\n\n if (Object.keys(options).length === 0) {\n options.month = \"short\";\n options.day = \"numeric\";\n }\n\n return new Intl.DateTimeFormat(undefined, options).format(date);\n}\n\nfunction formatCategoryLabel(chart: XlsxChart, value: unknown, fallback = \"\") {\n const rawRecord = chart.raw && typeof chart.raw === \"object\"\n ? chart.raw as Record<string, unknown>\n : null;\n const numeric = safeNumber(value);\n const formatCode = chart.categoryAxis?.numberFormat?.formatCode;\n if (numeric != null && isLikelyDateFormatCode(formatCode)) {\n return formatExcelDateSerial(numeric, formatCode, rawRecord?.date1904 === true);\n }\n\n const normalized = normalizeCategoryLabel(value);\n if (normalized.length > 0) {\n return normalized;\n }\n return fallback;\n}\n\nfunction truncateSvgText(value: string, maxWidth: number, fontSize = 10) {\n if (!value || maxWidth <= 0) {\n return \"\";\n }\n const charWidth = Math.max(4.2, fontSize * 0.56);\n const maxChars = Math.max(1, Math.floor(maxWidth / charWidth));\n if (value.length <= maxChars) {\n return value;\n }\n if (maxChars <= 1) {\n return \"…\";\n }\n return `${value.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;\n}\n\nfunction markerSymbolPath(symbol: string, size: number) {\n if (symbol === \"none\") {\n return \"\";\n }\n const symbolType = (() => {\n switch (symbol) {\n case \"diamond\":\n return symbolDiamond;\n case \"square\":\n return symbolSquare;\n case \"triangle\":\n case \"triangle-up\":\n return symbolTriangle;\n case \"cross\":\n case \"plus\":\n return symbolCross;\n case \"star\":\n return symbolStar;\n case \"circle\":\n default:\n return symbolCircle;\n }\n })();\n return d3Symbol().type(symbolType).size(size * size * Math.PI)() ?? \"\";\n}\n\nconst TWO_PI = Math.PI * 2;\n\nfunction normalizePieArc(startAngle: number, endAngle: number) {\n let start = startAngle;\n let end = endAngle;\n while (end < start) {\n end += TWO_PI;\n }\n return { end, start };\n}\n\nfunction resolvePieFrontSegments(startAngle: number, endAngle: number): Array<[number, number]> {\n const { start, end } = normalizePieArc(startAngle, endAngle);\n const segments: Array<[number, number]> = [];\n const minBand = Math.floor(start / TWO_PI) - 1;\n const maxBand = Math.ceil(end / TWO_PI) + 1;\n for (let band = minBand; band <= maxBand; band += 1) {\n const frontStart = Math.PI / 2 + band * TWO_PI;\n const frontEnd = Math.PI * 1.5 + band * TWO_PI;\n const segmentStart = Math.max(start, frontStart);\n const segmentEnd = Math.min(end, frontEnd);\n if (segmentEnd - segmentStart > 1e-4) {\n segments.push([segmentStart, segmentEnd]);\n }\n }\n return segments;\n}\n\nfunction pieEllipsePoint(\n centerX: number,\n centerY: number,\n radius: number,\n tilt: number,\n angle: number,\n depth = 0\n) {\n return {\n x: centerX + Math.sin(angle) * radius,\n y: centerY - Math.cos(angle) * radius * tilt + depth\n };\n}\n\nfunction toSvgNumber(value: number) {\n return Number(value.toFixed(3));\n}\n\nfunction buildPieOuterWallPath(\n centerX: number,\n centerY: number,\n radius: number,\n tilt: number,\n depth: number,\n startAngle: number,\n endAngle: number,\n fullArc = false\n) {\n const ry = radius * tilt;\n const segments = fullArc ? [[startAngle, endAngle] as [number, number]] : resolvePieFrontSegments(startAngle, endAngle);\n return segments.map(([segmentStart, segmentEnd]) => {\n const topStart = pieEllipsePoint(centerX, centerY, radius, tilt, segmentStart, 0);\n const topEnd = pieEllipsePoint(centerX, centerY, radius, tilt, segmentEnd, 0);\n const bottomStart = pieEllipsePoint(centerX, centerY, radius, tilt, segmentStart, depth);\n const bottomEnd = pieEllipsePoint(centerX, centerY, radius, tilt, segmentEnd, depth);\n const largeArc = segmentEnd - segmentStart > Math.PI ? 1 : 0;\n return [\n `M ${toSvgNumber(topStart.x)} ${toSvgNumber(topStart.y)}`,\n `A ${toSvgNumber(radius)} ${toSvgNumber(ry)} 0 ${largeArc} 1 ${toSvgNumber(topEnd.x)} ${toSvgNumber(topEnd.y)}`,\n `L ${toSvgNumber(bottomEnd.x)} ${toSvgNumber(bottomEnd.y)}`,\n `A ${toSvgNumber(radius)} ${toSvgNumber(ry)} 0 ${largeArc} 0 ${toSvgNumber(bottomStart.x)} ${toSvgNumber(bottomStart.y)}`,\n \"Z\"\n ].join(\" \");\n });\n}\n\nfunction isPieFrontFacingAngle(angle: number) {\n const normalized = ((angle % TWO_PI) + TWO_PI) % TWO_PI;\n return normalized > Math.PI / 2 && normalized < Math.PI * 1.5;\n}\n\nfunction buildPieRadialWallPath(\n centerX: number,\n centerY: number,\n radius: number,\n tilt: number,\n depth: number,\n angle: number,\n forceVisible = false\n) {\n if (!forceVisible && !isPieFrontFacingAngle(angle)) {\n return null;\n }\n const topCenter = { x: centerX, y: centerY };\n const bottomCenter = { x: centerX, y: centerY + depth };\n const topEdge = pieEllipsePoint(centerX, centerY, radius, tilt, angle, 0);\n const bottomEdge = pieEllipsePoint(centerX, centerY, radius, tilt, angle, depth);\n return [\n `M ${toSvgNumber(topCenter.x)} ${toSvgNumber(topCenter.y)}`,\n `L ${toSvgNumber(topEdge.x)} ${toSvgNumber(topEdge.y)}`,\n `L ${toSvgNumber(bottomEdge.x)} ${toSvgNumber(bottomEdge.y)}`,\n `L ${toSvgNumber(bottomCenter.x)} ${toSvgNumber(bottomCenter.y)}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction renderTitle(chart: XlsxChart, layout: ChartLayout, palette: ChartRendererPalette) {\n if (!chart.title) {\n return null;\n }\n const fontSize = 12;\n const text = truncateSvgText(chart.title, Math.max(40, layout.width - 12), fontSize);\n const baselineY = layout.titleHeight >= 30 ? 19 : 16;\n return (\n <text\n fill={chart.titleColor ?? chart.textColor ?? DEFAULT_CHART_TEXT_COLOR}\n fontFamily={buildChartFontFamily(chart.titleFontFamily ?? chart.fontFamily)}\n fontSize={fontSize}\n fontWeight={600}\n textAnchor=\"middle\"\n x={layout.width / 2}\n y={baselineY}\n >\n {text}\n </text>\n );\n}\n\nfunction renderLegend(chart: XlsxChart, layout: ChartLayout, palette: ChartRendererPalette) {\n if (!chart.legend || layout.legendItems.length === 0) {\n return null;\n }\n const textColor = resolveChartAxisTextColor(chart);\n const legendPos = layout.legendPosition;\n const items = layout.legendItems;\n const swatchSize = 8;\n const textOffset = swatchSize + 4;\n\n if (legendPos === \"left\" || legendPos === \"right\") {\n const x = legendPos === \"right\"\n ? layout.plot.left + layout.plot.width + 8\n : 8;\n const startY = layout.plot.top + 6;\n return (\n <g>\n {items.map((item, index) => {\n const y = startY + index * 18;\n return (\n <g key={`legend-${index}`} transform={`translate(${x}, ${y})`}>\n <rect fill={item.color} height={swatchSize} rx={1.2} ry={1.2} width={swatchSize} x={0} y={-7} />\n <text fill={textColor} fontSize={10} x={textOffset} y={0}>\n {item.label}\n </text>\n </g>\n );\n })}\n </g>\n );\n }\n\n const rowY = legendPos === \"top\" ? (layout.titleHeight + 12) : (layout.height - 8);\n const totalWidth = items.reduce((sum, item) => sum + 24 + Math.min(96, item.label.length * 5.4), 0);\n let cursorX = Math.max(8, (layout.width - totalWidth) / 2);\n return (\n <g>\n {items.map((item, index) => {\n const labelWidth = Math.min(96, item.label.length * 5.4);\n const node = (\n <g key={`legend-${index}`} transform={`translate(${cursorX}, ${rowY})`}>\n <rect fill={item.color} height={swatchSize} rx={1.2} ry={1.2} width={swatchSize} x={0} y={-7} />\n <text fill={textColor} fontSize={10} x={textOffset} y={0}>\n {item.label}\n </text>\n </g>\n );\n cursorX += 24 + labelWidth;\n return node;\n })}\n </g>\n );\n}\n\nfunction renderCartesianAxes(\n chart: XlsxChart,\n palette: ChartRendererPalette,\n plot: PlotRect,\n isHorizontal: boolean,\n categoryLabels: string[],\n categoryPositions: number[],\n valueTicks: number[],\n mapValue: (value: number) => number,\n formatValueTick: (value: number) => string = formatTickValue\n) {\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n const zeroPosition = mapValue(0);\n\n return (\n <g>\n {valueTicks.map((tick) => {\n const valuePosition = mapValue(tick);\n if (isHorizontal) {\n return (\n <g key={`grid-v-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.7)}\n strokeWidth={1}\n x1={valuePosition}\n x2={valuePosition}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={valuePosition}\n y={plot.top + plot.height + 14}\n >\n {formatValueTick(tick)}\n </text>\n </g>\n );\n }\n return (\n <g key={`grid-h-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.7)}\n strokeWidth={1}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={valuePosition}\n y2={valuePosition}\n />\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"end\"\n x={plot.left - 6}\n y={valuePosition + 3}\n >\n {formatValueTick(tick)}\n </text>\n </g>\n );\n })}\n {categoryPositions.map((position, index) => {\n const label = categoryLabels[index] ?? \"\";\n if (isHorizontal) {\n return (\n <text\n key={`cat-y-${index}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"end\"\n x={plot.left - 6}\n y={position + 3}\n >\n {label}\n </text>\n );\n }\n return (\n <text\n key={`cat-x-${index}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={position}\n y={plot.top + plot.height + 14}\n >\n {label}\n </text>\n );\n })}\n {isHorizontal ? (\n <>\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={plot.top + plot.height}\n y2={plot.top + plot.height}\n />\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={zeroPosition}\n x2={zeroPosition}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n </>\n ) : (\n <>\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={plot.left}\n x2={plot.left}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={zeroPosition}\n y2={zeroPosition}\n />\n </>\n )}\n </g>\n );\n}\n\nfunction scaleProjectedVector(vector: { x: number; y: number }, scale: number) {\n return {\n x: vector.x * scale,\n y: vector.y * scale\n };\n}\n\nfunction sampleProjectedEllipseArc(\n center: { x: number; y: number },\n axisA: { x: number; y: number },\n axisB: { x: number; y: number },\n startAngle: number,\n endAngle: number\n) {\n const steps = Math.max(12, Math.ceil(Math.abs(endAngle - startAngle) / (Math.PI / 14)));\n const points: Array<{ x: number; y: number }> = [];\n for (let step = 0; step <= steps; step += 1) {\n const ratio = step / steps;\n const angle = startAngle + ((endAngle - startAngle) * ratio);\n points.push({\n x: center.x + (axisA.x * Math.cos(angle)) + (axisB.x * Math.sin(angle)),\n y: center.y + (axisA.y * Math.cos(angle)) + (axisB.y * Math.sin(angle))\n });\n }\n return points;\n}\n\nfunction buildRibbonSvgPath(startArc: Array<{ x: number; y: number }>, endArc: Array<{ x: number; y: number }>) {\n if (startArc.length === 0 || endArc.length === 0) {\n return \"\";\n }\n return buildLinearSvgPath([...startArc, ...endArc.slice().reverse()], true);\n}\n\nfunction renderRadialFrustum(\n bar: BarRect,\n normalizedShape: \"cone\" | \"cylinder\",\n frontFill: string,\n sideFill: string,\n topFill: string\n) {\n const depthX = bar.depthX ?? (bar.isHorizontal ? 10 : 9);\n const depthY = bar.depthY ?? -7;\n const frontX = bar.left + (bar.depthOffsetX ?? 0);\n const frontY = bar.top + (bar.depthOffsetY ?? 0);\n const frontW = bar.width;\n const frontH = bar.height;\n const centerX = frontX + frontW / 2;\n const centerY = frontY + frontH / 2;\n const showStartCap = bar.capStart !== false;\n const showEndCap = bar.capEnd !== false;\n const startScale = normalizedShape === \"cone\" ? clamp(bar.bottomScale ?? 1, 0, 1) : 1;\n const endScale = normalizedShape === \"cone\" ? clamp(bar.topScale ?? 1, 0, 1) : 1;\n const radialDepthScale = normalizedShape === \"cylinder\"\n ? (bar.isHorizontal ? 0.52 : 0.48)\n : (bar.isHorizontal ? 0.7 : 0.58);\n const depthAxis = scaleProjectedVector({ x: depthX / 2, y: depthY / 2 }, radialDepthScale);\n const secondaryStrokeWidth = Math.max(0.6, bar.strokeWidth * 0.65);\n\n if (bar.isHorizontal) {\n const startCenter = { x: frontX + depthAxis.x, y: centerY + depthAxis.y };\n const endCenter = { x: frontX + frontW + depthAxis.x, y: centerY + depthAxis.y };\n const startAxisA = { x: 0, y: (frontH * startScale) / 2 };\n const endAxisA = { x: 0, y: (frontH * endScale) / 2 };\n const startAxisB = scaleProjectedVector(depthAxis, startScale);\n const endAxisB = scaleProjectedVector(depthAxis, endScale);\n const backStartArc = sampleProjectedEllipseArc(startCenter, startAxisA, startAxisB, 0, Math.PI);\n const backEndArc = sampleProjectedEllipseArc(endCenter, endAxisA, endAxisB, 0, Math.PI);\n const frontStartArc = sampleProjectedEllipseArc(startCenter, startAxisA, startAxisB, Math.PI, Math.PI * 2);\n const frontEndArc = sampleProjectedEllipseArc(endCenter, endAxisA, endAxisB, Math.PI, Math.PI * 2);\n const backWallPath = buildRibbonSvgPath(backEndArc, backStartArc);\n const frontWallPath = buildRibbonSvgPath(frontEndArc, frontStartArc);\n const endCapPath = endScale > 0.018\n ? buildLinearSvgPath(sampleProjectedEllipseArc(endCenter, endAxisA, endAxisB, 0, Math.PI * 2), true)\n : \"\";\n const startCapPath = startScale > 0.028\n ? buildLinearSvgPath(sampleProjectedEllipseArc(startCenter, startAxisA, startAxisB, 0, Math.PI * 2), true)\n : \"\";\n return (\n <g key={`${bar.key}-3d-horizontal-${normalizedShape}`}>\n {backWallPath ? <path d={backWallPath} fill={sideFill} stroke={bar.stroke} strokeWidth={secondaryStrokeWidth} /> : null}\n {showEndCap && endCapPath ? <path d={endCapPath} fill={topFill} stroke={bar.stroke} strokeWidth={secondaryStrokeWidth} /> : null}\n {frontWallPath ? <path d={frontWallPath} fill={frontFill} stroke={bar.stroke} strokeWidth={bar.strokeWidth} /> : null}\n {showStartCap && startCapPath ? <path d={startCapPath} fill={frontFill} stroke={bar.stroke} strokeWidth={secondaryStrokeWidth} /> : null}\n </g>\n );\n }\n\n const startCenter = { x: centerX + depthAxis.x, y: frontY + frontH + depthAxis.y };\n const endCenter = { x: centerX + depthAxis.x, y: frontY + depthAxis.y };\n const startAxisA = { x: (frontW * startScale) / 2, y: 0 };\n const endAxisA = { x: (frontW * endScale) / 2, y: 0 };\n const startAxisB = scaleProjectedVector(depthAxis, startScale);\n const endAxisB = scaleProjectedVector(depthAxis, endScale);\n const backStartArc = sampleProjectedEllipseArc(startCenter, startAxisA, startAxisB, 0, Math.PI);\n const backEndArc = sampleProjectedEllipseArc(endCenter, endAxisA, endAxisB, 0, Math.PI);\n const frontStartArc = sampleProjectedEllipseArc(startCenter, startAxisA, startAxisB, Math.PI, Math.PI * 2);\n const frontEndArc = sampleProjectedEllipseArc(endCenter, endAxisA, endAxisB, Math.PI, Math.PI * 2);\n const backWallPath = buildRibbonSvgPath(backEndArc, backStartArc);\n const frontWallPath = buildRibbonSvgPath(frontEndArc, frontStartArc);\n const endCapPath = endScale > 0.018\n ? buildLinearSvgPath(sampleProjectedEllipseArc(endCenter, endAxisA, endAxisB, 0, Math.PI * 2), true)\n : \"\";\n return (\n <g key={`${bar.key}-3d-${normalizedShape}`}>\n {backWallPath ? <path d={backWallPath} fill={sideFill} stroke={bar.stroke} strokeWidth={secondaryStrokeWidth} /> : null}\n {showEndCap && endCapPath ? <path d={endCapPath} fill={topFill} stroke={bar.stroke} strokeWidth={secondaryStrokeWidth} /> : null}\n {frontWallPath ? <path d={frontWallPath} fill={frontFill} stroke={bar.stroke} strokeWidth={bar.strokeWidth} /> : null}\n </g>\n );\n}\n\nfunction renderExtrudedRect(bar: BarRect) {\n const normalizedShape = (() => {\n switch (bar.shape3d) {\n case \"cone\":\n case \"coneToMax\":\n return \"cone\";\n case \"cylinder\":\n return \"cylinder\";\n case \"pyramid\":\n case \"pyramidToMax\":\n return \"pyramid\";\n default:\n return \"box\";\n }\n })();\n const depthX = bar.depthX ?? (bar.isHorizontal ? 10 : 9);\n const depthY = bar.depthY ?? -7;\n const frontX = bar.left + (bar.depthOffsetX ?? 0);\n const frontY = bar.top + (bar.depthOffsetY ?? 0);\n const frontW = bar.width;\n const frontH = bar.height;\n const frontX2 = frontX + frontW;\n const frontY2 = frontY + frontH;\n\n const sideAnchorX = frontX2;\n const sideDepthX = depthX;\n const centerX = frontX + frontW / 2;\n const bottomScale = clamp(bar.bottomScale ?? 1, 0.04, 1);\n const topScale = clamp(bar.topScale ?? 1, 0.04, 1);\n const bottomHalfWidth = (frontW * bottomScale) / 2;\n const topHalfWidth = (frontW * topScale) / 2;\n const bottomLeft = centerX - bottomHalfWidth;\n const bottomRight = centerX + bottomHalfWidth;\n const topLeft = centerX - topHalfWidth;\n const topRight = centerX + topHalfWidth;\n const showStartCap = bar.capStart !== false;\n const showEndCap = bar.capEnd !== false;\n\n const topFace = `${frontX},${frontY} ${frontX2},${frontY} ${frontX2 + sideDepthX},${frontY + depthY} ${frontX + sideDepthX},${frontY + depthY}`;\n const sideFace = `${sideAnchorX},${frontY} ${sideAnchorX},${frontY2} ${sideAnchorX + sideDepthX},${frontY2 + depthY} ${sideAnchorX + sideDepthX},${frontY + depthY}`;\n const frontFill = bar.gradientId ? `url(#${bar.gradientId})` : bar.color;\n const sideFill = bar.invertedNegative ? bar.color : darkenColor(bar.color, 0.22);\n const topFill = bar.invertedNegative ? lightenColor(bar.color, 0.04) : lightenColor(bar.color, 0.24);\n\n if (normalizedShape === \"cylinder\" || normalizedShape === \"cone\") {\n return renderRadialFrustum(bar, normalizedShape, frontFill, sideFill, topFill);\n }\n\n if (normalizedShape === \"box\") {\n return (\n <g key={`${bar.key}-3d`}>\n <polygon fill={sideFill} points={sideFace} stroke={bar.stroke} strokeWidth={Math.max(0.6, bar.strokeWidth * 0.65)} />\n <polygon fill={topFill} points={topFace} stroke={bar.stroke} strokeWidth={Math.max(0.6, bar.strokeWidth * 0.65)} />\n <rect fill={frontFill} height={frontH} stroke={bar.stroke} strokeWidth={bar.strokeWidth} width={frontW} x={frontX} y={frontY} />\n </g>\n );\n }\n\n if (bar.isHorizontal) {\n const centerY = frontY + frontH / 2;\n const startHalfHeight = (frontH * clamp(bar.bottomScale ?? 1, 0.04, 1)) / 2;\n const endHalfHeight = (frontH * clamp(bar.topScale ?? 1, 0.04, 1)) / 2;\n const startTop = centerY - startHalfHeight;\n const startBottom = centerY + startHalfHeight;\n const endTop = centerY - endHalfHeight;\n const endBottom = centerY + endHalfHeight;\n const topFacePoints = `${frontX},${startTop} ${frontX2},${endTop} ${frontX2 + sideDepthX},${endTop + depthY} ${frontX + sideDepthX},${startTop + depthY}`;\n const farSidePoints = `${frontX2},${endTop} ${frontX2},${endBottom} ${frontX2 + sideDepthX},${endBottom + depthY} ${frontX2 + sideDepthX},${endTop + depthY}`;\n\n const taperedFarFace = `${frontX2},${endTop} ${frontX2 + sideDepthX},${endTop + depthY} ${frontX2 + sideDepthX},${endBottom + depthY} ${frontX2},${endBottom}`;\n const frontPolygon = `${frontX},${startTop} ${frontX2},${endTop} ${frontX2},${endBottom} ${frontX},${startBottom}`;\n\n return (\n <g key={`${bar.key}-3d-horizontal-${normalizedShape}`}>\n <polygon fill={sideFill} points={taperedFarFace} stroke={bar.stroke} strokeWidth={Math.max(0.6, bar.strokeWidth * 0.65)} />\n <polygon fill={topFill} points={topFacePoints} stroke={bar.stroke} strokeWidth={Math.max(0.6, bar.strokeWidth * 0.65)} />\n <polygon fill={frontFill} points={frontPolygon} stroke={bar.stroke} strokeWidth={bar.strokeWidth} />\n </g>\n );\n }\n\n const taperedTopFace = `${topLeft},${frontY} ${topRight},${frontY} ${topRight + sideDepthX},${frontY + depthY} ${topLeft + sideDepthX},${frontY + depthY}`;\n const taperedSideFace = `${topRight},${frontY} ${bottomRight},${frontY2} ${bottomRight + sideDepthX},${frontY2 + depthY} ${topRight + sideDepthX},${frontY + depthY}`;\n const pyramidFrontFace = `${topLeft},${frontY} ${topRight},${frontY} ${bottomRight},${frontY2} ${bottomLeft},${frontY2}`;\n\n return (\n <g key={`${bar.key}-3d-${normalizedShape}`}>\n <polygon fill={sideFill} points={taperedSideFace} stroke={bar.stroke} strokeWidth={Math.max(0.6, bar.strokeWidth * 0.65)} />\n {showEndCap ? (\n <polygon fill={topFill} points={taperedTopFace} stroke={bar.stroke} strokeWidth={Math.max(0.6, bar.strokeWidth * 0.65)} />\n ) : null}\n <polygon fill={frontFill} points={pyramidFrontFace} stroke={bar.stroke} strokeWidth={bar.strokeWidth} />\n </g>\n );\n}\n\nfunction buildLinearSvgPath(points: Array<{ x: number; y: number }>, close = false) {\n if (points.length === 0) {\n return \"\";\n }\n const commands = points.map((point, index) => (\n `${index === 0 ? \"M\" : \"L\"} ${toSvgNumber(point.x)} ${toSvgNumber(point.y)}`\n ));\n if (close) {\n commands.push(\"Z\");\n }\n return commands.join(\" \");\n}\n\nfunction projectCartesian3dPoint(\n x: number,\n y: number,\n z: number,\n rotXRad: number,\n rotYRad: number,\n usePerspective: boolean,\n perspectiveStrength: number\n) {\n const cosX = Math.cos(rotXRad);\n const sinX = Math.sin(rotXRad);\n const cosY = Math.cos(rotYRad);\n const sinY = Math.sin(rotYRad);\n\n const x1 = x * cosY + z * sinY;\n const z1 = -x * sinY + z * cosY;\n const y1 = y * cosX - z1 * sinX;\n const z2 = y * sinX + z1 * cosX;\n const perspective = usePerspective\n ? 1 / Math.max(0.22, 1 + z2 * (0.26 + perspectiveStrength * 0.54))\n : 1;\n\n return {\n depth: z2,\n x: x1 * perspective,\n y: y1 * perspective\n };\n}\n\nfunction renderLineOrAreaChart3d(\n chart: XlsxChart,\n palette: ChartRendererPalette,\n layout: ChartLayout,\n categories: string[],\n stackedPointsBySeries: Array<Array<{ defined: boolean; y: number | null; y0: number | null; y1: number | null }>>,\n minValue: number,\n maxValue: number,\n isAreaChart: boolean,\n isStackedSeries: boolean\n) {\n const plot = layout.plot;\n const valueDomain = resolveAxisDomainWithChartOverrides(\n chart.valueAxis,\n minValue,\n maxValue,\n isAreaChart || chart.valueAxis?.crosses === \"autoZero\"\n );\n minValue = valueDomain.min;\n maxValue = valueDomain.max;\n const valueSpan = Math.max(1e-6, maxValue - minValue);\n const seriesCount = Math.max(1, chart.series.length);\n const categoryCount = Math.max(1, categories.length);\n const depthScale = clamp((chart.view3d?.depthPercent ?? 100) / 100, 0.5, 4);\n const halfDepth = (seriesCount <= 1 ? 0.82 : 1.02) * depthScale;\n const frontZ = halfDepth;\n const backZ = -halfDepth;\n const baseValue = isAreaChart ? Math.max(minValue, Math.min(maxValue, 0)) : minValue;\n const rotXRad = clamp(chart.view3d?.rotX ?? 18, -80, 80) * (Math.PI / 180);\n const rotYRad = clamp(chart.view3d?.rotY ?? 24, -80, 80) * (Math.PI / 180);\n const usePerspective = chart.view3d?.rAngAx === false;\n const perspectiveStrength = clamp((chart.view3d?.perspective ?? (usePerspective ? 26 : 0)) / 100, 0, 1);\n\n const normalizeX = (categoryIndex: number) => (\n categoryCount <= 1 ? 0 : ((categoryIndex / (categoryCount - 1)) - 0.5) * 2\n );\n const normalizeY = (value: number) => (\n -((((value - minValue) / valueSpan) - 0.5) * 2)\n );\n const stackedAreaDepthSpan = isAreaChart && isStackedSeries\n ? Math.max(0.18, (frontZ - backZ) * 0.56)\n : 0;\n const stackedAreaBackZ = frontZ - stackedAreaDepthSpan;\n const normalizeZ = (seriesIndex: number) => (\n seriesCount <= 1 || (isAreaChart && isStackedSeries)\n ? frontZ * 0.94\n : (((seriesIndex / (seriesCount - 1)) - 0.5) * (frontZ - backZ))\n );\n const projectSeriesPoint = (x: number, value: number, z: number) => projectCartesian3dPoint(\n x,\n normalizeY(value),\n z,\n rotXRad,\n rotYRad,\n usePerspective,\n perspectiveStrength\n );\n\n const cubeCorners = [\n { x: -1, y: -1, z: backZ },\n { x: 1, y: -1, z: backZ },\n { x: 1, y: 1, z: backZ },\n { x: -1, y: 1, z: backZ },\n { x: -1, y: -1, z: frontZ },\n { x: 1, y: -1, z: frontZ },\n { x: 1, y: 1, z: frontZ },\n { x: -1, y: 1, z: frontZ }\n ].map((corner) => projectCartesian3dPoint(\n corner.x,\n corner.y,\n corner.z,\n rotXRad,\n rotYRad,\n usePerspective,\n perspectiveStrength\n ));\n\n const projectedSeries = stackedPointsBySeries.map((seriesPoints, seriesIndex) => {\n const z = normalizeZ(seriesIndex);\n return seriesPoints.map((point, categoryIndex) => {\n const x = normalizeX(categoryIndex);\n const topValue = isStackedSeries ? (point.y1 ?? point.y ?? baseValue) : (point.y ?? baseValue);\n const bottomValue = isAreaChart\n ? (isStackedSeries ? (point.y0 ?? baseValue) : baseValue)\n : baseValue;\n const top = projectSeriesPoint(x, topValue, z);\n const bottom = projectSeriesPoint(x, bottomValue, z);\n const topBack = isAreaChart && isStackedSeries\n ? projectSeriesPoint(x, topValue, stackedAreaBackZ)\n : null;\n const bottomBack = isAreaChart && isStackedSeries\n ? projectSeriesPoint(x, bottomValue, stackedAreaBackZ)\n : null;\n return {\n bottom,\n bottomBack,\n defined: point.defined,\n depth: top.depth,\n depthBack: topBack?.depth ?? top.depth,\n top,\n topBack\n };\n });\n });\n\n const bounds = [\n ...cubeCorners,\n ...projectedSeries.flatMap((series) => series.flatMap((point) => point.defined\n ? [point.top, point.bottom, ...(point.topBack ? [point.topBack] : []), ...(point.bottomBack ? [point.bottomBack] : [])]\n : []))\n ];\n const minX = Math.min(...bounds.map((point) => point.x));\n const maxX = Math.max(...bounds.map((point) => point.x));\n const minY = Math.min(...bounds.map((point) => point.y));\n const maxY = Math.max(...bounds.map((point) => point.y));\n const scale = Math.min(\n plot.width / Math.max(0.4, maxX - minX),\n plot.height / Math.max(0.4, maxY - minY)\n ) * 0.82;\n const centerRawX = (minX + maxX) / 2;\n const centerRawY = (minY + maxY) / 2;\n const centerX = plot.left + plot.width / 2;\n const centerY = plot.top + plot.height / 2;\n const toScreenPoint = (point: { depth: number; x: number; y: number }) => ({\n depth: point.depth,\n x: centerX + (point.x - centerRawX) * scale,\n y: centerY + (point.y - centerRawY) * scale\n });\n\n const screenCorners = cubeCorners.map(toScreenPoint);\n const seriesGeometry = projectedSeries.map((series, seriesIndex) => ({\n averageDepth: series.reduce((sum, point) => sum + ((point.depth + point.depthBack) / 2), 0) / Math.max(1, series.length),\n points: series.map((point) => ({\n bottom: toScreenPoint(point.bottom),\n bottomBack: point.bottomBack ? toScreenPoint(point.bottomBack) : null,\n defined: point.defined,\n top: toScreenPoint(point.top),\n topBack: point.topBack ? toScreenPoint(point.topBack) : null\n })),\n seriesIndex\n })).sort((left, right) => left.averageDepth - right.averageDepth);\n\n const edgeColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const gridColor = lightenColor(edgeColor, 0.56);\n const labelColor = resolveChartAxisTextColor(chart);\n const boxEdges: Array<[number, number, boolean]> = [\n [0, 1, false], [1, 2, false], [2, 3, false], [3, 0, false],\n [4, 5, true], [5, 6, true], [6, 7, true], [7, 4, true],\n [0, 4, false], [1, 5, true], [2, 6, true], [3, 7, false]\n ];\n const yTicks = valueDomain.ticks;\n const xLabelPoints = categories.map((category, categoryIndex) => ({\n label: category,\n point: toScreenPoint(projectCartesian3dPoint(\n normalizeX(categoryIndex),\n -1.06,\n frontZ,\n rotXRad,\n rotYRad,\n usePerspective,\n perspectiveStrength\n ))\n }));\n const yLabelPoints = yTicks.map((tick) => ({\n point: toScreenPoint(projectCartesian3dPoint(\n -1.04,\n normalizeY(tick),\n frontZ,\n rotXRad,\n rotYRad,\n usePerspective,\n perspectiveStrength\n )),\n tick\n }));\n\n return (\n <g>\n {yTicks.map((tick) => {\n const yNorm = normalizeY(tick);\n const leftBack = toScreenPoint(projectCartesian3dPoint(-1, yNorm, backZ, rotXRad, rotYRad, usePerspective, perspectiveStrength));\n const rightBack = toScreenPoint(projectCartesian3dPoint(1, yNorm, backZ, rotXRad, rotYRad, usePerspective, perspectiveStrength));\n const leftFront = toScreenPoint(projectCartesian3dPoint(-1, yNorm, frontZ, rotXRad, rotYRad, usePerspective, perspectiveStrength));\n return (\n <g key={`line3d-grid-${tick}`}>\n <line stroke={gridColor} strokeWidth={1} x1={leftBack.x} x2={rightBack.x} y1={leftBack.y} y2={rightBack.y} />\n <line stroke={gridColor} strokeWidth={0.9} x1={leftBack.x} x2={leftFront.x} y1={leftBack.y} y2={leftFront.y} />\n </g>\n );\n })}\n {boxEdges.map(([startIndex, endIndex, emphasized], index) => {\n const start = screenCorners[startIndex];\n const end = screenCorners[endIndex];\n return (\n <line\n key={`line3d-box-${index}`}\n stroke={emphasized ? edgeColor : lightenColor(edgeColor, 0.34)}\n strokeWidth={emphasized ? 1.35 : 1}\n x1={start.x}\n x2={end.x}\n y1={start.y}\n y2={end.y}\n />\n );\n })}\n {seriesGeometry.map(({ points, seriesIndex }) => {\n const definedPoints = points.filter((point) => point.defined);\n if (definedPoints.length === 0) {\n return null;\n }\n const linePoints = definedPoints.map((point) => point.top);\n const areaPoints = isAreaChart\n ? [\n ...definedPoints.map((point) => point.top),\n ...definedPoints.slice().reverse().map((point) => point.bottom)\n ]\n : [];\n const areaBackPoints = isAreaChart && isStackedSeries\n ? [\n ...definedPoints.map((point) => point.topBack ?? point.top),\n ...definedPoints.slice().reverse().map((point) => point.bottomBack ?? point.bottom)\n ]\n : [];\n const strokeColor = chartSeriesStrokeColor(chart, seriesIndex);\n const fillColor = chartSeriesColor(chart, seriesIndex);\n const markerSymbol = normalizeChartMarkerSymbol(chart.series[seriesIndex]?.markerSymbol);\n const markerPath = markerSymbolPath(markerSymbol, Math.max(4, chart.series[seriesIndex]?.markerSize ?? 6) * 0.52);\n const slabFaces = isAreaChart && isStackedSeries\n ? definedPoints.slice(1).map((point, pointIndex) => {\n const previous = definedPoints[pointIndex];\n if (!previous?.topBack || !point.topBack || !previous.bottomBack || !point.bottomBack) {\n return null;\n }\n const topFace = buildLinearSvgPath([previous.top, point.top, point.topBack, previous.topBack], true);\n const bottomFace = buildLinearSvgPath([previous.bottom, point.bottom, point.bottomBack, previous.bottomBack], true);\n return (\n <React.Fragment key={`line3d-area-face-${seriesIndex}-${pointIndex}`}>\n <path\n d={topFace}\n fill={lightenColor(fillColor, 0.08)}\n fillOpacity={0.8}\n stroke={darkenColor(fillColor, 0.16)}\n strokeWidth={0.8}\n />\n <path\n d={bottomFace}\n fill={darkenColor(fillColor, 0.2)}\n fillOpacity={0.34}\n stroke={darkenColor(fillColor, 0.24)}\n strokeWidth={0.6}\n />\n </React.Fragment>\n );\n })\n : [];\n const firstDefinedPoint = definedPoints[0] ?? null;\n const lastDefinedPoint = definedPoints[definedPoints.length - 1] ?? null;\n const startCap = isAreaChart && isStackedSeries && firstDefinedPoint?.topBack && firstDefinedPoint?.bottomBack\n ? buildLinearSvgPath([\n firstDefinedPoint.top,\n firstDefinedPoint.bottom,\n firstDefinedPoint.bottomBack,\n firstDefinedPoint.topBack\n ], true)\n : \"\";\n const endCap = isAreaChart && isStackedSeries && lastDefinedPoint?.topBack && lastDefinedPoint?.bottomBack\n ? buildLinearSvgPath([\n lastDefinedPoint.top,\n lastDefinedPoint.bottom,\n lastDefinedPoint.bottomBack,\n lastDefinedPoint.topBack\n ], true)\n : \"\";\n\n return (\n <g key={`line3d-series-${seriesIndex}`}>\n {isAreaChart && isStackedSeries && areaBackPoints.length >= 3 ? (\n <path\n d={buildLinearSvgPath(areaBackPoints, true)}\n fill={darkenColor(fillColor, 0.18)}\n fillOpacity={0.44}\n stroke={darkenColor(fillColor, 0.26)}\n strokeWidth={0.8}\n />\n ) : null}\n {slabFaces}\n {startCap ? (\n <path\n d={startCap}\n fill={darkenColor(fillColor, 0.24)}\n fillOpacity={0.54}\n stroke={darkenColor(fillColor, 0.3)}\n strokeWidth={0.7}\n />\n ) : null}\n {endCap ? (\n <path\n d={endCap}\n fill={darkenColor(fillColor, 0.14)}\n fillOpacity={0.6}\n stroke={darkenColor(fillColor, 0.24)}\n strokeWidth={0.7}\n />\n ) : null}\n {isAreaChart && areaPoints.length >= 3 ? (\n <path\n d={buildLinearSvgPath(areaPoints, true)}\n fill={fillColor}\n fillOpacity={0.74}\n stroke={darkenColor(fillColor, 0.12)}\n strokeWidth={0.9}\n />\n ) : null}\n {!isAreaChart\n ? definedPoints.map((point, pointIndex) => (\n <line\n key={`line3d-drop-${seriesIndex}-${pointIndex}`}\n stroke={lightenColor(strokeColor, 0.44)}\n strokeDasharray=\"2 2\"\n strokeWidth={0.9}\n x1={point.top.x}\n x2={point.bottom.x}\n y1={point.top.y}\n y2={point.bottom.y}\n />\n ))\n : null}\n <path\n d={buildLinearSvgPath(linePoints)}\n fill=\"none\"\n stroke={strokeColor}\n strokeLinejoin=\"round\"\n strokeWidth={Math.max(1.8, chart.series[seriesIndex]?.lineWidthPx ?? 2)}\n />\n {markerPath.length > 0\n ? definedPoints.map((point, pointIndex) => (\n <g\n key={`line3d-marker-${seriesIndex}-${pointIndex}`}\n transform={`translate(${toSvgNumber(point.top.x)}, ${toSvgNumber(point.top.y)})`}\n >\n <path\n d={markerPath}\n fill={chart.series[seriesIndex]?.markerColor ?? fillColor}\n stroke={chart.series[seriesIndex]?.markerLineColor ?? chart.chartAreaFillColor ?? palette.surface}\n strokeWidth={1}\n />\n </g>\n ))\n : null}\n </g>\n );\n })}\n {yLabelPoints.map(({ point, tick }) => (\n <text\n key={`line3d-y-label-${tick}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"end\"\n x={point.x - 6}\n y={point.y + 3}\n >\n {formatTickValue(tick)}\n </text>\n ))}\n {xLabelPoints.map(({ label, point }, index) => (\n <text\n key={`line3d-x-label-${index}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={point.x}\n y={point.y + 14}\n >\n {label}\n </text>\n ))}\n </g>\n );\n}\n\nfunction renderBarChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout, chartType: string) {\n if (chart.series.length === 0) {\n return null;\n }\n const sourceCategories = getCategoryLabels(chart);\n if (sourceCategories.length === 0) {\n return null;\n }\n const isPercentStacked = chartType === \"ColumnPercentStacked\" || chartType === \"BarPercentStacked\";\n const isHorizontal = chartType === \"BarClustered\" || chartType === \"BarStacked\" || chartType === \"BarPercentStacked\";\n const isHistogramLike = isHistogramLikeChart(chart) && chartType === \"ColumnClustered\";\n const shouldReverseCategories = isHorizontal && chart.categoryAxis?.orientation !== \"maxMin\";\n const categories = shouldReverseCategories ? sourceCategories.slice().reverse() : sourceCategories;\n const isStacked = chartType === \"ColumnStacked\" || chartType === \"BarStacked\" || isPercentStacked;\n const negativeFillMode: \"chartArea\" | \"none\" | \"series\" = isPercentStacked\n ? \"chartArea\"\n : chartType === \"ColumnClustered\"\n ? \"none\"\n : \"series\";\n const categoryCount = categories.length;\n const seriesCount = chart.series.length;\n const normalized3dShape = (() => {\n switch (chart.shape3d) {\n case \"cone\":\n case \"coneToMax\":\n return \"cone\";\n case \"cylinder\":\n return \"cylinder\";\n case \"pyramid\":\n case \"pyramidToMax\":\n return \"pyramid\";\n default:\n return \"box\";\n }\n })();\n const frameOffsets = chart.is3d ? resolve3dFrameOffsets(chart, isHorizontal ? 9 : 11, isHorizontal ? 7 : 8) : null;\n const plot = chart.is3d && frameOffsets\n ? {\n ...layout.plot,\n height: Math.max(20, layout.plot.height - frameOffsets.insetBottom - 2),\n left: layout.plot.left + frameOffsets.insetLeft,\n top: layout.plot.top + frameOffsets.insetTop,\n width: Math.max(20, layout.plot.width - frameOffsets.insetLeft - frameOffsets.insetRight - 2)\n }\n : layout.plot;\n\n const matrix = chart.series.map((series) => {\n const values = Array.from(\n { length: categoryCount },\n (_, categoryIndex) => safeNumber(series.values[categoryIndex]) ?? 0\n );\n return shouldReverseCategories ? values.reverse() : values;\n });\n const rawMatrix = matrix.map((row) => row.slice());\n\n if (isPercentStacked) {\n for (let categoryIndex = 0; categoryIndex < categoryCount; categoryIndex += 1) {\n const total = matrix.reduce((sum, row) => sum + Math.max(0, row[categoryIndex] ?? 0), 0);\n for (let seriesIndex = 0; seriesIndex < seriesCount; seriesIndex += 1) {\n matrix[seriesIndex][categoryIndex] = total > 0 ? ((matrix[seriesIndex][categoryIndex] ?? 0) / total) * 100 : 0;\n }\n }\n }\n\n const positiveTotals = Array.from({ length: categoryCount }, (_, categoryIndex) => (\n matrix.reduce((sum, row) => sum + Math.max(0, row[categoryIndex] ?? 0), 0)\n ));\n const negativeTotals = Array.from({ length: categoryCount }, (_, categoryIndex) => (\n Math.abs(matrix.reduce((sum, row) => sum + Math.min(0, row[categoryIndex] ?? 0), 0))\n ));\n\n let minValue = Number.POSITIVE_INFINITY;\n let maxValue = Number.NEGATIVE_INFINITY;\n if (isStacked) {\n for (let categoryIndex = 0; categoryIndex < categoryCount; categoryIndex += 1) {\n let positive = 0;\n let negative = 0;\n for (let seriesIndex = 0; seriesIndex < seriesCount; seriesIndex += 1) {\n const value = matrix[seriesIndex][categoryIndex] ?? 0;\n if (value >= 0) {\n positive += value;\n } else {\n negative += value;\n }\n }\n maxValue = Math.max(maxValue, positive);\n minValue = Math.min(minValue, negative);\n }\n } else {\n for (const row of matrix) {\n for (const value of row) {\n maxValue = Math.max(maxValue, value);\n minValue = Math.min(minValue, value);\n }\n }\n }\n if (!Number.isFinite(minValue) || !Number.isFinite(maxValue)) {\n minValue = 0;\n maxValue = 1;\n }\n\n const valueDomain = resolveAxisDomainWithChartOverrides(\n chart.valueAxis,\n minValue,\n maxValue,\n true\n );\n minValue = valueDomain.min;\n maxValue = valueDomain.max;\n\n const categoryBandPadding = isHistogramLike\n ? { inner: 0, outer: 0 }\n : resolveCategoryBandPadding(chart.gapWidth);\n const categoryScale = scaleBand<string>()\n .domain(categories)\n .range(isHorizontal ? [plot.top, plot.top + plot.height] : [plot.left, plot.left + plot.width])\n .paddingInner(categoryBandPadding.inner)\n .paddingOuter(categoryBandPadding.outer);\n\n const seriesScale = scaleBand<string>()\n .domain(Array.from({ length: seriesCount }, (_, index) => String(index)))\n .range([0, categoryScale.bandwidth()])\n .paddingInner(isHistogramLike ? 0 : 0.16)\n .paddingOuter(isHistogramLike ? 0 : 0.08);\n const usesSeriesDepthAxis = (\n chart.is3d === true\n && !isHorizontal\n && !isStacked\n && seriesCount > 1\n && chart.seriesAxis != null\n );\n const depthLaneSpread = usesSeriesDepthAxis\n ? clamp(1.26 + seriesCount * 0.16, 1.4, 1.96)\n : 1;\n const depthGridSpanX = usesSeriesDepthAxis && frameOffsets\n ? frameOffsets.depthX * depthLaneSpread\n : 0;\n const depthGridSpanY = usesSeriesDepthAxis && frameOffsets\n ? frameOffsets.depthY * depthLaneSpread\n : 0;\n const depthSlotX = usesSeriesDepthAxis ? depthGridSpanX / Math.max(1, seriesCount) : 0;\n const depthSlotY = usesSeriesDepthAxis ? depthGridSpanY / Math.max(1, seriesCount) : 0;\n const depthBarX = usesSeriesDepthAxis\n ? Math.sign(depthSlotX || frameOffsets?.depthX || 1) * Math.max(8, Math.abs(depthSlotX) * 1.14)\n : frameOffsets?.depthX;\n const depthBarY = usesSeriesDepthAxis\n ? Math.sign(depthSlotY || frameOffsets?.depthY || -1) * Math.max(5.5, Math.abs(depthSlotY) * 1.12)\n : frameOffsets?.depthY;\n\n const shouldReverseValueAxis = chart.valueAxis?.orientation === \"maxMin\";\n const valueScale = scaleLinear()\n .domain([minValue, maxValue])\n .range(\n isHorizontal\n ? (shouldReverseValueAxis ? [plot.left + plot.width, plot.left] : [plot.left, plot.left + plot.width])\n : (shouldReverseValueAxis ? [plot.top, plot.top + plot.height] : [plot.top + plot.height, plot.top])\n );\n\n const ticks = isPercentStacked\n ? buildNumericTickValues(minValue, maxValue, chart.valueAxis?.majorUnit ?? 20)\n : valueDomain.ticks;\n const categoryPositions = categories.map((category) => {\n const bandStart = categoryScale(category) ?? 0;\n return bandStart + categoryScale.bandwidth() / 2;\n });\n\n const bars: BarRect[] = [];\n const positive = Array.from({ length: categoryCount }, () => 0);\n const negative = Array.from({ length: categoryCount }, () => 0);\n\n for (let seriesIndex = 0; seriesIndex < seriesCount; seriesIndex += 1) {\n for (let categoryIndex = 0; categoryIndex < categoryCount; categoryIndex += 1) {\n const value = matrix[seriesIndex][categoryIndex] ?? 0;\n const rawValue = rawMatrix[seriesIndex][categoryIndex] ?? value;\n const pointIndex = shouldReverseCategories ? (categoryCount - 1 - categoryIndex) : categoryIndex;\n const pointStyle = chart.series[seriesIndex]?.dataPointStyles?.find((entry) => entry.index === pointIndex);\n let start = 0;\n let end = value;\n if (isStacked) {\n if (value >= 0) {\n start = positive[categoryIndex];\n positive[categoryIndex] += value;\n end = positive[categoryIndex];\n } else {\n start = negative[categoryIndex];\n negative[categoryIndex] += value;\n end = negative[categoryIndex];\n }\n }\n\n const colors = chartSeriesBarColors(chart, seriesIndex, rawValue, negativeFillMode);\n const isInvertedNegative = rawValue < 0 && chart.series[seriesIndex]?.invertIfNegative === true;\n if (!(isInvertedNegative)) {\n if (pointStyle?.color) {\n colors.fill = pointStyle.color;\n if (!pointStyle.lineColor) {\n colors.stroke = pointStyle.color;\n }\n }\n if (pointStyle?.lineColor) {\n colors.stroke = pointStyle.lineColor;\n }\n }\n if (isInvertedNegative && isPercentStacked && chart.is3d) {\n colors.fill = \"#ffffff\";\n }\n const category = categories[categoryIndex];\n const categoryStart = categoryScale(category) ?? 0;\n const barThickness = usesSeriesDepthAxis\n ? Math.max(7, categoryScale.bandwidth() * 0.4)\n : isHistogramLike\n ? categoryScale.bandwidth()\n : isStacked\n ? categoryScale.bandwidth()\n : seriesScale.bandwidth();\n const barOffset = usesSeriesDepthAxis\n ? Math.max(0, (categoryScale.bandwidth() - barThickness) * 0.5)\n : isHistogramLike\n ? 0\n : isStacked\n ? 0\n : (seriesScale(String(seriesIndex)) ?? 0);\n const depthOffsetX = usesSeriesDepthAxis ? depthSlotX * seriesIndex : 0;\n const depthOffsetY = usesSeriesDepthAxis ? depthSlotY * seriesIndex : 0;\n const depthOrder = depthOffsetX * (frameOffsets?.depthX ?? 0) + depthOffsetY * (frameOffsets?.depthY ?? 0);\n const shapeTaper = normalized3dShape === \"pyramid\"\n ? 0.94\n : normalized3dShape === \"cone\"\n ? 1\n : 0;\n let topScale = 1;\n let bottomScale = 1;\n if (chart.is3d && shapeTaper > 0) {\n const scaleAt = (ratio: number) => {\n const clampedRatio = clamp(ratio, 0, 1);\n const taperedRatio = normalized3dShape === \"cone\"\n ? Math.pow(clampedRatio, isHorizontal ? 1.85 : 1.08)\n : clampedRatio;\n return clamp(1 - (taperedRatio * shapeTaper), normalized3dShape === \"cone\" ? 0 : 0.04, 1);\n };\n if (rawValue >= 0) {\n const total = Math.max(1e-6, isStacked ? positiveTotals[categoryIndex] : Math.abs(rawValue));\n bottomScale = scaleAt(isStacked ? start / total : 0);\n topScale = scaleAt(isStacked ? end / total : 1);\n } else {\n const total = Math.max(1e-6, isStacked ? negativeTotals[categoryIndex] : Math.abs(rawValue));\n topScale = scaleAt(isStacked ? Math.abs(start) / total : 0);\n bottomScale = scaleAt(isStacked ? Math.abs(end) / total : 1);\n }\n }\n\n if (isHorizontal) {\n const x1 = valueScale(start);\n const x2 = valueScale(end);\n const maxPositive = positiveTotals[categoryIndex] ?? 0;\n const maxNegative = negativeTotals[categoryIndex] ?? 0;\n bars.push({\n capEnd: !isStacked || (rawValue >= 0\n ? Math.abs(end - maxPositive) < 1e-6\n : Math.abs(end - maxNegative) < 1e-6),\n capStart: !isStacked || Math.abs(start) < 1e-6,\n bottomScale,\n categoryIndex,\n color: colors.fill,\n depthOrder,\n depthOffsetX,\n depthOffsetY,\n height: Math.max(1, barThickness),\n isHorizontal: true,\n key: `bar-${seriesIndex}-${categoryIndex}`,\n left: Math.min(x1, x2),\n depthX: usesSeriesDepthAxis ? depthBarX : frameOffsets?.depthX,\n depthY: usesSeriesDepthAxis ? depthBarY : frameOffsets?.depthY,\n shape3d: normalized3dShape,\n seriesIndex,\n stroke: colors.stroke,\n strokeWidth: colors.strokeWidth,\n topScale,\n top: categoryStart + barOffset,\n invertedNegative: isInvertedNegative,\n value: rawValue,\n width: Math.max(1, Math.abs(x2 - x1))\n });\n } else {\n const y1 = valueScale(start);\n const y2 = valueScale(end);\n const maxPositive = positiveTotals[categoryIndex] ?? 0;\n const maxNegative = negativeTotals[categoryIndex] ?? 0;\n bars.push({\n capEnd: !isStacked || (rawValue >= 0\n ? Math.abs(end - maxPositive) < 1e-6\n : Math.abs(end - maxNegative) < 1e-6),\n capStart: !isStacked || Math.abs(start) < 1e-6,\n bottomScale,\n categoryIndex,\n color: colors.fill,\n depthOrder,\n depthOffsetX,\n depthOffsetY,\n height: Math.max(1, Math.abs(y2 - y1)),\n isHorizontal: false,\n key: `bar-${seriesIndex}-${categoryIndex}`,\n left: categoryStart + barOffset,\n depthX: usesSeriesDepthAxis ? depthBarX : frameOffsets?.depthX,\n depthY: usesSeriesDepthAxis ? depthBarY : frameOffsets?.depthY,\n shape3d: normalized3dShape,\n seriesIndex,\n stroke: colors.stroke,\n strokeWidth: colors.strokeWidth,\n topScale,\n top: Math.min(y1, y2),\n invertedNegative: isInvertedNegative,\n value: rawValue,\n width: Math.max(1, barThickness)\n });\n }\n }\n }\n\n const renderedBars = chart.is3d && isStacked\n ? bars.slice().sort((left, right) => {\n if (left.categoryIndex !== right.categoryIndex) {\n return left.categoryIndex - right.categoryIndex;\n }\n const leftNegative = left.value < 0 ? 0 : 1;\n const rightNegative = right.value < 0 ? 0 : 1;\n if (leftNegative !== rightNegative) {\n return leftNegative - rightNegative;\n }\n if (isHorizontal) {\n if (left.left !== right.left) {\n return left.left - right.left;\n }\n return left.seriesIndex - right.seriesIndex;\n }\n if (left.top !== right.top) {\n return right.top - left.top;\n }\n return left.seriesIndex - right.seriesIndex;\n })\n : bars;\n const sortedBars = usesSeriesDepthAxis\n ? renderedBars.slice().sort((left, right) => {\n if ((left.depthOrder ?? 0) !== (right.depthOrder ?? 0)) {\n return (right.depthOrder ?? 0) - (left.depthOrder ?? 0);\n }\n if (left.categoryIndex !== right.categoryIndex) {\n return left.categoryIndex - right.categoryIndex;\n }\n return left.top - right.top;\n })\n : renderedBars;\n\n const useVertical3dGradient = chart.is3d && !isHorizontal;\n const gradientByColor = new Map<string, string>();\n if (useVertical3dGradient) {\n for (const bar of renderedBars) {\n if (!bar.color || bar.color === \"none\" || bar.color.startsWith(\"url(\")) {\n continue;\n }\n if (!gradientByColor.has(bar.color)) {\n gradientByColor.set(\n bar.color,\n `bar3d-front-${chart.id}-${gradientByColor.size}`.replace(/[^A-Za-z0-9_-]/g, \"-\")\n );\n }\n bar.gradientId = gradientByColor.get(bar.color);\n }\n }\n\n const axisNode = renderCartesianAxes(\n chart,\n palette,\n plot,\n isHorizontal,\n categories,\n categoryPositions,\n ticks,\n (value) => valueScale(value),\n isPercentStacked ? formatPercentTickValue : formatTickValue\n );\n const depthAxisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const depthGridColor = lightenColor(depthAxisColor, 0.48);\n const frameDepthX = usesSeriesDepthAxis ? depthGridSpanX : (frameOffsets?.depthX ?? 0);\n const frameDepthY = usesSeriesDepthAxis ? depthGridSpanY : (frameOffsets?.depthY ?? 0);\n const depthAxisNode = usesSeriesDepthAxis && frameOffsets ? (\n <g>\n {Array.from({ length: categoryCount + 1 }, (_, boundaryIndex) => {\n const x = plot.left + ((boundaryIndex / Math.max(1, categoryCount)) * plot.width);\n return (\n <line\n key={`bar3d-floor-x-${boundaryIndex}`}\n stroke={depthGridColor}\n strokeWidth={0.9}\n x1={x}\n x2={x + depthGridSpanX}\n y1={plot.top + plot.height}\n y2={plot.top + plot.height + depthGridSpanY}\n />\n );\n })}\n {Array.from({ length: seriesCount + 1 }, (_, boundaryIndex) => {\n const ratio = boundaryIndex / Math.max(1, seriesCount);\n const offsetX = depthGridSpanX * ratio;\n const offsetY = depthGridSpanY * ratio;\n return (\n <line\n key={`bar3d-floor-z-${boundaryIndex}`}\n stroke={depthGridColor}\n strokeWidth={0.9}\n x1={plot.left + offsetX}\n x2={plot.left + plot.width + offsetX}\n y1={plot.top + plot.height + offsetY}\n y2={plot.top + plot.height + offsetY}\n />\n );\n })}\n {chart.series.map((series, seriesIndex) => {\n const ratio = (seriesIndex + 0.5) / Math.max(1, seriesCount);\n const x = plot.left + plot.width + depthGridSpanX * ratio;\n const y = plot.top + plot.height + depthGridSpanY * ratio;\n return (\n <text\n key={`bar3d-ser-label-${seriesIndex}`}\n fill={resolveChartAxisTextColor(chart)}\n fontSize={10}\n textAnchor=\"start\"\n x={x + 7}\n y={y + 3}\n >\n {series.name ?? `Series ${seriesIndex + 1}`}\n </text>\n );\n })}\n </g>\n ) : null;\n\n const frameNode = chart.is3d && frameOffsets ? (\n <g>\n <polygon\n fill={lightenColor(chart.chartAreaFillColor ?? palette.surface, 0.05)}\n points={`${plot.left},${plot.top + plot.height} ${plot.left + plot.width},${plot.top + plot.height} ${plot.left + plot.width + frameDepthX},${plot.top + plot.height + frameDepthY} ${plot.left + frameDepthX},${plot.top + plot.height + frameDepthY}`}\n stroke={lightenColor(chart.axisLineColor ?? palette.border, 0.2)}\n strokeWidth={1}\n />\n <polygon\n fill={lightenColor(chart.chartAreaFillColor ?? palette.surface, 0.12)}\n points={`${plot.left},${plot.top} ${plot.left + plot.width},${plot.top} ${plot.left + plot.width + frameDepthX},${plot.top + frameDepthY} ${plot.left + frameDepthX},${plot.top + frameDepthY}`}\n stroke={lightenColor(chart.axisLineColor ?? palette.border, 0.2)}\n strokeWidth={1}\n />\n </g>\n ) : null;\n\n return (\n <g>\n {useVertical3dGradient && gradientByColor.size > 0 ? (\n <defs>\n {Array.from(gradientByColor.entries()).map(([color, id]) => (\n <linearGradient id={id} key={id} x1=\"0%\" x2=\"0%\" y1=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={lightenColor(color, 0.28)} />\n <stop offset=\"42%\" stopColor={lightenColor(color, 0.12)} />\n <stop offset=\"100%\" stopColor={darkenColor(color, 0.1)} />\n </linearGradient>\n ))}\n </defs>\n ) : null}\n {axisNode}\n {frameNode}\n {depthAxisNode}\n {chart.is3d\n ? sortedBars.map((bar) => renderExtrudedRect(bar))\n : renderedBars.map((bar) => (\n <rect\n key={bar.key}\n fill={bar.color}\n height={bar.height}\n stroke={isHistogramLike ? \"none\" : bar.stroke}\n strokeWidth={isHistogramLike ? 0 : bar.strokeWidth}\n width={bar.width}\n x={bar.left}\n y={bar.top}\n />\n ))}\n </g>\n );\n}\n\nfunction renderLineOrAreaChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout, chartType: string) {\n if (chart.series.length === 0) {\n return null;\n }\n const categories = getCategoryLabels(chart);\n if (categories.length === 0) {\n return null;\n }\n const plot = layout.plot;\n const displayBlanksAs = chart.displayBlanksAs;\n const isAreaChart = chartType === \"Area\" || chartType === \"AreaStacked\" || chartType === \"AreaPercentStacked\";\n const isStackedArea = chartType === \"AreaStacked\" || chartType === \"AreaPercentStacked\";\n const isStackedLine = chartType === \"LineStacked\" || chartType === \"LinePercentStacked\";\n const isStackedSeries = isStackedArea || isStackedLine;\n const isPercentStackedSeries = chartType === \"AreaPercentStacked\" || chartType === \"LinePercentStacked\";\n const resolvedValuesBySeries = chart.series.map((series) => (\n categories.map((_, categoryIndex) => resolveRenderableSeriesValue(series.values[categoryIndex], displayBlanksAs))\n ));\n\n type SeriesPoint = {\n defined: boolean;\n y: number | null;\n y0: number | null;\n y1: number | null;\n };\n\n const stackedPointsBySeries: SeriesPoint[][] = isStackedSeries\n ? (() => {\n const positive = Array.from({ length: categories.length }, () => 0);\n const negative = Array.from({ length: categories.length }, () => 0);\n const categoryTotals = isPercentStackedSeries\n ? categories.map((_, categoryIndex) => {\n const total = resolvedValuesBySeries.reduce((sum, seriesValues) => (\n sum + (seriesValues[categoryIndex] ?? 0)\n ), 0);\n return Math.abs(total) < 1e-9 ? 1 : total;\n })\n : null;\n return chart.series.map((_, seriesIndex) => (\n categories.map((_, categoryIndex) => {\n const rawValue = resolvedValuesBySeries[seriesIndex]?.[categoryIndex] ?? null;\n if (rawValue == null) {\n return { defined: false, y: null, y0: null, y1: null };\n }\n const value = isPercentStackedSeries\n ? (rawValue / (categoryTotals?.[categoryIndex] ?? 1)) * 100\n : rawValue;\n if (value >= 0) {\n const start = positive[categoryIndex];\n const end = start + value;\n positive[categoryIndex] = end;\n return { defined: true, y: end, y0: start, y1: end };\n }\n const start = negative[categoryIndex];\n const end = start + value;\n negative[categoryIndex] = end;\n return { defined: true, y: end, y0: start, y1: end };\n })\n ));\n })()\n : chart.series.map((_, seriesIndex) => (\n categories.map((_, categoryIndex) => {\n const value = resolvedValuesBySeries[seriesIndex]?.[categoryIndex] ?? null;\n return {\n defined: value != null,\n y: value,\n y0: null,\n y1: value\n };\n })\n ));\n\n const stackedExtents = stackedPointsBySeries\n .flatMap((seriesPoints) => (\n seriesPoints.flatMap((point) => (\n point.defined\n ? [point.y0, point.y1].filter((value): value is number => value != null && Number.isFinite(value))\n : []\n ))\n ));\n if (stackedExtents.length === 0) {\n return null;\n }\n let minValue = Math.min(...stackedExtents);\n let maxValue = Math.max(...stackedExtents);\n if (isAreaChart) {\n minValue = Math.min(0, minValue);\n } else if ((chartType === \"Line\" || isStackedLine) && chart.valueAxis?.crosses === \"autoZero\") {\n minValue = Math.min(0, minValue);\n }\n if (isPercentStackedSeries) {\n const explicitMin = typeof chart.valueAxis?.min === \"number\" && Number.isFinite(chart.valueAxis.min)\n ? Number(chart.valueAxis.min)\n : Math.min(0, minValue);\n const explicitMax = typeof chart.valueAxis?.max === \"number\" && Number.isFinite(chart.valueAxis.max)\n ? Number(chart.valueAxis.max)\n : Math.max(100, maxValue);\n minValue = explicitMin;\n maxValue = explicitMax <= explicitMin ? explicitMin + 1 : explicitMax;\n } else {\n const valueDomain = resolveAxisDomainWithChartOverrides(\n chart.valueAxis,\n minValue,\n maxValue,\n isAreaChart || chart.valueAxis?.crosses === \"autoZero\"\n );\n minValue = valueDomain.min;\n maxValue = valueDomain.max;\n }\n\n const xScale = scalePoint<string>()\n .domain(categories)\n .range([plot.left, plot.left + plot.width]);\n const yScale = scaleLinear()\n .domain([minValue, maxValue])\n .range([plot.top + plot.height, plot.top]);\n\n const ticks = isPercentStackedSeries\n ? buildNumericTickValues(minValue, maxValue, chart.valueAxis?.majorUnit ?? 20)\n : resolveAxisDomainWithChartOverrides(\n chart.valueAxis,\n minValue,\n maxValue,\n isAreaChart || chart.valueAxis?.crosses === \"autoZero\"\n ).ticks;\n const categoryPositions = categories.map((category) => xScale(category) ?? plot.left);\n\n const curve: CurveFactory = curveLinear;\n const areaBaseline = yScale(Math.max(minValue, 0));\n const plotPointsBySeries = chart.series.map((_, seriesIndex) => (\n categories.map((category, categoryIndex) => {\n const point = stackedPointsBySeries[seriesIndex]?.[categoryIndex] ?? {\n defined: false,\n y: null,\n y0: null,\n y1: null\n };\n return {\n defined: point.defined,\n x: xScale(category) ?? plot.left,\n y: point.y,\n y0: point.y0,\n y1: point.y1\n };\n })\n ));\n\n if (chart.is3d) {\n return renderLineOrAreaChart3d(\n chart,\n palette,\n layout,\n categories,\n stackedPointsBySeries,\n minValue,\n maxValue,\n isAreaChart,\n isStackedSeries\n );\n }\n\n const rawRecord = chart.raw && typeof chart.raw === \"object\"\n ? chart.raw as Record<string, unknown>\n : null;\n const dropLinesRecord = rawRecord?.dropLines && typeof rawRecord.dropLines === \"object\"\n ? rawRecord.dropLines as Record<string, unknown>\n : null;\n const highLowLinesRecord = rawRecord?.highLowLines && typeof rawRecord.highLowLines === \"object\"\n ? rawRecord.highLowLines as Record<string, unknown>\n : null;\n const upDownBarsRecord = rawRecord?.upDownBars && typeof rawRecord.upDownBars === \"object\"\n ? rawRecord.upDownBars as Record<string, unknown>\n : null;\n const dropLineColor = normalizeRendererHexColor((dropLinesRecord?.shapeProperties as Record<string, unknown> | undefined)?.lineColorHex)\n ?? lightenColor(chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border, 0.45);\n const highLowLineColor = normalizeRendererHexColor((highLowLinesRecord?.shapeProperties as Record<string, unknown> | undefined)?.lineColorHex)\n ?? chart.axisLineColor\n ?? chart.chartAreaBorderColor\n ?? palette.border;\n const upDownGapWidth = typeof upDownBarsRecord?.gapWidth === \"number\" && Number.isFinite(upDownBarsRecord.gapWidth)\n ? upDownBarsRecord.gapWidth\n : 150;\n const categoryStep = categoryPositions.length >= 2\n ? Math.min(...categoryPositions.slice(1).map((position, index) => Math.abs(position - (categoryPositions[index] ?? 0))).filter((value) => value > 0))\n : plot.width;\n const upDownBarWidth = clamp(categoryStep * (1 - resolveCategoryBandPadding(upDownGapWidth).inner) * 0.82, 3, 28);\n\n return (\n <g>\n {renderCartesianAxes(\n chart,\n palette,\n plot,\n false,\n categories,\n categoryPositions,\n ticks,\n (value) => yScale(value)\n )}\n {!isAreaChart && !isStackedSeries && highLowLinesRecord\n ? categories.map((_, categoryIndex) => {\n const yValues = plotPointsBySeries\n .map((seriesPoints) => seriesPoints[categoryIndex]?.y)\n .filter((value): value is number => value != null && Number.isFinite(value));\n if (yValues.length < 2) {\n return null;\n }\n const x = categoryPositions[categoryIndex] ?? plot.left;\n return (\n <line\n key={`high-low-${categoryIndex}`}\n stroke={highLowLineColor}\n strokeWidth={1}\n x1={x}\n x2={x}\n y1={yScale(Math.min(...yValues))}\n y2={yScale(Math.max(...yValues))}\n />\n );\n })\n : null}\n {!isAreaChart && !isStackedSeries && upDownBarsRecord && plotPointsBySeries.length >= 2\n ? categories.map((_, categoryIndex) => {\n const first = plotPointsBySeries[0]?.[categoryIndex];\n const second = plotPointsBySeries[1]?.[categoryIndex];\n if (!first || !second || first.y == null || second.y == null) {\n return null;\n }\n const top = yScale(Math.max(first.y, second.y));\n const bottom = yScale(Math.min(first.y, second.y));\n const isUpBar = second.y >= first.y;\n const fill = isUpBar ? darkenColor(highLowLineColor, 0.12) : \"#c0504d\";\n return (\n <rect\n key={`up-down-${categoryIndex}`}\n fill={fill}\n fillOpacity={0.92}\n height={Math.max(1, bottom - top)}\n stroke={darkenColor(fill, 0.18)}\n strokeWidth={1}\n width={upDownBarWidth}\n x={(categoryPositions[categoryIndex] ?? plot.left) - upDownBarWidth / 2}\n y={top}\n />\n );\n })\n : null}\n {chart.series.map((series, seriesIndex) => {\n const points = plotPointsBySeries[seriesIndex] ?? [];\n const lineStrokePoints = displayBlanksAs === \"span\"\n ? points.filter((point) => point.y != null)\n : points;\n const linePath = d3Line<{ x: number; y: number | null }>()\n .defined((point) => point.y != null)\n .x((point) => point.x)\n .y((point) => yScale(point.y ?? 0))\n .curve(curve)(lineStrokePoints) ?? \"\";\n\n const areaPath = isAreaChart\n ? d3Area<{ x: number; y: number | null; y0: number | null; y1: number | null }>()\n .defined((point) => (\n isStackedSeries\n ? point.y0 != null && point.y1 != null\n : point.y != null\n ))\n .x((point) => point.x)\n .y0((point) => (\n isStackedSeries\n ? yScale(point.y0 ?? 0)\n : areaBaseline\n ))\n .y1((point) => yScale((isStackedSeries ? point.y1 : point.y) ?? 0))\n .curve(curve)(points) ?? \"\"\n : \"\";\n\n const seriesFillColor = typeof series.shapeProperties?.xmlFillColor === \"string\"\n ? series.shapeProperties.xmlFillColor\n : chartSeriesColor(chart, seriesIndex);\n return (\n <g key={`line-series-${seriesIndex}`}>\n {!isAreaChart && !isStackedSeries && dropLinesRecord\n ? points.map((point, pointIndex) => (\n point.y == null ? null : (\n <line\n key={`drop-line-${seriesIndex}-${pointIndex}`}\n stroke={dropLineColor}\n strokeWidth={1}\n x1={point.x}\n x2={point.x}\n y1={yScale(point.y)}\n y2={areaBaseline}\n />\n )\n ))\n : null}\n {isAreaChart ? (\n <path\n d={areaPath}\n fill={seriesFillColor}\n fillOpacity={1}\n stroke=\"none\"\n />\n ) : null}\n <path\n d={linePath}\n fill=\"none\"\n stroke={chartSeriesStrokeColor(chart, seriesIndex)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={Math.max(1.5, series.lineWidthPx ?? 2)}\n />\n {points.map((point, pointIndex) => (\n point.y == null ? null : (\n <circle\n key={`line-marker-${seriesIndex}-${pointIndex}`}\n cx={point.x}\n cy={yScale(point.y)}\n fill={series.markerColor ?? chartSeriesColor(chart, seriesIndex)}\n r={Math.max(2, (series.markerSize ?? 6) * 0.25)}\n stroke={series.markerLineColor ?? chart.chartAreaFillColor ?? chartSeriesStrokeColor(chart, seriesIndex)}\n strokeWidth={1}\n />\n )\n ))}\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderComboChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const groups = buildComboGroups(chart);\n const columnGroup = groups.find((group) => group.chartType.startsWith(\"Column\"));\n const lineGroup = groups.find((group) => group.chartType.startsWith(\"Line\"));\n if (!columnGroup || !lineGroup) {\n return null;\n }\n\n const primaryChart: XlsxChart = {\n ...chart,\n categoryAxis: columnGroup.categoryAxis ?? chart.categoryAxis,\n chartType: columnGroup.chartType,\n dataLabels: undefined,\n is3d: columnGroup.is3d ?? false,\n series: columnGroup.series,\n valueAxis: columnGroup.valueAxis ?? chart.valueAxis\n };\n const categories = getCategoryLabels(primaryChart);\n if (categories.length === 0) {\n return null;\n }\n\n const plot = layout.plot;\n const groupGapWidth = typeof columnGroup.raw?.gapWidth === \"number\" && Number.isFinite(columnGroup.raw.gapWidth)\n ? columnGroup.raw.gapWidth\n : columnGroup.gapWidth ?? chart.gapWidth;\n const histogramColumns = columnGroup.series.some((series) => isHistogramLikeSeries(series));\n const categoryBandPadding = histogramColumns\n ? { inner: 0, outer: 0 }\n : resolveCategoryBandPadding(groupGapWidth);\n const categoryScale = scaleBand<string>()\n .domain(categories)\n .range([plot.left, plot.left + plot.width])\n .paddingInner(categoryBandPadding.inner)\n .paddingOuter(categoryBandPadding.outer);\n const seriesScale = scaleBand<string>()\n .domain(Array.from({ length: columnGroup.series.length }, (_, index) => String(index)))\n .range([0, categoryScale.bandwidth()])\n .paddingInner(histogramColumns ? 0 : 0.16)\n .paddingOuter(histogramColumns ? 0 : 0.08);\n const categoryPositions = categories.map((category) => (\n (categoryScale(category) ?? plot.left) + categoryScale.bandwidth() / 2\n ));\n\n const primaryValues = columnGroup.series.flatMap((series) => (\n series.values.map((value) => safeNumber(value)).filter((value): value is number => value != null)\n ));\n const secondaryValues = lineGroup.series.flatMap((series) => (\n series.values.map((value) => safeNumber(value)).filter((value): value is number => value != null)\n ));\n if (primaryValues.length === 0 || secondaryValues.length === 0) {\n return null;\n }\n\n const primaryDomain = resolveNumericAxisDomain(\n typeof columnGroup.valueAxis?.min === \"number\" ? columnGroup.valueAxis.min : Math.min(...primaryValues),\n typeof columnGroup.valueAxis?.max === \"number\" ? columnGroup.valueAxis.max : Math.max(...primaryValues),\n columnGroup.valueAxis?.majorUnit,\n true\n );\n const secondaryDomain = resolveNumericAxisDomain(\n typeof lineGroup.valueAxis?.min === \"number\" ? lineGroup.valueAxis.min : Math.min(...secondaryValues),\n typeof lineGroup.valueAxis?.max === \"number\" ? lineGroup.valueAxis.max : Math.max(...secondaryValues),\n lineGroup.valueAxis?.majorUnit,\n false\n );\n const primaryScale = scaleLinear()\n .domain([primaryDomain.min, primaryDomain.max])\n .range([plot.top + plot.height, plot.top]);\n const secondaryScale = scaleLinear()\n .domain([secondaryDomain.min, secondaryDomain.max])\n .range([plot.top + plot.height, plot.top]);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n\n return (\n <g>\n {renderCartesianAxes(\n primaryChart,\n palette,\n plot,\n false,\n categories,\n categoryPositions,\n primaryDomain.ticks,\n (value) => primaryScale(value)\n )}\n {secondaryDomain.ticks.map((tick) => {\n const y = secondaryScale(tick);\n return (\n <text\n key={`combo-secondary-tick-${tick}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"start\"\n x={plot.left + plot.width + 6}\n y={y + 3}\n >\n {formatTickValue(tick)}\n </text>\n );\n })}\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={plot.left + plot.width}\n x2={plot.left + plot.width}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n {columnGroup.series.flatMap((series, seriesIndex) => categories.map((category, categoryIndex) => {\n const value = safeNumber(series.values[categoryIndex]) ?? 0;\n const categoryStart = categoryScale(category) ?? plot.left;\n const barWidth = Math.max(1, histogramColumns ? categoryScale.bandwidth() : seriesScale.bandwidth());\n const x = categoryStart + (histogramColumns ? 0 : (seriesScale(String(seriesIndex)) ?? 0));\n const y = primaryScale(Math.max(0, value));\n const zeroY = primaryScale(0);\n const height = Math.max(1, Math.abs(zeroY - primaryScale(value)));\n return (\n <rect\n key={`combo-bar-${seriesIndex}-${categoryIndex}`}\n fill={series.color ?? series.lineColor ?? chartSeriesColor(primaryChart, seriesIndex)}\n height={height}\n stroke={histogramColumns ? \"none\" : (series.lineColor ?? series.color ?? chartSeriesStrokeColor(primaryChart, seriesIndex))}\n strokeWidth={histogramColumns ? 0 : 1}\n width={barWidth}\n x={x}\n y={Math.min(y, zeroY)}\n />\n );\n }))}\n {lineGroup.series.map((series, seriesIndex) => {\n const points = categories.map((category, categoryIndex) => ({\n x: (categoryScale(category) ?? plot.left) + categoryScale.bandwidth() / 2,\n y: safeNumber(series.values[categoryIndex])\n }));\n const lineStrokePoints = chart.displayBlanksAs === \"span\"\n ? points.filter((point) => point.y != null)\n : points;\n const path = d3Line<{ x: number; y: number | null }>()\n .defined((point) => point.y != null)\n .x((point) => point.x)\n .y((point) => secondaryScale(point.y ?? 0))\n .curve(curveLinear)(lineStrokePoints) ?? \"\";\n return (\n <g key={`combo-line-${seriesIndex}`}>\n <path\n d={path}\n fill=\"none\"\n stroke={series.lineColor ?? series.color ?? chartSeriesStrokeColor(chart, columnGroup.series.length + seriesIndex)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={Math.max(1.5, series.lineWidthPx ?? 2)}\n />\n {points.map((point, pointIndex) => (\n point.y == null ? null : (\n <path\n d={markerSymbolPath(normalizeChartMarkerSymbol(series.markerSymbol), Math.max(4, series.markerSize ?? 7)) || markerSymbolPath(\"circle\", 7)}\n fill={series.markerColor ?? series.color ?? series.lineColor ?? chartSeriesColor(chart, columnGroup.series.length + seriesIndex)}\n key={`combo-line-marker-${seriesIndex}-${pointIndex}`}\n stroke={series.markerLineColor ?? chart.chartAreaFillColor ?? \"#ffffff\"}\n strokeWidth={1}\n transform={`translate(${point.x}, ${secondaryScale(point.y)})`}\n />\n )\n ))}\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderScatterChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout, smooth: boolean) {\n const plot = layout.plot;\n const rawRecord = chart.raw && typeof chart.raw === \"object\"\n ? chart.raw as Record<string, unknown>\n : null;\n const normalizedTitle = typeof chart.title === \"string\" ? chart.title.trim().toLowerCase() : \"\";\n const scatterStyle = typeof chart.scatterStyle === \"string\"\n ? chart.scatterStyle\n : rawRecord && typeof rawRecord.scatterStyle === \"string\"\n ? rawRecord.scatterStyle\n : undefined;\n const styleDrawsLine = scatterStyle\n ? scatterStyle === \"line\" || scatterStyle === \"lineMarker\" || scatterStyle === \"smooth\" || scatterStyle === \"smoothMarker\"\n : true;\n const styleShowsMarkers = scatterStyle\n ? scatterStyle === \"marker\" || scatterStyle === \"lineMarker\" || scatterStyle === \"smoothMarker\"\n : true;\n const styleUsesSmoothCurve = scatterStyle\n ? scatterStyle === \"smooth\" || scatterStyle === \"smoothMarker\"\n : smooth;\n const titleForcesMarkerOnly = normalizedTitle.includes(\"marker only\");\n const titleForcesNoMarkers = normalizedTitle.includes(\"no markers\");\n const titleForcesWithMarkers = normalizedTitle.includes(\"with markers\");\n const pointsBySeries = chart.series.map((series) => {\n const yLength = series.values.length;\n const directXValues = Array.from({ length: yLength }, (_, index) => coerceLooseNumber(series.categories[index]));\n\n let resolvedXValues = directXValues;\n let usesSyntheticIndex = false;\n if (directXValues.filter((value) => value != null).length < Math.max(2, yLength - 1)) {\n const categories = series.categories ?? [];\n const pairedXValues = Array.from({ length: yLength }, (_, index) => {\n const candidates = [\n categories[index],\n categories[index * 2],\n categories[index * 2 + 1],\n categories[index + 1]\n ];\n for (const candidate of candidates) {\n const parsed = coerceLooseNumber(candidate);\n if (parsed != null) {\n return parsed;\n }\n }\n return null;\n });\n if (pairedXValues.filter((value) => value != null).length >= 2) {\n resolvedXValues = pairedXValues;\n } else {\n const numericPool = categories\n .map((entry) => coerceLooseNumber(entry))\n .filter((value): value is number => value != null);\n if (numericPool.length >= 2) {\n resolvedXValues = Array.from(\n { length: yLength },\n (_, index) => numericPool[index] ?? numericPool[numericPool.length - 1] ?? null\n );\n } else {\n usesSyntheticIndex = true;\n resolvedXValues = Array.from({ length: yLength }, (_, index) => index + 1);\n }\n }\n }\n\n const points = series.values.map((value, index) => {\n const x = coerceLooseNumber(resolvedXValues[index]);\n const y = safeNumber(value);\n return x == null || y == null ? null : { x, y };\n }).filter((point): point is { x: number; y: number } => point != null);\n return {\n pointCount: yLength,\n points,\n series,\n usesSyntheticIndex\n };\n });\n\n const allX = pointsBySeries.flatMap((series) => series.points.map((point) => point.x));\n const allY = pointsBySeries.flatMap((series) => series.points.map((point) => point.y));\n if (allX.length === 0 || allY.length === 0) {\n return null;\n }\n\n const hasExplicitMinX = typeof chart.categoryAxis?.min === \"number\" && Number.isFinite(chart.categoryAxis.min);\n const hasExplicitMaxX = typeof chart.categoryAxis?.max === \"number\" && Number.isFinite(chart.categoryAxis.max);\n const hasExplicitMinY = typeof chart.valueAxis?.min === \"number\" && Number.isFinite(chart.valueAxis.min);\n const hasExplicitMaxY = typeof chart.valueAxis?.max === \"number\" && Number.isFinite(chart.valueAxis.max);\n const hasSyntheticIndexAxis = pointsBySeries.some((series) => series.usesSyntheticIndex);\n const syntheticPointCount = Math.max(0, ...pointsBySeries.map((series) => series.pointCount));\n\n let minX = hasExplicitMinX ? Number(chart.categoryAxis?.min) : Math.min(...allX);\n let maxX = hasExplicitMaxX ? Number(chart.categoryAxis?.max) : Math.max(...allX);\n let minY = hasExplicitMinY ? Number(chart.valueAxis?.min) : Math.min(...allY);\n let maxY = hasExplicitMaxY ? Number(chart.valueAxis?.max) : Math.max(...allY);\n\n if (!hasExplicitMinX) {\n minX = hasSyntheticIndexAxis\n ? 0\n : chart.categoryAxis?.crosses === \"autoZero\"\n ? Math.min(0, minX)\n : minX;\n }\n if (!hasExplicitMaxX) {\n maxX = hasSyntheticIndexAxis\n ? Math.max(maxX, syntheticPointCount + 1)\n : chart.categoryAxis?.crosses === \"autoZero\"\n ? Math.max(0, maxX)\n : maxX;\n }\n if (!hasExplicitMinY && chart.valueAxis?.crosses === \"autoZero\") {\n minY = Math.min(0, minY);\n }\n if (!hasExplicitMaxY && chart.valueAxis?.crosses === \"autoZero\") {\n maxY = Math.max(0, maxY);\n }\n\n if (maxX <= minX) {\n maxX = minX + 1;\n }\n if (maxY <= minY) {\n maxY = minY + 1;\n }\n\n const xStep = typeof chart.categoryAxis?.majorUnit === \"number\" && chart.categoryAxis.majorUnit > 0\n ? chart.categoryAxis.majorUnit\n : buildNiceStep(minX, maxX, 5);\n const yStep = typeof chart.valueAxis?.majorUnit === \"number\" && chart.valueAxis.majorUnit > 0\n ? chart.valueAxis.majorUnit\n : buildNiceStep(minY, maxY, 5);\n\n if (!hasExplicitMinX && !hasSyntheticIndexAxis && Number.isFinite(xStep) && xStep > 0) {\n minX = Math.floor(minX / xStep) * xStep;\n }\n if (!hasExplicitMaxX && !hasSyntheticIndexAxis && Number.isFinite(xStep) && xStep > 0) {\n maxX = Math.ceil(maxX / xStep) * xStep;\n }\n if (!hasExplicitMinY && Number.isFinite(yStep) && yStep > 0) {\n minY = Math.floor(minY / yStep) * yStep;\n }\n if (!hasExplicitMaxY && Number.isFinite(yStep) && yStep > 0) {\n maxY = Math.ceil(maxY / yStep) * yStep;\n }\n\n const safeMaxX = maxX <= minX ? minX + 1 : maxX;\n const safeMaxY = maxY <= minY ? minY + 1 : maxY;\n\n const xScale = scaleLinear().domain([minX, safeMaxX]).range([plot.left, plot.left + plot.width]);\n const yScale = scaleLinear().domain([minY, safeMaxY]).range([plot.top + plot.height, plot.top]);\n const xMajorUnit = typeof chart.categoryAxis?.majorUnit === \"number\" && chart.categoryAxis.majorUnit > 0\n ? chart.categoryAxis.majorUnit\n : hasSyntheticIndexAxis\n ? 1\n : undefined;\n const yMajorUnit = typeof chart.valueAxis?.majorUnit === \"number\" && chart.valueAxis.majorUnit > 0\n ? chart.valueAxis.majorUnit\n : buildNiceStep(minY, safeMaxY, 6);\n const xTicks = buildNumericTickValues(minX, safeMaxX, xMajorUnit);\n const yTicks = buildNumericTickValues(minY, safeMaxY, yMajorUnit);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n\n const hasZeroX = minX <= 0 && safeMaxX >= 0;\n const hasZeroY = minY <= 0 && safeMaxY >= 0;\n\n return (\n <g>\n {xTicks.map((tick) => (\n <g key={`scatter-x-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.7)}\n strokeWidth={1}\n x1={xScale(tick)}\n x2={xScale(tick)}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n <text fill={labelColor} fontSize={10} textAnchor=\"middle\" x={xScale(tick)} y={plot.top + plot.height + 14}>\n {formatTickValue(tick)}\n </text>\n </g>\n ))}\n {yTicks.map((tick) => (\n <g key={`scatter-y-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.7)}\n strokeWidth={1}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={yScale(tick)}\n y2={yScale(tick)}\n />\n <text fill={labelColor} fontSize={10} textAnchor=\"end\" x={plot.left - 6} y={yScale(tick) + 3}>\n {formatTickValue(tick)}\n </text>\n </g>\n ))}\n {hasZeroY ? (\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={yScale(0)}\n y2={yScale(0)}\n />\n ) : null}\n {hasZeroX ? (\n <line\n stroke={axisColor}\n strokeWidth={1.2}\n x1={xScale(0)}\n x2={xScale(0)}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n ) : null}\n {pointsBySeries.map((seriesPoints, seriesIndex) => {\n const series = seriesPoints.series;\n const markerSize = Math.max(5, series.markerSize ?? 7);\n const markerPath = markerSymbolPath(\n normalizeChartMarkerSymbol(series.markerSymbol),\n markerSize * 0.55\n );\n const markerFill = series.lineColor ?? series.markerColor ?? series.color ?? chartSeriesStrokeColor(chart, seriesIndex);\n const shouldDrawLine = !titleForcesMarkerOnly\n && styleDrawsLine\n && series.shapeProperties?.xmlLineHidden !== true\n && seriesPoints.points.length > 1;\n const shouldDrawMarkers = !titleForcesNoMarkers\n && (titleForcesMarkerOnly || titleForcesWithMarkers || styleShowsMarkers)\n && markerPath.length > 0;\n const lineCurve = smooth || styleUsesSmoothCurve || series.smooth === true\n ? curveCatmullRom.alpha(0.5)\n : curveLinear;\n const linePath = shouldDrawLine\n ? d3Line<{ x: number; y: number }>()\n .x((point) => xScale(point.x))\n .y((point) => yScale(point.y))\n .curve(lineCurve)(seriesPoints.points) ?? \"\"\n : \"\";\n\n return (\n <g key={`scatter-series-${seriesIndex}`}>\n {shouldDrawLine && linePath.length > 0 ? (\n <path\n d={linePath}\n fill=\"none\"\n stroke={series.lineColor ?? chartSeriesStrokeColor(chart, seriesIndex)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={Math.max(1.2, series.lineWidthPx ?? 2)}\n />\n ) : null}\n {seriesPoints.points.map((point, pointIndex) => {\n if (!shouldDrawMarkers) {\n return null;\n }\n return (\n <g\n key={`scatter-point-${seriesIndex}-${pointIndex}`}\n transform={`translate(${xScale(point.x)}, ${yScale(point.y)})`}\n >\n <path\n d={markerPath}\n fill={markerFill}\n stroke=\"none\"\n strokeWidth={0}\n />\n </g>\n );\n })}\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderBubbleChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const plot = layout.plot;\n const pointsBySeries = chart.series.map((series) => (\n series.values.map((value, index) => {\n const x = safeNumber(series.categories[index]);\n const y = safeNumber(value);\n const bubble = safeNumber(series.bubbleSizes?.[index]);\n return x == null || y == null ? null : { bubble: bubble ?? 1, index, x, y };\n }).filter((point): point is { bubble: number; index: number; x: number; y: number } => point != null)\n ));\n\n const allX = pointsBySeries.flatMap((points) => points.map((point) => point.x));\n const allY = pointsBySeries.flatMap((points) => points.map((point) => point.y));\n const allBubble = pointsBySeries.flatMap((points) => points.map((point) => point.bubble));\n if (allX.length === 0 || allY.length === 0) {\n return null;\n }\n const minX = Math.min(...allX);\n const maxX = Math.max(...allX);\n const minY = Math.min(...allY);\n const maxY = Math.max(...allY);\n const bubbleMagnitudes = allBubble.map((value) => Math.sqrt(Math.max(0, value)));\n const minBubbleMagnitude = Math.min(...bubbleMagnitudes);\n const maxBubbleMagnitude = Math.max(...bubbleMagnitudes);\n\n const bubbleScaleFactor = clamp((chart.bubbleScale ?? 100) / 100, 0.2, 4);\n const minRadius = 4;\n const maxRadius = Math.max(minRadius + 2, 12 * bubbleScaleFactor);\n const radiusScale = scaleLinear()\n .domain([minBubbleMagnitude, maxBubbleMagnitude <= minBubbleMagnitude ? minBubbleMagnitude + 1 : maxBubbleMagnitude])\n .range([minRadius, maxRadius]);\n const safeMaxX = maxX <= minX ? minX + 1 : maxX;\n const safeMaxY = maxY <= minY ? minY + 1 : maxY;\n const xSpan = safeMaxX - minX;\n const ySpan = safeMaxY - minY;\n const xPad = Math.max(xSpan * 0.04, (xSpan * maxRadius) / Math.max(1, plot.width));\n const yPad = Math.max(ySpan * 0.06, (ySpan * maxRadius) / Math.max(1, plot.height));\n const xDomain = resolveAxisDomainWithChartOverrides(\n chart.categoryAxis,\n minX - xPad,\n safeMaxX + xPad,\n chart.categoryAxis?.crosses === \"autoZero\"\n );\n const yDomain = resolveAxisDomainWithChartOverrides(\n chart.valueAxis,\n minY - yPad,\n safeMaxY + yPad,\n chart.valueAxis?.crosses === \"autoZero\"\n );\n const xScale = scaleLinear().domain([xDomain.min, xDomain.max]).range([plot.left, plot.left + plot.width]);\n const yScale = scaleLinear().domain([yDomain.min, yDomain.max]).range([plot.top + plot.height, plot.top]);\n\n const xTicks = xDomain.ticks;\n const yTicks = yDomain.ticks;\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n const isBubble3d = chart.bubble3d === true || chart.is3d === true;\n const labelsEnabled = Boolean(\n chart.dataLabels?.showCategoryName\n || chart.dataLabels?.showSeriesName\n || chart.dataLabels?.showValue\n || chart.dataLabels?.showBubbleSize\n || chart.dataLabels?.showPercent\n );\n const bubbleTotals = pointsBySeries.map((points) => (\n points.reduce((sum, point) => sum + Math.abs(point.bubble), 0)\n ));\n\n return (\n <g>\n {xTicks.map((tick) => (\n <g key={`bubble-x-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.72)}\n strokeWidth={1}\n x1={xScale(tick)}\n x2={xScale(tick)}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n <text fill={labelColor} fontSize={10} textAnchor=\"middle\" x={xScale(tick)} y={plot.top + plot.height + 14}>\n {formatTickValue(tick)}\n </text>\n </g>\n ))}\n {yTicks.map((tick) => (\n <g key={`bubble-y-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.72)}\n strokeWidth={1}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={yScale(tick)}\n y2={yScale(tick)}\n />\n <text fill={labelColor} fontSize={10} textAnchor=\"end\" x={plot.left - 6} y={yScale(tick) + 3}>\n {formatTickValue(tick)}\n </text>\n </g>\n ))}\n <line stroke={axisColor} strokeWidth={1.2} x1={plot.left} x2={plot.left + plot.width} y1={plot.top + plot.height} y2={plot.top + plot.height} />\n <line stroke={axisColor} strokeWidth={1.2} x1={plot.left} x2={plot.left} y1={plot.top} y2={plot.top + plot.height} />\n {pointsBySeries.map((points, seriesIndex) => (\n <g key={`bubble-series-${seriesIndex}`}>\n {isBubble3d ? (\n <defs>\n <radialGradient id={`bubble3d-grad-${chart.id}-${seriesIndex}`} cx=\"35%\" cy=\"30%\" r=\"70%\">\n <stop offset=\"0%\" stopColor={lightenColor(chart.series[seriesIndex]?.color ?? chart.series[seriesIndex]?.lineColor ?? chartSeriesColor(chart, seriesIndex), 0.42)} />\n <stop offset=\"58%\" stopColor={chart.series[seriesIndex]?.color ?? chart.series[seriesIndex]?.lineColor ?? chartSeriesColor(chart, seriesIndex)} />\n <stop offset=\"100%\" stopColor={darkenColor(chart.series[seriesIndex]?.color ?? chart.series[seriesIndex]?.lineColor ?? chartSeriesColor(chart, seriesIndex), 0.18)} />\n </radialGradient>\n </defs>\n ) : null}\n {[...points]\n .sort((left, right) => {\n if (left.bubble !== right.bubble) {\n return right.bubble - left.bubble;\n }\n return left.index - right.index;\n })\n .map((point) => {\n const series = chart.series[seriesIndex];\n const baseColor = series?.color ?? series?.lineColor ?? chartSeriesColor(chart, seriesIndex);\n const radius = radiusScale(Math.sqrt(Math.max(0, point.bubble)));\n const pieces: string[] = [];\n if (chart.dataLabels?.showSeriesName && series?.name) {\n pieces.push(series.name);\n }\n if (chart.dataLabels?.showCategoryName) {\n pieces.push(formatTickValue(point.x));\n }\n if (chart.dataLabels?.showValue) {\n pieces.push(formatTickValue(point.y));\n }\n if (chart.dataLabels?.showBubbleSize) {\n pieces.push(formatTickValue(point.bubble));\n }\n if (chart.dataLabels?.showPercent) {\n pieces.push(`${Math.round((Math.abs(point.bubble) / Math.max(1, bubbleTotals[seriesIndex] ?? 1)) * 100)}%`);\n }\n return (\n <g key={`bubble-${seriesIndex}-${point.index}`}>\n <circle\n cx={xScale(point.x)}\n cy={yScale(point.y)}\n fill={isBubble3d ? `url(#bubble3d-grad-${chart.id}-${seriesIndex})` : baseColor}\n fillOpacity={isBubble3d ? 0.98 : 0.78}\n r={radius}\n stroke={darkenColor(baseColor, 0.18)}\n strokeWidth={isBubble3d ? 1.2 : 1}\n />\n {isBubble3d ? (\n <ellipse\n cx={xScale(point.x) - radius * 0.16}\n cy={yScale(point.y) - radius * 0.22}\n fill=\"#ffffff\"\n opacity={0.22}\n rx={Math.max(1.5, radius * 0.34)}\n ry={Math.max(1, radius * 0.2)}\n />\n ) : null}\n {labelsEnabled && pieces.length > 0 ? (\n <text\n fill={resolveChartTextColor(chart)}\n fontSize={10}\n textAnchor=\"start\"\n x={xScale(point.x) + radius + 4}\n y={yScale(point.y) + 3}\n >\n {pieces.join(\", \")}\n </text>\n ) : null}\n </g>\n );\n })}\n </g>\n ))}\n </g>\n );\n}\n\nfunction renderRadarChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n if (chart.series.length === 0) {\n return null;\n }\n const categories = getCategoryLabels(chart);\n if (categories.length === 0) {\n return null;\n }\n const plot = layout.plot;\n const centerX = plot.left + plot.width * 0.5;\n const centerY = plot.top + plot.height * 0.52;\n const radius = Math.max(22, Math.min(plot.width, plot.height) * 0.38);\n const values = chart.series.flatMap((series) => (\n series.values\n .slice(0, categories.length)\n .map((value) => safeNumber(value))\n .filter((value): value is number => value != null)\n ));\n const hasExplicitMin = typeof chart.valueAxis?.min === \"number\" && Number.isFinite(chart.valueAxis.min);\n const hasExplicitMax = typeof chart.valueAxis?.max === \"number\" && Number.isFinite(chart.valueAxis.max);\n let minValue = hasExplicitMin\n ? Number(chart.valueAxis?.min)\n : Math.min(0, ...(values.length ? values : [0]));\n let maxValue = hasExplicitMax\n ? Number(chart.valueAxis?.max)\n : Math.max(1, ...(values.length ? values : [1]));\n if (chart.valueAxis?.crosses === \"autoZero\") {\n minValue = Math.min(0, minValue);\n }\n const safeMax = maxValue <= minValue ? minValue + 1 : maxValue;\n const span = Math.max(1e-6, safeMax - minValue);\n const candidateMajorUnit = typeof chart.valueAxis?.majorUnit === \"number\" && chart.valueAxis.majorUnit > 0\n ? chart.valueAxis.majorUnit\n : undefined;\n const preferredMajorUnit = candidateMajorUnit && span / candidateMajorUnit >= 3\n ? candidateMajorUnit\n : buildNiceStep(minValue, safeMax, 6);\n const ticks = buildNumericTickValues(minValue, safeMax, preferredMajorUnit);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n const filled = chart.radarStyle === \"filled\";\n const showSpokes = chart.categoryAxis?.majorGridlines === true;\n\n const angleAt = (index: number) => (Math.PI * 2 * index) / categories.length - Math.PI / 2;\n const radialPoint = (index: number, valueRatio: number) => {\n const angle = angleAt(index);\n const r = radius * valueRatio;\n return {\n x: centerX + Math.cos(angle) * r,\n y: centerY + Math.sin(angle) * r\n };\n };\n\n return (\n <g>\n {ticks.map((tick, ringIndex) => {\n const ratio = (tick - minValue) / (safeMax - minValue);\n const ringPoints = categories.map((_, categoryIndex) => radialPoint(categoryIndex, ratio));\n const ringPath = d3Line<{ x: number; y: number }>()\n .x((point) => point.x)\n .y((point) => point.y)\n .curve(curveLinearClosed)(ringPoints) ?? \"\";\n return (\n <g key={`radar-ring-${ringIndex}`}>\n <path\n d={ringPath}\n fill={ringIndex % 2 === 0 ? \"transparent\" : lightenColor(chart.chartAreaFillColor ?? palette.surface, 0.04)}\n stroke={lightenColor(axisColor, 0.5)}\n strokeWidth={1}\n />\n <text fill={labelColor} fontSize={9} x={centerX + 4} y={centerY - radius * ratio + 3}>\n {formatTickValue(tick)}\n </text>\n </g>\n );\n })}\n {categories.map((category, categoryIndex) => {\n const edge = radialPoint(categoryIndex, 1);\n return (\n <g key={`radar-axis-${categoryIndex}`}>\n {showSpokes ? (\n <line stroke={lightenColor(axisColor, 0.52)} strokeWidth={1} x1={centerX} x2={edge.x} y1={centerY} y2={edge.y} />\n ) : null}\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={centerX + (edge.x - centerX) * 1.1}\n y={centerY + (edge.y - centerY) * 1.1}\n >\n {category}\n </text>\n </g>\n );\n })}\n {chart.series.map((series, seriesIndex) => {\n const points = categories.map((_, categoryIndex) => {\n const rawValue = safeNumber(series.values[categoryIndex]);\n if (rawValue == null) {\n return {\n defined: false,\n ...radialPoint(categoryIndex, 0)\n };\n }\n const ratio = clamp((rawValue - minValue) / (safeMax - minValue), 0, 1);\n return {\n defined: true,\n ...radialPoint(categoryIndex, ratio)\n };\n });\n const definedPoints = points.filter((point) => point.defined);\n if (definedPoints.length === 0) {\n return null;\n }\n const hasGap = points.some((point) => !point.defined);\n const polygon = d3Line<{ defined: boolean; x: number; y: number }>()\n .defined((point) => point.defined)\n .x((point) => point.x)\n .y((point) => point.y)\n .curve(hasGap ? curveLinear : curveLinearClosed)(points) ?? \"\";\n const color = chartSeriesColor(chart, seriesIndex);\n const markerSymbol = normalizeChartMarkerSymbol(series.markerSymbol);\n const markerSize = Math.max(4, series.markerSize ?? 6);\n const markerPath = markerSymbolPath(markerSymbol, markerSize * 0.5);\n const showMarkers = markerSymbol !== \"none\" && markerPath.length > 0;\n return (\n <g key={`radar-series-${seriesIndex}`}>\n {definedPoints.length >= 2 ? (\n <path\n d={polygon}\n fill={filled && !hasGap && definedPoints.length >= 3 ? color : \"none\"}\n fillOpacity={filled ? 0.26 : 0}\n stroke={chartSeriesStrokeColor(chart, seriesIndex)}\n strokeWidth={1.8}\n />\n ) : null}\n {showMarkers\n ? definedPoints.map((point, pointIndex) => (\n <g\n key={`radar-point-${seriesIndex}-${pointIndex}`}\n transform={`translate(${point.x}, ${point.y})`}\n >\n <path\n d={markerPath}\n fill={series.markerColor ?? color}\n stroke={series.markerLineColor ?? chart.chartAreaFillColor ?? palette.surface}\n strokeWidth={1}\n />\n </g>\n ))\n : null}\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderPieChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout, chartType: string) {\n const pieSeriesIndex = selectPrimaryPieSeriesIndex(chart);\n const pieSeries = chart.series[pieSeriesIndex];\n const pieData = buildPieEntries(chart, pieSeriesIndex);\n if (pieData.length === 0) {\n return null;\n }\n\n const legendOnRight = layout.legendPosition === \"right\";\n const centerX = legendOnRight ? layout.plot.left + layout.plot.width * 0.42 : layout.plot.left + layout.plot.width * 0.5;\n const centerY = layout.plot.top + layout.plot.height * 0.54;\n const outerRadius = Math.max(16, Math.min(layout.plot.width, layout.plot.height) * (chartType === \"Doughnut\" ? 0.32 : 0.38));\n const innerRatio = chartType === \"Doughnut\" ? clamp((chart.holeSize ?? 56) / 100, 0.1, 0.9) : 0;\n const innerRadius = outerRadius * innerRatio;\n const startAngle = ((chart.firstSliceAngle ?? 0) * Math.PI) / 180;\n const arcs = d3Pie<{ color: string; index: number; label: string; value: number }>()\n .value((entry) => entry.value)\n .sort(null)\n .startAngle(startAngle)\n .endAngle(startAngle + Math.PI * 2)(pieData);\n\n const arcPath = d3Arc<typeof arcs[number]>()\n .innerRadius(innerRadius)\n .outerRadius(outerRadius);\n\n const isPie3d = chartType === \"Pie3D\" || (chartType === \"PieExploded\" && chart.is3d === true);\n const rotX = chart.view3d?.rotX ?? 20;\n const perspective = chart.view3d?.perspective ?? 30;\n const tiltFromRotX = clamp(0.14 + (rotX / 90) * 0.72, 0.12, 0.92);\n const perspectiveCompression = clamp(1 - (perspective / 180), 0.55, 1);\n const tilt = isPie3d ? clamp(tiltFromRotX * perspectiveCompression, 0.14, 0.78) : 1;\n const depthScale = (chart.view3d?.depthPercent ?? 100) / 100;\n const depth = isPie3d ? Math.max(9, outerRadius * 0.28 * depthScale) : 0;\n const dataLabelsEnabled = Boolean(chart.dataLabels?.showCategoryName || chart.dataLabels?.showPercent || chart.dataLabels?.showValue);\n const total = pieData.reduce((sum, entry) => sum + entry.value, 0);\n const shadowId = `pie3d-shadow-${chart.id}`.replace(/[^A-Za-z0-9_-]/g, \"-\");\n const baseShadowId = `pie3d-base-shadow-${chart.id}`.replace(/[^A-Za-z0-9_-]/g, \"-\");\n const sliceSeparatorColor = chart.chartAreaFillColor ?? \"#ffffff\";\n const labelBounds = {\n bottom: layout.height - 6,\n left: 6,\n right: layout.width - 6,\n top: layout.plot.top + 8\n };\n const pointLabelByIndex = new Map((chart.dataLabels?.pointLabels ?? []).map((label) => [label.index, label]));\n const centerValuePointLabel = chartType === \"Doughnut\"\n ? (chart.dataLabels?.pointLabels ?? []).find((label) => (\n label.deleted !== true\n && label.showValue === true\n && label.showCategoryName !== true\n && label.showPercent !== true\n && label.showSeriesName !== true\n && label.showBubbleSize !== true\n )) ?? null\n : null;\n const centerValueEntry = centerValuePointLabel\n ? pieData.find((entry) => entry.index === centerValuePointLabel.index) ?? null\n : null;\n const shouldRenderCenterValue = chartType === \"Doughnut\" && centerValueEntry != null;\n const centerValueLooksPercent = centerValueEntry != null\n && total > 0\n && total <= 1.0000001\n && centerValueEntry.value >= 0\n && centerValueEntry.value <= 1.0000001;\n const centerValueText = centerValueEntry == null\n ? \"\"\n : centerValueLooksPercent\n ? `${Math.round(centerValueEntry.value * 100)}%`\n : formatTickValue(centerValueEntry.value);\n const centerValueFontSize = shouldRenderCenterValue\n ? Math.max(\n 14,\n Math.min(\n Math.max(20, innerRadius * 0.72),\n (centerValuePointLabel?.fontSizePt ?? 28) * 0.85\n )\n )\n : 0;\n\n const resolveSliceExplosion = (pointIndex: number) => {\n const pointStyle = pieSeries?.dataPointStyles?.find((entry) => entry.index === pointIndex);\n const seriesExplosion = typeof pieSeries?.shapeProperties?.xmlExplosion === \"number\"\n ? pieSeries.shapeProperties.xmlExplosion\n : 0;\n const rawExplosion = Math.max(0, pointStyle?.explosion ?? seriesExplosion ?? 0);\n if (rawExplosion <= 0) {\n return 0;\n }\n // OOXML explosion values are percent-like offsets of the pie radius.\n return outerRadius * clamp(rawExplosion / 100, 0, 4);\n };\n const hasExplodedSlices = arcs.some((arc) => resolveSliceExplosion(arc.data.index) > 0);\n const sliceSeparatorWidth = hasExplodedSlices ? 2 : 1.2;\n\n return (\n <g>\n {isPie3d ? (\n <defs>\n <filter id={shadowId} x=\"-40%\" y=\"-40%\" width=\"180%\" height=\"200%\">\n <feDropShadow dx=\"1.2\" dy=\"3.6\" floodColor=\"#000000\" floodOpacity=\"0.28\" stdDeviation=\"2.8\" />\n </filter>\n <filter id={baseShadowId} x=\"-50%\" y=\"-50%\" width=\"220%\" height=\"220%\">\n <feGaussianBlur stdDeviation=\"3.2\" />\n </filter>\n </defs>\n ) : null}\n {isPie3d ? (\n <ellipse\n cx={centerX}\n cy={centerY + depth + 3}\n fill=\"#000000\"\n filter={`url(#${baseShadowId})`}\n opacity={0.14}\n rx={outerRadius * 1.02}\n ry={outerRadius * tilt * 0.68}\n />\n ) : null}\n {isPie3d\n ? arcs.map((arc) => {\n const midAngle = (arc.startAngle + arc.endAngle) / 2;\n const explosion = resolveSliceExplosion(arc.data.index);\n const explodeX = Math.sin(midAngle) * explosion;\n const explodeY = -Math.cos(midAngle) * explosion * tilt;\n const sidePaths = buildPieOuterWallPath(\n centerX,\n centerY,\n outerRadius,\n tilt,\n depth,\n arc.startAngle,\n arc.endAngle,\n explosion > 0\n );\n if (sidePaths.length === 0) {\n return null;\n }\n return (\n <g key={`pie-side-${arc.data.index}`} transform={`translate(${explodeX}, ${explodeY})`}>\n {sidePaths.map((sidePath, sideIndex) => (\n <path\n d={sidePath}\n fill={darkenColor(arc.data.color, 0.34)}\n key={`pie-side-path-${arc.data.index}-${sideIndex}`}\n stroke={darkenColor(arc.data.color, 0.5)}\n strokeWidth={0.8}\n />\n ))}\n {explosion > 0 ? (() => {\n const startWall = buildPieRadialWallPath(\n centerX,\n centerY,\n outerRadius,\n tilt,\n depth,\n arc.startAngle,\n true\n );\n const endWall = buildPieRadialWallPath(\n centerX,\n centerY,\n outerRadius,\n tilt,\n depth,\n arc.endAngle,\n true\n );\n return (\n <>\n {startWall ? (\n <path\n d={startWall}\n fill={darkenColor(arc.data.color, 0.26)}\n stroke={darkenColor(arc.data.color, 0.44)}\n strokeWidth={0.8}\n />\n ) : null}\n {endWall ? (\n <path\n d={endWall}\n fill={darkenColor(arc.data.color, 0.2)}\n stroke={darkenColor(arc.data.color, 0.4)}\n strokeWidth={0.8}\n />\n ) : null}\n </>\n );\n })() : null}\n </g>\n );\n })\n : null}\n {arcs.map((arc) => {\n const explosion = resolveSliceExplosion(arc.data.index);\n const midAngle = (arc.startAngle + arc.endAngle) / 2;\n const explodeX = Math.sin(midAngle) * explosion;\n const explodeY = -Math.cos(midAngle) * explosion * (isPie3d ? tilt : 1);\n const labelRadius = outerRadius + (chartType === \"PieExploded\" ? 8 : 12);\n const labelX = centerX + Math.sin(midAngle) * labelRadius + explodeX;\n const labelY = centerY - Math.cos(midAngle) * labelRadius * (isPie3d ? tilt : 1) + explodeY;\n const pieces: string[] = [];\n if (chart.dataLabels?.showCategoryName && arc.data.label.trim().length > 0) {\n pieces.push(arc.data.label);\n }\n const pointLabel = pointLabelByIndex.get(arc.data.index);\n const showValue = pointLabel?.showValue ?? chart.dataLabels?.showValue;\n const showPercent = pointLabel?.showPercent ?? chart.dataLabels?.showPercent;\n if (showValue) {\n pieces.push(formatTickValue(arc.data.value));\n }\n if (showPercent) {\n pieces.push(`${Math.round((arc.data.value / Math.max(1, total)) * 100)}%`);\n }\n const labelText = pieces.join(\", \");\n const truncatedLabelText = truncateSvgText(labelText, Math.max(48, layout.width * 0.42), 10);\n const approxLabelWidth = Math.max(12, truncatedLabelText.length * 5.6);\n let labelAnchor: \"end\" | \"start\" = labelX >= centerX ? \"start\" : \"end\";\n let resolvedLabelX = labelX;\n if (labelAnchor === \"start\" && resolvedLabelX + approxLabelWidth > labelBounds.right) {\n labelAnchor = \"end\";\n }\n if (labelAnchor === \"end\" && resolvedLabelX - approxLabelWidth < labelBounds.left) {\n labelAnchor = \"start\";\n }\n resolvedLabelX = clamp(resolvedLabelX, labelBounds.left, labelBounds.right);\n const resolvedLabelY = clamp(labelY, labelBounds.top, labelBounds.bottom);\n return (\n <React.Fragment key={`pie-top-${arc.data.index}`}>\n <g transform={`translate(${explodeX}, ${explodeY})`}>\n <path\n d={(arcPath(arc) ?? \"\")}\n fill={arc.data.color}\n stroke={sliceSeparatorColor}\n strokeWidth={sliceSeparatorWidth}\n transform={`translate(${centerX}, ${centerY})${isPie3d ? ` scale(1, ${tilt})` : \"\"}`}\n filter={isPie3d ? `url(#${shadowId})` : undefined}\n />\n </g>\n {dataLabelsEnabled && truncatedLabelText.length > 0 ? (\n <text\n fill={resolveChartTextColor(chart)}\n fontSize={10}\n textAnchor={labelAnchor}\n x={resolvedLabelX}\n y={resolvedLabelY}\n >\n {truncatedLabelText}\n </text>\n ) : null}\n </React.Fragment>\n );\n })}\n {shouldRenderCenterValue ? (\n <text\n fill={chart.textColor ?? chart.titleColor ?? DEFAULT_CHART_TEXT_COLOR}\n fontSize={centerValueFontSize}\n fontWeight={700}\n textAnchor=\"middle\"\n x={centerX}\n y={centerY + centerValueFontSize * 0.34}\n >\n {centerValueText}\n </text>\n ) : null}\n </g>\n );\n}\n\nfunction renderBarOfPieChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const pieSeriesIndex = selectPrimaryPieSeriesIndex(chart);\n const pieSeries = chart.series[pieSeriesIndex];\n const categories = getCategoryLabels(chart);\n const values = pieSeries?.values.map((value) => Math.max(0, safeNumber(value) ?? 0)) ?? [];\n if (values.length === 0) {\n return null;\n }\n const raw = (chart.raw ?? {}) as Record<string, unknown>;\n const ofPieType = raw.ofPieType === \"pie\" ? \"pie\" : \"bar\";\n const splitPos = typeof raw.splitPos === \"number\" ? raw.splitPos : 0;\n let secondaryIndices = values\n .map((value, index) => ({ index, value }))\n .filter(({ value }) => value <= splitPos)\n .map(({ index }) => index);\n if (secondaryIndices.length === 0) {\n secondaryIndices = values\n .map((value, index) => ({ index, value }))\n .sort((left, right) => left.value - right.value)\n .slice(0, Math.min(2, values.length))\n .map(({ index }) => index);\n }\n const secondarySet = new Set(secondaryIndices);\n const secondaryTotal = secondaryIndices.reduce((sum, index) => sum + (values[index] ?? 0), 0);\n const primaryData = values.flatMap((value, index) => secondarySet.has(index)\n ? []\n : [{ color: chartPointColor(chart, index, pieSeriesIndex), label: categories[index], value }]);\n if (secondaryTotal > 0) {\n primaryData.push({\n color: chartPointColor(chart, secondaryIndices[0] ?? 0, pieSeriesIndex),\n label: \"Other\",\n value: secondaryTotal\n });\n }\n\n const pieCenterX = layout.plot.left + layout.plot.width * 0.28;\n const pieCenterY = layout.plot.top + layout.plot.height * 0.55;\n const pieRadius = Math.max(16, Math.min(layout.plot.height, layout.plot.width * 0.45) * 0.3);\n const arc = d3Arc<{ endAngle: number; startAngle: number }>().innerRadius(0).outerRadius(pieRadius);\n const pieArcs = d3Pie<{ color: string; label: string; value: number }>()\n .value((entry) => entry.value)\n .sort(null)\n .startAngle(((90 - (chart.firstSliceAngle ?? 0)) * Math.PI) / 180)\n .endAngle(((90 - (chart.firstSliceAngle ?? 0)) * Math.PI) / 180 + Math.PI * 2)(primaryData);\n\n const secondaryLabels = secondaryIndices.map((index) => categories[index] ?? \"\");\n const secondaryValues = secondaryIndices.map((index) => values[index] ?? 0);\n const connectorTargetX = layout.plot.left + layout.plot.width * 0.69;\n const secondaryData = secondaryIndices.map((index) => ({\n color: chartPointColor(chart, index, pieSeriesIndex),\n label: categories[index] ?? \"\",\n value: values[index] ?? 0\n }));\n const secondaryCenterX = layout.plot.left + layout.plot.width * 0.79;\n const secondaryCenterY = pieCenterY;\n const secondaryRadius = pieRadius * clamp(((typeof raw.secondPieSize === \"number\" ? raw.secondPieSize : 100) / 100), 0.55, 1.5);\n const secondaryArc = d3Arc<{ endAngle: number; startAngle: number }>().innerRadius(0).outerRadius(secondaryRadius);\n const secondaryPieArcs = d3Pie<{ color: string; label: string; value: number }>()\n .value((entry) => entry.value)\n .sort(null)\n .startAngle(((90 - (chart.firstSliceAngle ?? 0)) * Math.PI) / 180)\n .endAngle(((90 - (chart.firstSliceAngle ?? 0)) * Math.PI) / 180 + Math.PI * 2)(secondaryData);\n const stackedBarLeft = layout.plot.left + layout.plot.width * 0.72;\n const stackedBarWidth = Math.max(20, layout.plot.width * 0.13);\n const stackedBarTop = layout.plot.top + 16;\n const stackedBarHeight = Math.max(28, layout.plot.height - 32);\n const secondaryTotalSafe = Math.max(1e-6, secondaryTotal);\n let stackCursor = stackedBarTop;\n\n return (\n <g>\n {pieArcs.map((entry, index) => (\n <path\n key={`bar-of-pie-main-${index}`}\n d={arc(entry) ?? \"\"}\n fill={entry.data.color}\n stroke={chart.chartAreaFillColor ?? palette.surface}\n strokeWidth={1}\n transform={`translate(${pieCenterX}, ${pieCenterY})`}\n />\n ))}\n <line\n stroke={chart.chartAreaBorderColor ?? palette.border}\n strokeWidth={1}\n x1={pieCenterX + pieRadius}\n x2={connectorTargetX}\n y1={pieCenterY - pieRadius * 0.4}\n y2={layout.plot.top + 10}\n />\n <line\n stroke={chart.chartAreaBorderColor ?? palette.border}\n strokeWidth={1}\n x1={pieCenterX + pieRadius}\n x2={connectorTargetX}\n y1={pieCenterY + pieRadius * 0.4}\n y2={layout.plot.top + layout.plot.height - 10}\n />\n {ofPieType === \"pie\"\n ? secondaryPieArcs.map((entry, index) => (\n <path\n key={`bar-of-pie-secondary-pie-${index}`}\n d={secondaryArc(entry) ?? \"\"}\n fill={entry.data.color}\n stroke={chart.chartAreaFillColor ?? palette.surface}\n strokeWidth={1}\n transform={`translate(${secondaryCenterX}, ${secondaryCenterY})`}\n />\n ))\n : secondaryData.map((entry, index) => {\n const segmentHeight = index === secondaryData.length - 1\n ? Math.max(1, stackedBarTop + stackedBarHeight - stackCursor)\n : Math.max(1, (entry.value / secondaryTotalSafe) * stackedBarHeight);\n const y = stackCursor;\n stackCursor += segmentHeight;\n return (\n <g key={`bar-of-pie-secondary-bar-${index}`}>\n <rect\n fill={entry.color}\n height={segmentHeight}\n stroke={chart.chartAreaFillColor ?? palette.surface}\n strokeWidth={1}\n width={stackedBarWidth}\n x={stackedBarLeft}\n y={y}\n />\n <text\n fill={resolveChartAxisTextColor(chart)}\n fontSize={10}\n textAnchor=\"start\"\n x={stackedBarLeft + stackedBarWidth + 6}\n y={y + segmentHeight * 0.5 + 3}\n >\n {entry.label}\n </text>\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderSurfaceChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const plot = resolveSurfacePlotRect(chart, layout);\n const categories = getCategoryLabels(chart);\n const rows = chart.series.length;\n const cols = Math.max(\n categories.length,\n chart.series.reduce((max, series) => Math.max(max, series.values.length), 0)\n );\n if (rows === 0 || cols === 0) {\n return null;\n }\n const matrix = chart.series.map((series) => (\n Array.from({ length: cols }, (_, columnIndex) => safeNumber(series.values[columnIndex]))\n ));\n const domain = getSurfaceDomain(chart);\n if (!domain) {\n return null;\n }\n const isContour = isContourSurfaceChart(chart);\n const minValue = domain.minValue;\n const safeMax = domain.safeMax;\n const wallFill = chart.backWall?.fillColor ?? \"#d9d9df\";\n const wallLineColor = chart.backWall?.lineColor ?? chart.sideWall?.lineColor ?? chart.floor?.lineColor ?? (chart.axisLineColor ?? lightenColor(resolveSurfaceBaseColor(chart, palette), 0.4));\n\n if (isContour) {\n const thresholds = domain.ticks.slice(1, -1);\n const quads: React.ReactNode[] = [];\n const contourSegmentsByThreshold = new Map<number, SurfaceContourSegment[]>();\n\n for (let rowIndex = 0; rowIndex < rows - 1; rowIndex += 1) {\n for (let columnIndex = 0; columnIndex < cols - 1; columnIndex += 1) {\n const p00 = matrix[rowIndex]?.[columnIndex];\n const p10 = matrix[rowIndex]?.[columnIndex + 1];\n const p01 = matrix[rowIndex + 1]?.[columnIndex];\n const p11 = matrix[rowIndex + 1]?.[columnIndex + 1];\n if (p00 == null || p10 == null || p01 == null || p11 == null) {\n continue;\n }\n\n const x0 = plot.left + (columnIndex / Math.max(1, cols - 1)) * plot.width;\n const x1 = plot.left + ((columnIndex + 1) / Math.max(1, cols - 1)) * plot.width;\n const y0 = plot.top + plot.height - (rowIndex / Math.max(1, rows - 1)) * plot.height;\n const y1 = plot.top + plot.height - ((rowIndex + 1) / Math.max(1, rows - 1)) * plot.height;\n const averageValue = (p00 + p10 + p01 + p11) / 4;\n\n if (!chart.wireframe) {\n const primaryAvgA = (p00 + p10 + p11) / 3;\n const primaryAvgB = (p00 + p11 + p01) / 3;\n const secondaryAvgA = (p00 + p10 + p01) / 3;\n const secondaryAvgB = (p10 + p11 + p01) / 3;\n const primaryRange = (Math.max(p00, p10, p11) - Math.min(p00, p10, p11))\n + (Math.max(p00, p11, p01) - Math.min(p00, p11, p01));\n const secondaryRange = (Math.max(p00, p10, p01) - Math.min(p00, p10, p01))\n + (Math.max(p10, p11, p01) - Math.min(p10, p11, p01));\n const usePrimaryDiagonal = primaryRange <= secondaryRange;\n const triangles = usePrimaryDiagonal\n ? [\n {\n bandColor: resolveSurfaceBandColor(chart, palette, domain, primaryAvgA),\n bandIndex: resolveSurfaceBandIndex(domain, primaryAvgA),\n points: `${x0},${y0} ${x1},${y0} ${x1},${y1}`\n },\n {\n bandColor: resolveSurfaceBandColor(chart, palette, domain, primaryAvgB),\n bandIndex: resolveSurfaceBandIndex(domain, primaryAvgB),\n points: `${x0},${y0} ${x1},${y1} ${x0},${y1}`\n }\n ]\n : [\n {\n bandColor: resolveSurfaceBandColor(chart, palette, domain, secondaryAvgA),\n bandIndex: resolveSurfaceBandIndex(domain, secondaryAvgA),\n points: `${x0},${y0} ${x1},${y0} ${x0},${y1}`\n },\n {\n bandColor: resolveSurfaceBandColor(chart, palette, domain, secondaryAvgB),\n bandIndex: resolveSurfaceBandIndex(domain, secondaryAvgB),\n points: `${x1},${y0} ${x1},${y1} ${x0},${y1}`\n }\n ];\n const splitLine = usePrimaryDiagonal\n ? { x1: x0, y1: y0, x2: x1, y2: y1 }\n : { x1: x1, y1: y0, x2: x0, y2: y1 };\n const splitBands = triangles[0]?.bandIndex !== triangles[1]?.bandIndex;\n quads.push(\n <g key={`surface-contour-cell-${rowIndex}-${columnIndex}`}>\n {splitBands ? (\n <>\n <polygon fill={triangles[0]?.bandColor} points={triangles[0]?.points} stroke=\"none\" />\n <polygon fill={triangles[1]?.bandColor} points={triangles[1]?.points} stroke=\"none\" />\n <line\n stroke={darkenColor(resolveSurfaceBandPaletteColor(chart, palette, domain, averageValue), 0.22)}\n strokeWidth={0.8}\n x1={splitLine.x1}\n x2={splitLine.x2}\n y1={splitLine.y1}\n y2={splitLine.y2}\n />\n </>\n ) : (\n <rect\n fill={resolveSurfaceBandColor(chart, palette, domain, averageValue)}\n height={Math.abs(y1 - y0)}\n stroke=\"none\"\n width={Math.abs(x1 - x0)}\n x={Math.min(x0, x1)}\n y={Math.min(y0, y1)}\n />\n )}\n </g>\n );\n }\n\n const corners = [\n { value: p00, x: x0, y: y0 },\n { value: p10, x: x1, y: y0 },\n { value: p11, x: x1, y: y1 },\n { value: p01, x: x0, y: y1 }\n ];\n const edges: Array<[typeof corners[number], typeof corners[number]]> = [\n [corners[0], corners[1]],\n [corners[1], corners[2]],\n [corners[2], corners[3]],\n [corners[3], corners[0]]\n ];\n thresholds.forEach((threshold) => {\n const intersections: Array<{ x: number; y: number }> = [];\n edges.forEach(([start, end]) => {\n const delta = end.value - start.value;\n if (delta === 0) {\n return;\n }\n const crosses = (start.value < threshold && end.value > threshold) || (start.value > threshold && end.value < threshold);\n if (!crosses) {\n return;\n }\n const mix = (threshold - start.value) / delta;\n intersections.push({\n x: start.x + (end.x - start.x) * mix,\n y: start.y + (end.y - start.y) * mix\n });\n });\n if (intersections.length === 2) {\n const segments = contourSegmentsByThreshold.get(threshold) ?? [];\n segments.push({\n end: intersections[1] ?? intersections[0] ?? { x: x1, y: y1 },\n start: intersections[0] ?? { x: x0, y: y0 }\n });\n contourSegmentsByThreshold.set(threshold, segments);\n } else if (intersections.length === 4) {\n const center = averageValue;\n const pairings = center >= threshold\n ? [[0, 1], [2, 3]]\n : [[0, 3], [1, 2]];\n pairings.forEach(([startIndex, endIndex], pairingIndex) => {\n const leftPoint = intersections[startIndex] ?? intersections[0];\n const rightPoint = intersections[endIndex] ?? intersections[intersections.length - 1];\n if (!leftPoint || !rightPoint) {\n return;\n }\n const segments = contourSegmentsByThreshold.get(threshold) ?? [];\n segments.push({\n end: rightPoint,\n start: leftPoint\n });\n contourSegmentsByThreshold.set(threshold, segments);\n });\n }\n });\n }\n }\n\n const contourLines = Array.from(contourSegmentsByThreshold.entries()).flatMap(([threshold, segments], thresholdIndex) => (\n connectSurfaceContourSegments(segments).map((points, pathIndex) => {\n const path = buildSurfaceSmoothPath(points, true);\n if (!path) {\n return null;\n }\n return (\n <path\n key={`surface-contour-line-${thresholdIndex}-${pathIndex}`}\n d={path}\n fill=\"none\"\n stroke={chart.wireframe\n ? resolveSurfaceWireframeColor(chart, palette, domain, threshold)\n : darkenColor(resolveSurfaceBandColor(chart, palette, domain, threshold), 0.18)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={chart.wireframe ? 1.45 : 1.2}\n />\n );\n })\n ));\n\n const columnAverages = Array.from({ length: cols }, (_, columnIndex) => {\n const values = Array.from({ length: rows }, (_, rowIndex) => matrix[rowIndex]?.[columnIndex])\n .filter((value): value is number => value != null);\n if (values.length === 0) {\n return domain.minValue;\n }\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n });\n const rowAverages = Array.from({ length: rows }, (_, rowIndex) => {\n const values = matrix[rowIndex]?.filter((value): value is number => value != null) ?? [];\n if (values.length === 0) {\n return domain.minValue;\n }\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n });\n\n return (\n <g>\n <rect\n fill={wallFill}\n height={plot.height}\n stroke={lightenColor(wallLineColor, 0.14)}\n strokeWidth={0.8}\n width={plot.width}\n x={plot.left}\n y={plot.top}\n />\n {Array.from({ length: cols }, (_, columnIndex) => {\n const x = plot.left + (cols <= 1 ? plot.width / 2 : (columnIndex / (cols - 1)) * plot.width);\n return (\n <line\n key={`surface-contour-grid-col-${columnIndex}`}\n stroke={chart.wireframe\n ? resolveSurfaceWireframeColor(chart, palette, domain, columnAverages[columnIndex] ?? domain.minValue)\n : lightenColor(wallLineColor, 0.18)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={chart.wireframe ? 1.15 : 0.8}\n x1={x}\n x2={x}\n y1={plot.top}\n y2={plot.top + plot.height}\n />\n );\n })}\n {Array.from({ length: rows }, (_, rowIndex) => {\n const y = plot.top + plot.height - (rows <= 1 ? plot.height / 2 : (rowIndex / (rows - 1)) * plot.height);\n const rowStroke = chart.series[rowIndex]?.lineColor\n ?? chart.series[rowIndex]?.color\n ?? resolveSurfaceWireframeColor(chart, palette, domain, rowAverages[rowIndex] ?? domain.minValue);\n return (\n <line\n key={`surface-contour-grid-row-${rowIndex}`}\n stroke={chart.wireframe ? rowStroke : lightenColor(wallLineColor, 0.18)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={chart.wireframe ? 1.15 : 0.8}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={y}\n y2={y}\n />\n );\n })}\n {quads}\n {contourLines}\n {chart.wireframe ? null : (\n <rect\n fill=\"none\"\n height={plot.height}\n stroke={lightenColor(wallLineColor, 0.1)}\n strokeWidth={0.8}\n width={plot.width}\n x={plot.left}\n y={plot.top}\n />\n )}\n </g>\n );\n }\n\n const rotX = clamp(chart.view3d?.rotX ?? (chart.wireframe ? 90 : 25), -88, 88) * (Math.PI / 180);\n const rotY = clamp(chart.view3d?.rotY ?? (chart.wireframe ? 0 : 30), -88, 88) * (Math.PI / 180);\n const usePerspective = chart.view3d?.rAngAx === false;\n const perspectiveStrength = clamp(\n (chart.view3d?.perspective ?? (usePerspective ? 30 : 0)) / 100,\n 0,\n 1\n );\n const depthScale = clamp((chart.view3d?.depthPercent ?? 100) / 100, 0.2, 4);\n const cosX = Math.cos(rotX);\n const sinX = Math.sin(rotX);\n const cosY = Math.cos(rotY);\n const sinY = Math.sin(rotY);\n\n type SurfacePoint = { depth: number; hasValue: boolean; value: number; x: number; y: number };\n const rawPoints: SurfacePoint[][] = Array.from({ length: rows }, (_, rowIndex) => (\n Array.from({ length: cols }, (_, columnIndex) => {\n const value = matrix[rowIndex][columnIndex];\n const hasValue = value != null;\n const normalizedX = cols <= 1 ? 0 : ((columnIndex / (cols - 1)) - 0.5) * 2;\n const normalizedY = hasValue ? (-((((value - minValue) / (safeMax - minValue)) - 0.5) * 1.8) * depthScale) : (0.9 * depthScale);\n const normalizedZ = rows <= 1 ? 0 : ((rowIndex / (rows - 1)) - 0.5) * 2;\n\n const x1 = normalizedX * cosY + normalizedZ * sinY;\n const z1 = -normalizedX * sinY + normalizedZ * cosY;\n const y1 = normalizedY * cosX - z1 * sinX;\n const z2 = normalizedY * sinX + z1 * cosX;\n const perspective = usePerspective\n ? 1 / Math.max(0.18, 1 + z2 * (0.24 + perspectiveStrength * 0.5))\n : 1;\n\n return {\n depth: z2,\n hasValue,\n value: value ?? minValue,\n x: x1 * perspective,\n y: y1 * perspective\n };\n })\n ));\n\n const bounds = rawPoints.flat();\n const minX = Math.min(...bounds.map((point) => point.x));\n const maxX = Math.max(...bounds.map((point) => point.x));\n const minY = Math.min(...bounds.map((point) => point.y));\n const maxY = Math.max(...bounds.map((point) => point.y));\n const scale = Math.min(\n layout.plot.width / Math.max(0.25, maxX - minX),\n layout.plot.height / Math.max(0.25, maxY - minY)\n ) * 0.82;\n const centerX = layout.plot.left + layout.plot.width / 2;\n const centerY = layout.plot.top + layout.plot.height / 2;\n const centerRawX = (minX + maxX) / 2;\n const centerRawY = (minY + maxY) / 2;\n\n const points = rawPoints.map((row) => row.map((point) => ({\n ...point,\n x: centerX + (point.x - centerRawX) * scale,\n y: centerY + (point.y - centerRawY) * scale\n })));\n\n const baseColor = resolveSurfaceBaseColor(chart, palette);\n const axisColor = chart.axisLineColor ?? lightenColor(baseColor, 0.4);\n type Quad = {\n color: string;\n depth: number;\n key: string;\n points: string;\n stroke: string;\n };\n const quads: Quad[] = [];\n for (let rowIndex = 0; rowIndex < rows - 1; rowIndex += 1) {\n for (let columnIndex = 0; columnIndex < cols - 1; columnIndex += 1) {\n const p00 = points[rowIndex][columnIndex];\n const p10 = points[rowIndex][columnIndex + 1];\n const p11 = points[rowIndex + 1][columnIndex + 1];\n const p01 = points[rowIndex + 1][columnIndex];\n if (!p00.hasValue || !p10.hasValue || !p11.hasValue || !p01.hasValue) {\n continue;\n }\n const averageValue = (p00.value + p10.value + p11.value + p01.value) / 4;\n const ratio = clamp((averageValue - minValue) / (safeMax - minValue), 0, 1);\n quads.push({\n color: resolveSurfaceColor(chart, palette, ratio),\n depth: (p00.depth + p10.depth + p11.depth + p01.depth) / 4,\n key: `surface-quad-${rowIndex}-${columnIndex}`,\n points: `${p00.x},${p00.y} ${p10.x},${p10.y} ${p11.x},${p11.y} ${p01.x},${p01.y}`,\n stroke: lightenColor(baseColor, 0.18)\n });\n }\n }\n quads.sort((left, right) => left.depth - right.depth);\n\n const surfaceContourLines = !isContour\n ? (() => {\n const contourSegmentsByThreshold = new Map<number, SurfaceContourSegment[]>();\n const thresholds = domain.ticks.slice(1, -1);\n for (let rowIndex = 0; rowIndex < rows - 1; rowIndex += 1) {\n for (let columnIndex = 0; columnIndex < cols - 1; columnIndex += 1) {\n const topLeft = points[rowIndex][columnIndex];\n const topRight = points[rowIndex][columnIndex + 1];\n const bottomRight = points[rowIndex + 1][columnIndex + 1];\n const bottomLeft = points[rowIndex + 1][columnIndex];\n if (!topLeft.hasValue || !topRight.hasValue || !bottomRight.hasValue || !bottomLeft.hasValue) {\n continue;\n }\n const corners = [\n { point: topLeft, value: topLeft.value },\n { point: topRight, value: topRight.value },\n { point: bottomRight, value: bottomRight.value },\n { point: bottomLeft, value: bottomLeft.value }\n ];\n const edges: Array<[typeof corners[number], typeof corners[number]]> = [\n [corners[0], corners[1]],\n [corners[1], corners[2]],\n [corners[2], corners[3]],\n [corners[3], corners[0]]\n ];\n thresholds.forEach((threshold) => {\n const intersections: SurfacePathPoint[] = [];\n edges.forEach(([start, end]) => {\n const delta = end.value - start.value;\n if (delta === 0) {\n return;\n }\n const crosses = (start.value < threshold && end.value > threshold) || (start.value > threshold && end.value < threshold);\n if (!crosses) {\n return;\n }\n const ratio = (threshold - start.value) / delta;\n intersections.push({\n x: start.point.x + (end.point.x - start.point.x) * ratio,\n y: start.point.y + (end.point.y - start.point.y) * ratio\n });\n });\n if (intersections.length === 2) {\n const segments = contourSegmentsByThreshold.get(threshold) ?? [];\n segments.push({\n end: intersections[1] ?? intersections[0] ?? { x: topRight.x, y: topRight.y },\n start: intersections[0] ?? { x: topLeft.x, y: topLeft.y }\n });\n contourSegmentsByThreshold.set(threshold, segments);\n } else if (intersections.length === 4) {\n const center = (topLeft.value + topRight.value + bottomRight.value + bottomLeft.value) / 4;\n const pairings = center >= threshold\n ? [[0, 1], [2, 3]]\n : [[0, 3], [1, 2]];\n pairings.forEach(([startIndex, endIndex]) => {\n const startPoint = intersections[startIndex] ?? intersections[0];\n const endPoint = intersections[endIndex] ?? intersections[intersections.length - 1];\n if (!startPoint || !endPoint) {\n return;\n }\n const segments = contourSegmentsByThreshold.get(threshold) ?? [];\n segments.push({\n end: endPoint,\n start: startPoint\n });\n contourSegmentsByThreshold.set(threshold, segments);\n });\n }\n });\n }\n }\n return Array.from(contourSegmentsByThreshold.entries()).flatMap(([threshold, segments], thresholdIndex) => (\n connectSurfaceContourSegments(segments).map((pathPoints, pathIndex) => {\n const path = buildSurfaceSmoothPath(pathPoints, true);\n if (!path) {\n return null;\n }\n return (\n <path\n key={`surface-level-line-${thresholdIndex}-${pathIndex}`}\n d={path}\n fill=\"none\"\n stroke={darkenColor(resolveSurfaceBandPaletteColor(chart, palette, domain, threshold), 0.26)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.55}\n />\n );\n })\n ));\n })()\n : [];\n\n const buildSurfacePathRuns = (\n segmentPoints: Array<{ depth: number; hasValue: boolean; value: number; x: number; y: number }>,\n keyPrefix: string,\n strokeColor: string,\n strokeWidth: number\n ) => (\n splitSurfacePointRuns(segmentPoints).map((run, runIndex) => {\n const path = buildSurfaceSmoothPath(run, chart.wireframe === true);\n if (!path) {\n return null;\n }\n return (\n <path\n key={`${keyPrefix}-${runIndex}`}\n d={path}\n fill=\"none\"\n stroke={strokeColor}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={strokeWidth}\n />\n );\n })\n );\n\n return (\n <g>\n {isContour ? (\n <>\n <rect\n fill={wallFill}\n height={layout.plot.height}\n stroke={lightenColor(axisColor, 0.18)}\n strokeWidth={0.8}\n width={layout.plot.width}\n x={layout.plot.left}\n y={layout.plot.top}\n />\n {Array.from({ length: cols }, (_, columnIndex) => {\n const x = layout.plot.left + (cols <= 1 ? layout.plot.width / 2 : (columnIndex / (cols - 1)) * layout.plot.width);\n return (\n <line\n key={`surface-fallback-column-grid-${columnIndex}`}\n stroke={lightenColor(wallLineColor, 0.12)}\n strokeWidth={0.8}\n x1={x}\n x2={x}\n y1={layout.plot.top}\n y2={layout.plot.top + layout.plot.height}\n />\n );\n })}\n {Array.from({ length: rows }, (_, rowIndex) => {\n const y = layout.plot.top + layout.plot.height - (rows <= 1 ? layout.plot.height / 2 : (rowIndex / (rows - 1)) * layout.plot.height);\n return (\n <line\n key={`surface-fallback-row-grid-${rowIndex}`}\n stroke={lightenColor(wallLineColor, 0.12)}\n strokeWidth={0.8}\n x1={layout.plot.left}\n x2={layout.plot.left + layout.plot.width}\n y1={y}\n y2={y}\n />\n );\n })}\n </>\n ) : null}\n {chart.wireframe ? null : quads.map((quad) => (\n <polygon\n key={quad.key}\n fill={quad.color}\n fillOpacity={0.95}\n points={quad.points}\n stroke={quad.stroke}\n strokeWidth={0.7}\n />\n ))}\n {Array.from({ length: rows }, (_, rowIndex) => {\n const rowPoints = points[rowIndex];\n const averageValue = matrix[rowIndex]\n ?.filter((value): value is number => value != null)\n .reduce((sum, value, _, values) => sum + value / Math.max(1, values.length), 0) ?? domain.minValue;\n const rowStroke = chart.wireframe\n ? (chart.series[rowIndex]?.lineColor\n ?? chart.series[rowIndex]?.color\n ?? resolveSurfaceWireframeColor(chart, palette, domain, averageValue))\n : darkenColor(resolveSurfaceBandColor(chart, palette, domain, averageValue), 0.1);\n return (\n <g key={`surface-row-${rowIndex}`}>\n {buildSurfacePathRuns(\n rowPoints,\n `surface-row-${rowIndex}`,\n rowStroke,\n chart.wireframe ? Math.max(1.45, chart.series[rowIndex]?.lineWidthPx ?? 1.8) : 0.8\n )}\n </g>\n );\n })}\n {Array.from({ length: cols }, (_, columnIndex) => {\n const columnPoints = Array.from({ length: rows }, (_, rowIndex) => points[rowIndex][columnIndex]);\n const columnValues = Array.from({ length: rows }, (_, rowIndex) => matrix[rowIndex]?.[columnIndex])\n .filter((value): value is number => value != null);\n const columnAverage = columnValues.length > 0\n ? columnValues.reduce((sum, value) => sum + value, 0) / columnValues.length\n : domain.minValue;\n const columnStroke = chart.wireframe\n ? resolveSurfaceWireframeColor(chart, palette, domain, columnAverage)\n : darkenColor(resolveSurfaceBandColor(chart, palette, domain, columnAverage), 0.1);\n return (\n <g key={`surface-column-${columnIndex}`}>\n {buildSurfacePathRuns(\n columnPoints,\n `surface-column-${columnIndex}`,\n columnStroke,\n chart.wireframe ? 1.35 : 0.8\n )}\n </g>\n );\n })}\n {surfaceContourLines}\n {chart.wireframe ? (\n <rect\n fill=\"none\"\n height={layout.plot.height}\n stroke={lightenColor(axisColor, 0.18)}\n strokeWidth={0.8}\n width={layout.plot.width}\n x={layout.plot.left}\n y={layout.plot.top}\n />\n ) : null}\n </g>\n );\n}\n\nfunction indexByName(series: XlsxChart[\"series\"], matcher: RegExp) {\n const index = series.findIndex((entry) => matcher.test((entry.name ?? \"\").toLowerCase()));\n return index >= 0 ? index : null;\n}\n\nfunction renderStockChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const categories = getCategoryLabels(chart);\n if (categories.length === 0 || chart.series.length < 2) {\n return null;\n }\n\n const roles = resolveStockRoleIndices(chart);\n const highIndex = roles.high ?? 0;\n const lowIndex = roles.low ?? Math.min(1, chart.series.length - 1);\n const closeIndex = roles.close ?? Math.min(2, chart.series.length - 1);\n const openIndex = roles.open;\n const volumeIndex = roles.volume != null && ![highIndex, lowIndex, closeIndex, openIndex].includes(roles.volume)\n ? roles.volume\n : null;\n const high = chart.series[highIndex];\n const low = chart.series[lowIndex];\n const close = chart.series[closeIndex];\n const open = openIndex != null ? chart.series[openIndex] : null;\n const volume = volumeIndex != null ? chart.series[volumeIndex] : null;\n\n const points = categories\n .map((category, index) => {\n const highValue = safeNumber(high.values[index]);\n const lowValue = safeNumber(low.values[index]);\n const closeValue = safeNumber(close.values[index]);\n const openValue = open ? safeNumber(open.values[index]) : null;\n const volumeValue = volume ? safeNumber(volume.values[index]) : null;\n if (highValue == null || lowValue == null || closeValue == null) {\n return null;\n }\n return {\n category,\n close: closeValue,\n high: highValue,\n low: lowValue,\n open: openValue,\n volume: volumeValue\n };\n })\n .filter((entry): entry is { category: string; close: number; high: number; low: number; open: number | null; volume: number | null } => entry != null);\n if (points.length === 0) {\n return null;\n }\n\n const plot = layout.plot;\n const hasVolume = volume != null && points.some((entry) => (entry.volume ?? 0) > 0);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const stockPalette = resolveStockPalette(chart, axisColor);\n const rawMinValue = hasVolume\n ? Math.min(0, ...points.flatMap((entry) => [entry.low, entry.close, entry.open ?? entry.close, entry.volume ?? 0]))\n : Math.min(...points.map((entry) => entry.low));\n const rawMaxValue = hasVolume\n ? Math.max(...points.flatMap((entry) => [entry.high, entry.close, entry.open ?? entry.close, entry.volume ?? 0]))\n : Math.max(...points.map((entry) => entry.high));\n const resolvedDomain = resolveNumericAxisDomain(\n typeof chart.valueAxis?.min === \"number\" && Number.isFinite(chart.valueAxis.min) ? chart.valueAxis.min : rawMinValue,\n typeof chart.valueAxis?.max === \"number\" && Number.isFinite(chart.valueAxis.max) ? chart.valueAxis.max : rawMaxValue,\n chart.valueAxis?.majorUnit,\n hasVolume\n );\n const yScale = scaleLinear()\n .domain([resolvedDomain.min, resolvedDomain.max])\n .range([plot.top + plot.height, plot.top]);\n const xScale = scaleBand<string>()\n .domain(categories)\n .range([plot.left, plot.left + plot.width])\n .paddingInner(0.28)\n .paddingOuter(0.18);\n const ticks = resolvedDomain.ticks;\n const labelColor = resolveChartAxisTextColor(chart);\n const openTickColor = stockPalette.openAccent;\n const closeTickColor = openIndex != null ? stockPalette.lineColor : stockPalette.closeAccent;\n const labelStep = Math.max(1, Math.ceil(categories.length / Math.max(4, Math.floor(plot.width / 68))));\n const zeroY = yScale(Math.max(resolvedDomain.min, 0));\n\n return (\n <g>\n {ticks.map((tick) => (\n <g key={`stock-tick-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.72)}\n strokeWidth={1}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={yScale(tick)}\n y2={yScale(tick)}\n />\n <text fill={labelColor} fontSize={10} textAnchor=\"end\" x={plot.left - 6} y={yScale(tick) + 3}>\n {formatTickValue(tick)}\n </text>\n </g>\n ))}\n {categories.map((category, index) => {\n if (index % labelStep !== 0 && index !== categories.length - 1) {\n return null;\n }\n const x = (xScale(category) ?? plot.left) + xScale.bandwidth() * 0.5;\n return (\n <text\n key={`stock-cat-${category}`}\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={x}\n y={plot.top + plot.height + 14}\n >\n {category}\n </text>\n );\n })}\n <line stroke={axisColor} strokeWidth={1.2} x1={plot.left} x2={plot.left} y1={plot.top} y2={plot.top + plot.height} />\n <line stroke={axisColor} strokeWidth={1.2} x1={plot.left} x2={plot.left + plot.width} y1={plot.top + plot.height} y2={plot.top + plot.height} />\n {points.map((entry, index) => {\n const x = (xScale(entry.category) ?? plot.left) + xScale.bandwidth() * 0.5;\n const previousClose = index > 0 ? points[index - 1]?.close ?? entry.close : entry.close;\n const isUp = entry.open != null\n ? entry.close >= entry.open\n : entry.close >= previousClose;\n const stroke = stockPalette.lineColor;\n const candleWidth = Math.max(5, xScale.bandwidth() * 0.56);\n const bodyLeft = x - candleWidth / 2;\n const openY = entry.open != null ? yScale(entry.open) : null;\n const closeY = yScale(entry.close);\n const highY = yScale(entry.high);\n const lowY = yScale(entry.low);\n return (\n <g key={`stock-point-${index}`}>\n {hasVolume && entry.volume != null ? (\n <rect\n fill={stockPalette.volumeFill}\n height={Math.max(1, zeroY - yScale(entry.volume))}\n opacity={0.94}\n stroke=\"none\"\n width={Math.max(3, xScale.bandwidth() * 0.64)}\n x={x - Math.max(3, xScale.bandwidth() * 0.64) / 2}\n y={yScale(entry.volume)}\n />\n ) : null}\n <line stroke={stroke} strokeWidth={1.6} x1={x} x2={x} y1={highY} y2={lowY} />\n {entry.open != null && openY != null ? (\n Math.abs(openY - closeY) >= 1 ? (\n <rect\n fill={isUp ? stockPalette.upFill : stockPalette.downFill}\n height={Math.max(1.4, Math.abs(closeY - openY))}\n stroke={stroke}\n strokeWidth={1.3}\n width={candleWidth}\n x={bodyLeft}\n y={Math.min(openY, closeY)}\n />\n ) : (\n <line stroke={stroke} strokeWidth={1.6} x1={bodyLeft} x2={bodyLeft + candleWidth} y1={closeY} y2={closeY} />\n )\n ) : (\n <line stroke={closeTickColor} strokeWidth={1.8} x1={x} x2={x + 7} y1={closeY} y2={closeY} />\n )}\n {entry.open != null && openY != null ? (\n <line stroke={openTickColor} strokeWidth={1.8} x1={x - 7} x2={x} y1={openY} y2={openY} />\n ) : null}\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderWaterfallChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const stages = buildChartStages(chart);\n if (stages.length === 0) {\n return null;\n }\n\n const plot = layout.plot;\n const labels = stages.map((stage) => stage.label);\n const xScale = scaleBand<string>()\n .domain(labels)\n .range([plot.left, plot.left + plot.width])\n .paddingInner(0.34)\n .paddingOuter(0.18);\n\n const bars: Array<ChartStage & { end: number; index: number; start: number }> = [];\n let runningTotal = 0;\n stages.forEach((stage, index) => {\n const start = stage.isSubtotal ? 0 : runningTotal;\n const end = stage.isSubtotal ? runningTotal : runningTotal + stage.value;\n if (!stage.isSubtotal) {\n runningTotal = end;\n }\n bars.push({ ...stage, end, index, start });\n });\n\n const extents = bars.flatMap((bar) => [0, bar.start, bar.end]);\n let minValue = Math.min(...extents);\n let maxValue = Math.max(...extents);\n if (maxValue <= minValue) {\n maxValue = minValue + 1;\n }\n\n const yScale = scaleLinear()\n .domain([minValue, maxValue])\n .range([plot.top + plot.height, plot.top]);\n const ticks = buildNumericTickValues(minValue, maxValue, chart.valueAxis?.majorUnit);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n\n return (\n <g>\n {ticks.map((tick) => (\n <g key={`waterfall-y-${tick}`}>\n <line\n stroke={lightenColor(axisColor, 0.72)}\n strokeWidth={1}\n x1={plot.left}\n x2={plot.left + plot.width}\n y1={yScale(tick)}\n y2={yScale(tick)}\n />\n <text fill={labelColor} fontSize={10} textAnchor=\"end\" x={plot.left - 6} y={yScale(tick) + 3}>\n {formatTickValue(tick)}\n </text>\n </g>\n ))}\n <line stroke={axisColor} strokeWidth={1.2} x1={plot.left} x2={plot.left} y1={plot.top} y2={plot.top + plot.height} />\n <line stroke={axisColor} strokeWidth={1.2} x1={plot.left} x2={plot.left + plot.width} y1={yScale(0)} y2={yScale(0)} />\n {bars.map((bar, index) => {\n const bandLeft = xScale(bar.label) ?? plot.left;\n const bandWidth = xScale.bandwidth();\n const topValue = Math.max(bar.start, bar.end);\n const bottomValue = Math.min(bar.start, bar.end);\n const top = yScale(topValue);\n const height = Math.max(1, yScale(bottomValue) - top);\n const fill = bar.isSubtotal\n ? darkenColor(bar.color, 0.18)\n : bar.value >= 0\n ? bar.color\n : lightenColor(bar.color, 0.22);\n const connectorStart = index > 0 ? bars[index - 1] : null;\n const connectorY = connectorStart ? yScale(connectorStart.end) : 0;\n\n return (\n <g key={`waterfall-bar-${index}`}>\n {connectorStart ? (\n <line\n stroke={lightenColor(axisColor, 0.35)}\n strokeDasharray=\"3 3\"\n strokeWidth={1}\n x1={(xScale(connectorStart.label) ?? plot.left) + xScale.bandwidth()}\n x2={bandLeft}\n y1={connectorY}\n y2={connectorY}\n />\n ) : null}\n <rect\n fill={fill}\n rx={2}\n ry={2}\n stroke={darkenColor(fill, 0.22)}\n strokeWidth={1}\n x={bandLeft}\n y={top}\n width={bandWidth}\n height={height}\n />\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={bandLeft + bandWidth * 0.5}\n y={plot.top + plot.height + 14}\n >\n {bar.label}\n </text>\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={bandLeft + bandWidth * 0.5}\n y={top - 6}\n >\n {formatTickValue(bar.end)}\n </text>\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderFunnelChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const stages = buildChartStages(chart)\n .map((stage) => ({ ...stage, value: Math.max(0, stage.value) }))\n .filter((stage) => stage.value > 0);\n if (stages.length === 0) {\n return null;\n }\n\n const plot = layout.plot;\n const maxValue = Math.max(...stages.map((stage) => stage.value));\n const sectionHeight = plot.height / stages.length;\n const centerX = plot.left + plot.width * 0.5;\n const labelColor = resolveChartTextColor(chart);\n\n return (\n <g>\n {stages.map((stage, index) => {\n const stageWidth = (stage.value / maxValue) * plot.width;\n const topY = plot.top + index * sectionHeight;\n const stageHeight = Math.max(6, sectionHeight - 2);\n const left = centerX - stageWidth * 0.5;\n const fill = stage.isSubtotal ? darkenColor(stage.color, 0.14) : stage.color;\n const labelFitsInside = stageWidth > 90;\n\n return (\n <g key={`funnel-stage-${index}`}>\n <rect\n fill={fill}\n height={stageHeight}\n rx={0}\n ry={0}\n stroke={darkenColor(fill, 0.2)}\n strokeWidth={1}\n width={stageWidth}\n x={left}\n y={topY}\n />\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor={labelFitsInside ? \"middle\" : \"start\"}\n x={labelFitsInside ? centerX : centerX + stageWidth * 0.5 + 8}\n y={topY + sectionHeight * 0.5}\n >\n {`${stage.label} ${formatTickValue(stage.value)}`}\n </text>\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderSunburstChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const hierarchyData = buildHierarchyData(chart);\n if (!hierarchyData) {\n return null;\n }\n\n const root = d3Hierarchy(hierarchyData)\n .sum((node) => node.children && node.children.length > 0 ? 0 : Math.max(0.0001, node.value ?? 0))\n .sort((left, right) => (right.value ?? 0) - (left.value ?? 0));\n const partitioned = d3Partition<ChartHierarchyDatum>()\n .size([Math.PI * 2, root.height + 1])(root);\n const plot = layout.plot;\n const radius = Math.max(24, Math.min(plot.width, plot.height) * 0.5);\n const holeRadius = radius * 0.16;\n const centerX = plot.left + plot.width * 0.5;\n const centerY = plot.top + plot.height * 0.5;\n const ringSpan = Math.max(1, partitioned.height || 1);\n const arcBuilder = d3Arc<HierarchyRectangularNode<ChartHierarchyDatum>>()\n .startAngle((node) => node.x0)\n .endAngle((node) => node.x1)\n .padAngle(0.005)\n .padRadius(radius)\n .innerRadius((node) => holeRadius + ((node.y0 - 1) / ringSpan) * (radius - holeRadius))\n .outerRadius((node) => holeRadius + ((node.y1 - 1) / ringSpan) * (radius - holeRadius) - 1);\n\n return (\n <g transform={`translate(${centerX}, ${centerY})`}>\n {partitioned.descendants().filter((node) => node.depth > 0).map((node, index) => {\n const path = arcBuilder(node);\n if (!path) {\n return null;\n }\n const labelAngle = (node.x0 + node.x1) * 0.5 - Math.PI * 0.5;\n const labelRadius = holeRadius + (((node.y0 + node.y1) * 0.5 - 1) / ringSpan) * (radius - holeRadius);\n const labelX = Math.cos(labelAngle) * labelRadius;\n const labelY = Math.sin(labelAngle) * labelRadius;\n const arcSpan = node.x1 - node.x0;\n const canShowLabel = arcSpan * labelRadius > 26;\n const fill = resolveHierarchyNodeColor(chart, node);\n\n return (\n <g key={`sunburst-node-${index}`}>\n <path\n d={path}\n fill={fill}\n stroke={palette.surface}\n strokeWidth={1}\n />\n {canShowLabel ? (\n <text\n fill={darkenColor(fill, 0.65)}\n fontSize={9}\n textAnchor=\"middle\"\n transform={`translate(${labelX}, ${labelY}) rotate(${(labelAngle * 180) / Math.PI})`}\n >\n {node.data.name}\n </text>\n ) : null}\n </g>\n );\n })}\n <circle fill={chart.chartAreaFillColor ?? palette.surface} r={holeRadius - 2} />\n </g>\n );\n}\n\nfunction renderTreemapChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const hierarchyData = buildHierarchyData(chart);\n if (!hierarchyData) {\n return null;\n }\n\n const root = d3Hierarchy(hierarchyData)\n .sum((node) => node.children && node.children.length > 0 ? 0 : Math.max(0.0001, node.value ?? 0))\n .sort((left, right) => (right.value ?? 0) - (left.value ?? 0));\n const treemapRoot = d3Treemap<ChartHierarchyDatum>()\n .size([layout.plot.width, layout.plot.height])\n .paddingInner(2)\n .paddingOuter(1)\n .round(true)\n .tile(excelTreemapTile)(root);\n\n return (\n <g transform={`translate(${layout.plot.left}, ${layout.plot.top})`}>\n {treemapRoot.leaves().map((leaf, index) => {\n const fill = resolveTreemapNodeColor(chart, leaf);\n const width = Math.max(0, leaf.x1 - leaf.x0);\n const height = Math.max(0, leaf.y1 - leaf.y0);\n const canShowLabel = width > 48 && height > 22;\n\n return (\n <g key={`treemap-leaf-${index}`}>\n <rect\n fill={fill}\n rx={3}\n ry={3}\n stroke={palette.surface}\n strokeWidth={1}\n x={leaf.x0}\n y={leaf.y0}\n width={width}\n height={height}\n />\n {canShowLabel ? (\n <>\n <text\n fill={darkenColor(fill, 0.68)}\n fontSize={10}\n fontWeight={600}\n x={leaf.x0 + 8}\n y={leaf.y0 + 14}\n >\n {leaf.data.name}\n </text>\n <text\n fill={darkenColor(fill, 0.54)}\n fontSize={9}\n x={leaf.x0 + 8}\n y={leaf.y0 + 28}\n >\n {formatTickValue(leaf.value ?? 0)}\n </text>\n </>\n ) : null}\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderBoxWhiskerChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const visibleSeries = chart.series.filter((series) => series.hidden !== true);\n if (visibleSeries.length === 0) {\n return null;\n }\n\n const seriesStats = visibleSeries.map((series, index) => ({\n color: series.color ?? chartSeriesColor(chart, typeof series.formatIdx === \"number\" ? series.formatIdx : index),\n label: normalizeCategoryLabel(series.name) || `Series ${index + 1}`,\n lineColor: series.lineColor ?? series.color ?? chartSeriesColor(chart, typeof series.formatIdx === \"number\" ? series.formatIdx : index),\n series,\n stats: computeBoxWhiskerStats(series),\n visibility: resolveBoxWhiskerVisibility(series)\n })).filter((entry): entry is {\n color: string;\n label: string;\n lineColor: string;\n series: XlsxChartSeries;\n stats: BoxWhiskerStats;\n visibility: ReturnType<typeof resolveBoxWhiskerVisibility>;\n } => entry.stats != null);\n\n if (seriesStats.length === 0) {\n return null;\n }\n\n const allValues = seriesStats.flatMap((entry) => [\n entry.stats.min,\n entry.stats.lowerWhisker,\n entry.stats.q1,\n entry.stats.median,\n entry.stats.q3,\n entry.stats.upperWhisker,\n entry.stats.max\n ]);\n const minValue = Math.min(...allValues);\n const maxValue = Math.max(...allValues);\n const valueDomain = resolveAxisDomainWithChartOverrides(chart.valueAxis, minValue, maxValue, false);\n const yScale = scaleLinear()\n .domain([valueDomain.min, valueDomain.max])\n .range([layout.plot.top + layout.plot.height, layout.plot.top]);\n const xScale = scalePoint<number>()\n .domain(seriesStats.map((_, index) => index))\n .range([layout.plot.left + 24, layout.plot.left + layout.plot.width - 24]);\n const gap = seriesStats.length > 1\n ? Math.abs((xScale(1) ?? 0) - (xScale(0) ?? 0))\n : layout.plot.width * 0.5;\n const boxWidth = clamp(gap * 0.34, 20, 54);\n const capWidth = Math.max(8, boxWidth * 0.52);\n const axisColor = chart.axisLineColor ?? chart.chartAreaBorderColor ?? palette.border;\n const labelColor = resolveChartAxisTextColor(chart);\n const meanLinePoints = seriesStats\n .filter((entry) => entry.visibility.meanLine)\n .map((entry, index) => `${xScale(index) ?? layout.plot.left},${yScale(entry.stats.mean)}`);\n\n return (\n <g>\n {valueDomain.ticks.map((tick, index) => {\n const y = yScale(tick);\n return (\n <g key={`box-whisker-grid-${index}`}>\n <line\n stroke={lightenColor(axisColor, 0.22)}\n strokeWidth={0.8}\n x1={layout.plot.left}\n x2={layout.plot.left + layout.plot.width}\n y1={y}\n y2={y}\n />\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"end\"\n x={layout.plot.left - 6}\n y={y + 3}\n >\n {formatTickValue(tick)}\n </text>\n </g>\n );\n })}\n <line\n stroke={axisColor}\n strokeWidth={1}\n x1={layout.plot.left}\n x2={layout.plot.left}\n y1={layout.plot.top}\n y2={layout.plot.top + layout.plot.height}\n />\n <line\n stroke={axisColor}\n strokeWidth={1}\n x1={layout.plot.left}\n x2={layout.plot.left + layout.plot.width}\n y1={layout.plot.top + layout.plot.height}\n y2={layout.plot.top + layout.plot.height}\n />\n {meanLinePoints.length >= 2 ? (\n <polyline\n fill=\"none\"\n points={meanLinePoints.join(\" \")}\n stroke={darkenColor(axisColor, 0.2)}\n strokeDasharray=\"4 3\"\n strokeWidth={1}\n />\n ) : null}\n {seriesStats.map((entry, index) => {\n const x = xScale(index) ?? layout.plot.left;\n const boxTop = yScale(entry.stats.q3);\n const boxBottom = yScale(entry.stats.q1);\n const medianY = yScale(entry.stats.median);\n const lowerWhiskerY = yScale(entry.stats.lowerWhisker);\n const upperWhiskerY = yScale(entry.stats.upperWhisker);\n const meanY = yScale(entry.stats.mean);\n const visiblePoints = entry.visibility.nonoutliers\n ? entry.stats.visiblePoints\n : [];\n const outliers = entry.visibility.outliers\n ? entry.stats.outliers\n : [];\n\n return (\n <g key={`box-whisker-series-${index}`}>\n <line\n stroke={entry.lineColor}\n strokeWidth={1.5}\n x1={x}\n x2={x}\n y1={upperWhiskerY}\n y2={boxTop}\n />\n <line\n stroke={entry.lineColor}\n strokeWidth={1.5}\n x1={x}\n x2={x}\n y1={boxBottom}\n y2={lowerWhiskerY}\n />\n <line\n stroke={entry.lineColor}\n strokeWidth={1.5}\n x1={x - capWidth * 0.5}\n x2={x + capWidth * 0.5}\n y1={upperWhiskerY}\n y2={upperWhiskerY}\n />\n <line\n stroke={entry.lineColor}\n strokeWidth={1.5}\n x1={x - capWidth * 0.5}\n x2={x + capWidth * 0.5}\n y1={lowerWhiskerY}\n y2={lowerWhiskerY}\n />\n <rect\n fill={lightenColor(entry.color, 0.35)}\n fillOpacity={0.72}\n height={Math.max(1, boxBottom - boxTop)}\n stroke={entry.lineColor}\n strokeWidth={1.5}\n width={boxWidth}\n x={x - boxWidth * 0.5}\n y={boxTop}\n />\n <line\n stroke={darkenColor(entry.lineColor, 0.15)}\n strokeWidth={2}\n x1={x - boxWidth * 0.5}\n x2={x + boxWidth * 0.5}\n y1={medianY}\n y2={medianY}\n />\n {entry.visibility.meanMarker ? (\n <>\n <line\n stroke={darkenColor(entry.lineColor, 0.18)}\n strokeWidth={1.2}\n x1={x - 4}\n x2={x + 4}\n y1={meanY - 4}\n y2={meanY + 4}\n />\n <line\n stroke={darkenColor(entry.lineColor, 0.18)}\n strokeWidth={1.2}\n x1={x - 4}\n x2={x + 4}\n y1={meanY + 4}\n y2={meanY - 4}\n />\n </>\n ) : null}\n {visiblePoints.map((value, pointIndex) => {\n const y = yScale(value);\n const jitter = ((pointIndex % 7) - 3) * (boxWidth / 16);\n return (\n <circle\n key={`box-whisker-visible-${index}-${pointIndex}`}\n cx={x + jitter}\n cy={y}\n fill={entry.color}\n fillOpacity={0.45}\n r={2}\n stroke=\"none\"\n />\n );\n })}\n {outliers.map((value, pointIndex) => {\n const y = yScale(value);\n return (\n <circle\n key={`box-whisker-outlier-${index}-${pointIndex}`}\n cx={x}\n cy={y}\n fill=\"#ffffff\"\n r={3}\n stroke={entry.lineColor}\n strokeWidth={1.2}\n />\n );\n })}\n <text\n fill={labelColor}\n fontSize={10}\n textAnchor=\"middle\"\n x={x}\n y={layout.plot.top + layout.plot.height + 14}\n >\n {entry.label}\n </text>\n </g>\n );\n })}\n </g>\n );\n}\n\nfunction renderRegionMapChart(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout) {\n const primarySeriesIndex = Math.max(0, chart.series.findIndex((series) => series.hidden !== true));\n const primarySeries = chart.series[primarySeriesIndex] ?? null;\n if (!primarySeries) {\n return null;\n }\n\n const labels = getCategoryLabels(chart);\n const layoutProperties = resolveRegionMapLayoutProperties(primarySeries);\n const geography = layoutProperties?.geography && typeof layoutProperties.geography === \"object\"\n ? layoutProperties.geography as Record<string, unknown>\n : null;\n const featureSet = resolveRegionMapFeatureSet(labels, geography);\n const viewedRegionType = typeof geography?.viewedRegionType === \"string\"\n ? geography.viewedRegionType\n : null;\n const projectionType = typeof geography?.projectionType === \"string\"\n ? geography.projectionType\n : null;\n const projection = featureSet === \"us-state\"\n ? geoIdentity()\n : projectionType === \"miller\"\n ? geoMercator()\n : geoNaturalEarth1();\n const availableFeatures = getRegionMapBaseFeatures(featureSet);\n const categoricalValues = resolveRegionMapColorStrings(primarySeries);\n const categoricalColorByLabel = categoricalValues\n ? new Map(\n Array.from(new Set(categoricalValues)).map((value, index) => [\n value,\n chartPointColor(chart, index, primarySeriesIndex)\n ])\n )\n : null;\n const entries = labels.map((label, index) => {\n const feature = resolveRegionMapFeature(label, featureSet);\n const value = safeNumber(primarySeries.values[index]);\n const colorLabel = categoricalValues?.[index] ?? null;\n return {\n colorLabel,\n feature,\n key: normalizeCategoryLabel(label),\n label: normalizeCategoryLabel(label),\n value\n };\n }).filter((entry) => entry.feature != null && (entry.value != null || entry.colorLabel != null)) as Array<{\n colorLabel: string | null;\n feature: RegionMapFeature;\n key: string;\n label: string;\n value: number | null;\n }>;\n const fitToMatchedData = entries.length > 0 && (viewedRegionType === \"dataOnly\" || entries.length === 1);\n const fitFeatures = fitToMatchedData\n ? entries.map((entry) => entry.feature)\n : availableFeatures;\n projection.fitExtent(\n [\n [layout.plot.left + 8, layout.plot.top + 8],\n [layout.plot.left + layout.plot.width - 8, layout.plot.top + layout.plot.height - 8]\n ],\n {\n type: \"FeatureCollection\",\n features: fitFeatures\n } satisfies FeatureCollection<Geometry, { name?: string }>\n );\n const path = geoPath(projection);\n const baseFeatures = fitToMatchedData\n ? fitFeatures\n : availableFeatures;\n const noDataFill = resolveRegionMapNoDataColor(chart, primarySeriesIndex);\n const outlineColor = chart.chartAreaBorderColor && chart.chartAreaBorderColor !== \"transparent\"\n ? chart.chartAreaBorderColor\n : darkenColor(noDataFill, 0.22);\n const numericEntryValues = entries\n .map((entry) => entry.value)\n .filter((value): value is number => typeof value === \"number\" && Number.isFinite(value));\n const minValue = numericEntryValues.length > 0 ? Math.min(...numericEntryValues) : 0;\n const maxValue = numericEntryValues.length > 0 ? Math.max(...numericEntryValues) : 1;\n const showRegionLabels = layoutProperties?.regionLabelLayout !== \"none\";\n\n return (\n <g>\n {baseFeatures.map((feature, index) => {\n const d = path(feature);\n if (!d) {\n return null;\n }\n return (\n <path\n d={d}\n fill={noDataFill}\n key={`region-map-base-${feature.id ?? index}`}\n stroke={outlineColor}\n strokeLinejoin=\"round\"\n strokeWidth={0.6}\n />\n );\n })}\n {entries.map((entry, index) => {\n const d = path(entry.feature);\n if (!d) {\n return null;\n }\n const fill = entry.value != null\n ? (() => {\n const ratio = maxValue <= minValue ? 1 : (entry.value - minValue) / Math.max(1e-6, maxValue - minValue);\n return resolveRegionMapValueColor(chart, primarySeriesIndex, ratio);\n })()\n : categoricalColorByLabel?.get(entry.colorLabel ?? \"\") ?? resolveRegionMapDataColor(chart, primarySeriesIndex);\n return (\n <path\n d={d}\n fill={fill}\n key={`region-map-value-${entry.key || index}`}\n stroke={darkenColor(fill, 0.18)}\n strokeLinejoin=\"round\"\n strokeWidth={0.85}\n />\n );\n })}\n {showRegionLabels\n ? entries.map((entry, index) => {\n const bounds = path.bounds(entry.feature);\n const [[x0, y0], [x1, y1]] = bounds;\n const width = x1 - x0;\n const height = y1 - y0;\n if (!Number.isFinite(width) || !Number.isFinite(height) || width < 26 || height < 12) {\n return null;\n }\n const centroid = path.centroid(entry.feature);\n if (!Number.isFinite(centroid[0]) || !Number.isFinite(centroid[1])) {\n return null;\n }\n return (\n <text\n fill={resolveChartTextColor(chart)}\n fontSize={9}\n fontWeight={600}\n key={`region-map-label-${entry.key || index}`}\n textAnchor=\"middle\"\n x={centroid[0]}\n y={centroid[1]}\n >\n {truncateSvgText(entry.label, Math.max(28, width - 4), 9)}\n </text>\n );\n })\n : null}\n </g>\n );\n}\n\nfunction renderUnsupported(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout, chartType: string) {\n return (\n <g>\n <rect\n fill={lightenColor(chart.chartAreaFillColor ?? palette.surface, 0.02)}\n height={layout.plot.height}\n stroke={lightenColor(chart.axisLineColor ?? palette.border, 0.2)}\n strokeDasharray=\"3 3\"\n width={layout.plot.width}\n x={layout.plot.left}\n y={layout.plot.top}\n />\n <text\n fill={resolveChartMutedTextColor(chart)}\n fontSize={11}\n textAnchor=\"middle\"\n x={layout.plot.left + layout.plot.width / 2}\n y={layout.plot.top + layout.plot.height / 2}\n >\n {`Unsupported chart type: ${chartType}`}\n </text>\n </g>\n );\n}\n\nfunction renderChartPlot(chart: XlsxChart, palette: ChartRendererPalette, layout: ChartLayout, chartType: string) {\n if (isComboChart(chart)) {\n return renderComboChart(chart, palette, layout) ?? renderUnsupported(chart, palette, layout, \"Combo\");\n }\n if (\n chartType === \"ColumnClustered\"\n || chartType === \"ColumnStacked\"\n || chartType === \"ColumnPercentStacked\"\n || chartType === \"BarClustered\"\n || chartType === \"BarStacked\"\n || chartType === \"BarPercentStacked\"\n ) {\n return renderBarChart(chart, palette, layout, chartType);\n }\n if (\n chartType === \"Line\"\n || chartType === \"LineStacked\"\n || chartType === \"LinePercentStacked\"\n || chartType === \"Area\"\n || chartType === \"AreaStacked\"\n || chartType === \"AreaPercentStacked\"\n ) {\n return renderLineOrAreaChart(chart, palette, layout, chartType);\n }\n if (chartType === \"Scatter\") {\n return renderScatterChart(chart, palette, layout, false);\n }\n if (chartType === \"ScatterLines\") {\n return renderScatterChart(chart, palette, layout, false);\n }\n if (chartType === \"ScatterSmooth\") {\n return renderScatterChart(chart, palette, layout, true);\n }\n if (chartType === \"Bubble\") {\n return renderBubbleChart(chart, palette, layout);\n }\n if (chartType === \"Radar\") {\n return renderRadarChart(chart, palette, layout);\n }\n if (chartType === \"Pie\" || chartType === \"Pie3D\" || chartType === \"PieExploded\" || chartType === \"Doughnut\") {\n return renderPieChart(chart, palette, layout, chartType);\n }\n if (chartType === \"BarOfPie\") {\n return renderBarOfPieChart(chart, palette, layout);\n }\n if (chartType === \"Surface\") {\n return renderSurfaceChart(chart, palette, layout);\n }\n if (chartType === \"Stock\") {\n return renderStockChart(chart, palette, layout);\n }\n if (chartType === \"Waterfall\") {\n return renderWaterfallChart(chart, palette, layout);\n }\n if (chartType === \"Funnel\") {\n return renderFunnelChart(chart, palette, layout);\n }\n if (chartType === \"BoxWhisker\") {\n return renderBoxWhiskerChart(chart, palette, layout);\n }\n if (chartType === \"Sunburst\") {\n return renderSunburstChart(chart, palette, layout);\n }\n if (chartType === \"Treemap\") {\n return renderTreemapChart(chart, palette, layout);\n }\n if (chartType === \"RegionMap\") {\n return renderRegionMapChart(chart, palette, layout);\n }\n return renderUnsupported(chart, palette, layout, chartType);\n}\n\nexport const MemoChartSvg = React.memo(function MemoChartSvg({ chart, palette, rect }: ChartSvgProps) {\n const renderChartType = normalizeRenderableChartType(chart);\n const legendItems = getLegendItems(chart, renderChartType, palette);\n const layout = buildLayout(chart, rect, legendItems);\n const chartRaw = chart.raw && typeof chart.raw === \"object\" ? chart.raw as Record<string, unknown> : null;\n const explicitNoFill = chartRaw?.chartAreaNoFill === true || chartRaw?.plotAreaNoFill === true;\n const background = chart.chartAreaFillColor ?? (explicitNoFill ? \"transparent\" : \"#ffffff\");\n const borderColor = chart.chartAreaBorderColor ?? \"transparent\";\n const normalizedBackground = background.trim().toLowerCase();\n const normalizedBorderColor = borderColor.trim().toLowerCase();\n const hideBackgroundRect = normalizedBackground === \"transparent\" && normalizedBorderColor === \"transparent\";\n const fontFamily = buildChartFontFamily(chart.fontFamily);\n\n if (renderChartType === \"Surface\") {\n return (\n <MemoSurfaceChartComposite\n background={background}\n borderColor={borderColor}\n chart={chart}\n fallback={renderSurfaceChart(chart, palette, layout)}\n fontFamily={fontFamily}\n layout={layout}\n overlay={\n <>\n {renderSurfaceAxes(chart, layout)}\n {renderTitle(chart, layout, palette)}\n {renderLegend(chart, layout, palette)}\n </>\n }\n palette={palette}\n />\n );\n }\n\n return (\n <svg\n aria-label={chart.title ?? chart.name ?? \"Chart\"}\n role=\"img\"\n style={{ display: \"block\", fontFamily, height: \"100%\", pointerEvents: \"none\", width: \"100%\" }}\n viewBox={`0 0 ${layout.width} ${layout.height}`}\n >\n {hideBackgroundRect\n ? null\n : <rect fill={background} height={layout.height} stroke={borderColor} strokeWidth={1} width={layout.width} x={0} y={0} />}\n {renderTitle(chart, layout, palette)}\n {renderLegend(chart, layout, palette)}\n {renderChartPlot(chart, palette, layout, renderChartType)}\n </svg>\n );\n}, (prev, next) => (\n prev.chart === next.chart\n && prev.palette === next.palette\n && prev.rect.height === next.rect.height\n && prev.rect.width === next.rect.width\n && prev.rect.left === next.rect.left\n && prev.rect.top === next.rect.top\n));\n","import createREGL from \"regl\";\nimport * as React from \"react\";\nimport type { XlsxChart } from \"./types\";\n\ntype SurfacePalette = {\n border: string;\n mutedText: string;\n surface: string;\n text: string;\n};\n\ntype SurfaceLayout = {\n height: number;\n plot: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n width: number;\n};\n\ntype SurfaceCompositeProps = {\n background: string;\n borderColor: string;\n chart: XlsxChart;\n fontFamily: string;\n layout: SurfaceLayout;\n overlay: React.ReactNode;\n palette: SurfacePalette;\n fallback: React.ReactNode;\n};\n\ntype SurfaceDomain = {\n maxValue: number;\n minValue: number;\n safeMax: number;\n ticks: number[];\n};\n\ntype SurfacePoint3D = {\n depth: number;\n worldX: number;\n worldY: number;\n worldZ: number;\n x: number;\n y: number;\n};\n\ntype SurfaceVertex = {\n bandColor: string;\n point: SurfacePoint3D;\n value: number;\n};\n\ntype SolidSurfaceTriangle = {\n color: string;\n points: [SurfacePoint3D, SurfacePoint3D, SurfacePoint3D];\n};\n\ntype SurfaceScene = {\n fillColors: Float32Array;\n fillPositions: Float32Array;\n lineColors: Float32Array;\n linePositions: Float32Array;\n wallColors: Float32Array;\n wallPositions: Float32Array;\n};\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction safeNumber(value: unknown) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const normalized = value.trim().replace(/,/g, \"\");\n if (!normalized) {\n return null;\n }\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\nfunction parseRgbColor(color: string) {\n const match = /^#?([0-9a-f]{6})$/i.exec(color);\n if (!match) {\n return null;\n }\n return {\n blue: Number.parseInt(match[1].slice(4, 6), 16),\n green: Number.parseInt(match[1].slice(2, 4), 16),\n red: Number.parseInt(match[1].slice(0, 2), 16)\n };\n}\n\nfunction mixRgbColor(color: string, mixWith: string, ratio: number) {\n const base = parseRgbColor(color);\n const target = parseRgbColor(mixWith);\n if (!base || !target) {\n return color;\n }\n const clamped = clamp(ratio, 0, 1);\n const mixChannel = (left: number, right: number) => Math.round(left + (right - left) * clamped);\n return `#${[\n mixChannel(base.red, target.red),\n mixChannel(base.green, target.green),\n mixChannel(base.blue, target.blue)\n ].map((value) => value.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction lightenColor(color: string, ratio: number) {\n return mixRgbColor(color, \"#ffffff\", ratio);\n}\n\nfunction darkenColor(color: string, ratio: number) {\n return mixRgbColor(color, \"#000000\", ratio);\n}\n\nfunction resolveSurfaceBaseColor(chart: XlsxChart, palette: SurfacePalette) {\n return chart.chartColorPalette?.[0]\n ?? chart.series[0]?.color\n ?? chart.series[0]?.lineColor\n ?? chart.axisLineColor\n ?? chart.textColor\n ?? palette.text;\n}\n\nfunction normalizeBuiltinSurfaceStyleId(styleId: number | undefined) {\n if (typeof styleId !== \"number\" || !Number.isFinite(styleId)) {\n return null;\n }\n return styleId >= 100 ? styleId - 100 : styleId;\n}\n\nfunction normalizeSurfaceRendererHexColor(value: unknown) {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n const normalized = trimmed.startsWith(\"#\") ? trimmed.slice(1) : trimmed;\n return /^[0-9a-f]{6}$/i.test(normalized) ? `#${normalized.toLowerCase()}` : null;\n}\n\nfunction hasExplicitSurfaceBaseColor(chart: XlsxChart) {\n const primarySeriesColor = normalizeSurfaceRendererHexColor(chart.series[0]?.color ?? chart.series[0]?.lineColor);\n if (!primarySeriesColor) {\n return null;\n }\n const paletteColor = normalizeSurfaceRendererHexColor(chart.chartColorPalette?.[0]);\n return paletteColor && paletteColor === primarySeriesColor ? null : primarySeriesColor;\n}\n\nfunction buildMonochromeSurfacePalette(baseColor: string, count: number) {\n if (count <= 3) {\n return [\n lightenColor(baseColor, 0.22),\n baseColor,\n darkenColor(baseColor, 0.2)\n ];\n }\n return [\n lightenColor(baseColor, 0.3),\n lightenColor(baseColor, 0.14),\n baseColor,\n darkenColor(baseColor, 0.1),\n darkenColor(baseColor, 0.22)\n ];\n}\n\nfunction getBuiltinSurfacePalette(chart: XlsxChart) {\n const normalized = normalizeBuiltinSurfaceStyleId(chart.chartStyleId);\n const explicitBaseColor = hasExplicitSurfaceBaseColor(chart);\n if (normalized === 26) {\n return buildMonochromeSurfacePalette(explicitBaseColor ?? \"#ff006e\", 3);\n }\n if (normalized === 34 && explicitBaseColor) {\n return buildMonochromeSurfacePalette(explicitBaseColor, 3);\n }\n if (normalized === 34 || (chart.wireframe === true && normalized == null)) {\n return [\"#5b9bd5\", \"#ed7d31\", \"#a5a5a5\"];\n }\n if (normalized === 35 || normalized === 36 || (chart.wireframe !== true && normalized == null)) {\n return [\"#2f5597\", \"#4472c4\", \"#5b9bd5\", \"#8faadc\", \"#d9e2f3\"];\n }\n return null;\n}\n\nfunction shouldPreferBuiltinSurfacePalette(chart: XlsxChart) {\n const normalized = normalizeBuiltinSurfaceStyleId(chart.chartStyleId);\n const rawChartType = chart.raw && typeof chart.raw === \"object\" && typeof (chart.raw as Record<string, unknown>).xmlChartType === \"string\"\n ? String((chart.raw as Record<string, unknown>).xmlChartType)\n : \"\";\n return (\n (rawChartType === \"surfaceChart\" || rawChartType === \"surface3DChart\")\n && (normalized === 26 || normalized === 34 || normalized === 35 || normalized === 36)\n );\n}\n\nfunction getSurfaceBandCount(chart: XlsxChart) {\n const raw = chart.raw && typeof chart.raw === \"object\" ? chart.raw as Record<string, unknown> : null;\n const explicitBandCount = typeof raw?.bandFormatCount === \"number\" && Number.isFinite(raw.bandFormatCount)\n ? raw.bandFormatCount\n : null;\n if (explicitBandCount != null && explicitBandCount > 0 && !(isContourSurfaceChart(chart) && chart.wireframe !== true)) {\n return explicitBandCount;\n }\n const builtinPalette = getBuiltinSurfacePalette(chart);\n if (shouldPreferBuiltinSurfacePalette(chart) && builtinPalette && builtinPalette.length > 0) {\n return builtinPalette.length;\n }\n if (chart.chartColorPalette && chart.chartColorPalette.length > 1) {\n return chart.chartColorPalette.length;\n }\n if (builtinPalette && builtinPalette.length > 0) {\n return builtinPalette.length;\n }\n return chart.wireframe ? 3 : 5;\n}\n\nfunction getSurfaceColorStops(chart: XlsxChart, palette: SurfacePalette) {\n const builtinPalette = getBuiltinSurfacePalette(chart);\n if (shouldPreferBuiltinSurfacePalette(chart) && builtinPalette && builtinPalette.length >= 2) {\n return builtinPalette;\n }\n const explicitStops = (chart.chartColorPalette ?? []).filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (explicitStops.length >= 2) {\n return explicitStops;\n }\n if (builtinPalette && builtinPalette.length >= 2) {\n return builtinPalette;\n }\n const baseColor = resolveSurfaceBaseColor(chart, palette);\n return [\n darkenColor(baseColor, 0.42),\n darkenColor(baseColor, 0.24),\n baseColor,\n lightenColor(baseColor, 0.18),\n lightenColor(baseColor, 0.34),\n lightenColor(baseColor, 0.5)\n ];\n}\n\nfunction getSurfaceDomain(chart: XlsxChart): SurfaceDomain | null {\n const numericValues = chart.series.flatMap((series) => (\n series.values\n .map((value) => safeNumber(value))\n .filter((value): value is number => value != null)\n ));\n if (numericValues.length === 0) {\n return null;\n }\n const explicitMin = typeof chart.valueAxis?.min === \"number\" && Number.isFinite(chart.valueAxis.min)\n ? chart.valueAxis.min\n : null;\n const explicitMax = typeof chart.valueAxis?.max === \"number\" && Number.isFinite(chart.valueAxis.max)\n ? chart.valueAxis.max\n : null;\n const rawMin = Math.min(...numericValues);\n const rawMax = Math.max(...numericValues);\n const bandCount = Math.max(1, getSurfaceBandCount(chart));\n const spanBase = Math.max(1e-6, rawMax - Math.min(0, rawMin));\n const roughStep = spanBase / bandCount;\n const magnitude = Math.pow(10, Math.floor(Math.log10(Math.max(roughStep, 1e-6))));\n const normalized = roughStep / magnitude;\n const niceStep = normalized <= 1 ? 1 : normalized <= 2 ? 2 : normalized <= 5 ? 5 : 10;\n const step = typeof chart.valueAxis?.majorUnit === \"number\" && chart.valueAxis.majorUnit > 0\n ? chart.valueAxis.majorUnit\n : niceStep * magnitude;\n const minValue = explicitMin ?? (rawMin >= 0 ? 0 : Math.floor(rawMin / step) * step);\n const maxValue = explicitMax ?? Math.ceil(rawMax / step) * step;\n const safeMax = maxValue <= minValue ? minValue + step : maxValue;\n const ticks: number[] = [];\n for (let current = minValue; current <= safeMax + step * 0.001; current += step) {\n ticks.push(Number(current.toFixed(8)));\n }\n return {\n maxValue,\n minValue,\n safeMax,\n ticks: [...new Set(ticks)].sort((left, right) => left - right)\n };\n}\n\nfunction resolveSurfaceColor(chart: XlsxChart, palette: SurfacePalette, ratio: number) {\n const stops = getSurfaceColorStops(chart, palette);\n if (stops.length === 0) {\n return resolveSurfaceBaseColor(chart, palette);\n }\n if (stops.length === 1) {\n return stops[0];\n }\n const clampedRatio = clamp(ratio, 0, 1) * (stops.length - 1);\n const lowerIndex = Math.floor(clampedRatio);\n const upperIndex = Math.min(stops.length - 1, lowerIndex + 1);\n const mixRatio = clampedRatio - lowerIndex;\n return mixRgbColor(stops[lowerIndex] ?? stops[0], stops[upperIndex] ?? stops[stops.length - 1], mixRatio);\n}\n\nfunction resolveSurfaceBandPaletteColor(chart: XlsxChart, palette: SurfacePalette, domain: SurfaceDomain, value: number) {\n const stops = getSurfaceColorStops(chart, palette);\n if (stops.length === 0) {\n return resolveSurfaceBaseColor(chart, palette);\n }\n const ticks = domain.ticks;\n for (let index = 0; index < ticks.length - 1; index += 1) {\n const end = ticks[index + 1] ?? domain.safeMax;\n if (value <= end || index === ticks.length - 2) {\n return stops[Math.min(stops.length - 1, Math.max(0, index))] ?? stops[stops.length - 1] ?? resolveSurfaceBaseColor(chart, palette);\n }\n }\n return stops[stops.length - 1] ?? resolveSurfaceBaseColor(chart, palette);\n}\n\nfunction resolveSurfaceBandColor(chart: XlsxChart, palette: SurfacePalette, domain: SurfaceDomain, value: number) {\n return resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n}\n\nfunction getSurfaceWireframePalette(chart: XlsxChart, palette: SurfacePalette) {\n const raw = chart.raw && typeof chart.raw === \"object\" ? chart.raw as Record<string, unknown> : null;\n const explicit = Array.isArray(raw?.bandFormatLineColors)\n ? raw.bandFormatLineColors.filter((color): color is string => typeof color === \"string\" && color.length > 0)\n : [];\n if (explicit.length > 0) {\n return explicit;\n }\n return getSurfaceColorStops(chart, palette);\n}\n\nfunction resolveSurfaceWireframeColor(chart: XlsxChart, palette: SurfacePalette, domain: SurfaceDomain, value: number) {\n const stops = getSurfaceWireframePalette(chart, palette);\n if (stops.length === 0) {\n return resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n }\n const ticks = domain.ticks;\n for (let index = 0; index < ticks.length - 1; index += 1) {\n const end = ticks[index + 1] ?? domain.safeMax;\n if (value <= end || index === ticks.length - 2) {\n return stops[Math.min(stops.length - 1, Math.max(0, index))] ?? resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n }\n }\n return stops[stops.length - 1] ?? resolveSurfaceBandPaletteColor(chart, palette, domain, value);\n}\n\nfunction colorToRgba(color: string, alpha = 1) {\n const rgb = parseRgbColor(color);\n if (!rgb) {\n return [0.1, 0.1, 0.1, alpha] as const;\n }\n return [rgb.red / 255, rgb.green / 255, rgb.blue / 255, alpha] as const;\n}\n\nfunction shadeSurfaceColor(color: string, intensity: number) {\n const shaded = intensity >= 1\n ? lightenColor(color, clamp((intensity - 1) * 0.4, 0, 0.22))\n : darkenColor(color, clamp((1 - intensity) * 0.5, 0, 0.28));\n return colorToRgba(shaded, 1);\n}\n\nfunction bilinearInterpolate(p00: number, p10: number, p01: number, p11: number, u: number, v: number) {\n return (\n p00 * (1 - u) * (1 - v)\n + p10 * u * (1 - v)\n + p01 * (1 - u) * v\n + p11 * u * v\n );\n}\n\nfunction normalizeSurfaceX(column: number, cols: number) {\n return cols <= 1 ? 0 : ((column / (cols - 1)) - 0.5) * 2;\n}\n\nfunction normalizeSurfaceY(row: number, rows: number) {\n return rows <= 1 ? 0 : ((row / (rows - 1)) - 0.5) * 2;\n}\n\nfunction normalizeSurfaceZ(value: number, domain: SurfaceDomain, depthScale: number) {\n return -((((value - domain.minValue) / (domain.safeMax - domain.minValue)) - 0.5) * 1.8) * depthScale;\n}\n\nfunction projectCartesian3dPoint(\n x: number,\n y: number,\n z: number,\n rotXRad: number,\n rotYRad: number,\n usePerspective: boolean,\n perspectiveStrength: number\n) {\n const cosX = Math.cos(rotXRad);\n const sinX = Math.sin(rotXRad);\n const cosY = Math.cos(rotYRad);\n const sinY = Math.sin(rotYRad);\n const x1 = x * cosY + z * sinY;\n const z1 = -x * sinY + z * cosY;\n const y1 = y * cosX - z1 * sinX;\n const z2 = y * sinX + z1 * cosX;\n const perspective = usePerspective\n ? 1 / Math.max(0.18, 1 + z2 * (0.24 + perspectiveStrength * 0.5))\n : 1;\n return {\n depth: z2,\n x: x1 * perspective,\n y: y1 * perspective\n };\n}\n\nfunction computeNormal(left: SurfacePoint3D, middle: SurfacePoint3D, right: SurfacePoint3D) {\n const ux = middle.worldX - left.worldX;\n const uy = middle.worldY - left.worldY;\n const uz = middle.worldZ - left.worldZ;\n const vx = right.worldX - left.worldX;\n const vy = right.worldY - left.worldY;\n const vz = right.worldZ - left.worldZ;\n const nx = uy * vz - uz * vy;\n const ny = uz * vx - ux * vz;\n const nz = ux * vy - uy * vx;\n const length = Math.hypot(nx, ny, nz) || 1;\n return {\n x: nx / length,\n y: ny / length,\n z: nz / length\n };\n}\n\nfunction withProjectedDepth(point: SurfacePoint3D, depth: number): SurfacePoint3D {\n return {\n ...point,\n depth\n };\n}\n\nfunction nudgeProjectedDepth(point: SurfacePoint3D, delta: number): SurfacePoint3D {\n return {\n ...point,\n depth: point.depth + delta\n };\n}\n\nfunction isContourSurfaceChart(chart: XlsxChart) {\n const rawChartType = chart.raw && typeof chart.raw === \"object\" && typeof chart.raw.xmlChartType === \"string\"\n ? chart.raw.xmlChartType\n : \"\";\n if (rawChartType === \"surfaceChart\") {\n return true;\n }\n if (rawChartType === \"surface3DChart\") {\n return false;\n }\n return chart.chartType === \"Surface\" && chart.is3d !== true;\n}\n\nfunction buildSurfaceMesh(chart: XlsxChart, palette: SurfacePalette, layout: SurfaceLayout): SurfaceScene | null {\n const rows = chart.series.length;\n const cols = chart.series.reduce((max, series) => Math.max(max, series.values.length), 0);\n if (rows < 2 || cols < 2) {\n return null;\n }\n const matrix = chart.series.map((series) => (\n Array.from({ length: cols }, (_, columnIndex) => safeNumber(series.values[columnIndex]))\n ));\n const domain = getSurfaceDomain(chart);\n if (!domain) {\n return null;\n }\n const isContour = isContourSurfaceChart(chart);\n const isWireframe = chart.wireframe === true;\n const fillVertices: SurfaceVertex[] = [];\n const wallTriangles: SolidSurfaceTriangle[] = [];\n const contourLines: Array<{ color: string; from: SurfacePoint3D; to: SurfacePoint3D }> = [];\n const meshLines: Array<{ color: string; from: SurfacePoint3D; to: SurfacePoint3D }> = [];\n const stepsPerCell = isContour ? 12 : 24;\n const rotX = clamp(chart.view3d?.rotX ?? (isWireframe ? 85 : 25), -88, 88) * (Math.PI / 180);\n const rotY = clamp(chart.view3d?.rotY ?? (isWireframe ? 0 : 30), -88, 88) * (Math.PI / 180);\n const usePerspective = !isContour && chart.view3d?.rAngAx === false;\n const perspectiveStrength = clamp((chart.view3d?.perspective ?? (usePerspective ? 30 : 0)) / 100, 0, 1);\n const depthScale = isContour ? 1 : clamp((chart.view3d?.depthPercent ?? 100) / 100, 0.2, 4);\n const usesFlatMaterial = chart.surfaceMaterial === \"flat\";\n const wallLineColor = chart.backWall?.lineColor ?? chart.sideWall?.lineColor ?? chart.floor?.lineColor ?? chart.axisLineColor ?? \"#a6a6a6\";\n const backWallFill = chart.backWall?.fillColor ?? \"#d9d9df\";\n const sideWallFill = chart.sideWall?.fillColor ?? \"#d5d7dc\";\n const floorFill = chart.floor?.fillColor ?? \"#d0d2d8\";\n const projectPoint = (column: number, row: number, value: number): SurfacePoint3D => {\n const worldX = normalizeSurfaceX(column, cols);\n if (isContour) {\n return {\n depth: 0,\n worldX,\n worldY: normalizeSurfaceY(row, rows),\n worldZ: 0,\n x: worldX,\n y: normalizeSurfaceY(row, rows)\n };\n }\n const worldY = normalizeSurfaceZ(value, domain, depthScale);\n const worldZ = normalizeSurfaceY(row, rows);\n const projected = projectCartesian3dPoint(worldX, worldY, worldZ, rotX, rotY, usePerspective, perspectiveStrength);\n return {\n depth: projected.depth,\n worldX,\n worldY,\n worldZ,\n x: projected.x,\n y: projected.y\n };\n };\n const addWallQuad = (a: SurfacePoint3D, b: SurfacePoint3D, c: SurfacePoint3D, d: SurfacePoint3D, color: string) => {\n wallTriangles.push(\n { color, points: [a, b, c] },\n { color, points: [a, c, d] }\n );\n };\n const addMeshLine = (from: SurfacePoint3D, to: SurfacePoint3D, color: string) => {\n meshLines.push({ color, from, to });\n };\n\n for (let rowIndex = 0; rowIndex < rows - 1; rowIndex += 1) {\n for (let columnIndex = 0; columnIndex < cols - 1; columnIndex += 1) {\n const p00 = matrix[rowIndex]?.[columnIndex];\n const p10 = matrix[rowIndex]?.[columnIndex + 1];\n const p01 = matrix[rowIndex + 1]?.[columnIndex];\n const p11 = matrix[rowIndex + 1]?.[columnIndex + 1];\n if (p00 == null || p10 == null || p01 == null || p11 == null) {\n continue;\n }\n for (let stepRow = 0; stepRow < stepsPerCell; stepRow += 1) {\n for (let stepColumn = 0; stepColumn < stepsPerCell; stepColumn += 1) {\n const u0 = stepColumn / stepsPerCell;\n const u1 = (stepColumn + 1) / stepsPerCell;\n const v0 = stepRow / stepsPerCell;\n const v1 = (stepRow + 1) / stepsPerCell;\n const sample = (u: number, v: number) => {\n const value = bilinearInterpolate(p00, p10, p01, p11, u, v);\n return {\n bandColor: resolveSurfaceBandColor(chart, palette, domain, value),\n point: isContour\n ? withProjectedDepth(projectPoint(columnIndex + u, rowIndex + v, value), isWireframe ? 0.12 : 0.08)\n : projectPoint(columnIndex + u, rowIndex + v, value),\n value\n };\n };\n const a = sample(u0, v0);\n const b = sample(u1, v0);\n const c = sample(u1, v1);\n const d = sample(u0, v1);\n if (!isWireframe) {\n const avg1 = (a.value + b.value + c.value) / 3;\n const avg2 = (a.value + c.value + d.value) / 3;\n fillVertices.push(\n { ...a, bandColor: resolveSurfaceBandColor(chart, palette, domain, avg1) },\n { ...b, bandColor: resolveSurfaceBandColor(chart, palette, domain, avg1) },\n { ...c, bandColor: resolveSurfaceBandColor(chart, palette, domain, avg1) },\n { ...a, bandColor: resolveSurfaceBandColor(chart, palette, domain, avg2) },\n { ...c, bandColor: resolveSurfaceBandColor(chart, palette, domain, avg2) },\n { ...d, bandColor: resolveSurfaceBandColor(chart, palette, domain, avg2) }\n );\n }\n }\n }\n\n const thresholds = domain.ticks.slice(1, -1);\n if (isContour && isWireframe) {\n const corners = [\n { value: p00, x: columnIndex, y: rowIndex },\n { value: p10, x: columnIndex + 1, y: rowIndex },\n { value: p11, x: columnIndex + 1, y: rowIndex + 1 },\n { value: p01, x: columnIndex, y: rowIndex + 1 }\n ];\n const edges: Array<[typeof corners[number], typeof corners[number]]> = [\n [corners[0], corners[1]],\n [corners[1], corners[2]],\n [corners[2], corners[3]],\n [corners[3], corners[0]]\n ];\n thresholds.forEach((threshold) => {\n const intersections: Array<{ x: number; y: number }> = [];\n edges.forEach(([start, end]) => {\n const delta = end.value - start.value;\n if (delta === 0) {\n return;\n }\n const crosses = (start.value < threshold && end.value > threshold) || (start.value > threshold && end.value < threshold);\n if (!crosses) {\n return;\n }\n const ratio = (threshold - start.value) / delta;\n intersections.push({\n x: start.x + (end.x - start.x) * ratio,\n y: start.y + (end.y - start.y) * ratio\n });\n });\n if (intersections.length === 2) {\n contourLines.push({\n color: darkenColor(resolveSurfaceBandColor(chart, palette, domain, threshold), 0.22),\n from: withProjectedDepth(projectPoint(intersections[0]?.x ?? columnIndex, intersections[0]?.y ?? rowIndex, threshold), 0.18),\n to: withProjectedDepth(projectPoint(intersections[1]?.x ?? columnIndex + 1, intersections[1]?.y ?? rowIndex + 1, threshold), 0.18)\n });\n } else if (intersections.length === 4) {\n const center = (p00 + p10 + p01 + p11) / 4;\n const pairings = center >= threshold\n ? [[0, 1], [2, 3]]\n : [[0, 3], [1, 2]];\n pairings.forEach(([leftIndex, rightIndex]) => {\n const leftPoint = intersections[leftIndex] ?? intersections[0];\n const rightPoint = intersections[rightIndex] ?? intersections[intersections.length - 1];\n if (!leftPoint || !rightPoint) {\n return;\n }\n contourLines.push({\n color: darkenColor(resolveSurfaceBandColor(chart, palette, domain, threshold), 0.22),\n from: withProjectedDepth(projectPoint(leftPoint.x, leftPoint.y, threshold), 0.18),\n to: withProjectedDepth(projectPoint(rightPoint.x, rightPoint.y, threshold), 0.18)\n });\n });\n }\n });\n } else if (!isContour) {\n const corners = [\n { value: p00, x: columnIndex, y: rowIndex },\n { value: p10, x: columnIndex + 1, y: rowIndex },\n { value: p11, x: columnIndex + 1, y: rowIndex + 1 },\n { value: p01, x: columnIndex, y: rowIndex + 1 }\n ];\n const edges: Array<[typeof corners[number], typeof corners[number]]> = [\n [corners[0], corners[1]],\n [corners[1], corners[2]],\n [corners[2], corners[3]],\n [corners[3], corners[0]]\n ];\n thresholds.forEach((threshold) => {\n const intersections: Array<{ x: number; y: number }> = [];\n edges.forEach(([start, end]) => {\n const delta = end.value - start.value;\n if (delta === 0) {\n return;\n }\n const crosses = (start.value < threshold && end.value > threshold) || (start.value > threshold && end.value < threshold);\n if (!crosses) {\n return;\n }\n const ratio = (threshold - start.value) / delta;\n intersections.push({\n x: start.x + (end.x - start.x) * ratio,\n y: start.y + (end.y - start.y) * ratio\n });\n });\n if (intersections.length === 2) {\n contourLines.push({\n color: darkenColor(resolveSurfaceBandPaletteColor(chart, palette, domain, threshold), 0.26),\n from: projectPoint(intersections[0]?.x ?? columnIndex, intersections[0]?.y ?? rowIndex, threshold),\n to: projectPoint(intersections[1]?.x ?? columnIndex + 1, intersections[1]?.y ?? rowIndex + 1, threshold)\n });\n } else if (intersections.length === 4) {\n const center = (p00 + p10 + p01 + p11) / 4;\n const pairings = center >= threshold\n ? [[0, 1], [2, 3]]\n : [[0, 3], [1, 2]];\n pairings.forEach(([leftIndex, rightIndex]) => {\n const leftPoint = intersections[leftIndex] ?? intersections[0];\n const rightPoint = intersections[rightIndex] ?? intersections[intersections.length - 1];\n if (!leftPoint || !rightPoint) {\n return;\n }\n contourLines.push({\n color: darkenColor(resolveSurfaceBandPaletteColor(chart, palette, domain, threshold), 0.26),\n from: projectPoint(leftPoint.x, leftPoint.y, threshold),\n to: projectPoint(rightPoint.x, rightPoint.y, threshold)\n });\n });\n }\n });\n }\n }\n }\n\n const columnSkip = Math.max(1, chart.categoryAxis?.tickMarkSkip ?? 1);\n const rowSkip = Math.max(1, chart.seriesAxis?.tickMarkSkip ?? 1);\n if (isContour) {\n const topLeft = withProjectedDepth(projectPoint(0, 0, domain.minValue), -0.12);\n const topRight = withProjectedDepth(projectPoint(cols - 1, 0, domain.minValue), -0.12);\n const bottomRight = withProjectedDepth(projectPoint(cols - 1, rows - 1, domain.minValue), -0.12);\n const bottomLeft = withProjectedDepth(projectPoint(0, rows - 1, domain.minValue), -0.12);\n if (chart.backWall?.hidden !== true && backWallFill !== \"transparent\") {\n addWallQuad(topLeft, topRight, bottomRight, bottomLeft, backWallFill);\n }\n for (let columnIndex = 0; columnIndex < cols; columnIndex += columnSkip) {\n addMeshLine(\n withProjectedDepth(projectPoint(columnIndex, 0, domain.minValue), 0.04),\n withProjectedDepth(projectPoint(columnIndex, rows - 1, domain.minValue), 0.04),\n wallLineColor\n );\n }\n for (let rowIndex = 0; rowIndex < rows; rowIndex += rowSkip) {\n addMeshLine(\n withProjectedDepth(projectPoint(0, rowIndex, domain.minValue), 0.04),\n withProjectedDepth(projectPoint(cols - 1, rowIndex, domain.minValue), 0.04),\n wallLineColor\n );\n }\n } else {\n const minPlaneValue = domain.minValue;\n const wallDepthOffset = -0.2;\n if (chart.floor?.hidden !== true && floorFill !== \"transparent\") {\n addWallQuad(\n nudgeProjectedDepth(projectPoint(0, 0, minPlaneValue), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, 0, minPlaneValue), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, rows - 1, minPlaneValue), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(0, rows - 1, minPlaneValue), wallDepthOffset),\n floorFill\n );\n }\n if (chart.backWall?.hidden !== true && backWallFill !== \"transparent\") {\n addWallQuad(\n nudgeProjectedDepth(projectPoint(0, 0, domain.safeMax), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, 0, domain.safeMax), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, 0, minPlaneValue), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(0, 0, minPlaneValue), wallDepthOffset),\n backWallFill\n );\n }\n if (chart.sideWall?.hidden !== true && sideWallFill !== \"transparent\") {\n addWallQuad(\n nudgeProjectedDepth(projectPoint(cols - 1, 0, domain.safeMax), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, rows - 1, domain.safeMax), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, rows - 1, minPlaneValue), wallDepthOffset),\n nudgeProjectedDepth(projectPoint(cols - 1, 0, minPlaneValue), wallDepthOffset),\n sideWallFill\n );\n }\n for (const tick of domain.ticks) {\n if (chart.backWall?.hidden !== true && wallLineColor !== \"transparent\") {\n addMeshLine(nudgeProjectedDepth(projectPoint(0, 0, tick), wallDepthOffset * 0.75), nudgeProjectedDepth(projectPoint(cols - 1, 0, tick), wallDepthOffset * 0.75), wallLineColor);\n }\n if (chart.sideWall?.hidden !== true && wallLineColor !== \"transparent\") {\n addMeshLine(nudgeProjectedDepth(projectPoint(cols - 1, 0, tick), wallDepthOffset * 0.75), nudgeProjectedDepth(projectPoint(cols - 1, rows - 1, tick), wallDepthOffset * 0.75), wallLineColor);\n }\n }\n for (let columnIndex = 0; columnIndex < cols; columnIndex += columnSkip) {\n if (chart.floor?.hidden !== true && wallLineColor !== \"transparent\") {\n addMeshLine(nudgeProjectedDepth(projectPoint(columnIndex, 0, minPlaneValue), wallDepthOffset * 0.75), nudgeProjectedDepth(projectPoint(columnIndex, rows - 1, minPlaneValue), wallDepthOffset * 0.75), wallLineColor);\n }\n if (chart.backWall?.hidden !== true && wallLineColor !== \"transparent\") {\n addMeshLine(nudgeProjectedDepth(projectPoint(columnIndex, 0, minPlaneValue), wallDepthOffset * 0.75), nudgeProjectedDepth(projectPoint(columnIndex, 0, domain.safeMax), wallDepthOffset * 0.75), wallLineColor);\n }\n }\n for (let rowIndex = 0; rowIndex < rows; rowIndex += rowSkip) {\n if (chart.floor?.hidden !== true && wallLineColor !== \"transparent\") {\n addMeshLine(nudgeProjectedDepth(projectPoint(0, rowIndex, minPlaneValue), wallDepthOffset * 0.75), nudgeProjectedDepth(projectPoint(cols - 1, rowIndex, minPlaneValue), wallDepthOffset * 0.75), wallLineColor);\n }\n if (chart.sideWall?.hidden !== true && wallLineColor !== \"transparent\") {\n addMeshLine(nudgeProjectedDepth(projectPoint(cols - 1, rowIndex, minPlaneValue), wallDepthOffset * 0.75), nudgeProjectedDepth(projectPoint(cols - 1, rowIndex, domain.safeMax), wallDepthOffset * 0.75), wallLineColor);\n }\n }\n }\n\n if (!isContour && isWireframe) {\n const addWireMeshLine = (\n fromColumn: number,\n fromRow: number,\n toColumn: number,\n toRow: number,\n fromValue: number,\n toValue: number,\n color: string\n ) => {\n const averageValue = (fromValue + toValue) * 0.5;\n addMeshLine(\n projectPoint(fromColumn, fromRow, fromValue),\n projectPoint(toColumn, toRow, toValue),\n color || resolveSurfaceWireframeColor(chart, palette, domain, averageValue)\n );\n };\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const rowValues = matrix[rowIndex]?.filter((value): value is number => value != null) ?? [];\n const rowAverage = rowValues.length > 0\n ? rowValues.reduce((sum, value) => sum + value, 0) / rowValues.length\n : domain.minValue;\n const rowColor = chart.series[rowIndex]?.lineColor\n ?? chart.series[rowIndex]?.color\n ?? resolveSurfaceWireframeColor(chart, palette, domain, rowAverage);\n for (let columnIndex = 0; columnIndex < cols - 1; columnIndex += 1) {\n const left = matrix[rowIndex]?.[columnIndex];\n const right = matrix[rowIndex]?.[columnIndex + 1];\n if (left == null || right == null) {\n continue;\n }\n for (let step = 0; step < stepsPerCell; step += 1) {\n const u0 = step / stepsPerCell;\n const u1 = (step + 1) / stepsPerCell;\n const fromColumn = columnIndex + u0;\n const toColumn = columnIndex + u1;\n const fromValue = left + (right - left) * u0;\n const toValue = left + (right - left) * u1;\n addWireMeshLine(fromColumn, rowIndex, toColumn, rowIndex, fromValue, toValue, rowColor);\n }\n }\n }\n for (let columnIndex = 0; columnIndex < cols; columnIndex += 1) {\n const columnValues = Array.from({ length: rows }, (_, rowIndex) => matrix[rowIndex]?.[columnIndex])\n .filter((value): value is number => value != null);\n const columnAverage = columnValues.length > 0\n ? columnValues.reduce((sum, value) => sum + value, 0) / columnValues.length\n : domain.minValue;\n const columnColor = resolveSurfaceWireframeColor(chart, palette, domain, columnAverage);\n for (let rowIndex = 0; rowIndex < rows - 1; rowIndex += 1) {\n const top = matrix[rowIndex]?.[columnIndex];\n const bottom = matrix[rowIndex + 1]?.[columnIndex];\n if (top == null || bottom == null) {\n continue;\n }\n for (let step = 0; step < stepsPerCell; step += 1) {\n const v0 = step / stepsPerCell;\n const v1 = (step + 1) / stepsPerCell;\n const fromRow = rowIndex + v0;\n const toRow = rowIndex + v1;\n const fromValue = top + (bottom - top) * v0;\n const toValue = top + (bottom - top) * v1;\n addWireMeshLine(columnIndex, fromRow, columnIndex, toRow, fromValue, toValue, columnColor);\n }\n }\n }\n }\n\n const allPoints = [\n ...fillVertices.map((vertex) => vertex.point),\n ...wallTriangles.flatMap((triangle) => triangle.points),\n ...meshLines.flatMap((line) => [line.from, line.to]),\n ...contourLines.flatMap((line) => [line.from, line.to])\n ];\n if (allPoints.length === 0) {\n return null;\n }\n\n const minX = Math.min(...allPoints.map((point) => point.x));\n const maxX = Math.max(...allPoints.map((point) => point.x));\n const minY = Math.min(...allPoints.map((point) => point.y));\n const maxY = Math.max(...allPoints.map((point) => point.y));\n const minDepth = Math.min(...allPoints.map((point) => point.depth));\n const maxDepth = Math.max(...allPoints.map((point) => point.depth));\n const scale = Math.min(\n layout.plot.width / Math.max(0.25, maxX - minX),\n layout.plot.height / Math.max(0.25, maxY - minY)\n ) * 0.82;\n const centerX = layout.plot.left + layout.plot.width / 2;\n const centerY = layout.plot.top + layout.plot.height / 2;\n const centerRawX = (minX + maxX) / 2;\n const centerRawY = (minY + maxY) / 2;\n const toScreenX = (x: number) => centerX + (x - centerRawX) * scale;\n const toScreenY = (y: number) => centerY + (y - centerRawY) * scale;\n const toClipPoint = (point: SurfacePoint3D) => {\n const screenX = toScreenX(point.x);\n const screenY = toScreenY(point.y);\n return {\n x: (screenX / layout.width) * 2 - 1,\n y: 1 - (screenY / layout.height) * 2,\n z: clamp(((point.depth - minDepth) / Math.max(1e-6, maxDepth - minDepth)) * 2 - 1, -1, 1)\n };\n };\n\n const fillPositions: number[] = [];\n const fillColors: number[] = [];\n const wallPositions: number[] = [];\n const wallColors: number[] = [];\n for (const triangle of wallTriangles) {\n const rgba = colorToRgba(triangle.color, 1);\n for (const point of triangle.points) {\n const clip = toClipPoint(point);\n wallPositions.push(clip.x, clip.y, clip.z);\n wallColors.push(rgba[0], rgba[1], rgba[2], rgba[3] * 0.92);\n }\n }\n for (let index = 0; index < fillVertices.length; index += 3) {\n const left = fillVertices[index];\n const middle = fillVertices[index + 1];\n const right = fillVertices[index + 2];\n if (!left || !middle || !right) {\n continue;\n }\n const normal = computeNormal(left.point, middle.point, right.point);\n const lightDirection = { x: -0.32, y: 0.84, z: 0.44 };\n const rawLight = normal.x * lightDirection.x + normal.y * lightDirection.y + normal.z * lightDirection.z;\n const shaded = usesFlatMaterial\n ? colorToRgba(left.bandColor, 1)\n : shadeSurfaceColor(left.bandColor, clamp(0.8 + rawLight * 0.28, 0.52, 1.08));\n [left, middle, right].forEach((vertex) => {\n const clip = toClipPoint(vertex.point);\n fillPositions.push(clip.x, clip.y, clip.z);\n fillColors.push(shaded[0], shaded[1], shaded[2], shaded[3]);\n });\n }\n\n const linePositions: number[] = [];\n const lineColors: number[] = [];\n meshLines.forEach((line) => {\n const from = toClipPoint(line.from);\n const to = toClipPoint(line.to);\n const rgba = colorToRgba(line.color, 1);\n linePositions.push(from.x, from.y, from.z, to.x, to.y, to.z);\n lineColors.push(rgba[0], rgba[1], rgba[2], rgba[3], rgba[0], rgba[1], rgba[2], rgba[3]);\n });\n contourLines.forEach((line) => {\n const from = toClipPoint(line.from);\n const to = toClipPoint(line.to);\n const rgba = colorToRgba(line.color, 1);\n linePositions.push(from.x, from.y, from.z, to.x, to.y, to.z);\n lineColors.push(rgba[0], rgba[1], rgba[2], rgba[3], rgba[0], rgba[1], rgba[2], rgba[3]);\n });\n\n return {\n fillColors: new Float32Array(fillColors),\n fillPositions: new Float32Array(fillPositions),\n lineColors: new Float32Array(lineColors),\n linePositions: new Float32Array(linePositions),\n wallColors: new Float32Array(wallColors),\n wallPositions: new Float32Array(wallPositions)\n };\n}\n\nexport const MemoSurfaceChartComposite = React.memo(function MemoSurfaceChartComposite({\n background,\n borderColor,\n chart,\n fontFamily,\n layout,\n overlay,\n palette,\n fallback\n}: SurfaceCompositeProps) {\n const canvasRef = React.useRef<HTMLCanvasElement | null>(null);\n const [ready, setReady] = React.useState(false);\n const [failed, setFailed] = React.useState(false);\n const isContour = isContourSurfaceChart(chart);\n\n React.useEffect(() => {\n if (isContour) {\n setReady(false);\n setFailed(false);\n return;\n }\n const canvas = canvasRef.current;\n if (!canvas) {\n return;\n }\n let cancelled = false;\n let reglInstance: ReturnType<typeof createREGL> | null = null;\n\n const drawSurface = () => {\n try {\n const scene = buildSurfaceMesh(chart, palette, layout);\n if (!scene) {\n if (!cancelled) {\n setFailed(true);\n setReady(false);\n }\n return;\n }\n const dpr = window.devicePixelRatio || 1;\n canvas.width = Math.max(1, Math.round(layout.width * dpr));\n canvas.height = Math.max(1, Math.round(layout.height * dpr));\n reglInstance = createREGL({\n attributes: {\n alpha: true,\n antialias: true,\n depth: true,\n premultipliedAlpha: true\n },\n canvas\n });\n const fillCommand = scene.fillPositions.length > 0\n ? reglInstance({\n attributes: {\n color: scene.fillColors,\n position: scene.fillPositions\n },\n blend: {\n enable: true,\n func: {\n dstRGB: \"one minus src alpha\",\n dstAlpha: \"one minus src alpha\",\n srcRGB: \"src alpha\",\n srcAlpha: \"src alpha\"\n }\n },\n count: scene.fillPositions.length / 3,\n depth: {\n enable: true\n },\n frag: `\n precision mediump float;\n varying vec4 vColor;\n void main() {\n gl_FragColor = vColor;\n }\n `,\n primitive: \"triangles\",\n vert: `\n precision mediump float;\n attribute vec3 position;\n attribute vec4 color;\n varying vec4 vColor;\n void main() {\n gl_Position = vec4(position, 1.0);\n vColor = color;\n }\n `\n })\n : null;\n const wallCommand = scene.wallPositions.length > 0\n ? reglInstance({\n attributes: {\n color: scene.wallColors,\n position: scene.wallPositions\n },\n blend: {\n enable: true,\n func: {\n dstRGB: \"one minus src alpha\",\n dstAlpha: \"one minus src alpha\",\n srcRGB: \"src alpha\",\n srcAlpha: \"src alpha\"\n }\n },\n count: scene.wallPositions.length / 3,\n depth: {\n enable: false\n },\n frag: `\n precision mediump float;\n varying vec4 vColor;\n void main() {\n gl_FragColor = vColor;\n }\n `,\n primitive: \"triangles\",\n vert: `\n precision mediump float;\n attribute vec3 position;\n attribute vec4 color;\n varying vec4 vColor;\n void main() {\n gl_Position = vec4(position, 1.0);\n vColor = color;\n }\n `\n })\n : null;\n const lineCommand = scene.linePositions.length > 0\n ? reglInstance({\n attributes: {\n color: scene.lineColors,\n position: scene.linePositions\n },\n blend: {\n enable: true,\n func: {\n dstRGB: \"one minus src alpha\",\n dstAlpha: \"one minus src alpha\",\n srcRGB: \"src alpha\",\n srcAlpha: \"src alpha\"\n }\n },\n count: scene.linePositions.length / 3,\n depth: {\n enable: false\n },\n frag: `\n precision mediump float;\n varying vec4 vColor;\n void main() {\n gl_FragColor = vColor;\n }\n `,\n lineWidth: 1,\n primitive: \"lines\",\n vert: `\n precision mediump float;\n attribute vec3 position;\n attribute vec4 color;\n varying vec4 vColor;\n void main() {\n gl_Position = vec4(position, 1.0);\n vColor = color;\n }\n `\n })\n : null;\n\n reglInstance.clear({ color: [0, 0, 0, 0], depth: 1 });\n wallCommand?.();\n fillCommand?.();\n lineCommand?.();\n if (!cancelled) {\n setReady(true);\n setFailed(false);\n }\n } catch {\n if (!cancelled) {\n setReady(false);\n setFailed(true);\n }\n }\n };\n\n setReady(false);\n setFailed(false);\n drawSurface();\n\n return () => {\n cancelled = true;\n reglInstance?.destroy();\n };\n }, [\n chart,\n isContour,\n layout,\n palette\n ]);\n\n const shouldRenderFallback = isContour || failed || !ready;\n\n return (\n <div\n aria-label={chart.title ?? chart.name ?? \"Chart\"}\n role=\"img\"\n style={{\n background,\n border: borderColor.trim().toLowerCase() === \"transparent\" ? \"none\" : `1px solid ${borderColor}`,\n boxSizing: \"border-box\",\n fontFamily,\n height: \"100%\",\n overflow: \"hidden\",\n pointerEvents: \"none\",\n position: \"relative\",\n width: \"100%\"\n }}\n >\n <canvas\n ref={canvasRef}\n style={{\n display: shouldRenderFallback ? \"none\" : \"block\",\n height: \"100%\",\n inset: 0,\n position: \"absolute\",\n width: \"100%\"\n }}\n />\n <svg\n style={{ display: \"block\", height: \"100%\", inset: 0, position: \"absolute\", width: \"100%\" }}\n viewBox={`0 0 ${layout.width} ${layout.height}`}\n >\n {shouldRenderFallback ? fallback : null}\n {overlay}\n </svg>\n </div>\n );\n}, (prev, next) => (\n prev.chart === next.chart\n && prev.palette === next.palette\n && prev.background === next.background\n && prev.borderColor === next.borderColor\n && prev.fontFamily === next.fontFamily\n && prev.layout.width === next.layout.width\n && prev.layout.height === next.layout.height\n && prev.layout.plot.left === next.layout.plot.left\n && prev.layout.plot.top === next.layout.plot.top\n && prev.layout.plot.width === next.layout.plot.width\n && prev.layout.plot.height === next.layout.plot.height\n && prev.overlay === next.overlay\n && prev.fallback === next.fallback\n));\n"],"mappings":"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,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AMvwIA,IAAAE,SAAuB;AAEvB,2BAOO;;;ACTP,0BAAsI;AACtI,oBAAoE;AACpE,IAAAC,SAAuB;AACvB,sBAAmD;AACnD,sBAeO;AAEP,6BAA2C;AAC3C,iCAA8B;AAC9B,2BAAyB;;;ACvBzB,kBAAuB;AACvB,IAAAC,SAAuB;AAsnCjB;AAljCN,SAAS,MAAM,OAAe,KAAa,KAAa;AACtD,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,WAAW,OAAgB;AAClC,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE;AAChD,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,SAAS,OAAO,UAAU;AAChC,WAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe;AACpC,QAAM,QAAQ,qBAAqB,KAAK,KAAK;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC9C,OAAO,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC/C,KAAK,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC/C;AACF;AAEA,SAAS,YAAY,OAAe,SAAiB,OAAe;AAClE,QAAM,OAAO,cAAc,KAAK;AAChC,QAAM,SAAS,cAAc,OAAO;AACpC,MAAI,CAAC,QAAQ,CAAC,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,OAAO,GAAG,CAAC;AACjC,QAAM,aAAa,CAAC,MAAc,UAAkB,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO;AAC9F,SAAO,IAAI;AAAA,IACT,WAAW,KAAK,KAAK,OAAO,GAAG;AAAA,IAC/B,WAAW,KAAK,OAAO,OAAO,KAAK;AAAA,IACnC,WAAW,KAAK,MAAM,OAAO,IAAI;AAAA,EACnC,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AAChE;AAEA,SAAS,aAAa,OAAe,OAAe;AAClD,SAAO,YAAY,OAAO,WAAW,KAAK;AAC5C;AAEA,SAAS,YAAY,OAAe,OAAe;AACjD,SAAO,YAAY,OAAO,WAAW,KAAK;AAC5C;AAEA,SAAS,wBAAwB,OAAkB,SAAyB;AAC1E,SAAO,MAAM,oBAAoB,CAAC,KAC7B,MAAM,OAAO,CAAC,GAAG,SACjB,MAAM,OAAO,CAAC,GAAG,aACjB,MAAM,iBACN,MAAM,aACN,QAAQ;AACf;AAEA,SAASC,gCAA+B,SAA6B;AACnE,MAAI,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,SAAO,WAAW,MAAM,UAAU,MAAM;AAC1C;AAEA,SAAS,iCAAiC,OAAgB;AACxD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,aAAa,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAChE,SAAO,iBAAiB,KAAK,UAAU,IAAI,IAAI,WAAW,YAAY,CAAC,KAAK;AAC9E;AAEA,SAAS,4BAA4B,OAAkB;AACrD,QAAM,qBAAqB,iCAAiC,MAAM,OAAO,CAAC,GAAG,SAAS,MAAM,OAAO,CAAC,GAAG,SAAS;AAChH,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AACA,QAAM,eAAe,iCAAiC,MAAM,oBAAoB,CAAC,CAAC;AAClF,SAAO,gBAAgB,iBAAiB,qBAAqB,OAAO;AACtE;AAEA,SAAS,8BAA8B,WAAmB,OAAe;AACvE,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,MACL,aAAa,WAAW,IAAI;AAAA,MAC5B;AAAA,MACA,YAAY,WAAW,GAAG;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,WAAW,GAAG;AAAA,IAC3B,aAAa,WAAW,IAAI;AAAA,IAC5B;AAAA,IACA,YAAY,WAAW,GAAG;AAAA,IAC1B,YAAY,WAAW,IAAI;AAAA,EAC7B;AACF;AAEA,SAASC,0BAAyB,OAAkB;AAClD,QAAM,aAAaD,gCAA+B,MAAM,YAAY;AACpE,QAAM,oBAAoB,4BAA4B,KAAK;AAC3D,MAAI,eAAe,IAAI;AACrB,WAAO,8BAA8B,qBAAqB,WAAW,CAAC;AAAA,EACxE;AACA,MAAI,eAAe,MAAM,mBAAmB;AAC1C,WAAO,8BAA8B,mBAAmB,CAAC;AAAA,EAC3D;AACA,MAAI,eAAe,MAAO,MAAM,cAAc,QAAQ,cAAc,MAAO;AACzE,WAAO,CAAC,WAAW,WAAW,SAAS;AAAA,EACzC;AACA,MAAI,eAAe,MAAM,eAAe,MAAO,MAAM,cAAc,QAAQ,cAAc,MAAO;AAC9F,WAAO,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,kCAAkC,OAAkB;AAC3D,QAAM,aAAaA,gCAA+B,MAAM,YAAY;AACpE,QAAM,eAAe,MAAM,OAAO,OAAO,MAAM,QAAQ,YAAY,OAAQ,MAAM,IAAgC,iBAAiB,WAC9H,OAAQ,MAAM,IAAgC,YAAY,IAC1D;AACJ,UACG,iBAAiB,kBAAkB,iBAAiB,sBACjD,eAAe,MAAM,eAAe,MAAM,eAAe,MAAM,eAAe;AAEtF;AAEA,SAAS,oBAAoB,OAAkB;AAC7C,QAAM,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAiC;AAChG,QAAM,oBAAoB,OAAO,KAAK,oBAAoB,YAAY,OAAO,SAAS,IAAI,eAAe,IACrG,IAAI,kBACJ;AACJ,MAAI,qBAAqB,QAAQ,oBAAoB,KAAK,EAAE,sBAAsB,KAAK,KAAK,MAAM,cAAc,OAAO;AACrH,WAAO;AAAA,EACT;AACA,QAAM,iBAAiBC,0BAAyB,KAAK;AACrD,MAAI,kCAAkC,KAAK,KAAK,kBAAkB,eAAe,SAAS,GAAG;AAC3F,WAAO,eAAe;AAAA,EACxB;AACA,MAAI,MAAM,qBAAqB,MAAM,kBAAkB,SAAS,GAAG;AACjE,WAAO,MAAM,kBAAkB;AAAA,EACjC;AACA,MAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,WAAO,eAAe;AAAA,EACxB;AACA,SAAO,MAAM,YAAY,IAAI;AAC/B;AAEA,SAAS,qBAAqB,OAAkB,SAAyB;AACvE,QAAM,iBAAiBA,0BAAyB,KAAK;AACrD,MAAI,kCAAkC,KAAK,KAAK,kBAAkB,eAAe,UAAU,GAAG;AAC5F,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,MAAM,qBAAqB,CAAC,GAAG,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AACtI,MAAI,cAAc,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,eAAe,UAAU,GAAG;AAChD,WAAO;AAAA,EACT;AACA,QAAM,YAAY,wBAAwB,OAAO,OAAO;AACxD,SAAO;AAAA,IACL,YAAY,WAAW,IAAI;AAAA,IAC3B,YAAY,WAAW,IAAI;AAAA,IAC3B;AAAA,IACA,aAAa,WAAW,IAAI;AAAA,IAC5B,aAAa,WAAW,IAAI;AAAA,IAC5B,aAAa,WAAW,GAAG;AAAA,EAC7B;AACF;AAEA,SAAS,iBAAiB,OAAwC;AAChE,QAAM,gBAAgB,MAAM,OAAO,QAAQ,CAAC,WAC1C,OAAO,OACJ,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC,EAChC,OAAO,CAAC,UAA2B,SAAS,IAAI,CACpD;AACD,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,cAAc,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAC/F,MAAM,UAAU,MAChB;AACJ,QAAM,cAAc,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAC/F,MAAM,UAAU,MAChB;AACJ,QAAM,SAAS,KAAK,IAAI,GAAG,aAAa;AACxC,QAAM,SAAS,KAAK,IAAI,GAAG,aAAa;AACxC,QAAM,YAAY,KAAK,IAAI,GAAG,oBAAoB,KAAK,CAAC;AACxD,QAAM,WAAW,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,CAAC;AAC5D,QAAM,YAAY,WAAW;AAC7B,QAAM,YAAY,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC,CAAC;AAChF,QAAM,aAAa,YAAY;AAC/B,QAAM,WAAW,cAAc,IAAI,IAAI,cAAc,IAAI,IAAI,cAAc,IAAI,IAAI;AACnF,QAAM,OAAO,OAAO,MAAM,WAAW,cAAc,YAAY,MAAM,UAAU,YAAY,IACvF,MAAM,UAAU,YAChB,WAAW;AACf,QAAM,WAAW,gBAAgB,UAAU,IAAI,IAAI,KAAK,MAAM,SAAS,IAAI,IAAI;AAC/E,QAAM,WAAW,eAAe,KAAK,KAAK,SAAS,IAAI,IAAI;AAC3D,QAAM,UAAU,YAAY,WAAW,WAAW,OAAO;AACzD,QAAM,QAAkB,CAAC;AACzB,WAAS,UAAU,UAAU,WAAW,UAAU,OAAO,MAAO,WAAW,MAAM;AAC/E,UAAM,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAAA,EACvC;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAAA,EAC/D;AACF;AAiBA,SAAS,+BAA+B,OAAkB,SAAyB,QAAuB,OAAe;AACvH,QAAM,QAAQ,qBAAqB,OAAO,OAAO;AACjD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,wBAAwB,OAAO,OAAO;AAAA,EAC/C;AACA,QAAM,QAAQ,OAAO;AACrB,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG;AACxD,UAAM,MAAM,MAAM,QAAQ,CAAC,KAAK,OAAO;AACvC,QAAI,SAAS,OAAO,UAAU,MAAM,SAAS,GAAG;AAC9C,aAAO,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM,MAAM,SAAS,CAAC,KAAK,wBAAwB,OAAO,OAAO;AAAA,IACnI;AAAA,EACF;AACA,SAAO,MAAM,MAAM,SAAS,CAAC,KAAK,wBAAwB,OAAO,OAAO;AAC1E;AAEA,SAAS,wBAAwB,OAAkB,SAAyB,QAAuB,OAAe;AAChH,SAAO,+BAA+B,OAAO,SAAS,QAAQ,KAAK;AACrE;AAEA,SAAS,2BAA2B,OAAkB,SAAyB;AAC7E,QAAM,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAiC;AAChG,QAAM,WAAW,MAAM,QAAQ,KAAK,oBAAoB,IACpD,IAAI,qBAAqB,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC,IACzG,CAAC;AACL,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,OAAO,OAAO;AAC5C;AAEA,SAAS,6BAA6B,OAAkB,SAAyB,QAAuB,OAAe;AACrH,QAAM,QAAQ,2BAA2B,OAAO,OAAO;AACvD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,+BAA+B,OAAO,SAAS,QAAQ,KAAK;AAAA,EACrE;AACA,QAAM,QAAQ,OAAO;AACrB,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG;AACxD,UAAM,MAAM,MAAM,QAAQ,CAAC,KAAK,OAAO;AACvC,QAAI,SAAS,OAAO,UAAU,MAAM,SAAS,GAAG;AAC9C,aAAO,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,+BAA+B,OAAO,SAAS,QAAQ,KAAK;AAAA,IAC9H;AAAA,EACF;AACA,SAAO,MAAM,MAAM,SAAS,CAAC,KAAK,+BAA+B,OAAO,SAAS,QAAQ,KAAK;AAChG;AAEA,SAAS,YAAY,OAAe,QAAQ,GAAG;AAC7C,QAAM,MAAM,cAAc,KAAK;AAC/B,MAAI,CAAC,KAAK;AACR,WAAO,CAAC,KAAK,KAAK,KAAK,KAAK;AAAA,EAC9B;AACA,SAAO,CAAC,IAAI,MAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,OAAO,KAAK,KAAK;AAC/D;AAEA,SAAS,kBAAkB,OAAe,WAAmB;AAC3D,QAAM,SAAS,aAAa,IACxB,aAAa,OAAO,OAAO,YAAY,KAAK,KAAK,GAAG,IAAI,CAAC,IACzD,YAAY,OAAO,OAAO,IAAI,aAAa,KAAK,GAAG,IAAI,CAAC;AAC5D,SAAO,YAAY,QAAQ,CAAC;AAC9B;AAEA,SAAS,oBAAoB,KAAa,KAAa,KAAa,KAAa,GAAW,GAAW;AACrG,SACE,OAAO,IAAI,MAAM,IAAI,KACnB,MAAM,KAAK,IAAI,KACf,OAAO,IAAI,KAAK,IAChB,MAAM,IAAI;AAEhB;AAEA,SAAS,kBAAkB,QAAgB,MAAc;AACvD,SAAO,QAAQ,IAAI,KAAM,UAAU,OAAO,KAAM,OAAO;AACzD;AAEA,SAAS,kBAAkB,KAAa,MAAc;AACpD,SAAO,QAAQ,IAAI,KAAM,OAAO,OAAO,KAAM,OAAO;AACtD;AAEA,SAAS,kBAAkB,OAAe,QAAuB,YAAoB;AACnF,SAAO,IAAK,QAAQ,OAAO,aAAa,OAAO,UAAU,OAAO,YAAa,OAAO,OAAO;AAC7F;AAEA,SAAS,wBACP,GACA,GACA,GACA,SACA,SACA,gBACA,qBACA;AACA,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,KAAK,IAAI,OAAO,IAAI;AAC1B,QAAM,KAAK,CAAC,IAAI,OAAO,IAAI;AAC3B,QAAM,KAAK,IAAI,OAAO,KAAK;AAC3B,QAAM,KAAK,IAAI,OAAO,KAAK;AAC3B,QAAM,cAAc,iBAChB,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,OAAO,sBAAsB,IAAI,IAC9D;AACJ,SAAO;AAAA,IACL,OAAO;AAAA,IACP,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,EACV;AACF;AAEA,SAAS,cAAc,MAAsB,QAAwB,OAAuB;AAC1F,QAAM,KAAK,OAAO,SAAS,KAAK;AAChC,QAAM,KAAK,OAAO,SAAS,KAAK;AAChC,QAAM,KAAK,OAAO,SAAS,KAAK;AAChC,QAAM,KAAK,MAAM,SAAS,KAAK;AAC/B,QAAM,KAAK,MAAM,SAAS,KAAK;AAC/B,QAAM,KAAK,MAAM,SAAS,KAAK;AAC/B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAM,SAAS,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK;AACzC,SAAO;AAAA,IACL,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,EACV;AACF;AAEA,SAAS,mBAAmB,OAAuB,OAA+B;AAChF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAuB,OAA+B;AACjF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,MAAM,QAAQ;AAAA,EACvB;AACF;AAEA,SAAS,sBAAsB,OAAkB;AAC/C,QAAM,eAAe,MAAM,OAAO,OAAO,MAAM,QAAQ,YAAY,OAAO,MAAM,IAAI,iBAAiB,WACjG,MAAM,IAAI,eACV;AACJ,MAAI,iBAAiB,gBAAgB;AACnC,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,kBAAkB;AACrC,WAAO;AAAA,EACT;AACA,SAAO,MAAM,cAAc,aAAa,MAAM,SAAS;AACzD;AAEA,SAAS,iBAAiB,OAAkB,SAAyB,QAA4C;AAC/G,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,OAAO,MAAM,OAAO,OAAO,CAAC,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,OAAO,MAAM,GAAG,CAAC;AACxF,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,OAAO,IAAI,CAAC,WAC/B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,gBAAgB,WAAW,OAAO,OAAO,WAAW,CAAC,CAAC,CACxF;AACD,QAAM,SAAS,iBAAiB,KAAK;AACrC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,YAAY,sBAAsB,KAAK;AAC7C,QAAM,cAAc,MAAM,cAAc;AACxC,QAAM,eAAgC,CAAC;AACvC,QAAM,gBAAwC,CAAC;AAC/C,QAAM,eAAmF,CAAC;AAC1F,QAAM,YAAgF,CAAC;AACvF,QAAM,eAAe,YAAY,KAAK;AACtC,QAAM,OAAO,MAAM,MAAM,QAAQ,SAAS,cAAc,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK;AACxF,QAAM,OAAO,MAAM,MAAM,QAAQ,SAAS,cAAc,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK;AACvF,QAAM,iBAAiB,CAAC,aAAa,MAAM,QAAQ,WAAW;AAC9D,QAAM,sBAAsB,OAAO,MAAM,QAAQ,gBAAgB,iBAAiB,KAAK,MAAM,KAAK,GAAG,CAAC;AACtG,QAAM,aAAa,YAAY,IAAI,OAAO,MAAM,QAAQ,gBAAgB,OAAO,KAAK,KAAK,CAAC;AAC1F,QAAM,mBAAmB,MAAM,oBAAoB;AACnD,QAAM,gBAAgB,MAAM,UAAU,aAAa,MAAM,UAAU,aAAa,MAAM,OAAO,aAAa,MAAM,iBAAiB;AACjI,QAAM,eAAe,MAAM,UAAU,aAAa;AAClD,QAAM,eAAe,MAAM,UAAU,aAAa;AAClD,QAAM,YAAY,MAAM,OAAO,aAAa;AAC5C,QAAM,eAAe,CAAC,QAAgB,KAAa,UAAkC;AACnF,UAAM,SAAS,kBAAkB,QAAQ,IAAI;AAC7C,QAAI,WAAW;AACb,aAAO;AAAA,QACL,OAAO;AAAA,QACP;AAAA,QACA,QAAQ,kBAAkB,KAAK,IAAI;AAAA,QACnC,QAAQ;AAAA,QACR,GAAG;AAAA,QACH,GAAG,kBAAkB,KAAK,IAAI;AAAA,MAChC;AAAA,IACF;AACA,UAAM,SAAS,kBAAkB,OAAO,QAAQ,UAAU;AAC1D,UAAM,SAAS,kBAAkB,KAAK,IAAI;AAC1C,UAAM,YAAY,wBAAwB,QAAQ,QAAQ,QAAQ,MAAM,MAAM,gBAAgB,mBAAmB;AACjH,WAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,UAAU;AAAA,MACb,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AACA,QAAM,cAAc,CAAC,GAAmB,GAAmB,GAAmB,GAAmB,UAAkB;AACjH,kBAAc;AAAA,MACZ,EAAE,OAAO,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,MAC3B,EAAE,OAAO,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,cAAc,CAAC,MAAsB,IAAoB,UAAkB;AAC/E,cAAU,KAAK,EAAE,OAAO,MAAM,GAAG,CAAC;AAAA,EACpC;AAEA,WAAS,WAAW,GAAG,WAAW,OAAO,GAAG,YAAY,GAAG;AACzD,aAAS,cAAc,GAAG,cAAc,OAAO,GAAG,eAAe,GAAG;AAClE,YAAM,MAAM,OAAO,QAAQ,IAAI,WAAW;AAC1C,YAAM,MAAM,OAAO,QAAQ,IAAI,cAAc,CAAC;AAC9C,YAAM,MAAM,OAAO,WAAW,CAAC,IAAI,WAAW;AAC9C,YAAM,MAAM,OAAO,WAAW,CAAC,IAAI,cAAc,CAAC;AAClD,UAAI,OAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAAM;AAC5D;AAAA,MACF;AACA,eAAS,UAAU,GAAG,UAAU,cAAc,WAAW,GAAG;AAC1D,iBAAS,aAAa,GAAG,aAAa,cAAc,cAAc,GAAG;AACnE,gBAAM,KAAK,aAAa;AACxB,gBAAM,MAAM,aAAa,KAAK;AAC9B,gBAAM,KAAK,UAAU;AACrB,gBAAM,MAAM,UAAU,KAAK;AAC3B,gBAAM,SAAS,CAAC,GAAW,MAAc;AACvC,kBAAM,QAAQ,oBAAoB,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AAC1D,mBAAO;AAAA,cACL,WAAW,wBAAwB,OAAO,SAAS,QAAQ,KAAK;AAAA,cAChE,OAAO,YACH,mBAAmB,aAAa,cAAc,GAAG,WAAW,GAAG,KAAK,GAAG,cAAc,OAAO,IAAI,IAChG,aAAa,cAAc,GAAG,WAAW,GAAG,KAAK;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AACA,gBAAM,IAAI,OAAO,IAAI,EAAE;AACvB,gBAAM,IAAI,OAAO,IAAI,EAAE;AACvB,gBAAM,IAAI,OAAO,IAAI,EAAE;AACvB,gBAAM,IAAI,OAAO,IAAI,EAAE;AACvB,cAAI,CAAC,aAAa;AAChB,kBAAM,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC7C,kBAAM,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC7C,yBAAa;AAAA,cACX,EAAE,GAAG,GAAG,WAAW,wBAAwB,OAAO,SAAS,QAAQ,IAAI,EAAE;AAAA,cACzE,EAAE,GAAG,GAAG,WAAW,wBAAwB,OAAO,SAAS,QAAQ,IAAI,EAAE;AAAA,cACzE,EAAE,GAAG,GAAG,WAAW,wBAAwB,OAAO,SAAS,QAAQ,IAAI,EAAE;AAAA,cACzE,EAAE,GAAG,GAAG,WAAW,wBAAwB,OAAO,SAAS,QAAQ,IAAI,EAAE;AAAA,cACzE,EAAE,GAAG,GAAG,WAAW,wBAAwB,OAAO,SAAS,QAAQ,IAAI,EAAE;AAAA,cACzE,EAAE,GAAG,GAAG,WAAW,wBAAwB,OAAO,SAAS,QAAQ,IAAI,EAAE;AAAA,YAC3E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,aAAa,OAAO,MAAM,MAAM,GAAG,EAAE;AAC3C,UAAI,aAAa,aAAa;AAC5B,cAAM,UAAU;AAAA,UACd,EAAE,OAAO,KAAK,GAAG,aAAa,GAAG,SAAS;AAAA,UAC1C,EAAE,OAAO,KAAK,GAAG,cAAc,GAAG,GAAG,SAAS;AAAA,UAC9C,EAAE,OAAO,KAAK,GAAG,cAAc,GAAG,GAAG,WAAW,EAAE;AAAA,UAClD,EAAE,OAAO,KAAK,GAAG,aAAa,GAAG,WAAW,EAAE;AAAA,QAChD;AACA,cAAM,QAAiE;AAAA,UACrE,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,QACzB;AACA,mBAAW,QAAQ,CAAC,cAAc;AAChC,gBAAM,gBAAiD,CAAC;AACxD,gBAAM,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM;AAC9B,kBAAM,QAAQ,IAAI,QAAQ,MAAM;AAChC,gBAAI,UAAU,GAAG;AACf;AAAA,YACF;AACA,kBAAM,UAAW,MAAM,QAAQ,aAAa,IAAI,QAAQ,aAAe,MAAM,QAAQ,aAAa,IAAI,QAAQ;AAC9G,gBAAI,CAAC,SAAS;AACZ;AAAA,YACF;AACA,kBAAM,SAAS,YAAY,MAAM,SAAS;AAC1C,0BAAc,KAAK;AAAA,cACjB,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,cACjC,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,YACnC,CAAC;AAAA,UACH,CAAC;AACD,cAAI,cAAc,WAAW,GAAG;AAC9B,yBAAa,KAAK;AAAA,cAChB,OAAO,YAAY,wBAAwB,OAAO,SAAS,QAAQ,SAAS,GAAG,IAAI;AAAA,cACnF,MAAM,mBAAmB,aAAa,cAAc,CAAC,GAAG,KAAK,aAAa,cAAc,CAAC,GAAG,KAAK,UAAU,SAAS,GAAG,IAAI;AAAA,cAC3H,IAAI,mBAAmB,aAAa,cAAc,CAAC,GAAG,KAAK,cAAc,GAAG,cAAc,CAAC,GAAG,KAAK,WAAW,GAAG,SAAS,GAAG,IAAI;AAAA,YACnI,CAAC;AAAA,UACH,WAAW,cAAc,WAAW,GAAG;AACrC,kBAAM,UAAU,MAAM,MAAM,MAAM,OAAO;AACzC,kBAAM,WAAW,UAAU,YACvB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IACf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,qBAAS,QAAQ,CAAC,CAAC,WAAW,UAAU,MAAM;AAC5C,oBAAM,YAAY,cAAc,SAAS,KAAK,cAAc,CAAC;AAC7D,oBAAM,aAAa,cAAc,UAAU,KAAK,cAAc,cAAc,SAAS,CAAC;AACtF,kBAAI,CAAC,aAAa,CAAC,YAAY;AAC7B;AAAA,cACF;AACA,2BAAa,KAAK;AAAA,gBAChB,OAAO,YAAY,wBAAwB,OAAO,SAAS,QAAQ,SAAS,GAAG,IAAI;AAAA,gBACnF,MAAM,mBAAmB,aAAa,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI;AAAA,gBAChF,IAAI,mBAAmB,aAAa,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI;AAAA,cAClF,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,WAAW,CAAC,WAAW;AACrB,cAAM,UAAU;AAAA,UACd,EAAE,OAAO,KAAK,GAAG,aAAa,GAAG,SAAS;AAAA,UAC1C,EAAE,OAAO,KAAK,GAAG,cAAc,GAAG,GAAG,SAAS;AAAA,UAC9C,EAAE,OAAO,KAAK,GAAG,cAAc,GAAG,GAAG,WAAW,EAAE;AAAA,UAClD,EAAE,OAAO,KAAK,GAAG,aAAa,GAAG,WAAW,EAAE;AAAA,QAChD;AACA,cAAM,QAAiE;AAAA,UACrE,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,QACzB;AACA,mBAAW,QAAQ,CAAC,cAAc;AAChC,gBAAM,gBAAiD,CAAC;AACxD,gBAAM,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM;AAC9B,kBAAM,QAAQ,IAAI,QAAQ,MAAM;AAChC,gBAAI,UAAU,GAAG;AACf;AAAA,YACF;AACA,kBAAM,UAAW,MAAM,QAAQ,aAAa,IAAI,QAAQ,aAAe,MAAM,QAAQ,aAAa,IAAI,QAAQ;AAC9G,gBAAI,CAAC,SAAS;AACZ;AAAA,YACF;AACA,kBAAM,SAAS,YAAY,MAAM,SAAS;AAC1C,0BAAc,KAAK;AAAA,cACjB,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,cACjC,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,YACnC,CAAC;AAAA,UACH,CAAC;AACD,cAAI,cAAc,WAAW,GAAG;AAC9B,yBAAa,KAAK;AAAA,cAChB,OAAO,YAAY,+BAA+B,OAAO,SAAS,QAAQ,SAAS,GAAG,IAAI;AAAA,cAC1F,MAAM,aAAa,cAAc,CAAC,GAAG,KAAK,aAAa,cAAc,CAAC,GAAG,KAAK,UAAU,SAAS;AAAA,cACjG,IAAI,aAAa,cAAc,CAAC,GAAG,KAAK,cAAc,GAAG,cAAc,CAAC,GAAG,KAAK,WAAW,GAAG,SAAS;AAAA,YACzG,CAAC;AAAA,UACH,WAAW,cAAc,WAAW,GAAG;AACrC,kBAAM,UAAU,MAAM,MAAM,MAAM,OAAO;AACzC,kBAAM,WAAW,UAAU,YACvB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IACf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,qBAAS,QAAQ,CAAC,CAAC,WAAW,UAAU,MAAM;AAC5C,oBAAM,YAAY,cAAc,SAAS,KAAK,cAAc,CAAC;AAC7D,oBAAM,aAAa,cAAc,UAAU,KAAK,cAAc,cAAc,SAAS,CAAC;AACtF,kBAAI,CAAC,aAAa,CAAC,YAAY;AAC7B;AAAA,cACF;AACA,2BAAa,KAAK;AAAA,gBAChB,OAAO,YAAY,+BAA+B,OAAO,SAAS,QAAQ,SAAS,GAAG,IAAI;AAAA,gBAC1F,MAAM,aAAa,UAAU,GAAG,UAAU,GAAG,SAAS;AAAA,gBACtD,IAAI,aAAa,WAAW,GAAG,WAAW,GAAG,SAAS;AAAA,cACxD,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,IAAI,GAAG,MAAM,cAAc,gBAAgB,CAAC;AACpE,QAAM,UAAU,KAAK,IAAI,GAAG,MAAM,YAAY,gBAAgB,CAAC;AAC/D,MAAI,WAAW;AACb,UAAM,UAAU,mBAAmB,aAAa,GAAG,GAAG,OAAO,QAAQ,GAAG,KAAK;AAC7E,UAAM,WAAW,mBAAmB,aAAa,OAAO,GAAG,GAAG,OAAO,QAAQ,GAAG,KAAK;AACrF,UAAM,cAAc,mBAAmB,aAAa,OAAO,GAAG,OAAO,GAAG,OAAO,QAAQ,GAAG,KAAK;AAC/F,UAAM,aAAa,mBAAmB,aAAa,GAAG,OAAO,GAAG,OAAO,QAAQ,GAAG,KAAK;AACvF,QAAI,MAAM,UAAU,WAAW,QAAQ,iBAAiB,eAAe;AACrE,kBAAY,SAAS,UAAU,aAAa,YAAY,YAAY;AAAA,IACtE;AACA,aAAS,cAAc,GAAG,cAAc,MAAM,eAAe,YAAY;AACvE;AAAA,QACE,mBAAmB,aAAa,aAAa,GAAG,OAAO,QAAQ,GAAG,IAAI;AAAA,QACtE,mBAAmB,aAAa,aAAa,OAAO,GAAG,OAAO,QAAQ,GAAG,IAAI;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AACA,aAAS,WAAW,GAAG,WAAW,MAAM,YAAY,SAAS;AAC3D;AAAA,QACE,mBAAmB,aAAa,GAAG,UAAU,OAAO,QAAQ,GAAG,IAAI;AAAA,QACnE,mBAAmB,aAAa,OAAO,GAAG,UAAU,OAAO,QAAQ,GAAG,IAAI;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,gBAAgB,OAAO;AAC7B,UAAM,kBAAkB;AACxB,QAAI,MAAM,OAAO,WAAW,QAAQ,cAAc,eAAe;AAC/D;AAAA,QACE,oBAAoB,aAAa,GAAG,GAAG,aAAa,GAAG,eAAe;AAAA,QACtE,oBAAoB,aAAa,OAAO,GAAG,GAAG,aAAa,GAAG,eAAe;AAAA,QAC7E,oBAAoB,aAAa,OAAO,GAAG,OAAO,GAAG,aAAa,GAAG,eAAe;AAAA,QACpF,oBAAoB,aAAa,GAAG,OAAO,GAAG,aAAa,GAAG,eAAe;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,UAAU,WAAW,QAAQ,iBAAiB,eAAe;AACrE;AAAA,QACE,oBAAoB,aAAa,GAAG,GAAG,OAAO,OAAO,GAAG,eAAe;AAAA,QACvE,oBAAoB,aAAa,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,eAAe;AAAA,QAC9E,oBAAoB,aAAa,OAAO,GAAG,GAAG,aAAa,GAAG,eAAe;AAAA,QAC7E,oBAAoB,aAAa,GAAG,GAAG,aAAa,GAAG,eAAe;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,UAAU,WAAW,QAAQ,iBAAiB,eAAe;AACrE;AAAA,QACE,oBAAoB,aAAa,OAAO,GAAG,GAAG,OAAO,OAAO,GAAG,eAAe;AAAA,QAC9E,oBAAoB,aAAa,OAAO,GAAG,OAAO,GAAG,OAAO,OAAO,GAAG,eAAe;AAAA,QACrF,oBAAoB,aAAa,OAAO,GAAG,OAAO,GAAG,aAAa,GAAG,eAAe;AAAA,QACpF,oBAAoB,aAAa,OAAO,GAAG,GAAG,aAAa,GAAG,eAAe;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AACA,eAAW,QAAQ,OAAO,OAAO;AAC/B,UAAI,MAAM,UAAU,WAAW,QAAQ,kBAAkB,eAAe;AACtE,oBAAY,oBAAoB,aAAa,GAAG,GAAG,IAAI,GAAG,kBAAkB,IAAI,GAAG,oBAAoB,aAAa,OAAO,GAAG,GAAG,IAAI,GAAG,kBAAkB,IAAI,GAAG,aAAa;AAAA,MAChL;AACA,UAAI,MAAM,UAAU,WAAW,QAAQ,kBAAkB,eAAe;AACtE,oBAAY,oBAAoB,aAAa,OAAO,GAAG,GAAG,IAAI,GAAG,kBAAkB,IAAI,GAAG,oBAAoB,aAAa,OAAO,GAAG,OAAO,GAAG,IAAI,GAAG,kBAAkB,IAAI,GAAG,aAAa;AAAA,MAC9L;AAAA,IACF;AACA,aAAS,cAAc,GAAG,cAAc,MAAM,eAAe,YAAY;AACvE,UAAI,MAAM,OAAO,WAAW,QAAQ,kBAAkB,eAAe;AACnE,oBAAY,oBAAoB,aAAa,aAAa,GAAG,aAAa,GAAG,kBAAkB,IAAI,GAAG,oBAAoB,aAAa,aAAa,OAAO,GAAG,aAAa,GAAG,kBAAkB,IAAI,GAAG,aAAa;AAAA,MACtN;AACA,UAAI,MAAM,UAAU,WAAW,QAAQ,kBAAkB,eAAe;AACtE,oBAAY,oBAAoB,aAAa,aAAa,GAAG,aAAa,GAAG,kBAAkB,IAAI,GAAG,oBAAoB,aAAa,aAAa,GAAG,OAAO,OAAO,GAAG,kBAAkB,IAAI,GAAG,aAAa;AAAA,MAChN;AAAA,IACF;AACA,aAAS,WAAW,GAAG,WAAW,MAAM,YAAY,SAAS;AAC3D,UAAI,MAAM,OAAO,WAAW,QAAQ,kBAAkB,eAAe;AACnE,oBAAY,oBAAoB,aAAa,GAAG,UAAU,aAAa,GAAG,kBAAkB,IAAI,GAAG,oBAAoB,aAAa,OAAO,GAAG,UAAU,aAAa,GAAG,kBAAkB,IAAI,GAAG,aAAa;AAAA,MAChN;AACA,UAAI,MAAM,UAAU,WAAW,QAAQ,kBAAkB,eAAe;AACtE,oBAAY,oBAAoB,aAAa,OAAO,GAAG,UAAU,aAAa,GAAG,kBAAkB,IAAI,GAAG,oBAAoB,aAAa,OAAO,GAAG,UAAU,OAAO,OAAO,GAAG,kBAAkB,IAAI,GAAG,aAAa;AAAA,MACxN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,aAAa;AAC7B,UAAM,kBAAkB,CACtB,YACA,SACA,UACA,OACA,WACA,SACA,UACG;AACH,YAAM,gBAAgB,YAAY,WAAW;AAC7C;AAAA,QACE,aAAa,YAAY,SAAS,SAAS;AAAA,QAC3C,aAAa,UAAU,OAAO,OAAO;AAAA,QACrC,SAAS,6BAA6B,OAAO,SAAS,QAAQ,YAAY;AAAA,MAC5E;AAAA,IACF;AACA,aAAS,WAAW,GAAG,WAAW,MAAM,YAAY,GAAG;AACrD,YAAM,YAAY,OAAO,QAAQ,GAAG,OAAO,CAAC,UAA2B,SAAS,IAAI,KAAK,CAAC;AAC1F,YAAM,aAAa,UAAU,SAAS,IAClC,UAAU,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,UAAU,SAC7D,OAAO;AACX,YAAM,WAAW,MAAM,OAAO,QAAQ,GAAG,aACpC,MAAM,OAAO,QAAQ,GAAG,SACxB,6BAA6B,OAAO,SAAS,QAAQ,UAAU;AACpE,eAAS,cAAc,GAAG,cAAc,OAAO,GAAG,eAAe,GAAG;AAClE,cAAM,OAAO,OAAO,QAAQ,IAAI,WAAW;AAC3C,cAAM,QAAQ,OAAO,QAAQ,IAAI,cAAc,CAAC;AAChD,YAAI,QAAQ,QAAQ,SAAS,MAAM;AACjC;AAAA,QACF;AACA,iBAAS,OAAO,GAAG,OAAO,cAAc,QAAQ,GAAG;AACjD,gBAAM,KAAK,OAAO;AAClB,gBAAM,MAAM,OAAO,KAAK;AACxB,gBAAM,aAAa,cAAc;AACjC,gBAAM,WAAW,cAAc;AAC/B,gBAAM,YAAY,QAAQ,QAAQ,QAAQ;AAC1C,gBAAM,UAAU,QAAQ,QAAQ,QAAQ;AACxC,0BAAgB,YAAY,UAAU,UAAU,UAAU,WAAW,SAAS,QAAQ;AAAA,QACxF;AAAA,MACF;AAAA,IACF;AACA,aAAS,cAAc,GAAG,cAAc,MAAM,eAAe,GAAG;AAC9D,YAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAAa,OAAO,QAAQ,IAAI,WAAW,CAAC,EAC/F,OAAO,CAAC,UAA2B,SAAS,IAAI;AACnD,YAAM,gBAAgB,aAAa,SAAS,IACxC,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,aAAa,SACnE,OAAO;AACX,YAAM,cAAc,6BAA6B,OAAO,SAAS,QAAQ,aAAa;AACtF,eAAS,WAAW,GAAG,WAAW,OAAO,GAAG,YAAY,GAAG;AACzD,cAAM,MAAM,OAAO,QAAQ,IAAI,WAAW;AAC1C,cAAM,SAAS,OAAO,WAAW,CAAC,IAAI,WAAW;AACjD,YAAI,OAAO,QAAQ,UAAU,MAAM;AACjC;AAAA,QACF;AACA,iBAAS,OAAO,GAAG,OAAO,cAAc,QAAQ,GAAG;AACjD,gBAAM,KAAK,OAAO;AAClB,gBAAM,MAAM,OAAO,KAAK;AACxB,gBAAM,UAAU,WAAW;AAC3B,gBAAM,QAAQ,WAAW;AACzB,gBAAM,YAAY,OAAO,SAAS,OAAO;AACzC,gBAAM,UAAU,OAAO,SAAS,OAAO;AACvC,0BAAgB,aAAa,SAAS,aAAa,OAAO,WAAW,SAAS,WAAW;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,GAAG,aAAa,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,IAC5C,GAAG,cAAc,QAAQ,CAAC,aAAa,SAAS,MAAM;AAAA,IACtD,GAAG,UAAU,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,EAAE,CAAC;AAAA,IACnD,GAAG,aAAa,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM,KAAK,EAAE,CAAC;AAAA,EACxD;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC1D,QAAM,OAAO,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC1D,QAAM,OAAO,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC1D,QAAM,OAAO,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC1D,QAAM,WAAW,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAClE,QAAM,WAAW,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAClE,QAAM,QAAQ,KAAK;AAAA,IACjB,OAAO,KAAK,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI;AAAA,IAC9C,OAAO,KAAK,SAAS,KAAK,IAAI,MAAM,OAAO,IAAI;AAAA,EACjD,IAAI;AACJ,QAAM,UAAU,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AACvD,QAAM,UAAU,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AACvD,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,YAAY,CAAC,MAAc,WAAW,IAAI,cAAc;AAC9D,QAAM,YAAY,CAAC,MAAc,WAAW,IAAI,cAAc;AAC9D,QAAM,cAAc,CAAC,UAA0B;AAC7C,UAAM,UAAU,UAAU,MAAM,CAAC;AACjC,UAAM,UAAU,UAAU,MAAM,CAAC;AACjC,WAAO;AAAA,MACL,GAAI,UAAU,OAAO,QAAS,IAAI;AAAA,MAClC,GAAG,IAAK,UAAU,OAAO,SAAU;AAAA,MACnC,GAAG,OAAQ,MAAM,QAAQ,YAAY,KAAK,IAAI,MAAM,WAAW,QAAQ,IAAK,IAAI,GAAG,IAAI,CAAC;AAAA,IAC1F;AAAA,EACF;AAEA,QAAM,gBAA0B,CAAC;AACjC,QAAM,aAAuB,CAAC;AAC9B,QAAM,gBAA0B,CAAC;AACjC,QAAM,aAAuB,CAAC;AAC9B,aAAW,YAAY,eAAe;AACpC,UAAM,OAAO,YAAY,SAAS,OAAO,CAAC;AAC1C,eAAW,SAAS,SAAS,QAAQ;AACnC,YAAM,OAAO,YAAY,KAAK;AAC9B,oBAAc,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACzC,iBAAW,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI;AAAA,IAC3D;AAAA,EACF;AACA,WAAS,QAAQ,GAAG,QAAQ,aAAa,QAAQ,SAAS,GAAG;AAC3D,UAAM,OAAO,aAAa,KAAK;AAC/B,UAAM,SAAS,aAAa,QAAQ,CAAC;AACrC,UAAM,QAAQ,aAAa,QAAQ,CAAC;AACpC,QAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;AAC9B;AAAA,IACF;AACA,UAAM,SAAS,cAAc,KAAK,OAAO,OAAO,OAAO,MAAM,KAAK;AAClE,UAAM,iBAAiB,EAAE,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK;AACpD,UAAM,WAAW,OAAO,IAAI,eAAe,IAAI,OAAO,IAAI,eAAe,IAAI,OAAO,IAAI,eAAe;AACvG,UAAM,SAAS,mBACX,YAAY,KAAK,WAAW,CAAC,IAC7B,kBAAkB,KAAK,WAAW,MAAM,MAAM,WAAW,MAAM,MAAM,IAAI,CAAC;AAC9E,KAAC,MAAM,QAAQ,KAAK,EAAE,QAAQ,CAAC,WAAW;AACxC,YAAM,OAAO,YAAY,OAAO,KAAK;AACrC,oBAAc,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AACzC,iBAAW,KAAK,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,IAC5D,CAAC;AAAA,EACH;AAEA,QAAM,gBAA0B,CAAC;AACjC,QAAM,aAAuB,CAAC;AAC9B,YAAU,QAAQ,CAAC,SAAS;AAC1B,UAAM,OAAO,YAAY,KAAK,IAAI;AAClC,UAAM,KAAK,YAAY,KAAK,EAAE;AAC9B,UAAM,OAAO,YAAY,KAAK,OAAO,CAAC;AACtC,kBAAc,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC3D,eAAW,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,EACxF,CAAC;AACD,eAAa,QAAQ,CAAC,SAAS;AAC7B,UAAM,OAAO,YAAY,KAAK,IAAI;AAClC,UAAM,KAAK,YAAY,KAAK,EAAE;AAC9B,UAAM,OAAO,YAAY,KAAK,OAAO,CAAC;AACtC,kBAAc,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAC3D,eAAW,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAAA,EACxF,CAAC;AAED,SAAO;AAAA,IACL,YAAY,IAAI,aAAa,UAAU;AAAA,IACvC,eAAe,IAAI,aAAa,aAAa;AAAA,IAC7C,YAAY,IAAI,aAAa,UAAU;AAAA,IACvC,eAAe,IAAI,aAAa,aAAa;AAAA,IAC7C,YAAY,IAAI,aAAa,UAAU;AAAA,IACvC,eAAe,IAAI,aAAa,aAAa;AAAA,EAC/C;AACF;AAEO,IAAM,4BAAkC,YAAK,SAASC,2BAA0B;AAAA,EACrF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,YAAkB,cAAiC,IAAI;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAU,gBAAS,KAAK;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAU,gBAAS,KAAK;AAChD,QAAM,YAAY,sBAAsB,KAAK;AAE7C,EAAM,iBAAU,MAAM;AACpB,QAAI,WAAW;AACb,eAAS,KAAK;AACd,gBAAU,KAAK;AACf;AAAA,IACF;AACA,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,QAAI,YAAY;AAChB,QAAI,eAAqD;AAEzD,UAAM,cAAc,MAAM;AACxB,UAAI;AACF,cAAM,QAAQ,iBAAiB,OAAO,SAAS,MAAM;AACrD,YAAI,CAAC,OAAO;AACV,cAAI,CAAC,WAAW;AACd,sBAAU,IAAI;AACd,qBAAS,KAAK;AAAA,UAChB;AACA;AAAA,QACF;AACA,cAAM,MAAM,OAAO,oBAAoB;AACvC,eAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,GAAG,CAAC;AACzD,eAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,GAAG,CAAC;AAC3D,2BAAe,YAAAC,SAAW;AAAA,UACxB,YAAY;AAAA,YACV,OAAO;AAAA,YACP,WAAW;AAAA,YACX,OAAO;AAAA,YACP,oBAAoB;AAAA,UACtB;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,cAAc,MAAM,cAAc,SAAS,IAC7C,aAAa;AAAA,UACX,YAAY;AAAA,YACV,OAAO,MAAM;AAAA,YACb,UAAU,MAAM;AAAA,UAClB;AAAA,UACA,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA,OAAO,MAAM,cAAc,SAAS;AAAA,UACpC,OAAO;AAAA,YACL,QAAQ;AAAA,UACV;AAAA,UACA,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAON,WAAW;AAAA,UACX,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUR,CAAC,IACD;AACJ,cAAM,cAAc,MAAM,cAAc,SAAS,IAC7C,aAAa;AAAA,UACX,YAAY;AAAA,YACV,OAAO,MAAM;AAAA,YACb,UAAU,MAAM;AAAA,UAClB;AAAA,UACA,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA,OAAO,MAAM,cAAc,SAAS;AAAA,UACpC,OAAO;AAAA,YACL,QAAQ;AAAA,UACV;AAAA,UACA,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAON,WAAW;AAAA,UACX,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUR,CAAC,IACD;AACJ,cAAM,cAAc,MAAM,cAAc,SAAS,IAC7C,aAAa;AAAA,UACX,YAAY;AAAA,YACV,OAAO,MAAM;AAAA,YACb,UAAU,MAAM;AAAA,UAClB;AAAA,UACA,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,UACA,OAAO,MAAM,cAAc,SAAS;AAAA,UACpC,OAAO;AAAA,YACL,QAAQ;AAAA,UACV;AAAA,UACA,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAON,WAAW;AAAA,UACX,WAAW;AAAA,UACX,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUR,CAAC,IACD;AAEJ,qBAAa,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,OAAO,EAAE,CAAC;AACpD,sBAAc;AACd,sBAAc;AACd,sBAAc;AACd,YAAI,CAAC,WAAW;AACd,mBAAS,IAAI;AACb,oBAAU,KAAK;AAAA,QACjB;AAAA,MACF,QAAQ;AACN,YAAI,CAAC,WAAW;AACd,mBAAS,KAAK;AACd,oBAAU,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,KAAK;AACd,cAAU,KAAK;AACf,gBAAY;AAEZ,WAAO,MAAM;AACX,kBAAY;AACZ,oBAAc,QAAQ;AAAA,IACxB;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,uBAAuB,aAAa,UAAU,CAAC;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,MAAM,SAAS,MAAM,QAAQ;AAAA,MACzC,MAAK;AAAA,MACL,OAAO;AAAA,QACL;AAAA,QACA,QAAQ,YAAY,KAAK,EAAE,YAAY,MAAM,gBAAgB,SAAS,aAAa,WAAW;AAAA,QAC9F,WAAW;AAAA,QACX;AAAA,QACA,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,eAAe;AAAA,QACf,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,OAAO;AAAA,cACL,SAAS,uBAAuB,SAAS;AAAA,cACzC,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,UAAU;AAAA,cACV,OAAO;AAAA,YACT;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,EAAE,SAAS,SAAS,QAAQ,QAAQ,OAAO,GAAG,UAAU,YAAY,OAAO,OAAO;AAAA,YACzF,SAAS,OAAO,OAAO,KAAK,IAAI,OAAO,MAAM;AAAA,YAE5C;AAAA,qCAAuB,WAAW;AAAA,cAClC;AAAA;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ,GAAG,CAAC,MAAM,SACR,KAAK,UAAU,KAAK,SACjB,KAAK,YAAY,KAAK,WACtB,KAAK,eAAe,KAAK,cACzB,KAAK,gBAAgB,KAAK,eAC1B,KAAK,eAAe,KAAK,cACzB,KAAK,OAAO,UAAU,KAAK,OAAO,SAClC,KAAK,OAAO,WAAW,KAAK,OAAO,UACnC,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,QAC3C,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,KAAK,OAC1C,KAAK,OAAO,KAAK,UAAU,KAAK,OAAO,KAAK,SAC5C,KAAK,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,UAC7C,KAAK,YAAY,KAAK,WACtB,KAAK,aAAa,KAAK,QAC3B;;;AD+ZG,IAAAC,sBAAA;AA56CJ,IAAM,6BAA2B,uBAAAC;AAAA,EAC/B,qBAAAC;AAAA,EACC,qBAAAA,QAAqD,QAAQ;AAChE,EAAiE;AAEjE,IAAM,sBAAsE;AAAA,EAC1E,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EACnC,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,aAAa;AAAA,EACvC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EACxC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,uBAAuB;AAAA,EACjD,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EACnC,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAClC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,OAAO;AAAA,EACjC,MAAM,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EACnC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EACtC,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAClC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,gBAAgB;AAAA,EAC1C,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EACtC,MAAM,EAAE,MAAM,MAAM,MAAM,cAAc;AAAA,EACxC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EACnC,MAAM,EAAE,MAAM,MAAM,MAAM,gBAAgB;AAAA,EAC1C,MAAM,EAAE,MAAM,MAAM,MAAM,aAAa;AAAA,EACvC,MAAM,EAAE,MAAM,MAAM,MAAM,aAAa;AAAA,EACvC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EAC3C,MAAM,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACzC,MAAM,EAAE,MAAM,MAAM,MAAM,OAAO;AAAA,EACjC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,EACnC,MAAM,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACzC,MAAM,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACzC,MAAM,EAAE,MAAM,MAAM,MAAM,iBAAiB;AAAA,EAC3C,MAAM,EAAE,MAAM,MAAM,MAAM,eAAe;AAAA,EACzC,MAAM,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EACtC,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ;AAAA,EAClC,MAAM,EAAE,MAAM,MAAM,MAAM,OAAO;AAAA,EACjC,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACpC,MAAM,EAAE,MAAM,MAAM,MAAM,WAAW;AAAA,EACrC,MAAM,EAAE,MAAM,MAAM,MAAM,aAAa;AAAA,EACvC,MAAM,EAAE,MAAM,MAAM,MAAM,gBAAgB;AAAA,EAC1C,MAAM,EAAE,MAAM,MAAM,MAAM,YAAY;AAAA,EACtC,MAAM,EAAE,MAAM,MAAM,MAAM,UAAU;AACtC;AAEA,IAAM,wBAAsB,uBAAAD;AAAA,EAC1B,2BAAAE;AAAA,EACC,2BAAAA,QAAuD,QAAQ;AAClE,EAAiE,SAAS,IAAI,CAAC,YAAY;AACzF,QAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,QAAQ,KAAK,OAAO,QAAQ,MAAM,EAAE;AAChF,QAAM,QAAQ,oBAAoB,EAAE;AACpC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,GAAI,QAAQ,cAAc,CAAC;AAAA,MAC3B,MAAM,OAAO;AAAA,MACb,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,IACpB;AAAA,EACF;AACF,CAAC;AAED,IAAM,6BAA6B,oBAAI,IAAoB;AAAA,EACzD,CAAC,MAAM,0BAA0B;AAAA,EACjC,CAAC,OAAO,0BAA0B;AAAA,EAClC,CAAC,SAAS,0BAA0B;AAAA,EACpC,CAAC,iBAAiB,0BAA0B;AAAA,EAC5C,CAAC,yBAAyB,0BAA0B;AAAA,EACpD,CAAC,OAAO,0BAA0B;AAAA,EAClC,CAAC,MAAM,gBAAgB;AAAA,EACvB,CAAC,OAAO,gBAAgB;AAAA,EACxB,CAAC,OAAO,sBAAsB;AAAA,EAC9B,CAAC,SAAS,sBAAsB;AAAA,EAChC,CAAC,eAAe,cAAc;AAAA,EAC9B,CAAC,eAAe,cAAc;AAAA,EAC9B,CAAC,UAAU,oBAAoB;AAAA,EAC/B,CAAC,WAAW,UAAU;AAAA,EACtB,CAAC,kBAAkB,SAAS;AAAA,EAC5B,CAAC,eAAe,eAAe;AAAA,EAC/B,CAAC,mBAAgB,eAAe;AAClC,CAAC;AAED,IAAM,8BAA8B,oBAAI,IAAoB;AAAA,EAC1D,CAAC,wBAAwB,sBAAsB;AAAA,EAC/C,CAAC,iBAAiB,sBAAsB;AAAA,EACxC,CAAC,kBAAkB,sBAAsB;AAAA,EACzC,CAAC,MAAM,sBAAsB;AAAA,EAC7B,CAAC,OAAO,sBAAsB;AAChC,CAAC;AAED,IAAM,8BAA8B,MAAM;AACxC,QAAM,QAAQ,oBAAI,IAA8B;AAChD,yBAAuB,QAAQ,CAAC,YAAY;AAC1C,UAAM,OAAO,OAAO,QAAQ,YAAY,SAAS,WAAW,QAAQ,WAAW,OAAO;AACtF,UAAM,MAAM,sBAAsB,IAAI;AACtC,QAAI,IAAI,SAAS,GAAG;AAClB,YAAM,IAAI,KAAK,OAAO;AAAA,IACxB;AAAA,EACF,CAAC;AACD,SAAO;AACT,GAAG;AAEH,IAAM,uCAAuC,MAAM;AACjD,QAAM,QAAQ,oBAAI,IAA8B;AAChD,oBAAkB,QAAQ,CAAC,YAAY;AACrC,UAAM,OAAO,OAAO,QAAQ,YAAY,SAAS,WAAW,QAAQ,WAAW,OAAO;AACtF,UAAM,MAAM,sBAAsB,IAAI;AACtC,QAAI,IAAI,SAAS,GAAG;AAClB,YAAM,IAAI,KAAK,OAAO;AAAA,IACxB;AACA,UAAM,YAAY,sBAAsB,QAAQ,YAAY,SAAS;AACrE,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,IAAI,WAAW,OAAO;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,8BAA4B,QAAQ,CAAC,OAAO,QAAQ;AAClD,UAAM,UAAU,MAAM,IAAI,sBAAsB,KAAK,CAAC;AACtD,QAAI,SAAS;AACX,YAAM,IAAI,sBAAsB,GAAG,GAAG,OAAO;AAAA,IAC/C;AAAA,EACF,CAAC;AACD,SAAO;AACT,GAAG;AAEH,SAASC,eAAc,OAAe;AACpC,QAAM,QAAQ,qBAAqB,KAAK,KAAK;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC9C,OAAO,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC/C,KAAK,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC/C;AACF;AAEA,SAASC,aAAY,OAAe,SAAiB,OAAe;AAClE,QAAM,OAAOD,eAAc,KAAK;AAChC,QAAM,SAASA,eAAc,OAAO;AACpC,MAAI,CAAC,QAAQ,CAAC,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9C,QAAM,aAAa,CAAC,MAAc,UAAkB,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO;AAC9F,SAAO,IAAI;AAAA,IACT,WAAW,KAAK,KAAK,OAAO,GAAG;AAAA,IAC/B,WAAW,KAAK,OAAO,OAAO,KAAK;AAAA,IACnC,WAAW,KAAK,MAAM,OAAO,IAAI;AAAA,EACnC,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AAChE;AAEA,SAASE,cAAa,OAAe,OAAe;AAClD,SAAOD,aAAY,OAAO,WAAW,KAAK;AAC5C;AAEA,SAASE,aAAY,OAAe,OAAe;AACjD,SAAOF,aAAY,OAAO,WAAW,KAAK;AAC5C;AAEA,SAASG,OAAM,OAAe,KAAa,KAAa;AACtD,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEA,SAAS,sBAAsB,OAAgB;AAC7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,MACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,MAAM,OAAO,EACrB,QAAQ,kBAAkB,GAAG,EAC7B,KAAK,EACL,YAAY,EACZ,QAAQ,QAAQ,GAAG;AACxB;AAEA,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,IAAM,2BAA2B;AACjC,IAAM,iCAAiC;AAEvC,SAAS,yBAAyB,OAAe;AAC/C,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MACE,QAAQ,WAAW,GAAI,KACpB,QAAQ,WAAW,GAAG,KACtB,gFAAgF,KAAK,OAAO,GAC/F;AACA,WAAO;AAAA,EACT;AACA,SAAO,KAAK,KAAK,OAAO,IAAI,IAAI,QAAQ,QAAQ,MAAM,KAAM,CAAC,MAAM;AACrE;AAEA,SAAS,qBAAqB,YAAgC;AAC5D,MAAI,CAAC,cAAc,WAAW,KAAK,EAAE,WAAW,GAAG;AACjD,WAAO;AAAA,EACT;AACA,QAAM,SAAS,WACZ,MAAM,GAAG,EACT,IAAI,wBAAwB,EAC5B,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AACrC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAO,CAAC,GAAG,QAAQ,cAAgB,UAAU,SAAS,YAAY,EAAE,KAAK,IAAI;AAC/E;AAEA,SAAS,sBAAsB,OAAkB;AAC/C,SAAO,MAAM,aAAa,MAAM,cAAc;AAChD;AAEA,SAAS,0BAA0B,OAAkB;AACnD,SAAO,MAAM,kBAAkB,MAAM,aAAa,MAAM,cAAc;AACxE;AAEA,SAAS,2BAA2B,OAAkB;AACpD,SAAO,MAAM,aAAa,MAAM,kBAAkB;AACpD;AAEA,SAASC,YAAW,OAAgB;AAClC,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,aAAa,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE;AAChD,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,UAAM,SAAS,OAAO,UAAU;AAChC,WAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAkB,aAAqB;AAC/D,QAAM,SAAS,MAAM,OAAO,WAAW;AACvC,QAAM,eAAe,MAAM,oBAAoB,cAAc,KAAK,IAAI,GAAG,MAAM,kBAAkB,MAAM,CAAC;AACxG,SAAO,QAAQ,SAAS,QAAQ,aAAa,gBAAgB,MAAM,aAAa;AAClF;AAEA,SAAS,uBAAuB,OAAkB,aAAqB;AACrE,QAAM,SAAS,MAAM,OAAO,WAAW;AACvC,QAAM,eAAe,MAAM,oBAAoB,cAAc,KAAK,IAAI,GAAG,MAAM,kBAAkB,MAAM,CAAC;AACxG,SAAO,QAAQ,aAAa,QAAQ,SAAS,gBAAgB,MAAM,aAAa;AAClF;AAEA,SAAS,gBAAgB,OAAkB,YAAoB,cAAc,GAAG;AAC9E,QAAM,aAAa,MAAM,OAAO,WAAW,GAAG,iBAAiB,KAAK,CAAC,UAAU,MAAM,UAAU,UAAU;AACzG,MAAI,YAAY,OAAO;AACrB,WAAO,WAAW;AAAA,EACpB;AACA,QAAM,WAAW,MAAM,OAAO,WAAW,GAAG,aAAa,UAAU;AACnE,MAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,UAAM,cAAc;AACpB,QAAI,OAAO,YAAY,UAAU,UAAU;AACzC,aAAO,YAAY;AAAA,IACrB;AACA,QAAI,OAAO,YAAY,cAAc,UAAU;AAC7C,aAAO,YAAY;AAAA,IACrB;AACA,QAAI,OAAO,YAAY,iBAAiB,UAAU;AAChD,YAAM,aAAa,YAAY,aAAa,QAAQ,MAAM,EAAE;AAC5D,UAAI,mBAAmB,KAAK,UAAU,GAAG;AACvC,eAAO,IAAI,WAAW,YAAY,CAAC;AAAA,MACrC;AAAA,IACF;AACA,UAAM,kBAAkB,YAAY,mBAAmB,OAAO,YAAY,oBAAoB,WAC1F,YAAY,kBACZ;AACJ,QAAI,mBAAmB,OAAO,gBAAgB,iBAAiB,UAAU;AACvE,YAAM,aAAa,gBAAgB,aAAa,QAAQ,MAAM,EAAE;AAChE,UAAI,mBAAmB,KAAK,UAAU,GAAG;AACvC,eAAO,IAAI,WAAW,YAAY,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,MAAM;AACtB,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,SAAS,MAAM,2BAA2B;AAChD,WAAO,SAAS,aAAa,UAAU,QAAQ,MAAM,KAAK,QAAQ,aAAa,QAAQ,MAAM;AAAA,EAC/F;AACA,SAAO,iBAAiB,OAAO,WAAW;AAC5C;AAEA,SAAS,sBAAsB,QAA4C;AACzE,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAC7C,OAAO,MACP;AACJ,SAAO,MAAM,QAAQ,KAAK,oBAAoB,KAAK,IAAI,qBAAqB,SAAS;AACvF;AAEA,SAAS,qBAAqB,OAAkB;AAC9C,SAAO,MAAM,OAAO,KAAK,CAAC,WAAW,sBAAsB,MAAM,CAAC;AACpE;AAEA,SAAS,wBAAwB,OAAgB,aAAqC,WAAW;AAC/F,QAAM,SAAS,sBAAsB,KAAK;AAC1C,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI,eAAe,YAAY;AAC7B,UAAMC,gBAAe,4BAA4B,IAAI,MAAM,KAAK;AAChE,WAAO,oCAAoC,IAAIA,aAAY,KAAK;AAAA,EAClE;AACA,QAAM,eAAe,2BAA2B,IAAI,MAAM,KAAK;AAC/D,SAAO,2BAA2B,IAAI,YAAY,KAAK;AACzD;AAEA,SAAS,0BAA0B,OAAkB,aAAqB;AACxE,SAAO,MAAM,OAAO,WAAW,GAAG,SAC7B,MAAM,OAAO,WAAW,GAAG,aAC3B,MAAM,oBAAoB,CAAC,KAC3B;AACP;AAEA,SAAS,0BAA0B,OAAkB,aAAqB;AACxE,QAAM,aAAa,0BAA0B,gBAAgB,OAAO,GAAG,WAAW,CAAC;AACnF,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,QAAQ,MAAM,iBAAiB,IAAI,MAAM,oBAAoB,CAAC;AACpF,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,SAAS,MAAM,2BAA2B;AAChD,UAAM,eAAe;AAAA,MACnB,SAAU,SAAS,QAAQ,SAAU,QAAQ,UAAU,QAAQ,MAAM;AAAA,IACvE;AACA,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,0BAA0B,MAAM,OAAO,WAAW,GAAG,SAAS,MAAM,OAAO,WAAW,GAAG,SAAS,KACpG;AACP;AAEA,SAAS,4BAA4B,QAA4C;AAC/E,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAC7C,OAAO,MACP;AACJ,QAAM,SAAS,MAAM,QAAQ,KAAK,WAAW,IACzC,IAAI,YACH,IAAI,CAAC,UAAU,0BAA0B,KAAK,CAAC,EAC/C,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,IAClD,CAAC;AACL,SAAO,OAAO,UAAU,IAAI,SAAS;AACvC;AAEA,SAAS,6BAA6B,QAA4C;AAChF,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAC7C,OAAO,MACP;AACJ,QAAM,SAAS,MAAM,QAAQ,KAAK,mBAAmB,IACjD,IAAI,oBACH,IAAI,CAAC,UAAW,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,EAAG,EAC9D,OAAO,CAAC,UAA2B,MAAM,SAAS,CAAC,IACpD,CAAC;AACL,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,iCAAiC,QAA4C;AACpF,QAAM,MAAM,QAAQ,OAAO,OAAO,OAAO,QAAQ,WAC7C,OAAO,MACP;AACJ,SAAO,KAAK,oBAAoB,OAAO,IAAI,qBAAqB,WAC5D,IAAI,mBACJ;AACN;AAEA,SAAS,2BAA2B,QAAkB,WAA2C;AAC/F,QAAM,gBAAgB,OAAO,WAAW,kBAAkB,WACtD,UAAU,cAAc,KAAK,EAAE,YAAY,IAC3C;AACJ,QAAM,iBAAiB,OAAO,OAAO,CAAC,UAAU,wBAAwB,OAAO,SAAS,KAAK,IAAI,EAAE;AACnG,QAAM,eAAe,OAAO,OAAO,CAAC,UAAU,wBAAwB,OAAO,UAAU,KAAK,IAAI,EAAE;AAClG,MAAI,kBAAkB,QAAQ,eAAe,KAAK,gBAAgB,gBAAgB;AAChF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,YAAoC;AACpE,SAAO,eAAe,aAAa,oBAAoB;AACzD;AAEA,SAAS,oCAAoC,OAAiB,OAAe;AAC3E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,QAAM,UAAUF,OAAM,OAAO,GAAG,CAAC;AACjC,QAAM,SAAS,WAAW,MAAM,SAAS;AACzC,QAAM,aAAa,KAAK,MAAM,MAAM;AACpC,QAAM,aAAa,KAAK,IAAI,MAAM,SAAS,GAAG,aAAa,CAAC;AAC5D,QAAM,WAAW,SAAS;AAC1B,SAAOH,aAAY,MAAM,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS,CAAC,GAAG,QAAQ;AAC1G;AAEA,SAAS,2BAA2B,OAAkB,aAAqB,OAAe;AACxF,QAAM,gBAAgB,4BAA4B,MAAM,OAAO,WAAW,KAAK,IAAI;AACnF,MAAI,eAAe;AACjB,WAAO,oCAAoC,eAAe,KAAK;AAAA,EACjE;AACA,QAAM,YAAY,0BAA0B,OAAO,WAAW;AAC9D,SAAO,oCAAoC;AAAA,IACzCC,cAAa,WAAW,IAAI;AAAA,IAC5BA,cAAa,WAAW,IAAI;AAAA,IAC5BC,aAAY,WAAW,IAAI;AAAA,EAC7B,GAAG,KAAK;AACV;AAEA,SAAS,4BAA4B,OAAkB,aAAqB;AAC1E,QAAM,YAAY,0BAA0B,OAAO,WAAW;AAC9D,SAAO,0BAA0B,SAAS,KAAK;AACjD;AAEA,SAAS,0BAA0B,OAAgC;AACjE,QAAM,qBAAqB,KAAK,IAAI,GAAG,MAAM,OAAO,UAAU,CAAC,WAAW,OAAO,WAAW,IAAI,CAAC;AACjG,QAAM,oBAAoB,6BAA6B,MAAM,OAAO,kBAAkB,KAAK,IAAI;AAC/F,MAAI,mBAAmB;AACrB,UAAM,eAAe,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAAC;AAC1D,WAAO,aAAa,IAAI,CAAC,OAAO,WAAW;AAAA,MACzC,OAAO,gBAAgB,OAAO,OAAO,kBAAkB;AAAA,MACvD,OAAO;AAAA,IACT,EAAE;AAAA,EACJ;AACA,QAAM,UAAU,MAAM,OAAO,kBAAkB,GAAG,UAAU,CAAC,GAC1D,IAAI,CAAC,UAAUE,YAAW,KAAK,CAAC,EAChC,OAAO,CAAC,UAA2B,SAAS,IAAI;AACnD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM;AACnC,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM;AACnC,QAAM,QAAQ,uBAAuB,UAAU,UAAU,MAAS,EAAE,MAAM,GAAG,CAAC;AAC9E,SAAO,MAAM,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,UAAU;AAC7C,UAAM,WAAW,MAAM,QAAQ,CAAC,KAAK;AACrC,UAAM,WAAW,QAAQ,WAAW,QAAQ;AAC5C,UAAM,SAAS,WAAW,YAAY,KAAK,IAAI,MAAM,WAAW,QAAQ;AACxE,WAAO;AAAA,MACL,OAAO,2BAA2B,OAAO,oBAAoB,KAAK;AAAA,MAClE,OAAO,GAAG,gBAAgB,IAAI,CAAC,IAAI,gBAAgB,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BAA2B,SAA6B;AAC/D,MAAI,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,SAAO,WAAW,MAAM,UAAU,MAAM;AAC1C;AAEA,SAAS,qBAAqB,OAAkB,aAAqB;AACnE,QAAM,aAAa,2BAA2B,MAAM,YAAY;AAChE,MAAI,eAAe,IAAI;AACrB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,MAAM,OAAO,WAAW,GAAG,SACxC,MAAM,OAAO,WAAW,GAAG,aAC3B,MAAM,oBAAoB,CAAC,KAC3B;AACL,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACLH,cAAa,WAAW,IAAI;AAAA,IAC5BC,aAAY,WAAW,IAAI;AAAA,IAC3B;AAAA,IACAA,aAAY,WAAW,IAAI;AAAA,IAC3BD,cAAa,WAAW,IAAI;AAAA,IAC5BC,aAAY,WAAW,GAAG;AAAA,EAC5B;AACF;AAEA,SAAS,qBAAqB,OAAkB,YAAoB,cAAc,GAAG;AACnF,QAAM,aAAa,MAAM,OAAO,WAAW,GAAG,iBAAiB,KAAK,CAAC,UAAU,MAAM,UAAU,UAAU;AACzG,MAAI,YAAY,OAAO;AACrB,WAAO,WAAW;AAAA,EACpB;AACA,QAAM,iBAAiB,qBAAqB,OAAO,WAAW;AAC9D,MAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,WAAO,eAAe,aAAa,eAAe,MAAM,KAAK,eAAe,CAAC;AAAA,EAC/E;AACA,SAAO,gBAAgB,OAAO,YAAY,WAAW;AACvD;AAEA,SAAS,4BAA4B,OAAkB;AACrD,MAAI,YAAY;AAChB,MAAI,YAAY,OAAO;AAEvB,QAAM,OAAO,QAAQ,CAAC,QAAQ,UAAU;AACtC,QAAI,gBAAgB;AACpB,QAAI,QAAQ;AACZ,eAAW,YAAY,OAAO,QAAQ;AACpC,YAAM,QAAQE,YAAW,QAAQ;AACjC,UAAI,SAAS,QAAQ,QAAQ,GAAG;AAC9B,yBAAiB;AACjB,iBAAS;AAAA,MACX;AAAA,IACF;AACA,UAAM,QAAQ,gBAAgB,MAAY;AAC1C,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,kBAAY;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEA,SAAS,qBACP,OACA,aACA,OACA,kBACA;AACA,QAAM,SAAS,MAAM,OAAO,WAAW;AACvC,QAAM,cAAc,iBAAiB,OAAO,WAAW;AACvD,QAAM,gBAAgB,uBAAuB,OAAO,WAAW;AAC/D,QAAM,qBAAqB,OAAO,QAAQ,gBAAgB,YAAY,OAAO,SAAS,OAAO,WAAW,IACpG,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,WAAW,CAAC,IAC7C;AACJ,MAAI,QAAQ,KAAK,QAAQ,kBAAkB;AACzC,UAAM,uBAAuB,qBAAqB,SAC9C,SACA,OAAO,kBACH,qBAAqB,cAAc,MAAM,qBAAqB,WAC/D;AACP,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO,qBAAqB;AAAA,MACpC,aAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;AAEA,SAAS,2BAA2B,UAA8B;AAChE,QAAM,gBAAgB,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,IAC1ED,OAAM,UAAU,GAAG,GAAG,IACtB;AACJ,QAAM,QAAQA,OAAM,iBAAiB,MAAM,gBAAgB,MAAM,IAAI;AACrE,QAAM,QAAQA,OAAM,QAAQ,KAAK,GAAG,IAAI;AACxC,SAAO,EAAE,OAAO,MAAM;AACxB;AAEA,SAASG,yBAAwB,UAA8B;AAC7D,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,2BAA2B,OAA2B;AAC7D,MAAI,CAAC,SAAS,UAAU,QAAQ;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,6BAA6B,OAAkB;AACtD,MAAI,MAAM,cAAc,iBAAiB;AACvC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,cAAc,SAAS,MAAM,MAAM;AAC3C,WAAO;AAAA,EACT;AACA,MACE,MAAM,cAAc,SACjB,MAAM,OAAO,KAAK,CAAC,WAAW,MAAM,QAAQ,OAAO,UAAU,KAAK,OAAO,WAAW,KAAK,CAAC,UAC3F,SAAS,QACN,OAAO,UAAU,YACjB,eAAe,SACf,OAAQ,MAAkC,cAAc,aACtD,MAAiC,aAAa,KAAK,CACzD,CAAC,GACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,cAAc,6BAA6B;AACnD,WAAO;AAAA,EACT;AACA,SAAO,MAAM;AACf;AAEA,SAAS,uBAAuB,OAAgB;AAC9C,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK,EAChB,QAAQ,0BAA0B,EAAE,EACpC,KAAK;AACV;AAEA,SAAS,4BAA4B,SAA6B;AAChE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,YAAY,GAAG;AACpC,QAAM,YAAY,QAAQ,IAAI,QAAQ,MAAM,OAAO,CAAC,IAAI,SAAS,QAAQ,OAAO,EAAE;AAClF,QAAM,QAAQ,sCAAsC,KAAK,SAAS,KAAK,CAAC;AACxE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,WAAW,OAAO,MAAM,CAAC,CAAC;AAChC,QAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,MAAM,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,SAAS,QAAQ,IAAI;AACvC;AAEA,SAAS,kBAAkB,OAAkB;AAC3C,QAAM,oBAAoB,MAAM,OAAO,CAAC,GAAG,cAAc,CAAC;AAC1D,QAAM,gCAAgC,MAAM,oBAAoB;AAChE,QAAM,yBAAyB,gCAC3B,KAAK;AAAA,IACL;AAAA,IACA,GAAG,MAAM,OAAO,IAAI,CAAC,WAAW,KAAK;AAAA,MACnC,4BAA4B,OAAO,eAAe,OAAO;AAAA,MACzD,4BAA4B,OAAO,WAAW,OAAO;AAAA,IACvD,CAAC;AAAA,EACH,IACE;AACJ,QAAM,gBAAgB,KAAK;AAAA,IACzB;AAAA,IACA,kBAAkB;AAAA,IAClB,GAAG,MAAM,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,OAAO,WAAW,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,EAC1F;AACA,MAAI,iBAAiB,GAAG;AACtB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,yBAAyB,MAAM,OAAO,KAAK,CAAC,WAChD,OAAO,WAAW,KAAK,CAAC,UAAU,uBAAuB,KAAK,EAAE,SAAS,CAAC,CAC3E;AACD,QAAM,4BAA4B,MAAM,OAAO,KAAK,CAAC,WAAW;AAC9D,UAAM,mBAAmB,OAAO,WAAW;AAC3C,QAAI,qBAAqB,GAAG;AAC1B,aAAO;AAAA,IACT;AACA,WAAO,OAAO,WAAW,MAAM,CAAC,UAAU,uBAAuB,KAAK,EAAE,WAAW,CAAC;AAAA,EACtF,CAAC,KAAK,CAAC;AACP,SAAO,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,CAAC,GAAG,kBAAkB;AACjE,UAAM,UAAU,kBAAkB,aAAa;AAC/C,QAAI,WAAW,MAAM;AACnB,YAAM,oBAAoB,uBAAuB,OAAO;AACxD,UAAI,kBAAkB,SAAS,GAAG;AAChC,eAAO,oBAAoB,OAAO,SAAS,iBAAiB;AAAA,MAC9D;AAAA,IACF;AACA,UAAM,WAAW,MAAM,OACpB,IAAI,CAAC,WAAW,OAAO,WAAW,aAAa,CAAC,EAChD,KAAK,CAAC,UAAU,uBAAuB,KAAK,EAAE,SAAS,CAAC;AAC3D,QAAI,YAAY,MAAM;AACpB,aAAO,oBAAoB,OAAO,UAAU,uBAAuB,QAAQ,CAAC;AAAA,IAC9E;AACA,WAAO,4BAA4B,OAAO,gBAAgB,CAAC,IAAI;AAAA,EACjE,CAAC;AACH;AAEA,SAAS,aAAa,OAAkB;AACtC,QAAM,aAAa,MAAM,cAAc,CAAC;AACxC,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,qBAAqB,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC;AAC7E,SAAO,mBAAmB,OAAO;AACnC;AAEA,SAAS,qBAAqB,OAAkB;AAC9C,MAAI,CAAC,aAAa,KAAK,GAAG;AACxB,WAAO,MAAM,OAAO,IAAI,CAAC,QAAQ,WAAW;AAAA,MAC1C,OAAO,iBAAiB,OAAO,KAAK;AAAA,MACpC,OAAO,OAAO,QAAQ,UAAU,QAAQ,CAAC;AAAA,IAC3C,EAAE;AAAA,EACJ;AACA,UAAQ,MAAM,cAAc,CAAC,GAAG,QAAQ,CAAC,UACvC,MAAM,OAAO,IAAI,CAAC,QAAQ,iBAAiB;AAAA,IACzC,OAAO,OAAO,aAAa,OAAO,eAAe,OAAO,SAAS,iBAAiB,OAAO,WAAW;AAAA,IACpG,OAAO,OAAO,QAAQ,UAAU,cAAc,CAAC;AAAA,EACjD,EAAE,CACH;AACH;AAEA,SAAS,iBACP,OACA,SACA,iBACA,gBAAgB,OAChB;AACA,QAAM,kBAAkB,MAAM,KAAK,KAAK,CAAC,SACvC,KAAK,MAAM,QACR,QAAQ,SAAS,KAAK,EAAE,KACxB,gBAAgB,KAAK,QAAQ,CACjC;AACD,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,KAAK,KAAK,CAAC,SAAS,KAAK,MAAM,QAAQ,QAAQ,SAAS,KAAK,EAAE,CAAC,KAAK;AACpF;AAEA,SAAS,iBAAiB,OAA0C;AAClE,UAAQ,MAAM,cAAc,CAAC,GAAG,IAAI,CAAC,UAAU;AAC7C,UAAM,UAAU,MAAM,WAAW,CAAC;AAClC,UAAM,eAAe,iBAAiB,OAAO,SAAS,CAAC,aAAa,aAAa,OAAO,aAAa,GAAG,KACnG,MAAM,gBACN;AACL,UAAM,YAAY,iBAAiB,OAAO,SAAS,CAAC,aAAa,aAAa,OAAO,aAAa,KAAK,IAAI,KACtG,MAAM,aACN;AACL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,QAAQ,MAAM;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,OAAO,SAAS,CAAC;AAC9C;AAEA,SAAS,6BAA6B,UAAmB,iBAAqC;AAC5F,QAAM,UAAUF,YAAW,QAAQ;AACnC,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,SAAO,oBAAoB,SAAS,IAAI;AAC1C;AAEA,SAAS,kBAAkB,OAA+B;AACxD,QAAM,SAASA,YAAW,KAAK;AAC/B,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,SAAS,OAAO;AACzB,YAAM,SAAS,kBAAkB,KAAK;AACtC,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,SAAS;AACf,eAAW,OAAO,CAAC,KAAK,SAAS,KAAK,OAAO,UAAU,KAAK,GAAG;AAC7D,YAAM,SAAS,kBAAkB,OAAO,GAAG,CAAC;AAC5C,UAAI,UAAU,MAAM;AAClB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,QAAQ,kBAAkB,KAAK,KAAK;AAC1C,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,UAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,WAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkB,cAAc,4BAA4B,KAAK,GAAG;AAC3F,QAAM,aAAa,kBAAkB,KAAK;AAC1C,QAAM,SAAS,MAAM,OAAO,WAAW,GAAG,UAAU,CAAC;AACrD,SAAO,OACJ,IAAI,CAAC,UAAU,WAAW;AAAA,IACzB,OAAO,qBAAqB,OAAO,OAAO,WAAW;AAAA,IACrD;AAAA,IACA,OAAO,uBAAuB,WAAW,KAAK,CAAC;AAAA,IAC/C,OAAO,KAAK,IAAI,GAAGA,YAAW,QAAQ,KAAK,CAAC;AAAA,EAC9C,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,QAAQ,CAAC;AACtC;AAEA,SAAS,0BAA0B,QAAqC;AACtE,QAAM,MAAM,OAAO,OAAO,OAAO,OAAO,QAAQ,WAC5C,OAAO,MACP;AACJ,QAAM,mBAAmB,KAAK,oBAAoB,OAAO,IAAI,qBAAqB,WAC9E,IAAI,mBACJ;AACJ,QAAM,YAAY,MAAM,QAAQ,kBAAkB,SAAS,IAAI,iBAAiB,YAAY,CAAC;AAC7F,SAAO,UAAU,SAAS,KAAK,kBAAkB,gBAAgB;AACnE;AAEA,SAAS,iBAAiB,OAAkB;AAC1C,MAAI,MAAM,cAAc,YAAY,MAAM,cAAc,aAAa;AACnE,UAAM,qBAAqB,KAAK,IAAI,GAAG,MAAM,OAAO,UAAU,CAAC,WAAW,OAAO,WAAW,IAAI,CAAC;AACjG,UAAM,gBAAgB,MAAM,OAAO,kBAAkB,KAAK;AAC1D,QAAI,CAAC,eAAe;AAClB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,SAAS,kBAAkB,KAAK;AACtC,WAAO,cAAc,OAClB,IAAI,CAAC,UAAU,UAA6B;AAC3C,YAAM,QAAQA,YAAW,QAAQ;AACjC,UAAI,SAAS,QAAQ,CAAC,OAAO,SAAS,KAAK,GAAG;AAC5C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL,OAAO,MAAM,aACT,gBAAgB,OAAO,OAAO,kBAAkB,IAChD,iBAAiB,OAAO,kBAAkB;AAAA,QAC9C,YAAY;AAAA,QACZ,OAAO,uBAAuB,OAAO,KAAK,CAAC,KAAK,OAAO,QAAQ,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF,CAAC,EACA,OAAO,CAAC,UAA+B,SAAS,IAAI;AAAA,EACzD;AAEA,SAAO,MAAM,OACV,IAAI,CAAC,QAAQ,UAA6B;AACzC,UAAM,QAAQ,OAAO,OAAO,OAAe,CAAC,KAAK,UAAU,OAAOA,YAAW,KAAK,KAAK,IAAI,CAAC;AAC5F,QAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,UAAU,OAAO,OAAO,WAAW,YAAY,WAAW,OAAO,UAAU,UAAU;AAC3F,UAAM,QAAQ,OAAO,SACf,QAAQ,SAAS,IAAI,QAAQ,QAAQ,QAAQ,EAAE,EAAE,QAAQ,OAAO,EAAE,IAAI,UAAU,QAAQ,CAAC;AAC/F,WAAO;AAAA,MACL,OAAO,iBAAiB,OAAO,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAK;AAAA,MAC9F,YAAY,0BAA0B,MAAM;AAAA,MAC5C;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAA+B,SAAS,IAAI;AACzD;AAEA,SAAS,mBAAmB,OAAkB;AAC5C,QAAM,OAA4B;AAAA,IAChC,UAAU,CAAC;AAAA,IACX,MAAM,MAAM,SAAS,MAAM,QAAQ;AAAA,EACrC;AACA,QAAM,eAAe,KAAK,YAAY,CAAC;AACvC,QAAM,sBAAsB,oBAAI,IAAoB;AACpD,QAAM,yBAAyB,MAAM,OAAO,KAAK,CAAC,WAAW;AAC3D,UAAM,MAAM,OAAO,OAAO,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAiC;AACnG,WAAO,MAAM,QAAQ,KAAK,0BAA0B;AAAA,EACtD,CAAC,KAAK;AACN,QAAM,yBAAyB,MAAM;AACnC,QAAI,CAAC,wBAAwB;AAC3B,aAAO;AAAA,IACT;AACA,UAAM,MAAM,uBAAuB;AACnC,WAAO,MAAM,QAAQ,IAAI,0BAA0B,IAC/C,IAAI,2BAA2B,IAAI,CAAC,UAAU,MAAM,QAAQ,KAAK,IAC/D,MAAM,IAAI,CAAC,UAAU,uBAAuB,KAAK,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,IACtF,CAAC,CAAC,IACJ;AAAA,EACN,GAAG;AACH,QAAM,WAAW,wBACb,sBAAsB,SACtB,KAAK,IAAI,GAAG,GAAG,MAAM,OAAO,IAAI,CAAC,WAAW,OAAO,OAAO,MAAM,CAAC;AAErE,WAAS,WAAW,GAAG,WAAW,UAAU,YAAY,GAAG;AACzD,UAAM,OAAO,wBAAwB,QAAQ,KAAK,MAAM,OACrD,IAAI,CAAC,WAAW,uBAAuB,OAAO,WAAW,QAAQ,KAAK,OAAO,OAAO,QAAQ,CAAC,CAAC,EAC9F,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AACrC,QAAI,KAAK,WAAW,GAAG;AACrB;AAAA,IACF;AAEA,QAAI,UAAU;AACd,SAAK,QAAQ,CAAC,MAAM,eAAe;AACjC,cAAQ,WAAW,QAAQ,YAAY,CAAC;AACxC,YAAM,wBAAwB,eAAe,KAAK,SAAS,KAAK,KAAK,WAAW;AAChF,UAAI,OAAO,wBACP,SACA,QAAQ,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AACxD,UAAI,CAAC,MAAM;AACT,eAAO,EAAE,UAAU,CAAC,GAAG,MAAM,KAAK;AAClC,YAAI,eAAe,GAAG;AACpB,gBAAM,gBAAgB,oBAAoB;AAC1C,8BAAoB,IAAI,MAAM,aAAa;AAC3C,eAAK,aAAa;AAAA,QACpB,OAAO;AACL,eAAK,aAAa,QAAQ;AAAA,QAC5B;AACA,gBAAQ,SAAS,KAAK,IAAI;AAAA,MAC5B;AACA,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,cAAc,0BAA0B,MAAM,OAAO,MAAM,OAAO,SAAS,CAAC,KAAK;AACvF,YAAQ,SAAS,QAAQ,SAAS,KAAK,KAAK,IAAI,MAAQA,YAAW,aAAa,OAAO,QAAQ,CAAC,KAAK,CAAC;AAAA,EACxG;AAEA,SAAO,aAAa,SAAS,IAAI,OAAO;AAC1C;AAEA,SAAS,gCAAgC,QAAyB;AAChE,QAAM,MAAM,OAAO,OAAO,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAiC;AACnG,QAAM,mBAAmB,KAAK,oBAAoB,OAAO,IAAI,qBAAqB,WAC9E,IAAI,mBACJ;AACJ,QAAM,aAAa,kBAAkB,cAAc,OAAO,iBAAiB,eAAe,WACtF,iBAAiB,aACjB;AACJ,SAAO,YAAY,mBAAmB,cAAc,cAAc;AACpE;AAEA,SAAS,4BAA4B,QAAyB;AAC5D,QAAM,MAAM,OAAO,OAAO,OAAO,OAAO,QAAQ,WAAW,OAAO,MAAiC;AACnG,QAAM,mBAAmB,KAAK,oBAAoB,OAAO,IAAI,qBAAqB,WAC9E,IAAI,mBACJ;AACJ,QAAM,aAAa,kBAAkB,cAAc,OAAO,iBAAiB,eAAe,WACtF,iBAAiB,aACjB;AACJ,SAAO;AAAA,IACL,UAAU,YAAY,aAAa;AAAA,IACnC,YAAY,YAAY,eAAe;AAAA,IACvC,aAAa,YAAY,gBAAgB;AAAA,IACzC,UAAU,YAAY,aAAa;AAAA,EACrC;AACF;AAEA,SAAS,kBAAkB,cAAwB,YAAoB,QAAmC;AACxG,QAAM,QAAQ,aAAa;AAC3B,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,MAAI,UAAU,GAAG;AACf,WAAO,aAAa,CAAC,KAAK;AAAA,EAC5B;AAEA,QAAM,OAAO,WAAW,cACpB,cAAc,QAAQ,KACtB,IAAI,cAAc,QAAQ;AAC9B,MAAI,QAAQ,GAAG;AACb,WAAO,aAAa,CAAC,KAAK;AAAA,EAC5B;AACA,MAAI,QAAQ,OAAO;AACjB,WAAO,aAAa,QAAQ,CAAC,KAAK;AAAA,EACpC;AAEA,QAAM,aAAa,KAAK,MAAM,IAAI,IAAI;AACtC,QAAM,aAAa,KAAK,KAAK,IAAI,IAAI;AACrC,QAAM,WAAW,OAAO,KAAK,MAAM,IAAI;AACvC,QAAM,QAAQ,aAAa,KAAK,IAAI,GAAG,UAAU,CAAC,KAAK,aAAa,CAAC,KAAK;AAC1E,QAAM,QAAQ,aAAa,KAAK,IAAI,GAAG,UAAU,CAAC,KAAK,aAAa,QAAQ,CAAC,KAAK;AAClF,SAAO,SAAS,QAAQ,SAAS;AACnC;AAEA,SAAS,uBAAuB,QAAiD;AAC/E,QAAM,eAAe,OAAO,OACzB,IAAI,CAAC,UAAUA,YAAW,KAAK,CAAC,EAChC,OAAO,CAAC,UAA2B,SAAS,IAAI,EAChD,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AACrC,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,gCAAgC,MAAM;AAC7D,QAAM,KAAK,kBAAkB,cAAc,MAAM,cAAc;AAC/D,QAAM,SAAS,kBAAkB,cAAc,KAAK,cAAc;AAClE,QAAM,KAAK,kBAAkB,cAAc,MAAM,cAAc;AAC/D,QAAM,MAAM,KAAK;AACjB,QAAM,aAAa,KAAK,MAAM;AAC9B,QAAM,aAAa,KAAK,MAAM;AAC9B,QAAM,gBAAgB,aAAa,OAAO,CAAC,UAAU,SAAS,cAAc,SAAS,UAAU;AAC/F,QAAM,WAAW,aAAa,OAAO,CAAC,UAAU,QAAQ,cAAc,QAAQ,UAAU;AACxF,QAAM,eAAe,cAAc,CAAC,KAAK,aAAa,CAAC,KAAK;AAC5D,QAAM,eAAe,cAAc,cAAc,SAAS,CAAC,KAAK,aAAa,aAAa,SAAS,CAAC,KAAK;AACzG,QAAM,OAAO,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,aAAa;AAEhF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,KAAK,aAAa,aAAa,SAAS,CAAC,KAAK;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,KAAK,aAAa,CAAC,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,OAAkB,MAA0C;AAC7F,QAAM,UAAU,KAAK,UAAU,EAAE,QAAQ;AACzC,QAAM,WAAW,QAAQ,CAAC;AAC1B,QAAM,YAAY,UAAU,KAAK,cAAc;AAC/C,QAAM,YAAY,iBAAiB,OAAO,SAAS;AACnD,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC;AACxC,SAAO,UAAU,IAAI,YAAYH,cAAa,WAAWE,OAAM,QAAQ,MAAM,GAAG,GAAG,CAAC;AACtF;AAEA,SAAS,wBAAwB,OAAkB,MAA0C;AAC3F,QAAM,UAAU,KAAK,UAAU,EAAE,QAAQ;AACzC,QAAM,WAAW,QAAQ,CAAC;AAC1B,SAAO,iBAAiB,OAAO,UAAU,KAAK,cAAc,CAAC;AAC/D;AAEA,SAAS,iBAAiB,MAAqD,IAAY,IAAY,IAAY,IAAY;AAC7H,MAAI,CAAC,KAAK,YAAY,KAAK,SAAS,WAAW,GAAG;AAChD;AAAA,EACF;AACA,MAAI,KAAK,UAAU,GAAG;AACpB,yCAAY,MAAM,IAAI,IAAI,IAAI,EAAE;AAChC,SAAK,SAAS,QAAQ,CAAC,UAAU,iBAAiB,OAAO,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAChG;AAAA,EACF;AACA,yCAAc,MAAM,IAAI,IAAI,IAAI,EAAE;AAClC,OAAK,SAAS,QAAQ,CAAC,UAAU,iBAAiB,OAAO,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAClG;AAEA,SAASI,yBAAwB,OAAkB,SAA+B;AAChF,SAAO,MAAM,oBAAoB,CAAC,KAC7B,MAAM,OAAO,CAAC,GAAG,SACjB,MAAM,OAAO,CAAC,GAAG,aACjB,MAAM,iBACN,MAAM,aACN,QAAQ;AACf;AAEA,SAASC,gCAA+B,SAA6B;AACnE,MAAI,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,OAAO,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,SAAO,WAAW,MAAM,UAAU,MAAM;AAC1C;AAEA,SAASC,6BAA4B,OAAkB;AACrD,QAAM,qBAAqB,0BAA0B,MAAM,OAAO,CAAC,GAAG,SAAS,MAAM,OAAO,CAAC,GAAG,SAAS;AACzG,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AACA,QAAM,eAAe,0BAA0B,MAAM,oBAAoB,CAAC,CAAC;AAC3E,SAAO,gBAAgB,iBAAiB,qBAAqB,OAAO;AACtE;AAEA,SAASC,+BAA8B,WAAmB,OAAe;AACvE,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,MACLT,cAAa,WAAW,IAAI;AAAA,MAC5B;AAAA,MACAC,aAAY,WAAW,GAAG;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AAAA,IACLD,cAAa,WAAW,GAAG;AAAA,IAC3BA,cAAa,WAAW,IAAI;AAAA,IAC5B;AAAA,IACAC,aAAY,WAAW,GAAG;AAAA,IAC1BA,aAAY,WAAW,IAAI;AAAA,EAC7B;AACF;AAEA,SAASS,0BAAyB,OAAkB;AAClD,QAAM,aAAaH,gCAA+B,MAAM,YAAY;AACpE,QAAM,oBAAoBC,6BAA4B,KAAK;AAC3D,MAAI,eAAe,IAAI;AACrB,WAAOC,+BAA8B,qBAAqB,WAAW,CAAC;AAAA,EACxE;AACA,MAAI,eAAe,MAAM,mBAAmB;AAC1C,WAAOA,+BAA8B,mBAAmB,CAAC;AAAA,EAC3D;AACA,MAAI,eAAe,MAAO,MAAM,cAAc,QAAQ,cAAc,MAAO;AACzE,WAAO,CAAC,WAAW,WAAW,SAAS;AAAA,EACzC;AACA,MAAI,eAAe,MAAM,eAAe,MAAO,MAAM,cAAc,QAAQ,cAAc,MAAO;AAC9F,WAAO,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAASE,mCAAkC,OAAkB;AAC3D,QAAM,aAAaJ,gCAA+B,MAAM,YAAY;AACpE,QAAM,eAAe,MAAM,OAAO,OAAO,MAAM,QAAQ,YAAY,OAAQ,MAAM,IAAgC,iBAAiB,WAC9H,OAAQ,MAAM,IAAgC,YAAY,IAC1D;AACJ,UACG,iBAAiB,kBAAkB,iBAAiB,sBACjD,eAAe,MAAM,eAAe,MAAM,eAAe,MAAM,eAAe;AAEtF;AAEA,SAASK,qBAAoB,OAAkB;AAC7C,QAAM,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAiC;AAChG,QAAM,oBAAoB,OAAO,KAAK,oBAAoB,YAAY,OAAO,SAAS,IAAI,eAAe,IACrG,IAAI,kBACJ;AACJ,MAAI,qBAAqB,QAAQ,oBAAoB,KAAK,EAAEC,uBAAsB,KAAK,KAAK,MAAM,cAAc,OAAO;AACrH,WAAO;AAAA,EACT;AACA,QAAM,iBAAiBH,0BAAyB,KAAK;AACrD,MAAIC,mCAAkC,KAAK,KAAK,kBAAkB,eAAe,SAAS,GAAG;AAC3F,WAAO,eAAe;AAAA,EACxB;AACA,MAAI,MAAM,qBAAqB,MAAM,kBAAkB,SAAS,GAAG;AACjE,WAAO,MAAM,kBAAkB;AAAA,EACjC;AACA,MAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,WAAO,eAAe;AAAA,EACxB;AACA,SAAO,MAAM,YAAY,IAAI;AAC/B;AAEA,SAASG,sBAAqB,OAAkB,SAA+B;AAC7E,QAAM,iBAAiBJ,0BAAyB,KAAK;AACrD,MAAIC,mCAAkC,KAAK,KAAK,kBAAkB,eAAe,UAAU,GAAG;AAC5F,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,MAAM,qBAAqB,CAAC,GAAG,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC;AACtI,MAAI,cAAc,UAAU,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,eAAe,UAAU,GAAG;AAChD,WAAO;AAAA,EACT;AACA,QAAM,YAAYL,yBAAwB,OAAO,OAAO;AACxD,SAAO;AAAA,IACLL,aAAY,WAAW,IAAI;AAAA,IAC3BA,aAAY,WAAW,IAAI;AAAA,IAC3B;AAAA,IACAD,cAAa,WAAW,IAAI;AAAA,IAC5BA,cAAa,WAAW,IAAI;AAAA,IAC5BA,cAAa,WAAW,GAAG;AAAA,EAC7B;AACF;AAEA,SAASe,gCAA+B,OAAkB,SAA+B,QAAuB,OAAe;AAC7H,QAAM,QAAQD,sBAAqB,OAAO,OAAO;AACjD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAOR,yBAAwB,OAAO,OAAO;AAAA,EAC/C;AACA,QAAM,YAAY,wBAAwB,QAAQ,KAAK;AACvD,SAAO,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC,KAAK,MAAM,MAAM,SAAS,CAAC,KAAKA,yBAAwB,OAAO,OAAO;AACvI;AAEA,SAASU,kBAAiB,OAAwC;AAChE,QAAM,gBAAgB,MAAM,OAAO,QAAQ,CAAC,WAC1C,OAAO,OACJ,IAAI,CAAC,UAAUb,YAAW,KAAK,CAAC,EAChC,OAAO,CAAC,UAA2B,SAAS,IAAI,CACpD;AACD,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,cAAc,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAC/F,MAAM,UAAU,MAChB;AACJ,QAAM,cAAc,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAC/F,MAAM,UAAU,MAChB;AACJ,QAAM,SAAS,KAAK,IAAI,GAAG,aAAa;AACxC,QAAM,SAAS,KAAK,IAAI,GAAG,aAAa;AACxC,QAAM,YAAY,KAAK,IAAI,GAAGS,qBAAoB,KAAK,CAAC;AACxD,QAAM,WAAW,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,CAAC;AAC5D,QAAM,YAAY,WAAW;AAC7B,QAAM,YAAY,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,CAAC;AACxE,QAAM,aAAa,YAAY;AAC/B,QAAM,iBAAiB,cAAc,IAAI,IAAI,cAAc,IAAI,IAAI,cAAc,IAAI,IAAI;AACzF,QAAM,OAAO,OAAO,MAAM,WAAW,cAAc,YAAY,MAAM,UAAU,YAAY,IACvF,MAAM,UAAU,YAChB,iBAAiB;AACrB,QAAM,WAAW,gBAAgB,UAAU,IAAI,IAAI,KAAK,MAAM,SAAS,IAAI,IAAI;AAC/E,QAAM,WAAW,eAAe,KAAK,KAAK,SAAS,IAAI,IAAI;AAC3D,QAAM,UAAU,YAAY,WAAW,WAAW,OAAO;AACzD,QAAM,QAAkB,CAAC;AACzB,WAAS,UAAU,UAAU,WAAW,UAAU,OAAO,MAAO,WAAW,MAAM;AAC/E,UAAM,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAAA,EACvC;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM,UAAU,IAAI,QAAQ,CAAC,UAAU,OAAO;AAAA,EACvD;AACF;AAEA,SAAS,oBAAoB,OAAkB,SAA+B,OAAe;AAC3F,QAAM,QAAQE,sBAAqB,OAAO,OAAO;AACjD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAOR,yBAAwB,OAAO,OAAO;AAAA,EAC/C;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,QAAM,UAAUJ,OAAM,OAAO,GAAG,CAAC,KAAK,MAAM,SAAS;AACrD,QAAM,aAAa,KAAK,MAAM,OAAO;AACrC,QAAM,aAAa,KAAK,IAAI,MAAM,SAAS,GAAG,aAAa,CAAC;AAC5D,QAAM,WAAW,UAAU;AAC3B,SAAOH,aAAY,MAAM,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS,CAAC,GAAG,QAAQ;AAC1G;AAEA,SAASkB,yBAAwB,OAAkB,SAA+B,QAAuB,OAAe;AACtH,SAAOF,gCAA+B,OAAO,SAAS,QAAQ,KAAK;AACrE;AAEA,SAAS,wBAAwB,QAAuB,OAAe;AACrE,QAAM,QAAQ,OAAO;AACrB,WAAS,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG;AACxD,UAAM,MAAM,MAAM,QAAQ,CAAC,KAAK,OAAO;AACvC,QAAI,SAAS,OAAO,UAAU,MAAM,SAAS,GAAG;AAC9C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC;AACrC;AAIA,SAAS,uBAAuB,QAA4B,QAAiB;AAC3E,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,EACT;AACA,aAAO,gBAAAG,MAAyB,EAC7B,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,MAAM,OAAO,UAAU,KAAK,SAAS,gCAAgB,MAAM,GAAG,IAAI,2BAAW,EAAE,MAAM,KAAK;AAC/F;AAEA,SAAS,sBAA6E,QAAa;AACjG,QAAM,OAA6B,CAAC;AACpC,MAAI,aAAiC,CAAC;AACtC,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,CAAC,MAAM,UAAU;AACnB,UAAI,WAAW,UAAU,GAAG;AAC1B,aAAK,KAAK,UAAU;AAAA,MACtB;AACA,mBAAa,CAAC;AACd;AAAA,IACF;AACA,UAAM,YAAY,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE;AAC3C,UAAM,WAAW,WAAW,WAAW,SAAS,CAAC;AACjD,QAAI,CAAC,YAAY,KAAK,IAAI,SAAS,IAAI,UAAU,CAAC,IAAI,QAAQ,KAAK,IAAI,SAAS,IAAI,UAAU,CAAC,IAAI,MAAM;AACvG,iBAAW,KAAK,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AACD,MAAI,WAAW,UAAU,GAAG;AAC1B,SAAK,KAAK,UAAU;AAAA,EACtB;AACA,SAAO;AACT;AAOA,SAAS,8BAA8B,UAAmC;AACxE,QAAM,YAAY,CAAC,GAAG,QAAQ;AAC9B,QAAM,UAAU;AAChB,QAAM,SAAS,CAAC,MAAwB,UACtC,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,WAAW,KAAK,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK;AAEzE,QAAM,QAA8B,CAAC;AAErC,SAAO,UAAU,SAAS,GAAG;AAC3B,UAAM,OAAO,UAAU,MAAM;AAC7B,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,QAA4B,CAAC,KAAK,OAAO,KAAK,GAAG;AACvD,QAAI,UAAU;AACd,WAAO,SAAS;AACd,gBAAU;AACV,eAAS,QAAQ,UAAU,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC7D,cAAM,YAAY,UAAU,KAAK;AACjC,YAAI,CAAC,WAAW;AACd;AAAA,QACF;AACA,YAAI,OAAO,MAAM,MAAM,SAAS,CAAC,KAAK,UAAU,OAAO,UAAU,KAAK,GAAG;AACvE,gBAAM,KAAK,UAAU,GAAG;AAAA,QAC1B,WAAW,OAAO,MAAM,MAAM,SAAS,CAAC,KAAK,UAAU,OAAO,UAAU,GAAG,GAAG;AAC5E,gBAAM,KAAK,UAAU,KAAK;AAAA,QAC5B,WAAW,OAAO,MAAM,CAAC,KAAK,UAAU,OAAO,UAAU,GAAG,GAAG;AAC7D,gBAAM,QAAQ,UAAU,KAAK;AAAA,QAC/B,WAAW,OAAO,MAAM,CAAC,KAAK,UAAU,OAAO,UAAU,KAAK,GAAG;AAC/D,gBAAM,QAAQ,UAAU,GAAG;AAAA,QAC7B,OAAO;AACL;AAAA,QACF;AACA,kBAAU,OAAO,OAAO,CAAC;AACzB,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM,UAAU,MAAM,OAAO,CAAC,OAAO,UAAU;AAC7C,UAAI,UAAU,GAAG;AACf,eAAO;AAAA,MACT;AACA,YAAM,WAAW,MAAM,QAAQ,CAAC;AAChC,aAAO,CAAC,YAAY,CAAC,OAAO,UAAU,KAAK;AAAA,IAC7C,CAAC;AACD,QAAI,QAAQ,UAAU,GAAG;AACvB,YAAM,KAAK,OAAO;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASC,4BAA2B,OAAkB,SAA+B;AACnF,QAAM,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAiC;AAChG,QAAM,WAAW,MAAM,QAAQ,KAAK,oBAAoB,IACpD,IAAI,qBAAqB,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,SAAS,CAAC,IACzG,CAAC;AACL,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO;AAAA,EACT;AACA,SAAOL,sBAAqB,OAAO,OAAO;AAC5C;AAEA,SAASM,8BAA6B,OAAkB,SAA+B,QAAuB,OAAe;AAC3H,QAAM,QAAQD,4BAA2B,OAAO,OAAO;AACvD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAOJ,gCAA+B,OAAO,SAAS,QAAQ,KAAK;AAAA,EACrE;AACA,QAAM,YAAY,wBAAwB,QAAQ,KAAK;AACvD,SAAO,MAAM,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC,KAAKA,gCAA+B,OAAO,SAAS,QAAQ,KAAK;AAClI;AAEA,SAAS,uBAAuB,OAAkB,QAAqB;AACrE,MAAI,CAACF,uBAAsB,KAAK,GAAG;AACjC,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,cAAc,KAAK,IAAI,GAAG,kBAAkB,KAAK,EAAE,MAAM;AAC/D,QAAM,WAAW,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AAChD,QAAM,eAAe,KAAK,IAAI,MAAM,cAAc,KAAK,IAAI,GAAG,QAAQ,CAAC;AACvE,QAAM,aAAa,MAAM,YAAY,OAAO;AAC5C,QAAM,cAAc,MAAM,YAAY,OAAO;AAC7C,MAAI,QAAQ,OAAO,KAAK,QAAQ;AAChC,MAAI,SAAS,OAAO,KAAK,SAAS;AAClC,MAAI,QAAQ,KAAK,IAAI,MAAM,MAAM,IAAI,cAAc;AACjD,YAAQ,SAAS;AAAA,EACnB,OAAO;AACL,aAAS,QAAQ,KAAK,IAAI,MAAM,YAAY;AAAA,EAC9C;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,KAAK,QAAQ,OAAO,KAAK,QAAQ,SAAS;AAAA,IACvD,KAAK,OAAO,KAAK,OAAO,OAAO,KAAK,SAAS,UAAU;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,OAAkB,SAA+B;AAChF,QAAM,SAASG,kBAAiB,KAAK;AACrC,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC;AAAA,EACV;AACA,QAAM,QAAsB,CAAC;AAC7B,WAAS,QAAQ,GAAG,QAAQ,OAAO,MAAM,SAAS,GAAG,SAAS,GAAG;AAC/D,UAAM,QAAQ,OAAO,MAAM,KAAK,KAAK,OAAO;AAC5C,UAAM,MAAM,OAAO,MAAM,QAAQ,CAAC,KAAK,OAAO;AAC9C,UAAM,WAAW,SAAS,MAAM,SAAS;AACzC,UAAM,SAAS,WAAW,OAAO,YAAY,KAAK,IAAI,MAAM,OAAO,UAAU,OAAO,QAAQ;AAC5F,UAAM,KAAK;AAAA,MACT,OAAO,oBAAoB,OAAO,SAAS,KAAK;AAAA,MAChD,OAAO,GAAG,gBAAgB,KAAK,CAAC,IAAI,gBAAgB,GAAG,CAAC;AAAA,IAC1D,CAAC;AAAA,EACH;AACA,SAAO,MAAM,QAAQ;AACvB;AAEA,SAASH,uBAAsB,OAAkB;AAC/C,QAAM,eAAe,MAAM,OAAO,OAAO,MAAM,QAAQ,YAAY,OAAQ,MAAM,IAAgC,iBAAiB,WAC7H,MAAM,IAAgC,eACvC;AACJ,MAAI,iBAAiB,gBAAgB;AACnC,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,kBAAkB;AACrC,WAAO;AAAA,EACT;AACA,SAAO,MAAM,cAAc,aAAa,MAAM,SAAS;AACzD;AAEA,SAAS,kBAAkB,OAAkB,QAAqB;AAChE,QAAM,OAAO,uBAAuB,OAAO,MAAM;AACjD,QAAM,aAAa,kBAAkB,KAAK;AAC1C,QAAM,eAAe,MAAM,OAAO,IAAI,CAAC,QAAQ,UAAU,uBAAuB,OAAO,IAAI,KAAK,IAAI,QAAQ,CAAC,EAAE;AAC/G,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB;AACvE,QAAM,WAAW,KAAK,IAAI,GAAG,aAAa,MAAM;AAChD,QAAM,cAAc,KAAK,IAAI,GAAG,WAAW,MAAM;AACjD,QAAM,kBAAkB,WAAW,IAAI,CAAC,GAAG,UACzC,KAAK,QAAQ,eAAe,IAAI,KAAK,QAAQ,IAAK,SAAS,cAAc,KAAM,KAAK,MACrF;AACD,QAAM,eAAe,aAAa,IAAI,CAAC,GAAG,UACxC,KAAK,MAAM,KAAK,UAAU,YAAY,IAAI,KAAK,SAAS,IAAK,SAAS,WAAW,KAAM,KAAK,OAC7F;AAED,SACE,8CAAC,OACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,QAAQb,cAAa,WAAW,IAAI;AAAA,QACpC,aAAa;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA;AAAA,IACV;AAAA,IACC,WAAW,IAAI,CAAC,OAAO,UACtB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAW;AAAA,QACX,GAAG,gBAAgB,KAAK,KAAK,KAAK;AAAA,QAClC,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,QAE3B;AAAA;AAAA,MAPI,mBAAmB,KAAK;AAAA,IAQ/B,CACD;AAAA,IACA,aAAa,IAAI,CAAC,OAAO,UACxB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAW;AAAA,QACX,GAAG,KAAK,OAAO,KAAK,QAAQ;AAAA,QAC5B,IAAI,aAAa,KAAK,KAAK,KAAK,OAAO;AAAA,QAEtC;AAAA;AAAA,MAPI,mBAAmB,KAAK;AAAA,IAQ/B,CACD;AAAA,KACH;AAEJ;AAEA,SAAS,0BAA0B,OAAgB;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,aAAa,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAChE,SAAO,iBAAiB,KAAK,UAAU,IAAI,IAAI,WAAW,YAAY,CAAC,KAAK;AAC9E;AAEA,SAAS,wBAAwB,OAAkB;AACjD,QAAM,QAAQ;AAAA,IACZ,OAAO,YAAY,MAAM,QAAQ,gBAAgB;AAAA,IACjD,MAAM,YAAY,MAAM,QAAQ,cAAc;AAAA,IAC9C,KAAK,YAAY,MAAM,QAAQ,gBAAgB;AAAA,IAC/C,MAAM,YAAY,MAAM,QAAQ,YAAY;AAAA,IAC5C,QAAQ,YAAY,MAAM,QAAQ,YAAY;AAAA,EAChD;AACA,QAAM,cAAc,IAAI,IAAY,OAAO,OAAO,KAAK,EAAE,OAAO,CAAC,UAA2B,SAAS,IAAI,CAAC;AAC1G,QAAM,mBAAmB,MAAM,OAAO,IAAI,CAAC,GAAG,UAAU,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,KAAK,CAAC;AACxG,QAAM,iBAAiB,MAAM,OAAO,UAAU,IACzC,CAAC,QAAQ,QAAQ,OAAO,OAAO,IAC/B,CAAC,QAAQ,OAAO,OAAO;AAC5B,iBAAe,QAAQ,CAAC,SAAS;AAC/B,QAAI,MAAM,IAAI,KAAK,MAAM;AACvB,YAAM,YAAY,iBAAiB,MAAM;AACzC,UAAI,aAAa,MAAM;AACrB,cAAM,IAAI,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAkB,WAAmB;AAChE,QAAM,MAAM,MAAM,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAiC;AAChG,QAAM,eAAe,KAAK,gBAAgB,OAAO,IAAI,iBAAiB,WAClE,IAAI,eACJ;AACJ,QAAM,kBAAkB,cAAc,mBAAmB,OAAO,aAAa,oBAAoB,WAC7F,aAAa,kBACb;AACJ,QAAM,YAAY,0BAA0B,iBAAiB,YAAY,KAAK,aAAa;AAC3F,QAAM,eAAe,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AACnF,QAAM,cAAc,gBAAgB,QAAQ,gBAAgB,MAAM,YAAY;AAC9E,QAAM,YAAY,gBAAgB,QAAQ,gBAAgB,MAAM,YAAYA,cAAa,WAAW,IAAI;AACxG,SAAO;AAAA,IACL;AAAA,IACA,UAAUA,cAAa,WAAW,GAAG;AAAA,IACrC;AAAA,IACA;AAAA,IACA,YAAYA,cAAa,WAAW,IAAI;AAAA,IACxC,QAAQ;AAAA,IACR,YAAYA,cAAa,WAAW,IAAI;AAAA,EAC1C;AACF;AAEA,SAAS,sBAAsB,OAAkB,SAA6C;AAC5F,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,QAAQ,wBAAwB,KAAK;AAC3C,QAAM,eAAe,oBAAoB,OAAO,SAAS;AACzD,SAAO,MAAM,OAAO,IAAI,CAAC,QAAQ,UAAU;AACzC,QAAI,QAAQ,aAAa;AACzB,QAAI,MAAM,WAAW,OAAO;AAC1B,cAAQ,aAAa;AAAA,IACvB,WAAW,MAAM,SAAS,OAAO;AAC/B,cAAQ,aAAa;AAAA,IACvB,WAAW,MAAM,QAAQ,OAAO;AAC9B,cAAQ,aAAa;AAAA,IACvB,WAAW,MAAM,UAAU,OAAO;AAChC,cAAQ,aAAa;AAAA,IACvB;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,QAAQ,UAAU,QAAQ,CAAC;AAAA,IAC3C;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,OAAkB,WAAmB,SAA6C;AACxG,MAAI,CAAC,MAAM,QAAQ;AACjB,WAAO,CAAC;AAAA,EACV;AACA,MAAI,aAAa,KAAK,GAAG;AACvB,WAAO,qBAAqB,KAAK;AAAA,EACnC;AACA,MAAI,cAAc,SAAS;AACzB,WAAO,sBAAsB,OAAO,OAAO;AAAA,EAC7C;AACA,MAAI,cAAc,WAAW;AAC3B,WAAO,wBAAwB,OAAO,OAAO;AAAA,EAC/C;AACA,MAAI,cAAc,aAAa;AAC7B,WAAO,0BAA0B,KAAK;AAAA,EACxC;AACA,MAAI,cAAc,cAAc,cAAc,WAAW;AACvD,UAAM,gBAAgB,mBAAmB,KAAK;AAC9C,QAAI,CAAC,eAAe,UAAU;AAC5B,aAAO,CAAC;AAAA,IACV;AACA,WAAO,cAAc,SAAS,IAAI,CAAC,OAAO,WAAW;AAAA,MACnD,OAAO,iBAAiB,OAAO,MAAM,cAAc,KAAK;AAAA,MACxD,OAAO,MAAM;AAAA,IACf,EAAE;AAAA,EACJ;AACA,MAAI,cAAc,SAAS,cAAc,WAAW,cAAc,iBAAiB,cAAc,cAAc,cAAc,YAAY;AACvI,QAAI,cAAc,YAAY;AAC5B,YAAM,aAAa,kBAAkB,KAAK;AAC1C,YAAM,SAAS,MAAM,OAAO,CAAC,GAAG,UAAU,CAAC;AAC3C,aAAO,WACJ,IAAI,CAAC,OAAO,WAAW;AAAA,QACtB,OAAO,gBAAgB,OAAO,KAAK;AAAA,QACnC,OAAO,uBAAuB,KAAK;AAAA,QACnC,OAAOG,YAAW,OAAO,KAAK,CAAC,KAAK;AAAA,MACtC,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,QAAQ,KAAK,MAAM,MAAM,KAAK,EAAE,SAAS,CAAC,EAClE,IAAI,CAAC,WAAW;AAAA,QACf,OAAO,MAAM;AAAA,QACb,OAAO,MAAM;AAAA,MACf,EAAE;AAAA,IACN;AACA,WAAO,gBAAgB,KAAK,EAAE,IAAI,CAAC,WAAW;AAAA,MAC5C,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,IACf,EAAE;AAAA,EACJ;AACA,QAAM,aACJ,cAAc,aACX,cAAc,kBACd,cAAc,mBACd,cAAc;AAEnB,SAAO,MAAM,OAAO,IAAI,CAAC,QAAQ,WAAW;AAAA,IAC1C,OAAO,aACF,OAAO,aAAa,OAAO,eAAe,OAAO,SAAS,iBAAiB,OAAO,KAAK,IACxF,iBAAiB,OAAO,KAAK;AAAA,IACjC,OAAO,OAAO,QAAQ,UAAU,QAAQ,CAAC;AAAA,EAC3C,EAAE;AACJ;AAEA,SAAS,YAAY,OAAkB,MAAqB,aAAwC;AAClG,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AACjD,QAAM,SAAS,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC;AACnD,QAAM,iBAAiB,MAAM,cAAc,aACrC,MAAM,OAAO,OAAO,MAAM,QAAQ,YAAY,OAAQ,MAAM,IAAgC,iBAAiB,YAAY,OAAQ,MAAM,IAAgC,YAAY,EAAE,SAAS,SAAS;AAC7M,QAAM,cAAc,MAAM,QAAS,iBAAiB,KAAK,KAAM;AAC/D,QAAM,iBAAiBE,yBAAwB,MAAM,QAAQ,QAAQ;AAErE,QAAM,iBAAiB,YAAY,SAAS,MAAM,mBAAmB,WAAW,mBAAmB;AACnG,QAAM,mBAAmB,YAAY,SAAS,MAAM,mBAAmB,SAAS,mBAAmB;AAEnG,QAAM,WAAW,MAAM,mBAAmB,SAAS,KAAK;AACxD,QAAM,YAAY,MAAM,mBAAmB,UAAU,KAAK;AAC1D,QAAM,UAAU,eAAe,mBAAmB,QAAQ,KAAK;AAC/D,QAAM,aAAa,MAAM,mBAAmB,WAAW,KAAK;AAE5D,QAAM,YAAY,KAAK,IAAI,IAAI,QAAQ,WAAW,SAAS;AAC3D,QAAM,aAAa,KAAK,IAAI,IAAI,SAAS,UAAU,UAAU;AAE7D,QAAM,eAAe,SAAS;AAC9B,QAAM,gBAAgB,UAAU;AAChC,QAAM,sBAAsB,gBAAgB,gBACvC,iBAAiB,WAAW,iBAC7B;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,MAAM;AAAA,MACJ,QAAQ,KAAK,IAAI,IAAI,SAAS,UAAU,UAAU;AAAA,MAClD,MAAM;AAAA,MACN,KAAK;AAAA,MACL,OAAO,KAAK,IAAI,IAAI,QAAQ,WAAW,SAAS;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,cAAc,UAAkB,UAAkB,iBAAiB,GAAG;AAC7E,QAAM,OAAO,KAAK,IAAI,MAAM,WAAW,QAAQ;AAC/C,QAAM,YAAY,OAAO,KAAK,IAAI,GAAG,cAAc;AACnD,QAAM,YAAY,MAAM,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AACxD,QAAM,aAAa,YAAY;AAC/B,QAAM,iBAAiB,cAAc,IAAI,IAAI,cAAc,IAAI,IAAI,cAAc,IAAI,IAAI;AACzF,SAAO,iBAAiB;AAC1B;AAEA,SAAS,uBAAuB,UAAkB,UAAkB,WAAoB;AACtF,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,UAAU;AACpF,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAO,OAAO,cAAc,YAAY,YAAY,IACtD,YACA,cAAc,UAAU,UAAU,CAAC;AACvC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,GAAG;AACvC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,QAAQ,KAAK,MAAM,WAAW,IAAI,IAAI;AAC5C,QAAM,SAAmB,CAAC;AAC1B,WAAS,UAAU,OAAO,WAAW,WAAW,OAAO,MAAO,WAAW,MAAM;AAC7E,QAAI,WAAW,WAAW,OAAO,QAAS,WAAW,WAAW,OAAO,MAAO;AAC5E,aAAO,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,UAAkB,UAAkB,WAAoB,cAAc,OAAO;AAC7G,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC5D,WAAO;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,OAAO,CAAC,GAAG,CAAC;AAAA,IACd;AAAA,EACF;AACA,MAAI,YAAY,cAAc,KAAK,IAAI,GAAG,QAAQ,IAAI;AACtD,MAAI,YAAY,cAAc,KAAK,IAAI,GAAG,QAAQ,IAAI;AACtD,MAAI,aAAa,WAAW;AAC1B,gBAAY,YAAY;AAAA,EAC1B;AACA,QAAM,OAAO,OAAO,cAAc,YAAY,YAAY,IACtD,YACA,cAAc,WAAW,WAAW,CAAC;AACzC,QAAM,aAAa,OAAO,cAAc,YAAY,YAAY,IAC5D,YACA,KAAK,MAAM,YAAY,IAAI,IAAI;AACnC,QAAM,aAAa,OAAO,cAAc,YAAY,YAAY,IAC5D,YACA,KAAK,KAAK,YAAY,IAAI,IAAI;AAClC,QAAM,WAAW,cAAc,KAAK,IAAI,GAAG,UAAU,IAAI;AACzD,QAAM,WAAW,cAAc,WAAW,WAAW,OAAO;AAC5D,QAAM,QAAQ,uBAAuB,UAAU,UAAU,IAAI;AAC7D,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,QAAQ;AAAA,EACvD;AACF;AAEA,SAAS,oCACP,MACA,UACA,UACA,cAAc,OACd;AACA,QAAM,iBAAiB,OAAO,MAAM,QAAQ,YAAY,OAAO,SAAS,KAAK,GAAG;AAChF,QAAM,iBAAiB,OAAO,MAAM,QAAQ,YAAY,OAAO,SAAS,KAAK,GAAG;AAChF,QAAM,SAAS,iBAAiB,OAAO,MAAM,GAAG,IAAI;AACpD,QAAM,SAAS,iBAAiB,OAAO,MAAM,GAAG,IAAI;AACpD,QAAM,SAAS,yBAAyB,QAAQ,QAAQ,MAAM,WAAW,WAAW;AACpF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,KAAK,iBAAiB,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,IACjD,KAAK,iBAAiB,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,IACjD,OAAQ,kBAAkB,iBACtB;AAAA,MACE,iBAAiB,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,MAC5C,iBAAiB,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,MAC5C,MAAM;AAAA,IACR,IACA,OAAO;AAAA,EACb;AACF;AAEA,SAAS,sBAAsB,OAAkB,aAAa,IAAI,aAAa,GAAG;AAChF,QAAM,aAAaH,QAAO,MAAM,QAAQ,gBAAgB,OAAO,KAAK,MAAM,GAAG;AAC7E,QAAM,OAAOA,OAAM,MAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE;AACpD,QAAM,OAAOA,OAAM,MAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE;AACpD,QAAM,iBAAiB,MAAM,QAAQ,WAAW;AAChD,QAAM,sBAAsBA,QAAO,MAAM,QAAQ,gBAAgB,iBAAiB,KAAK,MAAM,KAAK,GAAG,CAAC;AACtG,QAAM,kBAAkBmB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,KAAK,KAAK;AAAA,IAClB,QAAQ,KAAK,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,QAAM,sBAAsBA;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,KAAK,KAAK;AAAA,IAClB,QAAQ,KAAK,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,QAAM,kBAAkB,oBAAoB,IAAI,gBAAgB;AAChE,QAAM,kBAAkB,oBAAoB,IAAI,gBAAgB;AAChE,QAAM,iBAAiBnB,OAAM,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,aAAa,MAAM,KAAK,IAAI;AACtF,QAAM,eAAeA,OAAM,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG;AAChE,QAAM,wBAAwB,kBAAkB;AAChD,QAAM,wBAAwB,kBAAkB;AAChD,QAAM,0BAA0B,KAAK,MAAM,uBAAuB,qBAAqB,KAAK;AAC5F,QAAM,mBAAmBA,OAAM,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG;AAC7D,QAAM,iBAAiBA,OAAM,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,GAAG;AAC3D,QAAM,eAAe,KAAK,IAAI,GAAG,aAAa,aAAa,gBAAgB,KAAK,OAAO,IAAI,KAAK;AAChG,QAAM,eAAe,CAAC,KAAK,IAAI,GAAG,aAAa,aAAa,cAAc;AAC1E,QAAM,iBAAiB,KAAK,IAAI,IAAI,KAAK,MAAM,cAAc,YAAY,IAAI,IAAI;AACjF,QAAM,SAAS,wBAAwB,0BAA0B;AACjE,QAAM,SAAS,wBAAwB,0BAA0B;AACjE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC;AAAA,IAC7C,WAAW,SAAS,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,IAC/C,YAAY,SAAS,IAAI,SAAS,IAAI;AAAA,IACtC,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,CAAC;AAAA,EAC5C;AACF;AAEA,SAAS,gBAAgB,OAAe;AACtC,MAAI,KAAK,IAAI,KAAK,KAAK,KAAM;AAC3B,WAAO,MAAM,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC;AAAA,EACrE;AACA,SAAO,MAAM,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC;AACrE;AAEA,SAAS,uBAAuB,OAAe;AAC7C,SAAO,GAAG,gBAAgB,KAAK,CAAC;AAClC;AAEA,SAAS,uBAAuB,YAAgC;AAC9D,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,aAAa,WAChB,YAAY,EACZ,QAAQ,cAAc,GAAG,EACzB,QAAQ,YAAY,GAAG,EACvB,QAAQ,QAAQ,GAAG;AACtB,SAAO,YAAY,KAAK,UAAU;AACpC;AAEA,SAAS,kBAAkB,QAAgB,SAAkB;AAC3D,QAAM,YAAY,KAAK,MAAM,MAAM;AACnC,QAAM,eAAe,KAAK,OAAO,SAAS,aAAa,KAAU;AACjE,QAAM,UAAU,UACZ,KAAK,IAAI,MAAM,GAAG,CAAC,IACnB,KAAK,IAAI,MAAM,IAAI,EAAE;AACzB,SAAO,IAAI,KAAK,UAAU,YAAY,QAAa,YAAY;AACjE;AAEA,SAAS,sBAAsB,OAAe,YAAgC,SAAkB;AAC9F,QAAM,OAAO,kBAAkB,OAAO,OAAO;AAC7C,QAAM,cAAc,cAAc,IAAI,YAAY;AAClD,QAAM,UAAsC,CAAC;AAE7C,MAAI,OAAO,KAAK,UAAU,GAAG;AAC3B,YAAQ,OAAO;AAAA,EACjB,WAAW,KAAK,KAAK,UAAU,GAAG;AAChC,YAAQ,OAAO;AAAA,EACjB;AAEA,MAAI,OAAO,KAAK,UAAU,GAAG;AAC3B,YAAQ,QAAQ;AAAA,EAClB,WAAW,MAAM,KAAK,UAAU,GAAG;AACjC,YAAQ,QAAQ;AAAA,EAClB,WAAW,+CAA+C,KAAK,UAAU,GAAG;AAC1E,YAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI,OAAO,KAAK,UAAU,GAAG;AAC3B,YAAQ,UAAU;AAAA,EACpB,WAAW,MAAM,KAAK,UAAU,GAAG;AACjC,YAAQ,UAAU;AAAA,EACpB;AAEA,MAAI,IAAI,KAAK,UAAU,GAAG;AACxB,YAAQ,MAAM;AAAA,EAChB;AAEA,MAAI,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACrC,YAAQ,QAAQ;AAChB,YAAQ,MAAM;AAAA,EAChB;AAEA,SAAO,IAAI,KAAK,eAAe,QAAW,OAAO,EAAE,OAAO,IAAI;AAChE;AAEA,SAAS,oBAAoB,OAAkB,OAAgB,WAAW,IAAI;AAC5E,QAAM,YAAY,MAAM,OAAO,OAAO,MAAM,QAAQ,WAChD,MAAM,MACN;AACJ,QAAM,UAAUC,YAAW,KAAK;AAChC,QAAM,aAAa,MAAM,cAAc,cAAc;AACrD,MAAI,WAAW,QAAQ,uBAAuB,UAAU,GAAG;AACzD,WAAO,sBAAsB,SAAS,YAAY,WAAW,aAAa,IAAI;AAAA,EAChF;AAEA,QAAM,aAAa,uBAAuB,KAAK;AAC/C,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAe,UAAkB,WAAW,IAAI;AACvE,MAAI,CAAC,SAAS,YAAY,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,IAAI,KAAK,WAAW,IAAI;AAC/C,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,WAAW,SAAS,CAAC;AAC7D,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,YAAY,GAAG;AACjB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC;AAC/D;AAEA,SAAS,iBAAiB,QAAgB,MAAc;AACtD,MAAI,WAAW,QAAQ;AACrB,WAAO;AAAA,EACT;AACA,QAAM,cAAc,MAAM;AACxB,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG;AACH,aAAO,gBAAAmB,QAAS,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO,OAAO,KAAK,EAAE,EAAE,KAAK;AACtE;AAEA,IAAM,SAAS,KAAK,KAAK;AAEzB,SAAS,gBAAgB,YAAoB,UAAkB;AAC7D,MAAI,QAAQ;AACZ,MAAI,MAAM;AACV,SAAO,MAAM,OAAO;AAClB,WAAO;AAAA,EACT;AACA,SAAO,EAAE,KAAK,MAAM;AACtB;AAEA,SAAS,wBAAwB,YAAoB,UAA2C;AAC9F,QAAM,EAAE,OAAO,IAAI,IAAI,gBAAgB,YAAY,QAAQ;AAC3D,QAAM,WAAoC,CAAC;AAC3C,QAAM,UAAU,KAAK,MAAM,QAAQ,MAAM,IAAI;AAC7C,QAAM,UAAU,KAAK,KAAK,MAAM,MAAM,IAAI;AAC1C,WAAS,OAAO,SAAS,QAAQ,SAAS,QAAQ,GAAG;AACnD,UAAM,aAAa,KAAK,KAAK,IAAI,OAAO;AACxC,UAAM,WAAW,KAAK,KAAK,MAAM,OAAO;AACxC,UAAM,eAAe,KAAK,IAAI,OAAO,UAAU;AAC/C,UAAM,aAAa,KAAK,IAAI,KAAK,QAAQ;AACzC,QAAI,aAAa,eAAe,MAAM;AACpC,eAAS,KAAK,CAAC,cAAc,UAAU,CAAC;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBACP,SACA,SACA,QACA,MACA,OACA,QAAQ,GACR;AACA,SAAO;AAAA,IACL,GAAG,UAAU,KAAK,IAAI,KAAK,IAAI;AAAA,IAC/B,GAAG,UAAU,KAAK,IAAI,KAAK,IAAI,SAAS,OAAO;AAAA,EACjD;AACF;AAEA,SAAS,YAAY,OAAe;AAClC,SAAO,OAAO,MAAM,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,sBACP,SACA,SACA,QACA,MACA,OACA,YACA,UACA,UAAU,OACV;AACA,QAAM,KAAK,SAAS;AACpB,QAAM,WAAW,UAAU,CAAC,CAAC,YAAY,QAAQ,CAAqB,IAAI,wBAAwB,YAAY,QAAQ;AACtH,SAAO,SAAS,IAAI,CAAC,CAAC,cAAc,UAAU,MAAM;AAClD,UAAM,WAAW,gBAAgB,SAAS,SAAS,QAAQ,MAAM,cAAc,CAAC;AAChF,UAAM,SAAS,gBAAgB,SAAS,SAAS,QAAQ,MAAM,YAAY,CAAC;AAC5E,UAAM,cAAc,gBAAgB,SAAS,SAAS,QAAQ,MAAM,cAAc,KAAK;AACvF,UAAM,YAAY,gBAAgB,SAAS,SAAS,QAAQ,MAAM,YAAY,KAAK;AACnF,UAAM,WAAW,aAAa,eAAe,KAAK,KAAK,IAAI;AAC3D,WAAO;AAAA,MACL,KAAK,YAAY,SAAS,CAAC,CAAC,IAAI,YAAY,SAAS,CAAC,CAAC;AAAA,MACvD,KAAK,YAAY,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,MAAM,QAAQ,MAAM,YAAY,OAAO,CAAC,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC;AAAA,MAC7G,KAAK,YAAY,UAAU,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC;AAAA,MACzD,KAAK,YAAY,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,MAAM,QAAQ,MAAM,YAAY,YAAY,CAAC,CAAC,IAAI,YAAY,YAAY,CAAC,CAAC;AAAA,MACvH;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,EACZ,CAAC;AACH;AAEA,SAAS,sBAAsB,OAAe;AAC5C,QAAM,cAAe,QAAQ,SAAU,UAAU;AACjD,SAAO,aAAa,KAAK,KAAK,KAAK,aAAa,KAAK,KAAK;AAC5D;AAEA,SAAS,uBACP,SACA,SACA,QACA,MACA,OACA,OACA,eAAe,OACf;AACA,MAAI,CAAC,gBAAgB,CAAC,sBAAsB,KAAK,GAAG;AAClD,WAAO;AAAA,EACT;AACA,QAAM,YAAY,EAAE,GAAG,SAAS,GAAG,QAAQ;AAC3C,QAAM,eAAe,EAAE,GAAG,SAAS,GAAG,UAAU,MAAM;AACtD,QAAM,UAAU,gBAAgB,SAAS,SAAS,QAAQ,MAAM,OAAO,CAAC;AACxE,QAAM,aAAa,gBAAgB,SAAS,SAAS,QAAQ,MAAM,OAAO,KAAK;AAC/E,SAAO;AAAA,IACL,KAAK,YAAY,UAAU,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC;AAAA,IACzD,KAAK,YAAY,QAAQ,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC,CAAC;AAAA,IACrD,KAAK,YAAY,WAAW,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC,CAAC;AAAA,IAC3D,KAAK,YAAY,aAAa,CAAC,CAAC,IAAI,YAAY,aAAa,CAAC,CAAC;AAAA,IAC/D;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,YAAY,OAAkB,QAAqB,SAA+B;AACzF,MAAI,CAAC,MAAM,OAAO;AAChB,WAAO;AAAA,EACT;AACA,QAAM,WAAW;AACjB,QAAM,OAAO,gBAAgB,MAAM,OAAO,KAAK,IAAI,IAAI,OAAO,QAAQ,EAAE,GAAG,QAAQ;AACnF,QAAM,YAAY,OAAO,eAAe,KAAK,KAAK;AAClD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAM,MAAM,cAAc,MAAM,aAAa;AAAA,MAC7C,YAAY,qBAAqB,MAAM,mBAAmB,MAAM,UAAU;AAAA,MAC1E;AAAA,MACA,YAAY;AAAA,MACZ,YAAW;AAAA,MACX,GAAG,OAAO,QAAQ;AAAA,MAClB,GAAG;AAAA,MAEF;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,aAAa,OAAkB,QAAqB,SAA+B;AAC1F,MAAI,CAAC,MAAM,UAAU,OAAO,YAAY,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AACA,QAAM,YAAY,0BAA0B,KAAK;AACjD,QAAM,YAAY,OAAO;AACzB,QAAM,QAAQ,OAAO;AACrB,QAAM,aAAa;AACnB,QAAM,aAAa,aAAa;AAEhC,MAAI,cAAc,UAAU,cAAc,SAAS;AACjD,UAAM,IAAI,cAAc,UACpB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,IACvC;AACJ,UAAM,SAAS,OAAO,KAAK,MAAM;AACjC,WACE,6CAAC,OACE,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,YAAM,IAAI,SAAS,QAAQ;AAC3B,aACE,8CAAC,OAA0B,WAAW,aAAa,CAAC,KAAK,CAAC,KACxD;AAAA,qDAAC,UAAK,MAAM,KAAK,OAAO,QAAQ,YAAY,IAAI,KAAK,IAAI,KAAK,OAAO,YAAY,GAAG,GAAG,GAAG,IAAI;AAAA,QAC9F,6CAAC,UAAK,MAAM,WAAW,UAAU,IAAI,GAAG,YAAY,GAAG,GACpD,eAAK,OACR;AAAA,WAJM,UAAU,KAAK,EAKvB;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AAEA,QAAM,OAAO,cAAc,QAAS,OAAO,cAAc,KAAO,OAAO,SAAS;AAChF,QAAM,aAAa,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,GAAG,GAAG,CAAC;AAClG,MAAI,UAAU,KAAK,IAAI,IAAI,OAAO,QAAQ,cAAc,CAAC;AACzD,SACE,6CAAC,OACE,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAM,aAAa,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,GAAG;AACvD,UAAM,OACJ,8CAAC,OAA0B,WAAW,aAAa,OAAO,KAAK,IAAI,KACjE;AAAA,mDAAC,UAAK,MAAM,KAAK,OAAO,QAAQ,YAAY,IAAI,KAAK,IAAI,KAAK,OAAO,YAAY,GAAG,GAAG,GAAG,IAAI;AAAA,MAC9F,6CAAC,UAAK,MAAM,WAAW,UAAU,IAAI,GAAG,YAAY,GAAG,GACpD,eAAK,OACR;AAAA,SAJM,UAAU,KAAK,EAKvB;AAEF,eAAW,KAAK;AAChB,WAAO;AAAA,EACT,CAAC,GACH;AAEJ;AAEA,SAAS,oBACP,OACA,SACA,MACA,cACA,gBACA,mBACA,YACA,UACA,kBAA6C,iBAC7C;AACA,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,eAAe,SAAS,CAAC;AAE/B,SACE,8CAAC,OACE;AAAA,eAAW,IAAI,CAAC,SAAS;AACxB,YAAM,gBAAgB,SAAS,IAAI;AACnC,UAAI,cAAc;AAChB,eACE,8CAAC,OACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQtB,cAAa,WAAW,GAAG;AAAA,cACnC,aAAa;AAAA,cACb,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,IAAI,KAAK;AAAA,cACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,UACtB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,UAAU;AAAA,cACV,YAAW;AAAA,cACX,GAAG;AAAA,cACH,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,cAE3B,0BAAgB,IAAI;AAAA;AAAA,UACvB;AAAA,aAjBM,UAAU,IAAI,EAkBtB;AAAA,MAEJ;AACA,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQA,cAAa,WAAW,GAAG;AAAA,YACnC,aAAa;AAAA,YACb,IAAI,KAAK;AAAA,YACT,IAAI,KAAK,OAAO,KAAK;AAAA,YACrB,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,KAAK,OAAO;AAAA,YACf,GAAG,gBAAgB;AAAA,YAElB,0BAAgB,IAAI;AAAA;AAAA,QACvB;AAAA,WAjBM,UAAU,IAAI,EAkBtB;AAAA,IAEJ,CAAC;AAAA,IACA,kBAAkB,IAAI,CAAC,UAAU,UAAU;AAC1C,YAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,UAAI,cAAc;AAChB,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,KAAK,OAAO;AAAA,YACf,GAAG,WAAW;AAAA,YAEb;AAAA;AAAA,UAPI,SAAS,KAAK;AAAA,QAQrB;AAAA,MAEJ;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAW;AAAA,UACX,GAAG;AAAA,UACH,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,UAE3B;AAAA;AAAA,QAPI,SAAS,KAAK;AAAA,MAQrB;AAAA,IAEJ,CAAC;AAAA,IACA,eACC,8EACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,OAAO,KAAK;AAAA,UACrB,IAAI,KAAK,MAAM,KAAK;AAAA,UACpB,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,MACtB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,MACtB;AAAA,OACF,IAEA,8EACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,MACtB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,OAAO,KAAK;AAAA,UACrB,IAAI;AAAA,UACJ,IAAI;AAAA;AAAA,MACN;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,qBAAqB,QAAkC,OAAe;AAC7E,SAAO;AAAA,IACL,GAAG,OAAO,IAAI;AAAA,IACd,GAAG,OAAO,IAAI;AAAA,EAChB;AACF;AAEA,SAAS,0BACP,QACA,OACA,OACA,YACA,UACA;AACA,QAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,WAAW,UAAU,KAAK,KAAK,KAAK,GAAG,CAAC;AACtF,QAAM,SAA0C,CAAC;AACjD,WAAS,OAAO,GAAG,QAAQ,OAAO,QAAQ,GAAG;AAC3C,UAAM,QAAQ,OAAO;AACrB,UAAM,QAAQ,cAAe,WAAW,cAAc;AACtD,WAAO,KAAK;AAAA,MACV,GAAG,OAAO,IAAK,MAAM,IAAI,KAAK,IAAI,KAAK,IAAM,MAAM,IAAI,KAAK,IAAI,KAAK;AAAA,MACrE,GAAG,OAAO,IAAK,MAAM,IAAI,KAAK,IAAI,KAAK,IAAM,MAAM,IAAI,KAAK,IAAI,KAAK;AAAA,IACvE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,UAA2C,QAAyC;AAC9G,MAAI,SAAS,WAAW,KAAK,OAAO,WAAW,GAAG;AAChD,WAAO;AAAA,EACT;AACA,SAAO,mBAAmB,CAAC,GAAG,UAAU,GAAG,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI;AAC5E;AAEA,SAAS,oBACP,KACA,iBACA,WACA,UACA,SACA;AACA,QAAM,SAAS,IAAI,WAAW,IAAI,eAAe,KAAK;AACtD,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,SAAS,IAAI,QAAQ,IAAI,gBAAgB;AAC/C,QAAM,SAAS,IAAI,OAAO,IAAI,gBAAgB;AAC9C,QAAM,SAAS,IAAI;AACnB,QAAM,SAAS,IAAI;AACnB,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,eAAe,IAAI,aAAa;AACtC,QAAM,aAAa,IAAI,WAAW;AAClC,QAAM,aAAa,oBAAoB,SAASE,OAAM,IAAI,eAAe,GAAG,GAAG,CAAC,IAAI;AACpF,QAAM,WAAW,oBAAoB,SAASA,OAAM,IAAI,YAAY,GAAG,GAAG,CAAC,IAAI;AAC/E,QAAM,mBAAmB,oBAAoB,aACxC,IAAI,eAAe,OAAO,OAC1B,IAAI,eAAe,MAAM;AAC9B,QAAM,YAAY,qBAAqB,EAAE,GAAG,SAAS,GAAG,GAAG,SAAS,EAAE,GAAG,gBAAgB;AACzF,QAAM,uBAAuB,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI;AAEjE,MAAI,IAAI,cAAc;AACpB,UAAMqB,eAAc,EAAE,GAAG,SAAS,UAAU,GAAG,GAAG,UAAU,UAAU,EAAE;AACxE,UAAMC,aAAY,EAAE,GAAG,SAAS,SAAS,UAAU,GAAG,GAAG,UAAU,UAAU,EAAE;AAC/E,UAAMC,cAAa,EAAE,GAAG,GAAG,GAAI,SAAS,aAAc,EAAE;AACxD,UAAMC,YAAW,EAAE,GAAG,GAAG,GAAI,SAAS,WAAY,EAAE;AACpD,UAAMC,cAAa,qBAAqB,WAAW,UAAU;AAC7D,UAAMC,YAAW,qBAAqB,WAAW,QAAQ;AACzD,UAAMC,gBAAe,0BAA0BN,cAAaE,aAAYE,aAAY,GAAG,KAAK,EAAE;AAC9F,UAAMG,cAAa,0BAA0BN,YAAWE,WAAUE,WAAU,GAAG,KAAK,EAAE;AACtF,UAAMG,iBAAgB,0BAA0BR,cAAaE,aAAYE,aAAY,KAAK,IAAI,KAAK,KAAK,CAAC;AACzG,UAAMK,eAAc,0BAA0BR,YAAWE,WAAUE,WAAU,KAAK,IAAI,KAAK,KAAK,CAAC;AACjG,UAAMK,gBAAe,mBAAmBH,aAAYD,aAAY;AAChE,UAAMK,iBAAgB,mBAAmBF,cAAaD,cAAa;AACnE,UAAMI,cAAa,WAAW,QAC1B,mBAAmB,0BAA0BX,YAAWE,WAAUE,WAAU,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IACjG;AACJ,UAAM,eAAe,aAAa,QAC9B,mBAAmB,0BAA0BL,cAAaE,aAAYE,aAAY,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IACvG;AACJ,WACE,8CAAC,OACE;AAAA,MAAAM,gBAAe,6CAAC,UAAK,GAAGA,eAAc,MAAM,UAAU,QAAQ,IAAI,QAAQ,aAAa,sBAAsB,IAAK;AAAA,MAClH,cAAcE,cAAa,6CAAC,UAAK,GAAGA,aAAY,MAAM,SAAS,QAAQ,IAAI,QAAQ,aAAa,sBAAsB,IAAK;AAAA,MAC3HD,iBAAgB,6CAAC,UAAK,GAAGA,gBAAe,MAAM,WAAW,QAAQ,IAAI,QAAQ,aAAa,IAAI,aAAa,IAAK;AAAA,MAChH,gBAAgB,eAAe,6CAAC,UAAK,GAAG,cAAc,MAAM,WAAW,QAAQ,IAAI,QAAQ,aAAa,sBAAsB,IAAK;AAAA,SAJ9H,GAAG,IAAI,GAAG,kBAAkB,eAAe,EAKnD;AAAA,EAEJ;AAEA,QAAM,cAAc,EAAE,GAAG,UAAU,UAAU,GAAG,GAAG,SAAS,SAAS,UAAU,EAAE;AACjF,QAAM,YAAY,EAAE,GAAG,UAAU,UAAU,GAAG,GAAG,SAAS,UAAU,EAAE;AACtE,QAAM,aAAa,EAAE,GAAI,SAAS,aAAc,GAAG,GAAG,EAAE;AACxD,QAAM,WAAW,EAAE,GAAI,SAAS,WAAY,GAAG,GAAG,EAAE;AACpD,QAAM,aAAa,qBAAqB,WAAW,UAAU;AAC7D,QAAM,WAAW,qBAAqB,WAAW,QAAQ;AACzD,QAAM,eAAe,0BAA0B,aAAa,YAAY,YAAY,GAAG,KAAK,EAAE;AAC9F,QAAM,aAAa,0BAA0B,WAAW,UAAU,UAAU,GAAG,KAAK,EAAE;AACtF,QAAM,gBAAgB,0BAA0B,aAAa,YAAY,YAAY,KAAK,IAAI,KAAK,KAAK,CAAC;AACzG,QAAM,cAAc,0BAA0B,WAAW,UAAU,UAAU,KAAK,IAAI,KAAK,KAAK,CAAC;AACjG,QAAM,eAAe,mBAAmB,YAAY,YAAY;AAChE,QAAM,gBAAgB,mBAAmB,aAAa,aAAa;AACnE,QAAM,aAAa,WAAW,QAC1B,mBAAmB,0BAA0B,WAAW,UAAU,UAAU,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,IACjG;AACJ,SACE,8CAAC,OACE;AAAA,mBAAe,6CAAC,UAAK,GAAG,cAAc,MAAM,UAAU,QAAQ,IAAI,QAAQ,aAAa,sBAAsB,IAAK;AAAA,IAClH,cAAc,aAAa,6CAAC,UAAK,GAAG,YAAY,MAAM,SAAS,QAAQ,IAAI,QAAQ,aAAa,sBAAsB,IAAK;AAAA,IAC3H,gBAAgB,6CAAC,UAAK,GAAG,eAAe,MAAM,WAAW,QAAQ,IAAI,QAAQ,aAAa,IAAI,aAAa,IAAK;AAAA,OAH3G,GAAG,IAAI,GAAG,OAAO,eAAe,EAIxC;AAEJ;AAEA,SAAS,mBAAmB,KAAc;AACxC,QAAM,mBAAmB,MAAM;AAC7B,YAAQ,IAAI,SAAS;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG;AACH,QAAM,SAAS,IAAI,WAAW,IAAI,eAAe,KAAK;AACtD,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,SAAS,IAAI,QAAQ,IAAI,gBAAgB;AAC/C,QAAM,SAAS,IAAI,OAAO,IAAI,gBAAgB;AAC9C,QAAM,SAAS,IAAI;AACnB,QAAM,SAAS,IAAI;AACnB,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,SAAS;AAEzB,QAAM,cAAc;AACpB,QAAM,aAAa;AACnB,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,cAAchC,OAAM,IAAI,eAAe,GAAG,MAAM,CAAC;AACvD,QAAM,WAAWA,OAAM,IAAI,YAAY,GAAG,MAAM,CAAC;AACjD,QAAM,kBAAmB,SAAS,cAAe;AACjD,QAAM,eAAgB,SAAS,WAAY;AAC3C,QAAM,aAAa,UAAU;AAC7B,QAAM,cAAc,UAAU;AAC9B,QAAM,UAAU,UAAU;AAC1B,QAAM,WAAW,UAAU;AAC3B,QAAM,eAAe,IAAI,aAAa;AACtC,QAAM,aAAa,IAAI,WAAW;AAElC,QAAM,UAAU,GAAG,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,IAAI,UAAU,UAAU,IAAI,SAAS,MAAM,IAAI,SAAS,UAAU,IAAI,SAAS,MAAM;AAC7I,QAAM,WAAW,GAAG,WAAW,IAAI,MAAM,IAAI,WAAW,IAAI,OAAO,IAAI,cAAc,UAAU,IAAI,UAAU,MAAM,IAAI,cAAc,UAAU,IAAI,SAAS,MAAM;AAClK,QAAM,YAAY,IAAI,aAAa,QAAQ,IAAI,UAAU,MAAM,IAAI;AACnE,QAAM,WAAW,IAAI,mBAAmB,IAAI,QAAQD,aAAY,IAAI,OAAO,IAAI;AAC/E,QAAM,UAAU,IAAI,mBAAmBD,cAAa,IAAI,OAAO,IAAI,IAAIA,cAAa,IAAI,OAAO,IAAI;AAEnG,MAAI,oBAAoB,cAAc,oBAAoB,QAAQ;AAChE,WAAO,oBAAoB,KAAK,iBAAiB,WAAW,UAAU,OAAO;AAAA,EAC/E;AAEA,MAAI,oBAAoB,OAAO;AAC7B,WACE,8CAAC,OACC;AAAA,mDAAC,aAAQ,MAAM,UAAU,QAAQ,UAAU,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI,GAAG;AAAA,MACnH,6CAAC,aAAQ,MAAM,SAAS,QAAQ,SAAS,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI,GAAG;AAAA,MACjH,6CAAC,UAAK,MAAM,WAAW,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,aAAa,IAAI,aAAa,OAAO,QAAQ,GAAG,QAAQ,GAAG,QAAQ;AAAA,SAHxH,GAAG,IAAI,GAAG,KAIlB;AAAA,EAEJ;AAEA,MAAI,IAAI,cAAc;AACpB,UAAM,UAAU,SAAS,SAAS;AAClC,UAAM,kBAAmB,SAASE,OAAM,IAAI,eAAe,GAAG,MAAM,CAAC,IAAK;AAC1E,UAAM,gBAAiB,SAASA,OAAM,IAAI,YAAY,GAAG,MAAM,CAAC,IAAK;AACrE,UAAM,WAAW,UAAU;AAC3B,UAAM,cAAc,UAAU;AAC9B,UAAM,SAAS,UAAU;AACzB,UAAM,YAAY,UAAU;AAC5B,UAAM,gBAAgB,GAAG,MAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,UAAU,UAAU,IAAI,SAAS,MAAM,IAAI,SAAS,UAAU,IAAI,WAAW,MAAM;AACvJ,UAAM,gBAAgB,GAAG,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,SAAS,IAAI,UAAU,UAAU,IAAI,YAAY,MAAM,IAAI,UAAU,UAAU,IAAI,SAAS,MAAM;AAE3J,UAAM,iBAAiB,GAAG,OAAO,IAAI,MAAM,IAAI,UAAU,UAAU,IAAI,SAAS,MAAM,IAAI,UAAU,UAAU,IAAI,YAAY,MAAM,IAAI,OAAO,IAAI,SAAS;AAC5J,UAAM,eAAe,GAAG,MAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,IAAI,SAAS,IAAI,MAAM,IAAI,WAAW;AAEhH,WACE,8CAAC,OACC;AAAA,mDAAC,aAAQ,MAAM,UAAU,QAAQ,gBAAgB,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI,GAAG;AAAA,MACzH,6CAAC,aAAQ,MAAM,SAAS,QAAQ,eAAe,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI,GAAG;AAAA,MACvH,6CAAC,aAAQ,MAAM,WAAW,QAAQ,cAAc,QAAQ,IAAI,QAAQ,aAAa,IAAI,aAAa;AAAA,SAH5F,GAAG,IAAI,GAAG,kBAAkB,eAAe,EAInD;AAAA,EAEJ;AAEA,QAAM,iBAAiB,GAAG,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,IAAI,WAAW,UAAU,IAAI,SAAS,MAAM,IAAI,UAAU,UAAU,IAAI,SAAS,MAAM;AACxJ,QAAM,kBAAkB,GAAG,QAAQ,IAAI,MAAM,IAAI,WAAW,IAAI,OAAO,IAAI,cAAc,UAAU,IAAI,UAAU,MAAM,IAAI,WAAW,UAAU,IAAI,SAAS,MAAM;AACnK,QAAM,mBAAmB,GAAG,OAAO,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,IAAI,WAAW,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO;AAEtH,SACE,8CAAC,OACC;AAAA,iDAAC,aAAQ,MAAM,UAAU,QAAQ,iBAAiB,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI,GAAG;AAAA,IACzH,aACC,6CAAC,aAAQ,MAAM,SAAS,QAAQ,gBAAgB,QAAQ,IAAI,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,cAAc,IAAI,GAAG,IACtH;AAAA,IACJ,6CAAC,aAAQ,MAAM,WAAW,QAAQ,kBAAkB,QAAQ,IAAI,QAAQ,aAAa,IAAI,aAAa;AAAA,OALhG,GAAG,IAAI,GAAG,OAAO,eAAe,EAMxC;AAEJ;AAEA,SAAS,mBAAmB,QAAyC,QAAQ,OAAO;AAClF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,OAAO,IAAI,CAAC,OAAO,UAClC,GAAG,UAAU,IAAI,MAAM,GAAG,IAAI,YAAY,MAAM,CAAC,CAAC,IAAI,YAAY,MAAM,CAAC,CAAC,EAC3E;AACD,MAAI,OAAO;AACT,aAAS,KAAK,GAAG;AAAA,EACnB;AACA,SAAO,SAAS,KAAK,GAAG;AAC1B;AAEA,SAASmB,yBACP,GACA,GACA,GACA,SACA,SACA,gBACA,qBACA;AACA,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,OAAO,KAAK,IAAI,OAAO;AAC7B,QAAM,OAAO,KAAK,IAAI,OAAO;AAE7B,QAAM,KAAK,IAAI,OAAO,IAAI;AAC1B,QAAM,KAAK,CAAC,IAAI,OAAO,IAAI;AAC3B,QAAM,KAAK,IAAI,OAAO,KAAK;AAC3B,QAAM,KAAK,IAAI,OAAO,KAAK;AAC3B,QAAM,cAAc,iBAChB,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,OAAO,sBAAsB,KAAK,IAC/D;AAEJ,SAAO;AAAA,IACL,OAAO;AAAA,IACP,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,EACV;AACF;AAEA,SAAS,wBACP,OACA,SACA,QACA,YACA,uBACA,UACA,UACA,aACA,iBACA;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe,MAAM,WAAW,YAAY;AAAA,EAC9C;AACA,aAAW,YAAY;AACvB,aAAW,YAAY;AACvB,QAAM,YAAY,KAAK,IAAI,MAAM,WAAW,QAAQ;AACpD,QAAM,cAAc,KAAK,IAAI,GAAG,MAAM,OAAO,MAAM;AACnD,QAAM,gBAAgB,KAAK,IAAI,GAAG,WAAW,MAAM;AACnD,QAAM,aAAanB,QAAO,MAAM,QAAQ,gBAAgB,OAAO,KAAK,KAAK,CAAC;AAC1E,QAAM,aAAa,eAAe,IAAI,OAAO,QAAQ;AACrD,QAAM,SAAS;AACf,QAAM,QAAQ,CAAC;AACf,QAAM,YAAY,cAAc,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,CAAC,CAAC,IAAI;AAC5E,QAAM,UAAUA,OAAM,MAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE,KAAK,KAAK,KAAK;AACtE,QAAM,UAAUA,OAAM,MAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE,KAAK,KAAK,KAAK;AACtE,QAAM,iBAAiB,MAAM,QAAQ,WAAW;AAChD,QAAM,sBAAsBA,QAAO,MAAM,QAAQ,gBAAgB,iBAAiB,KAAK,MAAM,KAAK,GAAG,CAAC;AAEtG,QAAM,aAAa,CAAC,kBAClB,iBAAiB,IAAI,KAAM,iBAAiB,gBAAgB,KAAM,OAAO;AAE3E,QAAM,aAAa,CAAC,UAClB,IAAK,QAAQ,YAAY,YAAa,OAAO;AAE/C,QAAM,uBAAuB,eAAe,kBACxC,KAAK,IAAI,OAAO,SAAS,SAAS,IAAI,IACtC;AACJ,QAAM,mBAAmB,SAAS;AAClC,QAAM,aAAa,CAAC,gBAClB,eAAe,KAAM,eAAe,kBAChC,SAAS,QACN,eAAe,cAAc,KAAM,QAAQ,SAAS;AAE7D,QAAM,qBAAqB,CAAC,GAAW,OAAe,MAAcmB;AAAA,IAClE;AAAA,IACA,WAAW,KAAK;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,cAAc;AAAA,IAClB,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM;AAAA,IACzB,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM;AAAA,IACxB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,MAAM;AAAA,IACvB,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,MAAM;AAAA,IACxB,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO;AAAA,IAC1B,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO;AAAA,IACzB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO;AAAA,IACxB,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,OAAO;AAAA,EAC3B,EAAE,IAAI,CAAC,WAAWA;AAAA,IAChB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,kBAAkB,sBAAsB,IAAI,CAAC,cAAc,gBAAgB;AAC/E,UAAM,IAAI,WAAW,WAAW;AAChC,WAAO,aAAa,IAAI,CAAC,OAAO,kBAAkB;AAChD,YAAM,IAAI,WAAW,aAAa;AAClC,YAAM,WAAW,kBAAmB,MAAM,MAAM,MAAM,KAAK,YAAc,MAAM,KAAK;AACpF,YAAM,cAAc,cACf,kBAAmB,MAAM,MAAM,YAAa,YAC7C;AACJ,YAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC7C,YAAM,SAAS,mBAAmB,GAAG,aAAa,CAAC;AACnD,YAAM,UAAU,eAAe,kBAC3B,mBAAmB,GAAG,UAAU,gBAAgB,IAChD;AACJ,YAAM,aAAa,eAAe,kBAC9B,mBAAmB,GAAG,aAAa,gBAAgB,IACnD;AACJ,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,QACf,OAAO,IAAI;AAAA,QACX,WAAW,SAAS,SAAS,IAAI;AAAA,QACjC;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,GAAG,gBAAgB,QAAQ,CAAC,WAAW,OAAO,QAAQ,CAAC,UAAU,MAAM,UACnE,CAAC,MAAM,KAAK,MAAM,QAAQ,GAAI,MAAM,UAAU,CAAC,MAAM,OAAO,IAAI,CAAC,GAAI,GAAI,MAAM,aAAa,CAAC,MAAM,UAAU,IAAI,CAAC,CAAE,IACpH,CAAC,CAAC,CAAC;AAAA,EACT;AACA,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,QAAQ,KAAK;AAAA,IACjB,KAAK,QAAQ,KAAK,IAAI,KAAK,OAAO,IAAI;AAAA,IACtC,KAAK,SAAS,KAAK,IAAI,KAAK,OAAO,IAAI;AAAA,EACzC,IAAI;AACJ,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,QAAM,UAAU,KAAK,MAAM,KAAK,SAAS;AACzC,QAAM,gBAAgB,CAAC,WAAoD;AAAA,IACzE,OAAO,MAAM;AAAA,IACb,GAAG,WAAW,MAAM,IAAI,cAAc;AAAA,IACtC,GAAG,WAAW,MAAM,IAAI,cAAc;AAAA,EACxC;AAEA,QAAM,gBAAgB,YAAY,IAAI,aAAa;AACnD,QAAM,iBAAiB,gBAAgB,IAAI,CAAC,QAAQ,iBAAiB;AAAA,IACnE,cAAc,OAAO,OAAO,CAAC,KAAK,UAAU,OAAQ,MAAM,QAAQ,MAAM,aAAa,GAAI,CAAC,IAAI,KAAK,IAAI,GAAG,OAAO,MAAM;AAAA,IACvH,QAAQ,OAAO,IAAI,CAAC,WAAW;AAAA,MAC7B,QAAQ,cAAc,MAAM,MAAM;AAAA,MAClC,YAAY,MAAM,aAAa,cAAc,MAAM,UAAU,IAAI;AAAA,MACjE,SAAS,MAAM;AAAA,MACf,KAAK,cAAc,MAAM,GAAG;AAAA,MAC5B,SAAS,MAAM,UAAU,cAAc,MAAM,OAAO,IAAI;AAAA,IAC1D,EAAE;AAAA,IACF;AAAA,EACF,EAAE,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,eAAe,MAAM,YAAY;AAEhE,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,YAAYrB,cAAa,WAAW,IAAI;AAC9C,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,WAA6C;AAAA,IACjD,CAAC,GAAG,GAAG,KAAK;AAAA,IAAG,CAAC,GAAG,GAAG,KAAK;AAAA,IAAG,CAAC,GAAG,GAAG,KAAK;AAAA,IAAG,CAAC,GAAG,GAAG,KAAK;AAAA,IACzD,CAAC,GAAG,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG,IAAI;AAAA,IACrD,CAAC,GAAG,GAAG,KAAK;AAAA,IAAG,CAAC,GAAG,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG,IAAI;AAAA,IAAG,CAAC,GAAG,GAAG,KAAK;AAAA,EACzD;AACA,QAAM,SAAS,YAAY;AAC3B,QAAM,eAAe,WAAW,IAAI,CAAC,UAAU,mBAAmB;AAAA,IAChE,OAAO;AAAA,IACP,OAAO,cAAcqB;AAAA,MACnB,WAAW,aAAa;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,EAAE;AACF,QAAM,eAAe,OAAO,IAAI,CAAC,UAAU;AAAA,IACzC,OAAO,cAAcA;AAAA,MACnB;AAAA,MACA,WAAW,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF,EAAE;AAEF,SACE,8CAAC,OACE;AAAA,WAAO,IAAI,CAAC,SAAS;AACpB,YAAM,QAAQ,WAAW,IAAI;AAC7B,YAAM,WAAW,cAAcA,yBAAwB,IAAI,OAAO,OAAO,SAAS,SAAS,gBAAgB,mBAAmB,CAAC;AAC/H,YAAM,YAAY,cAAcA,yBAAwB,GAAG,OAAO,OAAO,SAAS,SAAS,gBAAgB,mBAAmB,CAAC;AAC/H,YAAM,YAAY,cAAcA,yBAAwB,IAAI,OAAO,QAAQ,SAAS,SAAS,gBAAgB,mBAAmB,CAAC;AACjI,aACE,8CAAC,OACC;AAAA,qDAAC,UAAK,QAAQ,WAAW,aAAa,GAAG,IAAI,SAAS,GAAG,IAAI,UAAU,GAAG,IAAI,SAAS,GAAG,IAAI,UAAU,GAAG;AAAA,QAC3G,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,SAAS,GAAG,IAAI,UAAU,GAAG,IAAI,SAAS,GAAG,IAAI,UAAU,GAAG;AAAA,WAFvG,eAAe,IAAI,EAG3B;AAAA,IAEJ,CAAC;AAAA,IACA,SAAS,IAAI,CAAC,CAAC,YAAY,UAAU,UAAU,GAAG,UAAU;AAC3D,YAAM,QAAQ,cAAc,UAAU;AACtC,YAAM,MAAM,cAAc,QAAQ;AAClC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,QAAQ,aAAa,YAAYrB,cAAa,WAAW,IAAI;AAAA,UAC7D,aAAa,aAAa,OAAO;AAAA,UACjC,IAAI,MAAM;AAAA,UACV,IAAI,IAAI;AAAA,UACR,IAAI,MAAM;AAAA,UACV,IAAI,IAAI;AAAA;AAAA,QANH,cAAc,KAAK;AAAA,MAO1B;AAAA,IAEJ,CAAC;AAAA,IACA,eAAe,IAAI,CAAC,EAAE,QAAQ,YAAY,MAAM;AAC/C,YAAM,gBAAgB,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO;AAC5D,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO;AAAA,MACT;AACA,YAAM,aAAa,cAAc,IAAI,CAAC,UAAU,MAAM,GAAG;AACzD,YAAM,aAAa,cACf;AAAA,QACE,GAAG,cAAc,IAAI,CAAC,UAAU,MAAM,GAAG;AAAA,QACzC,GAAG,cAAc,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,MAAM;AAAA,MAChE,IACA,CAAC;AACL,YAAM,iBAAiB,eAAe,kBAClC;AAAA,QACE,GAAG,cAAc,IAAI,CAAC,UAAU,MAAM,WAAW,MAAM,GAAG;AAAA,QAC1D,GAAG,cAAc,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,MAAM,cAAc,MAAM,MAAM;AAAA,MACpF,IACA,CAAC;AACL,YAAM,cAAc,uBAAuB,OAAO,WAAW;AAC7D,YAAM,YAAY,iBAAiB,OAAO,WAAW;AACrD,YAAM,eAAe,2BAA2B,MAAM,OAAO,WAAW,GAAG,YAAY;AACvF,YAAM,aAAa,iBAAiB,cAAc,KAAK,IAAI,GAAG,MAAM,OAAO,WAAW,GAAG,cAAc,CAAC,IAAI,IAAI;AAChH,YAAM,YAAY,eAAe,kBAC7B,cAAc,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,eAAe;AAChD,cAAM,WAAW,cAAc,UAAU;AACzC,YAAI,CAAC,UAAU,WAAW,CAAC,MAAM,WAAW,CAAC,SAAS,cAAc,CAAC,MAAM,YAAY;AACrF,iBAAO;AAAA,QACT;AACA,cAAM,UAAU,mBAAmB,CAAC,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,SAAS,OAAO,GAAG,IAAI;AACnG,cAAM,aAAa,mBAAmB,CAAC,SAAS,QAAQ,MAAM,QAAQ,MAAM,YAAY,SAAS,UAAU,GAAG,IAAI;AAClH,eACE,8CAAO,iBAAN,EACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,MAAMA,cAAa,WAAW,IAAI;AAAA,cAClC,aAAa;AAAA,cACb,QAAQC,aAAY,WAAW,IAAI;AAAA,cACnC,aAAa;AAAA;AAAA,UACf;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,GAAG;AAAA,cACH,MAAMA,aAAY,WAAW,GAAG;AAAA,cAChC,aAAa;AAAA,cACb,QAAQA,aAAY,WAAW,IAAI;AAAA,cACnC,aAAa;AAAA;AAAA,UACf;AAAA,aAdmB,oBAAoB,WAAW,IAAI,UAAU,EAelE;AAAA,MAEJ,CAAC,IACD,CAAC;AACL,YAAM,oBAAoB,cAAc,CAAC,KAAK;AAC9C,YAAM,mBAAmB,cAAc,cAAc,SAAS,CAAC,KAAK;AACpE,YAAM,WAAW,eAAe,mBAAmB,mBAAmB,WAAW,mBAAmB,aAChG,mBAAmB;AAAA,QACjB,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,MACpB,GAAG,IAAI,IACP;AACJ,YAAM,SAAS,eAAe,mBAAmB,kBAAkB,WAAW,kBAAkB,aAC5F,mBAAmB;AAAA,QACjB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,MACnB,GAAG,IAAI,IACP;AAEJ,aACE,8CAAC,OACE;AAAA,uBAAe,mBAAmB,eAAe,UAAU,IAC1D;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,mBAAmB,gBAAgB,IAAI;AAAA,YAC1C,MAAMA,aAAY,WAAW,IAAI;AAAA,YACjC,aAAa;AAAA,YACb,QAAQA,aAAY,WAAW,IAAI;AAAA,YACnC,aAAa;AAAA;AAAA,QACf,IACE;AAAA,QACH;AAAA,QACA,WACC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAMA,aAAY,WAAW,IAAI;AAAA,YACjC,aAAa;AAAA,YACb,QAAQA,aAAY,WAAW,GAAG;AAAA,YAClC,aAAa;AAAA;AAAA,QACf,IACE;AAAA,QACH,SACC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAMA,aAAY,WAAW,IAAI;AAAA,YACjC,aAAa;AAAA,YACb,QAAQA,aAAY,WAAW,IAAI;AAAA,YACnC,aAAa;AAAA;AAAA,QACf,IACE;AAAA,QACH,eAAe,WAAW,UAAU,IACnC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,mBAAmB,YAAY,IAAI;AAAA,YACtC,MAAM;AAAA,YACN,aAAa;AAAA,YACb,QAAQA,aAAY,WAAW,IAAI;AAAA,YACnC,aAAa;AAAA;AAAA,QACf,IACE;AAAA,QACH,CAAC,cACE,cAAc,IAAI,CAAC,OAAO,eACxB;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQD,cAAa,aAAa,IAAI;AAAA,YACtC,iBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,IAAI,MAAM,IAAI;AAAA,YACd,IAAI,MAAM,OAAO;AAAA,YACjB,IAAI,MAAM,IAAI;AAAA,YACd,IAAI,MAAM,OAAO;AAAA;AAAA,UAPZ,eAAe,WAAW,IAAI,UAAU;AAAA,QAQ/C,CACD,IACD;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,mBAAmB,UAAU;AAAA,YAChC,MAAK;AAAA,YACL,QAAQ;AAAA,YACR,gBAAe;AAAA,YACf,aAAa,KAAK,IAAI,KAAK,MAAM,OAAO,WAAW,GAAG,eAAe,CAAC;AAAA;AAAA,QACxE;AAAA,QACC,WAAW,SAAS,IACjB,cAAc,IAAI,CAAC,OAAO,eACxB;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,aAAa,YAAY,MAAM,IAAI,CAAC,CAAC,KAAK,YAAY,MAAM,IAAI,CAAC,CAAC;AAAA,YAE7E;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM,MAAM,OAAO,WAAW,GAAG,eAAe;AAAA,gBAChD,QAAQ,MAAM,OAAO,WAAW,GAAG,mBAAmB,MAAM,sBAAsB,QAAQ;AAAA,gBAC1F,aAAa;AAAA;AAAA,YACf;AAAA;AAAA,UARK,iBAAiB,WAAW,IAAI,UAAU;AAAA,QASjD,CACD,IACD;AAAA,WAzEE,iBAAiB,WAAW,EA0EpC;AAAA,IAEJ,CAAC;AAAA,IACA,aAAa,IAAI,CAAC,EAAE,OAAO,KAAK,MAC/B;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAW;AAAA,QACX,GAAG,MAAM,IAAI;AAAA,QACb,GAAG,MAAM,IAAI;AAAA,QAEZ,0BAAgB,IAAI;AAAA;AAAA,MAPhB,kBAAkB,IAAI;AAAA,IAQ7B,CACD;AAAA,IACA,aAAa,IAAI,CAAC,EAAE,OAAO,MAAM,GAAG,UACnC;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,YAAW;AAAA,QACX,GAAG,MAAM;AAAA,QACT,GAAG,MAAM,IAAI;AAAA,QAEZ;AAAA;AAAA,MAPI,kBAAkB,KAAK;AAAA,IAQ9B,CACD;AAAA,KACH;AAEJ;AAEA,SAAS,eAAe,OAAkB,SAA+B,QAAqB,WAAmB;AAC/G,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,kBAAkB,KAAK;AAChD,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AACA,QAAM,mBAAmB,cAAc,0BAA0B,cAAc;AAC/E,QAAM,eAAe,cAAc,kBAAkB,cAAc,gBAAgB,cAAc;AACjG,QAAM,kBAAkB,qBAAqB,KAAK,KAAK,cAAc;AACrE,QAAM,0BAA0B,gBAAgB,MAAM,cAAc,gBAAgB;AACpF,QAAM,aAAa,0BAA0B,iBAAiB,MAAM,EAAE,QAAQ,IAAI;AAClF,QAAM,YAAY,cAAc,mBAAmB,cAAc,gBAAgB;AACjF,QAAM,mBAAoD,mBACtD,cACA,cAAc,oBACZ,SACA;AACN,QAAM,gBAAgB,WAAW;AACjC,QAAM,cAAc,MAAM,OAAO;AACjC,QAAM,qBAAqB,MAAM;AAC/B,YAAQ,MAAM,SAAS;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,GAAG;AACH,QAAM,eAAe,MAAM,OAAO,sBAAsB,OAAO,eAAe,IAAI,IAAI,eAAe,IAAI,CAAC,IAAI;AAC9G,QAAM,OAAO,MAAM,QAAQ,eACvB;AAAA,IACE,GAAG,OAAO;AAAA,IACV,QAAQ,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,aAAa,cAAc,CAAC;AAAA,IACtE,MAAM,OAAO,KAAK,OAAO,aAAa;AAAA,IACtC,KAAK,OAAO,KAAK,MAAM,aAAa;AAAA,IACpC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,aAAa,YAAY,aAAa,aAAa,CAAC;AAAA,EAC9F,IACA,OAAO;AAEX,QAAM,SAAS,MAAM,OAAO,IAAI,CAAC,WAAW;AAC1C,UAAM,SAAS,MAAM;AAAA,MACnB,EAAE,QAAQ,cAAc;AAAA,MACxB,CAAC,GAAG,kBAAkBG,YAAW,OAAO,OAAO,aAAa,CAAC,KAAK;AAAA,IACpE;AACA,WAAO,0BAA0B,OAAO,QAAQ,IAAI;AAAA,EACtD,CAAC;AACD,QAAM,YAAY,OAAO,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AAEjD,MAAI,kBAAkB;AACpB,aAAS,gBAAgB,GAAG,gBAAgB,eAAe,iBAAiB,GAAG;AAC7E,YAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,IAAI,GAAG,IAAI,aAAa,KAAK,CAAC,GAAG,CAAC;AACvF,eAAS,cAAc,GAAG,cAAc,aAAa,eAAe,GAAG;AACrE,eAAO,WAAW,EAAE,aAAa,IAAI,QAAQ,KAAM,OAAO,WAAW,EAAE,aAAa,KAAK,KAAK,QAAS,MAAM;AAAA,MAC/G;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,CAAC,GAAG,kBAC/D,OAAO,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,IAAI,GAAG,IAAI,aAAa,KAAK,CAAC,GAAG,CAAC,CAC1E;AACD,QAAM,iBAAiB,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,CAAC,GAAG,kBAC/D,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,IAAI,GAAG,IAAI,aAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CACpF;AAED,MAAI,WAAW,OAAO;AACtB,MAAI,WAAW,OAAO;AACtB,MAAI,WAAW;AACb,aAAS,gBAAgB,GAAG,gBAAgB,eAAe,iBAAiB,GAAG;AAC7E,UAAIiC,YAAW;AACf,UAAIC,YAAW;AACf,eAAS,cAAc,GAAG,cAAc,aAAa,eAAe,GAAG;AACrE,cAAM,QAAQ,OAAO,WAAW,EAAE,aAAa,KAAK;AACpD,YAAI,SAAS,GAAG;AACd,UAAAD,aAAY;AAAA,QACd,OAAO;AACL,UAAAC,aAAY;AAAA,QACd;AAAA,MACF;AACA,iBAAW,KAAK,IAAI,UAAUD,SAAQ;AACtC,iBAAW,KAAK,IAAI,UAAUC,SAAQ;AAAA,IACxC;AAAA,EACF,OAAO;AACL,eAAW,OAAO,QAAQ;AACxB,iBAAW,SAAS,KAAK;AACvB,mBAAW,KAAK,IAAI,UAAU,KAAK;AACnC,mBAAW,KAAK,IAAI,UAAU,KAAK;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AAC5D,eAAW;AACX,eAAW;AAAA,EACb;AAEA,QAAM,cAAc;AAAA,IAClB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,YAAY;AACvB,aAAW,YAAY;AAEvB,QAAM,sBAAsB,kBACxB,EAAE,OAAO,GAAG,OAAO,EAAE,IACrB,2BAA2B,MAAM,QAAQ;AAC7C,QAAM,oBAAgB,2BAAkB,EACrC,OAAO,UAAU,EACjB,MAAM,eAAe,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC,EAC7F,aAAa,oBAAoB,KAAK,EACtC,aAAa,oBAAoB,KAAK;AAEzC,QAAM,kBAAc,2BAAkB,EACnC,OAAO,MAAM,KAAK,EAAE,QAAQ,YAAY,GAAG,CAAC,GAAG,UAAU,OAAO,KAAK,CAAC,CAAC,EACvE,MAAM,CAAC,GAAG,cAAc,UAAU,CAAC,CAAC,EACpC,aAAa,kBAAkB,IAAI,IAAI,EACvC,aAAa,kBAAkB,IAAI,IAAI;AAC1C,QAAM,sBACJ,MAAM,SAAS,QACZ,CAAC,gBACD,CAAC,aACD,cAAc,KACd,MAAM,cAAc;AAEzB,QAAM,kBAAkB,sBACpBnC,OAAM,OAAO,cAAc,MAAM,KAAK,IAAI,IAC1C;AACJ,QAAM,iBAAiB,uBAAuB,eAC1C,aAAa,SAAS,kBACtB;AACJ,QAAM,iBAAiB,uBAAuB,eAC1C,aAAa,SAAS,kBACtB;AACJ,QAAM,aAAa,sBAAsB,iBAAiB,KAAK,IAAI,GAAG,WAAW,IAAI;AACrF,QAAM,aAAa,sBAAsB,iBAAiB,KAAK,IAAI,GAAG,WAAW,IAAI;AACrF,QAAM,YAAY,sBACd,KAAK,KAAK,cAAc,cAAc,UAAU,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,IAAI,IAAI,IAC5F,cAAc;AAClB,QAAM,YAAY,sBACd,KAAK,KAAK,cAAc,cAAc,UAAU,EAAE,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,UAAU,IAAI,IAAI,IAC/F,cAAc;AAElB,QAAM,yBAAyB,MAAM,WAAW,gBAAgB;AAChE,QAAM,iBAAa,6BAAY,EAC5B,OAAO,CAAC,UAAU,QAAQ,CAAC,EAC3B;AAAA,IACC,eACK,yBAAyB,CAAC,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,IACjG,yBAAyB,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG;AAAA,EACtG;AAEF,QAAM,QAAQ,mBACV,uBAAuB,UAAU,UAAU,MAAM,WAAW,aAAa,EAAE,IAC3E,YAAY;AAChB,QAAM,oBAAoB,WAAW,IAAI,CAAC,aAAa;AACrD,UAAM,YAAY,cAAc,QAAQ,KAAK;AAC7C,WAAO,YAAY,cAAc,UAAU,IAAI;AAAA,EACjD,CAAC;AAED,QAAM,OAAkB,CAAC;AACzB,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,MAAM,CAAC;AAC9D,QAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,cAAc,GAAG,MAAM,CAAC;AAE9D,WAAS,cAAc,GAAG,cAAc,aAAa,eAAe,GAAG;AACrE,aAAS,gBAAgB,GAAG,gBAAgB,eAAe,iBAAiB,GAAG;AAC7E,YAAM,QAAQ,OAAO,WAAW,EAAE,aAAa,KAAK;AACpD,YAAM,WAAW,UAAU,WAAW,EAAE,aAAa,KAAK;AAC1D,YAAM,aAAa,0BAA2B,gBAAgB,IAAI,gBAAiB;AACnF,YAAM,aAAa,MAAM,OAAO,WAAW,GAAG,iBAAiB,KAAK,CAAC,UAAU,MAAM,UAAU,UAAU;AACzG,UAAI,QAAQ;AACZ,UAAI,MAAM;AACV,UAAI,WAAW;AACb,YAAI,SAAS,GAAG;AACd,kBAAQ,SAAS,aAAa;AAC9B,mBAAS,aAAa,KAAK;AAC3B,gBAAM,SAAS,aAAa;AAAA,QAC9B,OAAO;AACL,kBAAQ,SAAS,aAAa;AAC9B,mBAAS,aAAa,KAAK;AAC3B,gBAAM,SAAS,aAAa;AAAA,QAC9B;AAAA,MACF;AAEA,YAAM,SAAS,qBAAqB,OAAO,aAAa,UAAU,gBAAgB;AAClF,YAAM,qBAAqB,WAAW,KAAK,MAAM,OAAO,WAAW,GAAG,qBAAqB;AAC3F,UAAI,CAAE,oBAAqB;AACzB,YAAI,YAAY,OAAO;AACrB,iBAAO,OAAO,WAAW;AACzB,cAAI,CAAC,WAAW,WAAW;AACzB,mBAAO,SAAS,WAAW;AAAA,UAC7B;AAAA,QACF;AACA,YAAI,YAAY,WAAW;AACzB,iBAAO,SAAS,WAAW;AAAA,QAC7B;AAAA,MACF;AACA,UAAI,sBAAsB,oBAAoB,MAAM,MAAM;AACxD,eAAO,OAAO;AAAA,MAChB;AACA,YAAM,WAAW,WAAW,aAAa;AACzC,YAAM,gBAAgB,cAAc,QAAQ,KAAK;AACjD,YAAM,eAAe,sBACjB,KAAK,IAAI,GAAG,cAAc,UAAU,IAAI,GAAG,IAC3C,kBACE,cAAc,UAAU,IAC1B,YACE,cAAc,UAAU,IACxB,YAAY,UAAU;AAC5B,YAAM,YAAY,sBACd,KAAK,IAAI,IAAI,cAAc,UAAU,IAAI,gBAAgB,GAAG,IAC5D,kBACE,IACF,YACE,IACC,YAAY,OAAO,WAAW,CAAC,KAAK;AAC3C,YAAM,eAAe,sBAAsB,aAAa,cAAc;AACtE,YAAM,eAAe,sBAAsB,aAAa,cAAc;AACtE,YAAM,aAAa,gBAAgB,cAAc,UAAU,KAAK,gBAAgB,cAAc,UAAU;AACxG,YAAM,aAAa,sBAAsB,YACrC,OACA,sBAAsB,SACpB,IACA;AACN,UAAI,WAAW;AACf,UAAI,cAAc;AAClB,UAAI,MAAM,QAAQ,aAAa,GAAG;AAChC,cAAM,UAAU,CAAC,UAAkB;AACjC,gBAAM,eAAeA,OAAM,OAAO,GAAG,CAAC;AACtC,gBAAM,eAAe,sBAAsB,SACvC,KAAK,IAAI,cAAc,eAAe,OAAO,IAAI,IACjD;AACJ,iBAAOA,OAAM,IAAK,eAAe,YAAa,sBAAsB,SAAS,IAAI,MAAM,CAAC;AAAA,QAC1F;AACA,YAAI,YAAY,GAAG;AACjB,gBAAM,QAAQ,KAAK,IAAI,MAAM,YAAY,eAAe,aAAa,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC3F,wBAAc,QAAQ,YAAY,QAAQ,QAAQ,CAAC;AACnD,qBAAW,QAAQ,YAAY,MAAM,QAAQ,CAAC;AAAA,QAChD,OAAO;AACL,gBAAM,QAAQ,KAAK,IAAI,MAAM,YAAY,eAAe,aAAa,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC3F,qBAAW,QAAQ,YAAY,KAAK,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC1D,wBAAc,QAAQ,YAAY,KAAK,IAAI,GAAG,IAAI,QAAQ,CAAC;AAAA,QAC7D;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,cAAM,KAAK,WAAW,KAAK;AAC3B,cAAM,KAAK,WAAW,GAAG;AACzB,cAAM,cAAc,eAAe,aAAa,KAAK;AACrD,cAAM,cAAc,eAAe,aAAa,KAAK;AACrD,aAAK,KAAK;AAAA,UACR,QAAQ,CAAC,cAAc,YAAY,IAC/B,KAAK,IAAI,MAAM,WAAW,IAAI,OAC9B,KAAK,IAAI,MAAM,WAAW,IAAI;AAAA,UAClC,UAAU,CAAC,aAAa,KAAK,IAAI,KAAK,IAAI;AAAA,UAC1C;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,KAAK,IAAI,GAAG,YAAY;AAAA,UAChC,cAAc;AAAA,UACd,KAAK,OAAO,WAAW,IAAI,aAAa;AAAA,UACxC,MAAM,KAAK,IAAI,IAAI,EAAE;AAAA,UACrB,QAAQ,sBAAsB,YAAY,cAAc;AAAA,UACxD,QAAQ,sBAAsB,YAAY,cAAc;AAAA,UACxD,SAAS;AAAA,UACT;AAAA,UACA,QAAQ,OAAO;AAAA,UACf,aAAa,OAAO;AAAA,UACpB;AAAA,UACA,KAAK,gBAAgB;AAAA,UACrB,kBAAkB;AAAA,UAClB,OAAO;AAAA,UACP,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,QACtC,CAAC;AAAA,MACH,OAAO;AACL,cAAM,KAAK,WAAW,KAAK;AAC3B,cAAM,KAAK,WAAW,GAAG;AACzB,cAAM,cAAc,eAAe,aAAa,KAAK;AACrD,cAAM,cAAc,eAAe,aAAa,KAAK;AACrD,aAAK,KAAK;AAAA,UACR,QAAQ,CAAC,cAAc,YAAY,IAC/B,KAAK,IAAI,MAAM,WAAW,IAAI,OAC9B,KAAK,IAAI,MAAM,WAAW,IAAI;AAAA,UAClC,UAAU,CAAC,aAAa,KAAK,IAAI,KAAK,IAAI;AAAA,UAC1C;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;AAAA,UACrC,cAAc;AAAA,UACd,KAAK,OAAO,WAAW,IAAI,aAAa;AAAA,UACxC,MAAM,gBAAgB;AAAA,UACtB,QAAQ,sBAAsB,YAAY,cAAc;AAAA,UACxD,QAAQ,sBAAsB,YAAY,cAAc;AAAA,UACxD,SAAS;AAAA,UACT;AAAA,UACA,QAAQ,OAAO;AAAA,UACf,aAAa,OAAO;AAAA,UACpB;AAAA,UACA,KAAK,KAAK,IAAI,IAAI,EAAE;AAAA,UACpB,kBAAkB;AAAA,UAClB,OAAO;AAAA,UACP,OAAO,KAAK,IAAI,GAAG,YAAY;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,QAAQ,YAC/B,KAAK,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU;AACjC,QAAI,KAAK,kBAAkB,MAAM,eAAe;AAC9C,aAAO,KAAK,gBAAgB,MAAM;AAAA,IACpC;AACA,UAAM,eAAe,KAAK,QAAQ,IAAI,IAAI;AAC1C,UAAM,gBAAgB,MAAM,QAAQ,IAAI,IAAI;AAC5C,QAAI,iBAAiB,eAAe;AAClC,aAAO,eAAe;AAAA,IACxB;AACA,QAAI,cAAc;AAChB,UAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,eAAO,KAAK,OAAO,MAAM;AAAA,MAC3B;AACA,aAAO,KAAK,cAAc,MAAM;AAAA,IAClC;AACA,QAAI,KAAK,QAAQ,MAAM,KAAK;AAC1B,aAAO,MAAM,MAAM,KAAK;AAAA,IAC1B;AACA,WAAO,KAAK,cAAc,MAAM;AAAA,EAClC,CAAC,IACD;AACJ,QAAM,aAAa,sBACf,aAAa,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU;AACzC,SAAK,KAAK,cAAc,QAAQ,MAAM,cAAc,IAAI;AACtD,cAAQ,MAAM,cAAc,MAAM,KAAK,cAAc;AAAA,IACvD;AACA,QAAI,KAAK,kBAAkB,MAAM,eAAe;AAC9C,aAAO,KAAK,gBAAgB,MAAM;AAAA,IACpC;AACA,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B,CAAC,IACD;AAEJ,QAAM,wBAAwB,MAAM,QAAQ,CAAC;AAC7C,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,MAAI,uBAAuB;AACzB,eAAW,OAAO,cAAc;AAC9B,UAAI,CAAC,IAAI,SAAS,IAAI,UAAU,UAAU,IAAI,MAAM,WAAW,MAAM,GAAG;AACtE;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB,IAAI,IAAI,KAAK,GAAG;AACnC,wBAAgB;AAAA,UACd,IAAI;AAAA,UACJ,eAAe,MAAM,EAAE,IAAI,gBAAgB,IAAI,GAAG,QAAQ,mBAAmB,GAAG;AAAA,QAClF;AAAA,MACF;AACA,UAAI,aAAa,gBAAgB,IAAI,IAAI,KAAK;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,UAAU,WAAW,KAAK;AAAA,IAC3B,mBAAmB,yBAAyB;AAAA,EAC9C;AACA,QAAM,iBAAiB,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AACpF,QAAM,iBAAiBF,cAAa,gBAAgB,IAAI;AACxD,QAAM,cAAc,sBAAsB,iBAAkB,cAAc,UAAU;AACpF,QAAM,cAAc,sBAAsB,iBAAkB,cAAc,UAAU;AACpF,QAAM,gBAAgB,uBAAuB,eAC3C,8CAAC,OACE;AAAA,UAAM,KAAK,EAAE,QAAQ,gBAAgB,EAAE,GAAG,CAAC,GAAG,kBAAkB;AAC/D,YAAM,IAAI,KAAK,OAAS,gBAAgB,KAAK,IAAI,GAAG,aAAa,IAAK,KAAK;AAC3E,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI;AAAA,UACJ,IAAI,IAAI;AAAA,UACR,IAAI,KAAK,MAAM,KAAK;AAAA,UACpB,IAAI,KAAK,MAAM,KAAK,SAAS;AAAA;AAAA,QANxB,iBAAiB,aAAa;AAAA,MAOrC;AAAA,IAEJ,CAAC;AAAA,IACA,MAAM,KAAK,EAAE,QAAQ,cAAc,EAAE,GAAG,CAAC,GAAG,kBAAkB;AAC7D,YAAM,QAAQ,gBAAgB,KAAK,IAAI,GAAG,WAAW;AACrD,YAAM,UAAU,iBAAiB;AACjC,YAAM,UAAU,iBAAiB;AACjC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI,KAAK,OAAO;AAAA,UAChB,IAAI,KAAK,OAAO,KAAK,QAAQ;AAAA,UAC7B,IAAI,KAAK,MAAM,KAAK,SAAS;AAAA,UAC7B,IAAI,KAAK,MAAM,KAAK,SAAS;AAAA;AAAA,QANxB,iBAAiB,aAAa;AAAA,MAOrC;AAAA,IAEJ,CAAC;AAAA,IACA,MAAM,OAAO,IAAI,CAAC,QAAQ,gBAAgB;AACzC,YAAM,SAAS,cAAc,OAAO,KAAK,IAAI,GAAG,WAAW;AAC3D,YAAM,IAAI,KAAK,OAAO,KAAK,QAAQ,iBAAiB;AACpD,YAAM,IAAI,KAAK,MAAM,KAAK,SAAS,iBAAiB;AACpD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,0BAA0B,KAAK;AAAA,UACrC,UAAU;AAAA,UACV,YAAW;AAAA,UACX,GAAG,IAAI;AAAA,UACP,GAAG,IAAI;AAAA,UAEN,iBAAO,QAAQ,UAAU,cAAc,CAAC;AAAA;AAAA,QAPpC,mBAAmB,WAAW;AAAA,MAQrC;AAAA,IAEJ,CAAC;AAAA,KACH,IACE;AAEJ,QAAM,YAAY,MAAM,QAAQ,eAC9B,8CAAC,OACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAMA,cAAa,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AAAA,QACpE,QAAQ,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,QAAQ,WAAW,IAAI,KAAK,MAAM,KAAK,SAAS,WAAW,IAAI,KAAK,OAAO,WAAW,IAAI,KAAK,MAAM,KAAK,SAAS,WAAW;AAAA,QACrP,QAAQA,cAAa,MAAM,iBAAiB,QAAQ,QAAQ,GAAG;AAAA,QAC/D,aAAa;AAAA;AAAA,IACf;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAMA,cAAa,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AAAA,QACpE,QAAQ,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,OAAO,KAAK,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,OAAO,KAAK,QAAQ,WAAW,IAAI,KAAK,MAAM,WAAW,IAAI,KAAK,OAAO,WAAW,IAAI,KAAK,MAAM,WAAW;AAAA,QAC7L,QAAQA,cAAa,MAAM,iBAAiB,QAAQ,QAAQ,GAAG;AAAA,QAC/D,aAAa;AAAA;AAAA,IACf;AAAA,KACF,IACE;AAEJ,SACE,8CAAC,OACE;AAAA,6BAAyB,gBAAgB,OAAO,IAC/C,6CAAC,UACE,gBAAM,KAAK,gBAAgB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,MACpD,8CAAC,oBAAe,IAAiB,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,QAC1D;AAAA,mDAAC,UAAK,QAAO,MAAK,WAAWA,cAAa,OAAO,IAAI,GAAG;AAAA,MACxD,6CAAC,UAAK,QAAO,OAAM,WAAWA,cAAa,OAAO,IAAI,GAAG;AAAA,MACzD,6CAAC,UAAK,QAAO,QAAO,WAAWC,aAAY,OAAO,GAAG,GAAG;AAAA,SAH7B,EAI7B,CACD,GACH,IACE;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,OACH,WAAW,IAAI,CAAC,QAAQ,mBAAmB,GAAG,CAAC,IAC/C,aAAa,IAAI,CAAC,QAChB;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,IAAI;AAAA,QACV,QAAQ,IAAI;AAAA,QACZ,QAAQ,kBAAkB,SAAS,IAAI;AAAA,QACvC,aAAa,kBAAkB,IAAI,IAAI;AAAA,QACvC,OAAO,IAAI;AAAA,QACX,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA;AAAA,MAPF,IAAI;AAAA,IAQX,CACD;AAAA,KACP;AAEJ;AAEA,SAAS,sBAAsB,OAAkB,SAA+B,QAAqB,WAAmB;AACtH,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,aAAa,kBAAkB,KAAK;AAC1C,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,kBAAkB,MAAM;AAC9B,QAAM,cAAc,cAAc,UAAU,cAAc,iBAAiB,cAAc;AACzF,QAAM,gBAAgB,cAAc,iBAAiB,cAAc;AACnE,QAAM,gBAAgB,cAAc,iBAAiB,cAAc;AACnE,QAAM,kBAAkB,iBAAiB;AACzC,QAAM,yBAAyB,cAAc,wBAAwB,cAAc;AACnF,QAAM,yBAAyB,MAAM,OAAO,IAAI,CAAC,WAC/C,WAAW,IAAI,CAAC,GAAG,kBAAkB,6BAA6B,OAAO,OAAO,aAAa,GAAG,eAAe,CAAC,CACjH;AASD,QAAM,wBAAyC,mBAC1C,MAAM;AACL,UAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,GAAG,MAAM,CAAC;AAClE,UAAM,WAAW,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,GAAG,MAAM,CAAC;AAClE,UAAM,iBAAiB,yBACnB,WAAW,IAAI,CAAC,GAAG,kBAAkB;AACnC,YAAM,QAAQ,uBAAuB,OAAO,CAAC,KAAK,iBAChD,OAAO,aAAa,aAAa,KAAK,IACrC,CAAC;AACJ,aAAO,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI;AAAA,IACtC,CAAC,IACD;AACJ,WAAO,MAAM,OAAO,IAAI,CAAC,GAAG,gBAC1B,WAAW,IAAI,CAACqC,IAAG,kBAAkB;AACnC,YAAM,WAAW,uBAAuB,WAAW,IAAI,aAAa,KAAK;AACzE,UAAI,YAAY,MAAM;AACpB,eAAO,EAAE,SAAS,OAAO,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK;AAAA,MACvD;AACA,YAAM,QAAQ,yBACT,YAAY,iBAAiB,aAAa,KAAK,KAAM,MACtD;AACJ,UAAI,SAAS,GAAG;AACd,cAAMC,SAAQ,SAAS,aAAa;AACpC,cAAMC,OAAMD,SAAQ;AACpB,iBAAS,aAAa,IAAIC;AAC1B,eAAO,EAAE,SAAS,MAAM,GAAGA,MAAK,IAAID,QAAO,IAAIC,KAAI;AAAA,MACrD;AACA,YAAM,QAAQ,SAAS,aAAa;AACpC,YAAM,MAAM,QAAQ;AACpB,eAAS,aAAa,IAAI;AAC1B,aAAO,EAAE,SAAS,MAAM,GAAG,KAAK,IAAI,OAAO,IAAI,IAAI;AAAA,IACrD,CAAC,CACF;AAAA,EACH,GAAG,IACH,MAAM,OAAO,IAAI,CAAC,GAAG,gBACnB,WAAW,IAAI,CAACF,IAAG,kBAAkB;AACnC,UAAM,QAAQ,uBAAuB,WAAW,IAAI,aAAa,KAAK;AACtE,WAAO;AAAA,MACL,SAAS,SAAS;AAAA,MAClB,GAAG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF,CAAC,CACF;AAEL,QAAM,iBAAiB,sBACpB,QAAQ,CAAC,iBACR,aAAa,QAAQ,CAAC,UACpB,MAAM,UACF,CAAC,MAAM,IAAI,MAAM,EAAE,EAAE,OAAO,CAAC,UAA2B,SAAS,QAAQ,OAAO,SAAS,KAAK,CAAC,IAC/F,CAAC,CACN,CACF;AACH,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,WAAW,KAAK,IAAI,GAAG,cAAc;AACzC,MAAI,WAAW,KAAK,IAAI,GAAG,cAAc;AACzC,MAAI,aAAa;AACf,eAAW,KAAK,IAAI,GAAG,QAAQ;AAAA,EACjC,YAAY,cAAc,UAAU,kBAAkB,MAAM,WAAW,YAAY,YAAY;AAC7F,eAAW,KAAK,IAAI,GAAG,QAAQ;AAAA,EACjC;AACA,MAAI,wBAAwB;AAC1B,UAAM,cAAc,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAC/F,OAAO,MAAM,UAAU,GAAG,IAC1B,KAAK,IAAI,GAAG,QAAQ;AACxB,UAAM,cAAc,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAC/F,OAAO,MAAM,UAAU,GAAG,IAC1B,KAAK,IAAI,KAAK,QAAQ;AAC1B,eAAW;AACX,eAAW,eAAe,cAAc,cAAc,IAAI;AAAA,EAC5D,OAAO;AACL,UAAM,cAAc;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,eAAe,MAAM,WAAW,YAAY;AAAA,IAC9C;AACA,eAAW,YAAY;AACvB,eAAW,YAAY;AAAA,EACzB;AAEA,QAAM,aAAS,4BAAmB,EAC/B,OAAO,UAAU,EACjB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC;AAC5C,QAAM,aAAS,6BAAY,EACxB,OAAO,CAAC,UAAU,QAAQ,CAAC,EAC3B,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAE3C,QAAM,QAAQ,yBACV,uBAAuB,UAAU,UAAU,MAAM,WAAW,aAAa,EAAE,IAC3E;AAAA,IACE,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe,MAAM,WAAW,YAAY;AAAA,EAC9C,EAAE;AACN,QAAM,oBAAoB,WAAW,IAAI,CAAC,aAAa,OAAO,QAAQ,KAAK,KAAK,IAAI;AAEpF,QAAM,QAAsB;AAC5B,QAAM,eAAe,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC;AACjD,QAAM,qBAAqB,MAAM,OAAO,IAAI,CAAC,GAAG,gBAC9C,WAAW,IAAI,CAAC,UAAU,kBAAkB;AAC1C,UAAM,QAAQ,sBAAsB,WAAW,IAAI,aAAa,KAAK;AAAA,MACnE,SAAS;AAAA,MACT,GAAG;AAAA,MACH,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AACA,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,GAAG,OAAO,QAAQ,KAAK,KAAK;AAAA,MAC5B,GAAG,MAAM;AAAA,MACT,IAAI,MAAM;AAAA,MACV,IAAI,MAAM;AAAA,IACZ;AAAA,EACF,CAAC,CACF;AAED,MAAI,MAAM,MAAM;AACd,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,OAAO,OAAO,MAAM,QAAQ,WAChD,MAAM,MACN;AACJ,QAAM,kBAAkB,WAAW,aAAa,OAAO,UAAU,cAAc,WAC3E,UAAU,YACV;AACJ,QAAM,qBAAqB,WAAW,gBAAgB,OAAO,UAAU,iBAAiB,WACpF,UAAU,eACV;AACJ,QAAM,mBAAmB,WAAW,cAAc,OAAO,UAAU,eAAe,WAC9E,UAAU,aACV;AACJ,QAAM,gBAAgB,0BAA2B,iBAAiB,iBAAyD,YAAY,KAClItC,cAAa,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ,QAAQ,IAAI;AAC3F,QAAM,mBAAmB,0BAA2B,oBAAoB,iBAAyD,YAAY,KACxI,MAAM,iBACN,MAAM,wBACN,QAAQ;AACb,QAAM,iBAAiB,OAAO,kBAAkB,aAAa,YAAY,OAAO,SAAS,iBAAiB,QAAQ,IAC9G,iBAAiB,WACjB;AACJ,QAAM,eAAe,kBAAkB,UAAU,IAC7C,KAAK,IAAI,GAAG,kBAAkB,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,UAAU,KAAK,IAAI,YAAY,kBAAkB,KAAK,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,UAAU,QAAQ,CAAC,CAAC,IAClJ,KAAK;AACT,QAAM,iBAAiBE,OAAM,gBAAgB,IAAI,2BAA2B,cAAc,EAAE,SAAS,MAAM,GAAG,EAAE;AAEhH,SACE,8CAAC,OACE;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,UAAU,OAAO,KAAK;AAAA,IACzB;AAAA,IACC,CAAC,eAAe,CAAC,mBAAmB,qBACjC,WAAW,IAAI,CAAC,GAAG,kBAAkB;AACnC,YAAM,UAAU,mBACb,IAAI,CAAC,iBAAiB,aAAa,aAAa,GAAG,CAAC,EACpD,OAAO,CAAC,UAA2B,SAAS,QAAQ,OAAO,SAAS,KAAK,CAAC;AAC7E,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,IAAI,kBAAkB,aAAa,KAAK,KAAK;AACnD,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;AAAA,UAC/B,IAAI,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;AAAA;AAAA,QAN1B,YAAY,aAAa;AAAA,MAOhC;AAAA,IAEJ,CAAC,IACD;AAAA,IACH,CAAC,eAAe,CAAC,mBAAmB,oBAAoB,mBAAmB,UAAU,IAClF,WAAW,IAAI,CAAC,GAAG,kBAAkB;AACnC,YAAM,QAAQ,mBAAmB,CAAC,IAAI,aAAa;AACnD,YAAM,SAAS,mBAAmB,CAAC,IAAI,aAAa;AACpD,UAAI,CAAC,SAAS,CAAC,UAAU,MAAM,KAAK,QAAQ,OAAO,KAAK,MAAM;AAC5D,eAAO;AAAA,MACT;AACA,YAAM,MAAM,OAAO,KAAK,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC;AAC9C,YAAM,SAAS,OAAO,KAAK,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC;AACjD,YAAM,UAAU,OAAO,KAAK,MAAM;AAClC,YAAM,OAAO,UAAUD,aAAY,kBAAkB,IAAI,IAAI;AAC7D,aACE;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA,aAAa;AAAA,UACb,QAAQ,KAAK,IAAI,GAAG,SAAS,GAAG;AAAA,UAChC,QAAQA,aAAY,MAAM,IAAI;AAAA,UAC9B,aAAa;AAAA,UACb,OAAO;AAAA,UACP,IAAI,kBAAkB,aAAa,KAAK,KAAK,QAAQ,iBAAiB;AAAA,UACtE,GAAG;AAAA;AAAA,QARE,WAAW,aAAa;AAAA,MAS/B;AAAA,IAEJ,CAAC,IACD;AAAA,IACH,MAAM,OAAO,IAAI,CAAC,QAAQ,gBAAgB;AACzC,YAAM,SAAS,mBAAmB,WAAW,KAAK,CAAC;AACnD,YAAM,mBAAmB,oBAAoB,SACzC,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,IAAI,IACxC;AACJ,YAAM,eAAW,gBAAAiB,MAAwC,EACtD,QAAQ,CAAC,UAAU,MAAM,KAAK,IAAI,EAClC,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,EAAE,CAAC,UAAU,OAAO,MAAM,KAAK,CAAC,CAAC,EACjC,MAAM,KAAK,EAAE,gBAAgB,KAAK;AAErC,YAAM,WAAW,kBACb,gBAAAuB,MAA8E,EAC7E,QAAQ,CAAC,UACR,kBACI,MAAM,MAAM,QAAQ,MAAM,MAAM,OAChC,MAAM,KAAK,IAChB,EACA,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,GAAG,CAAC,UACH,kBACI,OAAO,MAAM,MAAM,CAAC,IACpB,YACL,EACA,GAAG,CAAC,UAAU,QAAQ,kBAAkB,MAAM,KAAK,MAAM,MAAM,CAAC,CAAC,EACjE,MAAM,KAAK,EAAE,MAAM,KAAK,KACzB;AAEJ,YAAM,kBAAkB,OAAO,OAAO,iBAAiB,iBAAiB,WACpE,OAAO,gBAAgB,eACvB,iBAAiB,OAAO,WAAW;AACvC,aACE,8CAAC,OACE;AAAA,SAAC,eAAe,CAAC,mBAAmB,kBACjC,OAAO,IAAI,CAAC,OAAO,eACjB,MAAM,KAAK,OAAO,OAChB;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,IAAI,MAAM;AAAA,YACV,IAAI,MAAM;AAAA,YACV,IAAI,OAAO,MAAM,CAAC;AAAA,YAClB,IAAI;AAAA;AAAA,UANC,aAAa,WAAW,IAAI,UAAU;AAAA,QAO7C,CAEH,IACD;AAAA,QACH,cACC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAM;AAAA,YACN,aAAa;AAAA,YACb,QAAO;AAAA;AAAA,QACT,IACE;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAQ,uBAAuB,OAAO,WAAW;AAAA,YACjD,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAa,KAAK,IAAI,KAAK,OAAO,eAAe,CAAC;AAAA;AAAA,QACpD;AAAA,QACC,OAAO,IAAI,CAAC,OAAO,eAClB,MAAM,KAAK,OAAO,OAChB;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI,MAAM;AAAA,YACV,IAAI,OAAO,MAAM,CAAC;AAAA,YAClB,MAAM,OAAO,eAAe,iBAAiB,OAAO,WAAW;AAAA,YAC/D,GAAG,KAAK,IAAI,IAAI,OAAO,cAAc,KAAK,IAAI;AAAA,YAC9C,QAAQ,OAAO,mBAAmB,MAAM,sBAAsB,uBAAuB,OAAO,WAAW;AAAA,YACvG,aAAa;AAAA;AAAA,UANR,eAAe,WAAW,IAAI,UAAU;AAAA,QAO/C,CAEH;AAAA,WA5CK,eAAe,WAAW,EA6ClC;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,iBAAiB,OAAkB,SAA+B,QAAqB;AAC9F,QAAM,SAAS,iBAAiB,KAAK;AACrC,QAAM,cAAc,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,WAAW,QAAQ,CAAC;AAC/E,QAAM,YAAY,OAAO,KAAK,CAAC,UAAU,MAAM,UAAU,WAAW,MAAM,CAAC;AAC3E,MAAI,CAAC,eAAe,CAAC,WAAW;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,eAA0B;AAAA,IAC9B,GAAG;AAAA,IACH,cAAc,YAAY,gBAAgB,MAAM;AAAA,IAChD,WAAW,YAAY;AAAA,IACvB,YAAY;AAAA,IACZ,MAAM,YAAY,QAAQ;AAAA,IAC1B,QAAQ,YAAY;AAAA,IACpB,WAAW,YAAY,aAAa,MAAM;AAAA,EAC5C;AACA,QAAM,aAAa,kBAAkB,YAAY;AACjD,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO;AACpB,QAAM,gBAAgB,OAAO,YAAY,KAAK,aAAa,YAAY,OAAO,SAAS,YAAY,IAAI,QAAQ,IAC3G,YAAY,IAAI,WAChB,YAAY,YAAY,MAAM;AAClC,QAAM,mBAAmB,YAAY,OAAO,KAAK,CAAC,WAAW,sBAAsB,MAAM,CAAC;AAC1F,QAAM,sBAAsB,mBACxB,EAAE,OAAO,GAAG,OAAO,EAAE,IACrB,2BAA2B,aAAa;AAC5C,QAAM,oBAAgB,2BAAkB,EACrC,OAAO,UAAU,EACjB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC,EACzC,aAAa,oBAAoB,KAAK,EACtC,aAAa,oBAAoB,KAAK;AACzC,QAAM,kBAAc,2BAAkB,EACnC,OAAO,MAAM,KAAK,EAAE,QAAQ,YAAY,OAAO,OAAO,GAAG,CAAC,GAAG,UAAU,OAAO,KAAK,CAAC,CAAC,EACrF,MAAM,CAAC,GAAG,cAAc,UAAU,CAAC,CAAC,EACpC,aAAa,mBAAmB,IAAI,IAAI,EACxC,aAAa,mBAAmB,IAAI,IAAI;AAC3C,QAAM,oBAAoB,WAAW,IAAI,CAAC,cACvC,cAAc,QAAQ,KAAK,KAAK,QAAQ,cAAc,UAAU,IAAI,CACtE;AAED,QAAM,gBAAgB,YAAY,OAAO,QAAQ,CAAC,WAChD,OAAO,OAAO,IAAI,CAAC,UAAUtC,YAAW,KAAK,CAAC,EAAE,OAAO,CAAC,UAA2B,SAAS,IAAI,CACjG;AACD,QAAM,kBAAkB,UAAU,OAAO,QAAQ,CAAC,WAChD,OAAO,OAAO,IAAI,CAAC,UAAUA,YAAW,KAAK,CAAC,EAAE,OAAO,CAAC,UAA2B,SAAS,IAAI,CACjG;AACD,MAAI,cAAc,WAAW,KAAK,gBAAgB,WAAW,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB;AAAA,IACpB,OAAO,YAAY,WAAW,QAAQ,WAAW,YAAY,UAAU,MAAM,KAAK,IAAI,GAAG,aAAa;AAAA,IACtG,OAAO,YAAY,WAAW,QAAQ,WAAW,YAAY,UAAU,MAAM,KAAK,IAAI,GAAG,aAAa;AAAA,IACtG,YAAY,WAAW;AAAA,IACvB;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,OAAO,UAAU,WAAW,QAAQ,WAAW,UAAU,UAAU,MAAM,KAAK,IAAI,GAAG,eAAe;AAAA,IACpG,OAAO,UAAU,WAAW,QAAQ,WAAW,UAAU,UAAU,MAAM,KAAK,IAAI,GAAG,eAAe;AAAA,IACpG,UAAU,WAAW;AAAA,IACrB;AAAA,EACF;AACA,QAAM,mBAAe,6BAAY,EAC9B,OAAO,CAAC,cAAc,KAAK,cAAc,GAAG,CAAC,EAC7C,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC3C,QAAM,qBAAiB,6BAAY,EAChC,OAAO,CAAC,gBAAgB,KAAK,gBAAgB,GAAG,CAAC,EACjD,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC3C,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAElD,SACE,8CAAC,OACE;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,CAAC,UAAU,aAAa,KAAK;AAAA,IAC/B;AAAA,IACC,gBAAgB,MAAM,IAAI,CAAC,SAAS;AACnC,YAAM,IAAI,eAAe,IAAI;AAC7B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAW;AAAA,UACX,GAAG,KAAK,OAAO,KAAK,QAAQ;AAAA,UAC5B,GAAG,IAAI;AAAA,UAEN,0BAAgB,IAAI;AAAA;AAAA,QAPhB,wBAAwB,IAAI;AAAA,MAQnC;AAAA,IAEJ,CAAC;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,IAAI,KAAK,OAAO,KAAK;AAAA,QACrB,IAAI,KAAK,OAAO,KAAK;AAAA,QACrB,IAAI,KAAK;AAAA,QACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,IACtB;AAAA,IACC,YAAY,OAAO,QAAQ,CAAC,QAAQ,gBAAgB,WAAW,IAAI,CAAC,UAAU,kBAAkB;AAC/F,YAAM,QAAQA,YAAW,OAAO,OAAO,aAAa,CAAC,KAAK;AAC1D,YAAM,gBAAgB,cAAc,QAAQ,KAAK,KAAK;AACtD,YAAM,WAAW,KAAK,IAAI,GAAG,mBAAmB,cAAc,UAAU,IAAI,YAAY,UAAU,CAAC;AACnG,YAAM,IAAI,iBAAiB,mBAAmB,IAAK,YAAY,OAAO,WAAW,CAAC,KAAK;AACvF,YAAM,IAAI,aAAa,KAAK,IAAI,GAAG,KAAK,CAAC;AACzC,YAAM,QAAQ,aAAa,CAAC;AAC5B,YAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,aAAa,KAAK,CAAC,CAAC;AAChE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM,OAAO,SAAS,OAAO,aAAa,iBAAiB,cAAc,WAAW;AAAA,UACpF;AAAA,UACA,QAAQ,mBAAmB,SAAU,OAAO,aAAa,OAAO,SAAS,uBAAuB,cAAc,WAAW;AAAA,UACzH,aAAa,mBAAmB,IAAI;AAAA,UACpC,OAAO;AAAA,UACP;AAAA,UACA,GAAG,KAAK,IAAI,GAAG,KAAK;AAAA;AAAA,QAPf,aAAa,WAAW,IAAI,aAAa;AAAA,MAQhD;AAAA,IAEJ,CAAC,CAAC;AAAA,IACD,UAAU,OAAO,IAAI,CAAC,QAAQ,gBAAgB;AAC7C,YAAM,SAAS,WAAW,IAAI,CAAC,UAAU,mBAAmB;AAAA,QAC1D,IAAI,cAAc,QAAQ,KAAK,KAAK,QAAQ,cAAc,UAAU,IAAI;AAAA,QACxE,GAAGA,YAAW,OAAO,OAAO,aAAa,CAAC;AAAA,MAC5C,EAAE;AACF,YAAM,mBAAmB,MAAM,oBAAoB,SAC/C,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,IAAI,IACxC;AACJ,YAAM,WAAO,gBAAAe,MAAwC,EAClD,QAAQ,CAAC,UAAU,MAAM,KAAK,IAAI,EAClC,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,EAAE,CAAC,UAAU,eAAe,MAAM,KAAK,CAAC,CAAC,EACzC,MAAM,2BAAW,EAAE,gBAAgB,KAAK;AAC3C,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAQ,OAAO,aAAa,OAAO,SAAS,uBAAuB,OAAO,YAAY,OAAO,SAAS,WAAW;AAAA,YACjH,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAa,KAAK,IAAI,KAAK,OAAO,eAAe,CAAC;AAAA;AAAA,QACpD;AAAA,QACC,OAAO,IAAI,CAAC,OAAO,eAClB,MAAM,KAAK,OAAO,OAChB;AAAA,UAAC;AAAA;AAAA,YACC,GAAG,iBAAiB,2BAA2B,OAAO,YAAY,GAAG,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC,CAAC,KAAK,iBAAiB,UAAU,CAAC;AAAA,YACzI,MAAM,OAAO,eAAe,OAAO,SAAS,OAAO,aAAa,iBAAiB,OAAO,YAAY,OAAO,SAAS,WAAW;AAAA,YAE/H,QAAQ,OAAO,mBAAmB,MAAM,sBAAsB;AAAA,YAC9D,aAAa;AAAA,YACb,WAAW,aAAa,MAAM,CAAC,KAAK,eAAe,MAAM,CAAC,CAAC;AAAA;AAAA,UAHtD,qBAAqB,WAAW,IAAI,UAAU;AAAA,QAIrD,CAEH;AAAA,WApBK,cAAc,WAAW,EAqBjC;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,mBAAmB,OAAkB,SAA+B,QAAqB,QAAiB;AACjH,QAAM,OAAO,OAAO;AACpB,QAAM,YAAY,MAAM,OAAO,OAAO,MAAM,QAAQ,WAChD,MAAM,MACN;AACJ,QAAM,kBAAkB,OAAO,MAAM,UAAU,WAAW,MAAM,MAAM,KAAK,EAAE,YAAY,IAAI;AAC7F,QAAM,eAAe,OAAO,MAAM,iBAAiB,WAC/C,MAAM,eACN,aAAa,OAAO,UAAU,iBAAiB,WAC7C,UAAU,eACV;AACN,QAAM,iBAAiB,eACnB,iBAAiB,UAAU,iBAAiB,gBAAgB,iBAAiB,YAAY,iBAAiB,iBAC1G;AACJ,QAAM,oBAAoB,eACtB,iBAAiB,YAAY,iBAAiB,gBAAgB,iBAAiB,iBAC/E;AACJ,QAAM,uBAAuB,eACzB,iBAAiB,YAAY,iBAAiB,iBAC9C;AACJ,QAAM,wBAAwB,gBAAgB,SAAS,aAAa;AACpE,QAAM,uBAAuB,gBAAgB,SAAS,YAAY;AAClE,QAAM,yBAAyB,gBAAgB,SAAS,cAAc;AACtE,QAAM,iBAAiB,MAAM,OAAO,IAAI,CAAC,WAAW;AAClD,UAAM,UAAU,OAAO,OAAO;AAC9B,UAAM,gBAAgB,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,UAAU,kBAAkB,OAAO,WAAW,KAAK,CAAC,CAAC;AAE/G,QAAI,kBAAkB;AACtB,QAAI,qBAAqB;AACzB,QAAI,cAAc,OAAO,CAAC,UAAU,SAAS,IAAI,EAAE,SAAS,KAAK,IAAI,GAAG,UAAU,CAAC,GAAG;AACpF,YAAM,aAAa,OAAO,cAAc,CAAC;AACzC,YAAM,gBAAgB,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,UAAU;AAClE,cAAM,aAAa;AAAA,UACjB,WAAW,KAAK;AAAA,UAChB,WAAW,QAAQ,CAAC;AAAA,UACpB,WAAW,QAAQ,IAAI,CAAC;AAAA,UACxB,WAAW,QAAQ,CAAC;AAAA,QACtB;AACA,mBAAW,aAAa,YAAY;AAClC,gBAAM,SAAS,kBAAkB,SAAS;AAC1C,cAAI,UAAU,MAAM;AAClB,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AACD,UAAI,cAAc,OAAO,CAAC,UAAU,SAAS,IAAI,EAAE,UAAU,GAAG;AAC9D,0BAAkB;AAAA,MACpB,OAAO;AACL,cAAM,cAAc,WACjB,IAAI,CAAC,UAAU,kBAAkB,KAAK,CAAC,EACvC,OAAO,CAAC,UAA2B,SAAS,IAAI;AACnD,YAAI,YAAY,UAAU,GAAG;AAC3B,4BAAkB,MAAM;AAAA,YACtB,EAAE,QAAQ,QAAQ;AAAA,YAClB,CAAC,GAAG,UAAU,YAAY,KAAK,KAAK,YAAY,YAAY,SAAS,CAAC,KAAK;AAAA,UAC7E;AAAA,QACF,OAAO;AACL,+BAAqB;AACrB,4BAAkB,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC,GAAG,UAAU,QAAQ,CAAC;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AACjD,YAAM,IAAI,kBAAkB,gBAAgB,KAAK,CAAC;AAClD,YAAM,IAAIf,YAAW,KAAK;AAC1B,aAAO,KAAK,QAAQ,KAAK,OAAO,OAAO,EAAE,GAAG,EAAE;AAAA,IAChD,CAAC,EAAE,OAAO,CAAC,UAA6C,SAAS,IAAI;AACrE,WAAO;AAAA,MACL,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,OAAO,eAAe,QAAQ,CAAC,WAAW,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACrF,QAAM,OAAO,eAAe,QAAQ,CAAC,WAAW,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACrF,MAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,MAAM,cAAc,QAAQ,YAAY,OAAO,SAAS,MAAM,aAAa,GAAG;AAC7G,QAAM,kBAAkB,OAAO,MAAM,cAAc,QAAQ,YAAY,OAAO,SAAS,MAAM,aAAa,GAAG;AAC7G,QAAM,kBAAkB,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG;AACvG,QAAM,kBAAkB,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG;AACvG,QAAM,wBAAwB,eAAe,KAAK,CAAC,WAAW,OAAO,kBAAkB;AACvF,QAAM,sBAAsB,KAAK,IAAI,GAAG,GAAG,eAAe,IAAI,CAAC,WAAW,OAAO,UAAU,CAAC;AAE5F,MAAI,OAAO,kBAAkB,OAAO,MAAM,cAAc,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;AAC/E,MAAI,OAAO,kBAAkB,OAAO,MAAM,cAAc,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;AAC/E,MAAI,OAAO,kBAAkB,OAAO,MAAM,WAAW,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;AAC5E,MAAI,OAAO,kBAAkB,OAAO,MAAM,WAAW,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;AAE5E,MAAI,CAAC,iBAAiB;AACpB,WAAO,wBACH,IACA,MAAM,cAAc,YAAY,aAC9B,KAAK,IAAI,GAAG,IAAI,IAChB;AAAA,EACR;AACA,MAAI,CAAC,iBAAiB;AACpB,WAAO,wBACH,KAAK,IAAI,MAAM,sBAAsB,CAAC,IACtC,MAAM,cAAc,YAAY,aAC9B,KAAK,IAAI,GAAG,IAAI,IAChB;AAAA,EACR;AACA,MAAI,CAAC,mBAAmB,MAAM,WAAW,YAAY,YAAY;AAC/D,WAAO,KAAK,IAAI,GAAG,IAAI;AAAA,EACzB;AACA,MAAI,CAAC,mBAAmB,MAAM,WAAW,YAAY,YAAY;AAC/D,WAAO,KAAK,IAAI,GAAG,IAAI;AAAA,EACzB;AAEA,MAAI,QAAQ,MAAM;AAChB,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,QAAQ,MAAM;AAChB,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,QAAQ,OAAO,MAAM,cAAc,cAAc,YAAY,MAAM,aAAa,YAAY,IAC9F,MAAM,aAAa,YACnB,cAAc,MAAM,MAAM,CAAC;AAC/B,QAAM,QAAQ,OAAO,MAAM,WAAW,cAAc,YAAY,MAAM,UAAU,YAAY,IACxF,MAAM,UAAU,YAChB,cAAc,MAAM,MAAM,CAAC;AAE/B,MAAI,CAAC,mBAAmB,CAAC,yBAAyB,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACrF,WAAO,KAAK,MAAM,OAAO,KAAK,IAAI;AAAA,EACpC;AACA,MAAI,CAAC,mBAAmB,CAAC,yBAAyB,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACrF,WAAO,KAAK,KAAK,OAAO,KAAK,IAAI;AAAA,EACnC;AACA,MAAI,CAAC,mBAAmB,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAC3D,WAAO,KAAK,MAAM,OAAO,KAAK,IAAI;AAAA,EACpC;AACA,MAAI,CAAC,mBAAmB,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AAC3D,WAAO,KAAK,KAAK,OAAO,KAAK,IAAI;AAAA,EACnC;AAEA,QAAM,WAAW,QAAQ,OAAO,OAAO,IAAI;AAC3C,QAAM,WAAW,QAAQ,OAAO,OAAO,IAAI;AAE3C,QAAM,aAAS,6BAAY,EAAE,OAAO,CAAC,MAAM,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC;AAC/F,QAAM,aAAS,6BAAY,EAAE,OAAO,CAAC,MAAM,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC9F,QAAM,aAAa,OAAO,MAAM,cAAc,cAAc,YAAY,MAAM,aAAa,YAAY,IACnG,MAAM,aAAa,YACnB,wBACE,IACA;AACN,QAAM,aAAa,OAAO,MAAM,WAAW,cAAc,YAAY,MAAM,UAAU,YAAY,IAC7F,MAAM,UAAU,YAChB,cAAc,MAAM,UAAU,CAAC;AACnC,QAAM,SAAS,uBAAuB,MAAM,UAAU,UAAU;AAChE,QAAM,SAAS,uBAAuB,MAAM,UAAU,UAAU;AAChE,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAElD,QAAM,WAAW,QAAQ,KAAK,YAAY;AAC1C,QAAM,WAAW,QAAQ,KAAK,YAAY;AAE1C,SACE,8CAAC,OACE;AAAA,WAAO,IAAI,CAAC,SACX,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQH,cAAa,WAAW,GAAG;AAAA,UACnC,aAAa;AAAA,UACb,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,MACtB;AAAA,MACA,6CAAC,UAAK,MAAM,YAAY,UAAU,IAAI,YAAW,UAAS,GAAG,OAAO,IAAI,GAAG,GAAG,KAAK,MAAM,KAAK,SAAS,IACpG,0BAAgB,IAAI,GACvB;AAAA,SAXM,aAAa,IAAI,EAYzB,CACD;AAAA,IACA,OAAO,IAAI,CAAC,SACX,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQA,cAAa,WAAW,GAAG;AAAA,UACnC,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,OAAO,KAAK;AAAA,UACrB,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,OAAO,IAAI;AAAA;AAAA,MACjB;AAAA,MACA,6CAAC,UAAK,MAAM,YAAY,UAAU,IAAI,YAAW,OAAM,GAAG,KAAK,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,GACxF,0BAAgB,IAAI,GACvB;AAAA,SAXM,aAAa,IAAI,EAYzB,CACD;AAAA,IACA,WACC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,IAAI,KAAK;AAAA,QACT,IAAI,KAAK,OAAO,KAAK;AAAA,QACrB,IAAI,OAAO,CAAC;AAAA,QACZ,IAAI,OAAO,CAAC;AAAA;AAAA,IACd,IACE;AAAA,IACH,WACC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,IAAI,OAAO,CAAC;AAAA,QACZ,IAAI,OAAO,CAAC;AAAA,QACZ,IAAI,KAAK;AAAA,QACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,IACtB,IACE;AAAA,IACH,eAAe,IAAI,CAAC,cAAc,gBAAgB;AACjD,YAAM,SAAS,aAAa;AAC5B,YAAM,aAAa,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC;AACrD,YAAM,aAAa;AAAA,QACjB,2BAA2B,OAAO,YAAY;AAAA,QAC9C,aAAa;AAAA,MACf;AACA,YAAM,aAAa,OAAO,aAAa,OAAO,eAAe,OAAO,SAAS,uBAAuB,OAAO,WAAW;AACtH,YAAM,iBAAiB,CAAC,yBACnB,kBACA,OAAO,iBAAiB,kBAAkB,QAC1C,aAAa,OAAO,SAAS;AAClC,YAAM,oBAAoB,CAAC,yBACrB,yBAAyB,0BAA0B,sBACpD,WAAW,SAAS;AACzB,YAAM,YAAY,UAAU,wBAAwB,OAAO,WAAW,OAClE,gCAAgB,MAAM,GAAG,IACzB;AACJ,YAAM,WAAW,qBACb,gBAAAkB,MAAiC,EAC9B,EAAE,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,EAC5B,EAAE,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,EAC5B,MAAM,SAAS,EAAE,aAAa,MAAM,KAAK,KAC5C;AAEJ,aACE,8CAAC,OACE;AAAA,0BAAkB,SAAS,SAAS,IACnC;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAQ,OAAO,aAAa,uBAAuB,OAAO,WAAW;AAAA,YACrE,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAa,KAAK,IAAI,KAAK,OAAO,eAAe,CAAC;AAAA;AAAA,QACpD,IACE;AAAA,QACH,aAAa,OAAO,IAAI,CAAC,OAAO,eAAe;AAC9C,cAAI,CAAC,mBAAmB;AACtB,mBAAO;AAAA,UACT;AACA,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,aAAa,OAAO,MAAM,CAAC,CAAC,KAAK,OAAO,MAAM,CAAC,CAAC;AAAA,cAE3D;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG;AAAA,kBACH,MAAM;AAAA,kBACN,QAAO;AAAA,kBACP,aAAa;AAAA;AAAA,cACf;AAAA;AAAA,YARK,iBAAiB,WAAW,IAAI,UAAU;AAAA,UASjD;AAAA,QAEJ,CAAC;AAAA,WA5BK,kBAAkB,WAAW,EA6BrC;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,kBAAkB,OAAkB,SAA+B,QAAqB;AAC/F,QAAM,OAAO,OAAO;AACpB,QAAM,iBAAiB,MAAM,OAAO,IAAI,CAAC,WACvC,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAClC,UAAM,IAAIf,YAAW,OAAO,WAAW,KAAK,CAAC;AAC7C,UAAM,IAAIA,YAAW,KAAK;AAC1B,UAAM,SAASA,YAAW,OAAO,cAAc,KAAK,CAAC;AACrD,WAAO,KAAK,QAAQ,KAAK,OAAO,OAAO,EAAE,QAAQ,UAAU,GAAG,OAAO,GAAG,EAAE;AAAA,EAC5E,CAAC,EAAE,OAAO,CAAC,UAA4E,SAAS,IAAI,CACrG;AAED,QAAM,OAAO,eAAe,QAAQ,CAAC,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC9E,QAAM,OAAO,eAAe,QAAQ,CAAC,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AAC9E,QAAM,YAAY,eAAe,QAAQ,CAAC,WAAW,OAAO,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AACxF,MAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,QAAM,mBAAmB,UAAU,IAAI,CAAC,UAAU,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC;AAC/E,QAAM,qBAAqB,KAAK,IAAI,GAAG,gBAAgB;AACvD,QAAM,qBAAqB,KAAK,IAAI,GAAG,gBAAgB;AAEvD,QAAM,oBAAoBD,QAAO,MAAM,eAAe,OAAO,KAAK,KAAK,CAAC;AACxE,QAAM,YAAY;AAClB,QAAM,YAAY,KAAK,IAAI,YAAY,GAAG,KAAK,iBAAiB;AAChE,QAAM,kBAAc,6BAAY,EAC7B,OAAO,CAAC,oBAAoB,sBAAsB,qBAAqB,qBAAqB,IAAI,kBAAkB,CAAC,EACnH,MAAM,CAAC,WAAW,SAAS,CAAC;AAC/B,QAAM,WAAW,QAAQ,OAAO,OAAO,IAAI;AAC3C,QAAM,WAAW,QAAQ,OAAO,OAAO,IAAI;AAC3C,QAAM,QAAQ,WAAW;AACzB,QAAM,QAAQ,WAAW;AACzB,QAAM,OAAO,KAAK,IAAI,QAAQ,MAAO,QAAQ,YAAa,KAAK,IAAI,GAAG,KAAK,KAAK,CAAC;AACjF,QAAM,OAAO,KAAK,IAAI,QAAQ,MAAO,QAAQ,YAAa,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC;AAClF,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,MAAM,cAAc,YAAY;AAAA,EAClC;AACA,QAAM,UAAU;AAAA,IACd,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,MAAM,WAAW,YAAY;AAAA,EAC/B;AACA,QAAM,aAAS,6BAAY,EAAE,OAAO,CAAC,QAAQ,KAAK,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC;AACzG,QAAM,aAAS,6BAAY,EAAE,OAAO,CAAC,QAAQ,KAAK,QAAQ,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAExG,QAAM,SAAS,QAAQ;AACvB,QAAM,SAAS,QAAQ;AACvB,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,aAAa,MAAM,aAAa,QAAQ,MAAM,SAAS;AAC7D,QAAM,gBAAgB;AAAA,IACpB,MAAM,YAAY,oBACf,MAAM,YAAY,kBAClB,MAAM,YAAY,aAClB,MAAM,YAAY,kBAClB,MAAM,YAAY;AAAA,EACvB;AACA,QAAM,eAAe,eAAe,IAAI,CAAC,WACvC,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,KAAK,IAAI,MAAM,MAAM,GAAG,CAAC,CAC9D;AAED,SACE,8CAAC,OACE;AAAA,WAAO,IAAI,CAAC,SACX,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQF,cAAa,WAAW,IAAI;AAAA,UACpC,aAAa;AAAA,UACb,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,MACtB;AAAA,MACA,6CAAC,UAAK,MAAM,YAAY,UAAU,IAAI,YAAW,UAAS,GAAG,OAAO,IAAI,GAAG,GAAG,KAAK,MAAM,KAAK,SAAS,IACpG,0BAAgB,IAAI,GACvB;AAAA,SAXM,YAAY,IAAI,EAYxB,CACD;AAAA,IACA,OAAO,IAAI,CAAC,SACX,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQA,cAAa,WAAW,IAAI;AAAA,UACpC,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,OAAO,KAAK;AAAA,UACrB,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,OAAO,IAAI;AAAA;AAAA,MACjB;AAAA,MACA,6CAAC,UAAK,MAAM,YAAY,UAAU,IAAI,YAAW,OAAM,GAAG,KAAK,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,GACxF,0BAAgB,IAAI,GACvB;AAAA,SAXM,YAAY,IAAI,EAYxB,CACD;AAAA,IACD,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,IAC9I,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,IAClH,eAAe,IAAI,CAAC,QAAQ,gBAC3B,8CAAC,OACE;AAAA,mBACC,6CAAC,UACC,wDAAC,oBAAe,IAAI,iBAAiB,MAAM,EAAE,IAAI,WAAW,IAAI,IAAG,OAAM,IAAG,OAAM,GAAE,OAClF;AAAA,qDAAC,UAAK,QAAO,MAAK,WAAWA,cAAa,MAAM,OAAO,WAAW,GAAG,SAAS,MAAM,OAAO,WAAW,GAAG,aAAa,iBAAiB,OAAO,WAAW,GAAG,IAAI,GAAG;AAAA,QACnK,6CAAC,UAAK,QAAO,OAAM,WAAW,MAAM,OAAO,WAAW,GAAG,SAAS,MAAM,OAAO,WAAW,GAAG,aAAa,iBAAiB,OAAO,WAAW,GAAG;AAAA,QAChJ,6CAAC,UAAK,QAAO,QAAO,WAAWC,aAAY,MAAM,OAAO,WAAW,GAAG,SAAS,MAAM,OAAO,WAAW,GAAG,aAAa,iBAAiB,OAAO,WAAW,GAAG,IAAI,GAAG;AAAA,SACtK,GACF,IACE;AAAA,MACH,CAAC,GAAG,MAAM,EACR,KAAK,CAAC,MAAM,UAAU;AACrB,YAAI,KAAK,WAAW,MAAM,QAAQ;AAChC,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B;AACA,eAAO,KAAK,QAAQ,MAAM;AAAA,MAC5B,CAAC,EACA,IAAI,CAAC,UAAU;AAChB,cAAM,SAAS,MAAM,OAAO,WAAW;AACvC,cAAM,YAAY,QAAQ,SAAS,QAAQ,aAAa,iBAAiB,OAAO,WAAW;AAC3F,cAAM,SAAS,YAAY,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM,MAAM,CAAC,CAAC;AAC/D,cAAM,SAAmB,CAAC;AAC1B,YAAI,MAAM,YAAY,kBAAkB,QAAQ,MAAM;AACpD,iBAAO,KAAK,OAAO,IAAI;AAAA,QACzB;AACA,YAAI,MAAM,YAAY,kBAAkB;AACtC,iBAAO,KAAK,gBAAgB,MAAM,CAAC,CAAC;AAAA,QACtC;AACA,YAAI,MAAM,YAAY,WAAW;AAC/B,iBAAO,KAAK,gBAAgB,MAAM,CAAC,CAAC;AAAA,QACtC;AACA,YAAI,MAAM,YAAY,gBAAgB;AACpC,iBAAO,KAAK,gBAAgB,MAAM,MAAM,CAAC;AAAA,QAC3C;AACA,YAAI,MAAM,YAAY,aAAa;AACjC,iBAAO,KAAK,GAAG,KAAK,MAAO,KAAK,IAAI,MAAM,MAAM,IAAI,KAAK,IAAI,GAAG,aAAa,WAAW,KAAK,CAAC,IAAK,GAAG,CAAC,GAAG;AAAA,QAC5G;AACA,eACE,8CAAC,OACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,OAAO,MAAM,CAAC;AAAA,cAClB,IAAI,OAAO,MAAM,CAAC;AAAA,cAClB,MAAM,aAAa,sBAAsB,MAAM,EAAE,IAAI,WAAW,MAAM;AAAA,cACtE,aAAa,aAAa,OAAO;AAAA,cACjC,GAAG;AAAA,cACH,QAAQA,aAAY,WAAW,IAAI;AAAA,cACnC,aAAa,aAAa,MAAM;AAAA;AAAA,UAClC;AAAA,UACC,aACC;AAAA,YAAC;AAAA;AAAA,cACC,IAAI,OAAO,MAAM,CAAC,IAAI,SAAS;AAAA,cAC/B,IAAI,OAAO,MAAM,CAAC,IAAI,SAAS;AAAA,cAC/B,MAAK;AAAA,cACL,SAAS;AAAA,cACT,IAAI,KAAK,IAAI,KAAK,SAAS,IAAI;AAAA,cAC/B,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG;AAAA;AAAA,UAC9B,IACE;AAAA,UACH,iBAAiB,OAAO,SAAS,IAChC;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,sBAAsB,KAAK;AAAA,cACjC,UAAU;AAAA,cACV,YAAW;AAAA,cACX,GAAG,OAAO,MAAM,CAAC,IAAI,SAAS;AAAA,cAC9B,GAAG,OAAO,MAAM,CAAC,IAAI;AAAA,cAEpB,iBAAO,KAAK,IAAI;AAAA;AAAA,UACnB,IACE;AAAA,aA9BE,UAAU,WAAW,IAAI,MAAM,KAAK,EA+B5C;AAAA,MAEJ,CAAC;AAAA,SAvEK,iBAAiB,WAAW,EAwEpC,CACD;AAAA,KACH;AAEJ;AAEA,SAAS,iBAAiB,OAAkB,SAA+B,QAAqB;AAC9F,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,aAAa,kBAAkB,KAAK;AAC1C,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,QAAM,UAAU,KAAK,MAAM,KAAK,SAAS;AACzC,QAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,IAAI,IAAI;AACpE,QAAM,SAAS,MAAM,OAAO,QAAQ,CAAC,WACnC,OAAO,OACJ,MAAM,GAAG,WAAW,MAAM,EAC1B,IAAI,CAAC,UAAUE,YAAW,KAAK,CAAC,EAChC,OAAO,CAAC,UAA2B,SAAS,IAAI,CACpD;AACD,QAAM,iBAAiB,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG;AACtG,QAAM,iBAAiB,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG;AACtG,MAAI,WAAW,iBACX,OAAO,MAAM,WAAW,GAAG,IAC3B,KAAK,IAAI,GAAG,GAAI,OAAO,SAAS,SAAS,CAAC,CAAC,CAAE;AACjD,MAAI,WAAW,iBACX,OAAO,MAAM,WAAW,GAAG,IAC3B,KAAK,IAAI,GAAG,GAAI,OAAO,SAAS,SAAS,CAAC,CAAC,CAAE;AACjD,MAAI,MAAM,WAAW,YAAY,YAAY;AAC3C,eAAW,KAAK,IAAI,GAAG,QAAQ;AAAA,EACjC;AACA,QAAM,UAAU,YAAY,WAAW,WAAW,IAAI;AACtD,QAAM,OAAO,KAAK,IAAI,MAAM,UAAU,QAAQ;AAC9C,QAAM,qBAAqB,OAAO,MAAM,WAAW,cAAc,YAAY,MAAM,UAAU,YAAY,IACrG,MAAM,UAAU,YAChB;AACJ,QAAM,qBAAqB,sBAAsB,OAAO,sBAAsB,IAC1E,qBACA,cAAc,UAAU,SAAS,CAAC;AACtC,QAAM,QAAQ,uBAAuB,UAAU,SAAS,kBAAkB;AAC1E,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,SAAS,MAAM,eAAe;AACpC,QAAM,aAAa,MAAM,cAAc,mBAAmB;AAE1D,QAAM,UAAU,CAAC,UAAmB,KAAK,KAAK,IAAI,QAAS,WAAW,SAAS,KAAK,KAAK;AACzF,QAAM,cAAc,CAAC,OAAe,eAAuB;AACzD,UAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAM,IAAI,SAAS;AACnB,WAAO;AAAA,MACL,GAAG,UAAU,KAAK,IAAI,KAAK,IAAI;AAAA,MAC/B,GAAG,UAAU,KAAK,IAAI,KAAK,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,SACE,8CAAC,OACE;AAAA,UAAM,IAAI,CAAC,MAAM,cAAc;AAC9B,YAAM,SAAS,OAAO,aAAa,UAAU;AAC7C,YAAM,aAAa,WAAW,IAAI,CAAC,GAAG,kBAAkB,YAAY,eAAe,KAAK,CAAC;AACzF,YAAM,eAAW,gBAAAe,MAAiC,EAC/C,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,MAAM,iCAAiB,EAAE,UAAU,KAAK;AAC3C,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAM,YAAY,MAAM,IAAI,gBAAgBlB,cAAa,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AAAA,YAC1G,QAAQA,cAAa,WAAW,GAAG;AAAA,YACnC,aAAa;AAAA;AAAA,QACf;AAAA,QACA,6CAAC,UAAK,MAAM,YAAY,UAAU,GAAG,GAAG,UAAU,GAAG,GAAG,UAAU,SAAS,QAAQ,GAChF,0BAAgB,IAAI,GACvB;AAAA,WATM,cAAc,SAAS,EAU/B;AAAA,IAEJ,CAAC;AAAA,IACA,WAAW,IAAI,CAAC,UAAU,kBAAkB;AAC3C,YAAM,OAAO,YAAY,eAAe,CAAC;AACzC,aACE,8CAAC,OACE;AAAA,qBACC,6CAAC,UAAK,QAAQA,cAAa,WAAW,IAAI,GAAG,aAAa,GAAG,IAAI,SAAS,IAAI,KAAK,GAAG,IAAI,SAAS,IAAI,KAAK,GAAG,IAC7G;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,WAAW,KAAK,IAAI,WAAW;AAAA,YAClC,GAAG,WAAW,KAAK,IAAI,WAAW;AAAA,YAEjC;AAAA;AAAA,QACH;AAAA,WAZM,cAAc,aAAa,EAanC;AAAA,IAEJ,CAAC;AAAA,IACA,MAAM,OAAO,IAAI,CAAC,QAAQ,gBAAgB;AACzC,YAAM,SAAS,WAAW,IAAI,CAAC,GAAG,kBAAkB;AAClD,cAAM,WAAWG,YAAW,OAAO,OAAO,aAAa,CAAC;AACxD,YAAI,YAAY,MAAM;AACpB,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,GAAG,YAAY,eAAe,CAAC;AAAA,UACjC;AAAA,QACF;AACA,cAAM,QAAQD,QAAO,WAAW,aAAa,UAAU,WAAW,GAAG,CAAC;AACtE,eAAO;AAAA,UACL,SAAS;AAAA,UACT,GAAG,YAAY,eAAe,KAAK;AAAA,QACrC;AAAA,MACF,CAAC;AACD,YAAM,gBAAgB,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO;AAC5D,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO;AAAA,MACT;AACA,YAAM,SAAS,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,OAAO;AACpD,YAAM,cAAU,gBAAAgB,MAAmD,EAChE,QAAQ,CAAC,UAAU,MAAM,OAAO,EAChC,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,EAAE,CAAC,UAAU,MAAM,CAAC,EACpB,MAAM,SAAS,8BAAc,iCAAiB,EAAE,MAAM,KAAK;AAC9D,YAAM,QAAQ,iBAAiB,OAAO,WAAW;AACjD,YAAM,eAAe,2BAA2B,OAAO,YAAY;AACnE,YAAM,aAAa,KAAK,IAAI,GAAG,OAAO,cAAc,CAAC;AACrD,YAAM,aAAa,iBAAiB,cAAc,aAAa,GAAG;AAClE,YAAM,cAAc,iBAAiB,UAAU,WAAW,SAAS;AACnE,aACE,8CAAC,OACE;AAAA,sBAAc,UAAU,IACvB;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAM,UAAU,CAAC,UAAU,cAAc,UAAU,IAAI,QAAQ;AAAA,YAC/D,aAAa,SAAS,OAAO;AAAA,YAC7B,QAAQ,uBAAuB,OAAO,WAAW;AAAA,YACjD,aAAa;AAAA;AAAA,QACf,IACE;AAAA,QACH,cACG,cAAc,IAAI,CAAC,OAAO,eACxB;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW,aAAa,MAAM,CAAC,KAAK,MAAM,CAAC;AAAA,YAE3C;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG;AAAA,gBACH,MAAM,OAAO,eAAe;AAAA,gBAC5B,QAAQ,OAAO,mBAAmB,MAAM,sBAAsB,QAAQ;AAAA,gBACtE,aAAa;AAAA;AAAA,YACf;AAAA;AAAA,UARK,eAAe,WAAW,IAAI,UAAU;AAAA,QAS/C,CACD,IACD;AAAA,WAxBE,gBAAgB,WAAW,EAyBnC;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,eAAe,OAAkB,SAA+B,QAAqB,WAAmB;AAC/G,QAAM,iBAAiB,4BAA4B,KAAK;AACxD,QAAM,YAAY,MAAM,OAAO,cAAc;AAC7C,QAAM,UAAU,gBAAgB,OAAO,cAAc;AACrD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,OAAO,mBAAmB;AAChD,QAAM,UAAU,gBAAgB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AACrH,QAAM,UAAU,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AACvD,QAAM,cAAc,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,KAAK,cAAc,aAAa,OAAO,KAAK;AAC3H,QAAM,aAAa,cAAc,aAAahB,QAAO,MAAM,YAAY,MAAM,KAAK,KAAK,GAAG,IAAI;AAC9F,QAAM,cAAc,cAAc;AAClC,QAAM,cAAe,MAAM,mBAAmB,KAAK,KAAK,KAAM;AAC9D,QAAM,WAAO,gBAAAwC,KAAsE,EAChF,MAAM,CAAC,UAAU,MAAM,KAAK,EAC5B,KAAK,IAAI,EACT,WAAW,UAAU,EACrB,SAAS,aAAa,KAAK,KAAK,CAAC,EAAE,OAAO;AAE7C,QAAM,cAAU,gBAAAC,KAA2B,EACxC,YAAY,WAAW,EACvB,YAAY,WAAW;AAE1B,QAAM,UAAU,cAAc,WAAY,cAAc,iBAAiB,MAAM,SAAS;AACxF,QAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,QAAM,cAAc,MAAM,QAAQ,eAAe;AACjD,QAAM,eAAezC,OAAM,OAAQ,OAAO,KAAM,MAAM,MAAM,IAAI;AAChE,QAAM,yBAAyBA,OAAM,IAAK,cAAc,KAAM,MAAM,CAAC;AACrE,QAAM,OAAO,UAAUA,OAAM,eAAe,wBAAwB,MAAM,IAAI,IAAI;AAClF,QAAM,cAAc,MAAM,QAAQ,gBAAgB,OAAO;AACzD,QAAM,QAAQ,UAAU,KAAK,IAAI,GAAG,cAAc,OAAO,UAAU,IAAI;AACvE,QAAM,oBAAoB,QAAQ,MAAM,YAAY,oBAAoB,MAAM,YAAY,eAAe,MAAM,YAAY,SAAS;AACpI,QAAM,QAAQ,QAAQ,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,OAAO,CAAC;AACjE,QAAM,WAAW,gBAAgB,MAAM,EAAE,GAAG,QAAQ,mBAAmB,GAAG;AAC1E,QAAM,eAAe,qBAAqB,MAAM,EAAE,GAAG,QAAQ,mBAAmB,GAAG;AACnF,QAAM,sBAAsB,MAAM,sBAAsB;AACxD,QAAM,cAAc;AAAA,IAClB,QAAQ,OAAO,SAAS;AAAA,IACxB,MAAM;AAAA,IACN,OAAO,OAAO,QAAQ;AAAA,IACtB,KAAK,OAAO,KAAK,MAAM;AAAA,EACzB;AACA,QAAM,oBAAoB,IAAI,KAAK,MAAM,YAAY,eAAe,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AAC5G,QAAM,wBAAwB,cAAc,cACvC,MAAM,YAAY,eAAe,CAAC,GAAG,KAAK,CAAC,UAC5C,MAAM,YAAY,QACf,MAAM,cAAc,QACpB,MAAM,qBAAqB,QAC3B,MAAM,gBAAgB,QACtB,MAAM,mBAAmB,QACzB,MAAM,mBAAmB,IAC7B,KAAK,OACJ;AACJ,QAAM,mBAAmB,wBACrB,QAAQ,KAAK,CAAC,UAAU,MAAM,UAAU,sBAAsB,KAAK,KAAK,OACxE;AACJ,QAAM,0BAA0B,cAAc,cAAc,oBAAoB;AAChF,QAAM,0BAA0B,oBAAoB,QAC/C,QAAQ,KACR,SAAS,aACT,iBAAiB,SAAS,KAC1B,iBAAiB,SAAS;AAC/B,QAAM,kBAAkB,oBAAoB,OACxC,KACA,0BACE,GAAG,KAAK,MAAM,iBAAiB,QAAQ,GAAG,CAAC,MAC3C,gBAAgB,iBAAiB,KAAK;AAC5C,QAAM,sBAAsB,0BACxB,KAAK;AAAA,IACH;AAAA,IACA,KAAK;AAAA,MACH,KAAK,IAAI,IAAI,cAAc,IAAI;AAAA,OAC9B,uBAAuB,cAAc,MAAM;AAAA,IAC9C;AAAA,EACF,IACA;AAEJ,QAAM,wBAAwB,CAAC,eAAuB;AACpD,UAAM,aAAa,WAAW,iBAAiB,KAAK,CAAC,UAAU,MAAM,UAAU,UAAU;AACzF,UAAM,kBAAkB,OAAO,WAAW,iBAAiB,iBAAiB,WACxE,UAAU,gBAAgB,eAC1B;AACJ,UAAM,eAAe,KAAK,IAAI,GAAG,YAAY,aAAa,mBAAmB,CAAC;AAC9E,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO,cAAcA,OAAM,eAAe,KAAK,GAAG,CAAC;AAAA,EACrD;AACA,QAAM,oBAAoB,KAAK,KAAK,CAAC,QAAQ,sBAAsB,IAAI,KAAK,KAAK,IAAI,CAAC;AACtF,QAAM,sBAAsB,oBAAoB,IAAI;AAEpD,SACE,8CAAC,OACE;AAAA,cACC,8CAAC,UACC;AAAA,mDAAC,YAAO,IAAI,UAAU,GAAE,QAAO,GAAE,QAAO,OAAM,QAAO,QAAO,QAC1D,uDAAC,kBAAa,IAAG,OAAM,IAAG,OAAM,YAAW,WAAU,cAAa,QAAO,cAAa,OAAM,GAC9F;AAAA,MACA,6CAAC,YAAO,IAAI,cAAc,GAAE,QAAO,GAAE,QAAO,OAAM,QAAO,QAAO,QAC9D,uDAAC,oBAAe,cAAa,OAAM,GACrC;AAAA,OACF,IACE;AAAA,IACH,UACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,IAAI,UAAU,QAAQ;AAAA,QACtB,MAAK;AAAA,QACL,QAAQ,QAAQ,YAAY;AAAA,QAC5B,SAAS;AAAA,QACT,IAAI,cAAc;AAAA,QAClB,IAAI,cAAc,OAAO;AAAA;AAAA,IAC3B,IACE;AAAA,IACH,UACK,KAAK,IAAI,CAAC,QAAQ;AAChB,YAAM,YAAY,IAAI,aAAa,IAAI,YAAY;AACnD,YAAM,YAAY,sBAAsB,IAAI,KAAK,KAAK;AACtD,YAAM,WAAW,KAAK,IAAI,QAAQ,IAAI;AACtC,YAAM,WAAW,CAAC,KAAK,IAAI,QAAQ,IAAI,YAAY;AACnD,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,YAAY;AAAA,MACd;AACF,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO;AAAA,MACT;AACA,aACE,8CAAC,OAAqC,WAAW,aAAa,QAAQ,KAAK,QAAQ,KAChF;AAAA,kBAAU,IAAI,CAAC,UAAU,cACxB;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAMD,aAAY,IAAI,KAAK,OAAO,IAAI;AAAA,YAEtC,QAAQA,aAAY,IAAI,KAAK,OAAO,GAAG;AAAA,YACvC,aAAa;AAAA;AAAA,UAFR,iBAAiB,IAAI,KAAK,KAAK,IAAI,SAAS;AAAA,QAGnD,CACD;AAAA,QACA,YAAY,KAAK,MAAM;AACtB,gBAAM,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ;AAAA,UACF;AACA,gBAAM,UAAU;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ;AAAA,UACF;AACA,iBACE,8EACG;AAAA,wBACC;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG;AAAA,gBACH,MAAMA,aAAY,IAAI,KAAK,OAAO,IAAI;AAAA,gBACtC,QAAQA,aAAY,IAAI,KAAK,OAAO,IAAI;AAAA,gBACxC,aAAa;AAAA;AAAA,YACf,IACE;AAAA,YACH,UACC;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG;AAAA,gBACH,MAAMA,aAAY,IAAI,KAAK,OAAO,GAAG;AAAA,gBACrC,QAAQA,aAAY,IAAI,KAAK,OAAO,GAAG;AAAA,gBACvC,aAAa;AAAA;AAAA,YACf,IACE;AAAA,aACN;AAAA,QAEJ,GAAG,IAAI;AAAA,WAjDD,YAAY,IAAI,KAAK,KAAK,EAkDlC;AAAA,IAEJ,CAAC,IACD;AAAA,IACH,KAAK,IAAI,CAAC,QAAQ;AACjB,YAAM,YAAY,sBAAsB,IAAI,KAAK,KAAK;AACtD,YAAM,YAAY,IAAI,aAAa,IAAI,YAAY;AACnD,YAAM,WAAW,KAAK,IAAI,QAAQ,IAAI;AACtC,YAAM,WAAW,CAAC,KAAK,IAAI,QAAQ,IAAI,aAAa,UAAU,OAAO;AACrE,YAAM,cAAc,eAAe,cAAc,gBAAgB,IAAI;AACrE,YAAM,SAAS,UAAU,KAAK,IAAI,QAAQ,IAAI,cAAc;AAC5D,YAAM,SAAS,UAAU,KAAK,IAAI,QAAQ,IAAI,eAAe,UAAU,OAAO,KAAK;AACnF,YAAM,SAAmB,CAAC;AAC1B,UAAI,MAAM,YAAY,oBAAoB,IAAI,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG;AAC1E,eAAO,KAAK,IAAI,KAAK,KAAK;AAAA,MAC5B;AACA,YAAM,aAAa,kBAAkB,IAAI,IAAI,KAAK,KAAK;AACvD,YAAM,YAAY,YAAY,aAAa,MAAM,YAAY;AAC7D,YAAM,cAAc,YAAY,eAAe,MAAM,YAAY;AACjE,UAAI,WAAW;AACb,eAAO,KAAK,gBAAgB,IAAI,KAAK,KAAK,CAAC;AAAA,MAC7C;AACA,UAAI,aAAa;AACf,eAAO,KAAK,GAAG,KAAK,MAAO,IAAI,KAAK,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAK,GAAG,CAAC,GAAG;AAAA,MAC3E;AACA,YAAM,YAAY,OAAO,KAAK,IAAI;AAClC,YAAM,qBAAqB,gBAAgB,WAAW,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI,GAAG,EAAE;AAC3F,YAAM,mBAAmB,KAAK,IAAI,IAAI,mBAAmB,SAAS,GAAG;AACrE,UAAI,cAA+B,UAAU,UAAU,UAAU;AACjE,UAAI,iBAAiB;AACrB,UAAI,gBAAgB,WAAW,iBAAiB,mBAAmB,YAAY,OAAO;AACpF,sBAAc;AAAA,MAChB;AACA,UAAI,gBAAgB,SAAS,iBAAiB,mBAAmB,YAAY,MAAM;AACjF,sBAAc;AAAA,MAChB;AACA,uBAAiBC,OAAM,gBAAgB,YAAY,MAAM,YAAY,KAAK;AAC1E,YAAM,iBAAiBA,OAAM,QAAQ,YAAY,KAAK,YAAY,MAAM;AACxE,aACE,8CAAO,iBAAN,EACC;AAAA,qDAAC,OAAE,WAAW,aAAa,QAAQ,KAAK,QAAQ,KAC9C;AAAA,UAAC;AAAA;AAAA,YACC,GAAI,QAAQ,GAAG,KAAK;AAAA,YACpB,MAAM,IAAI,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,WAAW,aAAa,OAAO,KAAK,OAAO,IAAI,UAAU,aAAa,IAAI,MAAM,EAAE;AAAA,YAClF,QAAQ,UAAU,QAAQ,QAAQ,MAAM;AAAA;AAAA,QAC1C,GACF;AAAA,QACC,qBAAqB,mBAAmB,SAAS,IAChD;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,sBAAsB,KAAK;AAAA,YACjC,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,GAAG;AAAA,YACH,GAAG;AAAA,YAEF;AAAA;AAAA,QACH,IACE;AAAA,WArBe,WAAW,IAAI,KAAK,KAAK,EAsB9C;AAAA,IAEJ,CAAC;AAAA,IACA,0BACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,aAAa,MAAM,cAAc;AAAA,QAC7C,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAW;AAAA,QACX,GAAG;AAAA,QACH,GAAG,UAAU,sBAAsB;AAAA,QAElC;AAAA;AAAA,IACH,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,oBAAoB,OAAkB,SAA+B,QAAqB;AACjG,QAAM,iBAAiB,4BAA4B,KAAK;AACxD,QAAM,YAAY,MAAM,OAAO,cAAc;AAC7C,QAAM,aAAa,kBAAkB,KAAK;AAC1C,QAAM,SAAS,WAAW,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,GAAGC,YAAW,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC;AACzF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,QAAM,MAAO,MAAM,OAAO,CAAC;AAC3B,QAAM,YAAY,IAAI,cAAc,QAAQ,QAAQ;AACpD,QAAM,WAAW,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AACnE,MAAI,mBAAmB,OACpB,IAAI,CAAC,OAAO,WAAW,EAAE,OAAO,MAAM,EAAE,EACxC,OAAO,CAAC,EAAE,MAAM,MAAM,SAAS,QAAQ,EACvC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK;AAC3B,MAAI,iBAAiB,WAAW,GAAG;AACjC,uBAAmB,OAChB,IAAI,CAAC,OAAO,WAAW,EAAE,OAAO,MAAM,EAAE,EACxC,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,EAC9C,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC,EACnC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK;AAAA,EAC7B;AACA,QAAM,eAAe,IAAI,IAAI,gBAAgB;AAC7C,QAAM,iBAAiB,iBAAiB,OAAO,CAAC,KAAK,UAAU,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC;AAC5F,QAAM,cAAc,OAAO,QAAQ,CAAC,OAAO,UAAU,aAAa,IAAI,KAAK,IACvE,CAAC,IACD,CAAC,EAAE,OAAO,gBAAgB,OAAO,OAAO,cAAc,GAAG,OAAO,WAAW,KAAK,GAAG,MAAM,CAAC,CAAC;AAC/F,MAAI,iBAAiB,GAAG;AACtB,gBAAY,KAAK;AAAA,MACf,OAAO,gBAAgB,OAAO,iBAAiB,CAAC,KAAK,GAAG,cAAc;AAAA,MACtE,OAAO;AAAA,MACP,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AAC1D,QAAM,aAAa,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AAC1D,QAAM,YAAY,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,QAAQ,OAAO,KAAK,QAAQ,IAAI,IAAI,GAAG;AAC3F,QAAM,UAAM,gBAAAwC,KAAgD,EAAE,YAAY,CAAC,EAAE,YAAY,SAAS;AAClG,QAAM,cAAU,gBAAAD,KAAuD,EACpE,MAAM,CAAC,UAAU,MAAM,KAAK,EAC5B,KAAK,IAAI,EACT,YAAa,MAAM,MAAM,mBAAmB,MAAM,KAAK,KAAM,GAAG,EAChE,UAAW,MAAM,MAAM,mBAAmB,MAAM,KAAK,KAAM,MAAM,KAAK,KAAK,CAAC,EAAE,WAAW;AAE5F,QAAM,kBAAkB,iBAAiB,IAAI,CAAC,UAAU,WAAW,KAAK,KAAK,EAAE;AAC/E,QAAM,kBAAkB,iBAAiB,IAAI,CAAC,UAAU,OAAO,KAAK,KAAK,CAAC;AAC1E,QAAM,mBAAmB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AAChE,QAAM,gBAAgB,iBAAiB,IAAI,CAAC,WAAW;AAAA,IACrD,OAAO,gBAAgB,OAAO,OAAO,cAAc;AAAA,IACnD,OAAO,WAAW,KAAK,KAAK;AAAA,IAC5B,OAAO,OAAO,KAAK,KAAK;AAAA,EAC1B,EAAE;AACF,QAAM,mBAAmB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AAChE,QAAM,mBAAmB;AACzB,QAAM,kBAAkB,YAAYxC,QAAQ,OAAO,IAAI,kBAAkB,WAAW,IAAI,gBAAgB,OAAO,KAAM,MAAM,GAAG;AAC9H,QAAM,mBAAe,gBAAAyC,KAAgD,EAAE,YAAY,CAAC,EAAE,YAAY,eAAe;AACjH,QAAM,uBAAmB,gBAAAD,KAAuD,EAC7E,MAAM,CAAC,UAAU,MAAM,KAAK,EAC5B,KAAK,IAAI,EACT,YAAa,MAAM,MAAM,mBAAmB,MAAM,KAAK,KAAM,GAAG,EAChE,UAAW,MAAM,MAAM,mBAAmB,MAAM,KAAK,KAAM,MAAM,KAAK,KAAK,CAAC,EAAE,aAAa;AAC9F,QAAM,iBAAiB,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AAC9D,QAAM,kBAAkB,KAAK,IAAI,IAAI,OAAO,KAAK,QAAQ,IAAI;AAC7D,QAAM,gBAAgB,OAAO,KAAK,MAAM;AACxC,QAAM,mBAAmB,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE;AAC7D,QAAM,qBAAqB,KAAK,IAAI,MAAM,cAAc;AACxD,MAAI,cAAc;AAElB,SACE,8CAAC,OACE;AAAA,YAAQ,IAAI,CAAC,OAAO,UACnB;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,IAAI,KAAK,KAAK;AAAA,QACjB,MAAM,MAAM,KAAK;AAAA,QACjB,QAAQ,MAAM,sBAAsB,QAAQ;AAAA,QAC5C,aAAa;AAAA,QACb,WAAW,aAAa,UAAU,KAAK,UAAU;AAAA;AAAA,MAL5C,mBAAmB,KAAK;AAAA,IAM/B,CACD;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM,wBAAwB,QAAQ;AAAA,QAC9C,aAAa;AAAA,QACb,IAAI,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,IAAI,aAAa,YAAY;AAAA,QAC7B,IAAI,OAAO,KAAK,MAAM;AAAA;AAAA,IACxB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM,wBAAwB,QAAQ;AAAA,QAC9C,aAAa;AAAA,QACb,IAAI,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,IAAI,aAAa,YAAY;AAAA,QAC7B,IAAI,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AAAA;AAAA,IAC7C;AAAA,IACC,cAAc,QACX,iBAAiB,IAAI,CAAC,OAAO,UAC7B;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG,aAAa,KAAK,KAAK;AAAA,QAC1B,MAAM,MAAM,KAAK;AAAA,QACjB,QAAQ,MAAM,sBAAsB,QAAQ;AAAA,QAC5C,aAAa;AAAA,QACb,WAAW,aAAa,gBAAgB,KAAK,gBAAgB;AAAA;AAAA,MALxD,4BAA4B,KAAK;AAAA,IAMxC,CACD,IACC,cAAc,IAAI,CAAC,OAAO,UAAU;AACpC,YAAM,gBAAgB,UAAU,cAAc,SAAS,IACnD,KAAK,IAAI,GAAG,gBAAgB,mBAAmB,WAAW,IAC1D,KAAK,IAAI,GAAI,MAAM,QAAQ,qBAAsB,gBAAgB;AACrE,YAAM,IAAI;AACV,qBAAe;AACf,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,YACR,QAAQ,MAAM,sBAAsB,QAAQ;AAAA,YAC5C,aAAa;AAAA,YACb,OAAO;AAAA,YACP,GAAG;AAAA,YACH;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,0BAA0B,KAAK;AAAA,YACrC,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,iBAAiB,kBAAkB;AAAA,YACtC,GAAG,IAAI,gBAAgB,MAAM;AAAA,YAE5B,gBAAM;AAAA;AAAA,QACT;AAAA,WAlBM,4BAA4B,KAAK,EAmBzC;AAAA,IAEJ,CAAC;AAAA,KACL;AAEJ;AAEA,SAAS,mBAAmB,OAAkB,SAA+B,QAAqB;AAChG,QAAM,OAAO,uBAAuB,OAAO,MAAM;AACjD,QAAM,aAAa,kBAAkB,KAAK;AAC1C,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,OAAO,KAAK;AAAA,IAChB,WAAW;AAAA,IACX,MAAM,OAAO,OAAO,CAAC,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,OAAO,MAAM,GAAG,CAAC;AAAA,EAC7E;AACA,MAAI,SAAS,KAAK,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,OAAO,IAAI,CAAC,WAC/B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,gBAAgBvC,YAAW,OAAO,OAAO,WAAW,CAAC,CAAC,CACxF;AACD,QAAM,SAASa,kBAAiB,KAAK;AACrC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,YAAYH,uBAAsB,KAAK;AAC7C,QAAM,WAAW,OAAO;AACxB,QAAM,UAAU,OAAO;AACvB,QAAM,WAAW,MAAM,UAAU,aAAa;AAC9C,QAAM,gBAAgB,MAAM,UAAU,aAAa,MAAM,UAAU,aAAa,MAAM,OAAO,cAAc,MAAM,iBAAiBb,cAAaM,yBAAwB,OAAO,OAAO,GAAG,GAAG;AAE3L,MAAI,WAAW;AACb,UAAM,aAAa,OAAO,MAAM,MAAM,GAAG,EAAE;AAC3C,UAAMsC,SAA2B,CAAC;AAClC,UAAM,6BAA6B,oBAAI,IAAqC;AAE5E,aAAS,WAAW,GAAG,WAAW,OAAO,GAAG,YAAY,GAAG;AACzD,eAAS,cAAc,GAAG,cAAc,OAAO,GAAG,eAAe,GAAG;AAClE,cAAM,MAAM,OAAO,QAAQ,IAAI,WAAW;AAC1C,cAAM,MAAM,OAAO,QAAQ,IAAI,cAAc,CAAC;AAC9C,cAAM,MAAM,OAAO,WAAW,CAAC,IAAI,WAAW;AAC9C,cAAM,MAAM,OAAO,WAAW,CAAC,IAAI,cAAc,CAAC;AAClD,YAAI,OAAO,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO,MAAM;AAC5D;AAAA,QACF;AAEA,cAAM,KAAK,KAAK,OAAQ,cAAc,KAAK,IAAI,GAAG,OAAO,CAAC,IAAK,KAAK;AACpE,cAAM,KAAK,KAAK,QAAS,cAAc,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAK,KAAK;AAC1E,cAAM,KAAK,KAAK,MAAM,KAAK,SAAU,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAK,KAAK;AAC9E,cAAM,KAAK,KAAK,MAAM,KAAK,UAAW,WAAW,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAK,KAAK;AACpF,cAAM,gBAAgB,MAAM,MAAM,MAAM,OAAO;AAE/C,YAAI,CAAC,MAAM,WAAW;AACpB,gBAAM,eAAe,MAAM,MAAM,OAAO;AACxC,gBAAM,eAAe,MAAM,MAAM,OAAO;AACxC,gBAAM,iBAAiB,MAAM,MAAM,OAAO;AAC1C,gBAAM,iBAAiB,MAAM,MAAM,OAAO;AAC1C,gBAAM,eAAgB,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,KACjE,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG;AACrD,gBAAM,iBAAkB,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,KACnE,KAAK,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG;AACrD,gBAAM,qBAAqB,gBAAgB;AAC3C,gBAAM,YAAY,qBACd;AAAA,YACE;AAAA,cACE,WAAW3B,yBAAwB,OAAO,SAAS,QAAQ,WAAW;AAAA,cACtE,WAAW,wBAAwB,QAAQ,WAAW;AAAA,cACtD,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,YAC7C;AAAA,YACA;AAAA,cACE,WAAWA,yBAAwB,OAAO,SAAS,QAAQ,WAAW;AAAA,cACtE,WAAW,wBAAwB,QAAQ,WAAW;AAAA,cACtD,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,YAC7C;AAAA,UACF,IACA;AAAA,YACE;AAAA,cACE,WAAWA,yBAAwB,OAAO,SAAS,QAAQ,aAAa;AAAA,cACxE,WAAW,wBAAwB,QAAQ,aAAa;AAAA,cACxD,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,YAC7C;AAAA,YACA;AAAA,cACE,WAAWA,yBAAwB,OAAO,SAAS,QAAQ,aAAa;AAAA,cACxE,WAAW,wBAAwB,QAAQ,aAAa;AAAA,cACxD,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAAA,YAC7C;AAAA,UACF;AACJ,gBAAM,YAAY,qBACd,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IACjC,EAAE,IAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AACrC,gBAAM,aAAa,UAAU,CAAC,GAAG,cAAc,UAAU,CAAC,GAAG;AAC7D,UAAA2B,OAAM;AAAA,YACJ,6CAAC,OACE,uBACC,8EACE;AAAA,2DAAC,aAAQ,MAAM,UAAU,CAAC,GAAG,WAAW,QAAQ,UAAU,CAAC,GAAG,QAAQ,QAAO,QAAO;AAAA,cACpF,6CAAC,aAAQ,MAAM,UAAU,CAAC,GAAG,WAAW,QAAQ,UAAU,CAAC,GAAG,QAAQ,QAAO,QAAO;AAAA,cACpF;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ3C,aAAYc,gCAA+B,OAAO,SAAS,QAAQ,YAAY,GAAG,IAAI;AAAA,kBAC9F,aAAa;AAAA,kBACb,IAAI,UAAU;AAAA,kBACd,IAAI,UAAU;AAAA,kBACd,IAAI,UAAU;AAAA,kBACd,IAAI,UAAU;AAAA;AAAA,cAChB;AAAA,eACF,IAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAME,yBAAwB,OAAO,SAAS,QAAQ,YAAY;AAAA,gBAClE,QAAQ,KAAK,IAAI,KAAK,EAAE;AAAA,gBACxB,QAAO;AAAA,gBACP,OAAO,KAAK,IAAI,KAAK,EAAE;AAAA,gBACvB,GAAG,KAAK,IAAI,IAAI,EAAE;AAAA,gBAClB,GAAG,KAAK,IAAI,IAAI,EAAE;AAAA;AAAA,YACpB,KAtBI,wBAAwB,QAAQ,IAAI,WAAW,EAwBvD;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU;AAAA,UACd,EAAE,OAAO,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA,UAC3B,EAAE,OAAO,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA,UAC3B,EAAE,OAAO,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA,UAC3B,EAAE,OAAO,KAAK,GAAG,IAAI,GAAG,GAAG;AAAA,QAC7B;AACA,cAAM,QAAiE;AAAA,UACrE,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,QACzB;AACA,mBAAW,QAAQ,CAAC,cAAc;AAChC,gBAAM,gBAAiD,CAAC;AACxD,gBAAM,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM;AAC9B,kBAAM,QAAQ,IAAI,QAAQ,MAAM;AAChC,gBAAI,UAAU,GAAG;AACf;AAAA,YACF;AACA,kBAAM,UAAW,MAAM,QAAQ,aAAa,IAAI,QAAQ,aAAe,MAAM,QAAQ,aAAa,IAAI,QAAQ;AAC9G,gBAAI,CAAC,SAAS;AACZ;AAAA,YACF;AACA,kBAAM,OAAO,YAAY,MAAM,SAAS;AACxC,0BAAc,KAAK;AAAA,cACjB,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,cACjC,GAAG,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,YACnC,CAAC;AAAA,UACH,CAAC;AACD,cAAI,cAAc,WAAW,GAAG;AAC9B,kBAAM,WAAW,2BAA2B,IAAI,SAAS,KAAK,CAAC;AAC/D,qBAAS,KAAK;AAAA,cACZ,KAAK,cAAc,CAAC,KAAK,cAAc,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,cAC5D,OAAO,cAAc,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,YAC5C,CAAC;AACD,uCAA2B,IAAI,WAAW,QAAQ;AAAA,UACpD,WAAW,cAAc,WAAW,GAAG;AACrC,kBAAM,SAAS;AACf,kBAAM,WAAW,UAAU,YACvB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IACf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,qBAAS,QAAQ,CAAC,CAAC,YAAY,QAAQ,GAAG,iBAAiB;AACzD,oBAAM,YAAY,cAAc,UAAU,KAAK,cAAc,CAAC;AAC9D,oBAAM,aAAa,cAAc,QAAQ,KAAK,cAAc,cAAc,SAAS,CAAC;AACpF,kBAAI,CAAC,aAAa,CAAC,YAAY;AAC7B;AAAA,cACF;AACA,oBAAM,WAAW,2BAA2B,IAAI,SAAS,KAAK,CAAC;AAC/D,uBAAS,KAAK;AAAA,gBACZ,KAAK;AAAA,gBACL,OAAO;AAAA,cACT,CAAC;AACD,yCAA2B,IAAI,WAAW,QAAQ;AAAA,YACpD,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,KAAK,2BAA2B,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,QAAQ,GAAG,mBACpG,8BAA8B,QAAQ,EAAE,IAAI,CAAC4B,SAAQ,cAAc;AACjE,YAAM,OAAO,uBAAuBA,SAAQ,IAAI;AAChD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAQ,MAAM,YACVzB,8BAA6B,OAAO,SAAS,QAAQ,SAAS,IAC9DnB,aAAYgB,yBAAwB,OAAO,SAAS,QAAQ,SAAS,GAAG,IAAI;AAAA,UAChF,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,aAAa,MAAM,YAAY,OAAO;AAAA;AAAA,QARjC,wBAAwB,cAAc,IAAI,SAAS;AAAA,MAS1D;AAAA,IAEJ,CAAC,CACF;AAED,UAAM,iBAAiB,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,gBAAgB;AACtE,YAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAACqB,IAAG,aAAa,OAAO,QAAQ,IAAI,WAAW,CAAC,EACzF,OAAO,CAAC,UAA2B,SAAS,IAAI;AACnD,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,OAAO;AAAA,MAChB;AACA,aAAO,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO;AAAA,IAChE,CAAC;AACD,UAAM,cAAc,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAAa;AAChE,YAAM,SAAS,OAAO,QAAQ,GAAG,OAAO,CAAC,UAA2B,SAAS,IAAI,KAAK,CAAC;AACvF,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,OAAO;AAAA,MAChB;AACA,aAAO,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,OAAO;AAAA,IAChE,CAAC;AAED,WACE,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,QAAQtC,cAAa,eAAe,IAAI;AAAA,UACxC,aAAa;AAAA,UACb,OAAO,KAAK;AAAA,UACZ,GAAG,KAAK;AAAA,UACR,GAAG,KAAK;AAAA;AAAA,MACV;AAAA,MACC,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,gBAAgB;AAChD,cAAM,IAAI,KAAK,QAAQ,QAAQ,IAAI,KAAK,QAAQ,IAAK,eAAe,OAAO,KAAM,KAAK;AACtF,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQ,MAAM,YACVoB,8BAA6B,OAAO,SAAS,QAAQ,eAAe,WAAW,KAAK,OAAO,QAAQ,IACnGpB,cAAa,eAAe,IAAI;AAAA,YACpC,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAa,MAAM,YAAY,OAAO;AAAA,YACtC,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI,KAAK;AAAA,YACT,IAAI,KAAK,MAAM,KAAK;AAAA;AAAA,UAVf,4BAA4B,WAAW;AAAA,QAW9C;AAAA,MAEJ,CAAC;AAAA,MACA,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAAa;AAC7C,cAAM,IAAI,KAAK,MAAM,KAAK,UAAU,QAAQ,IAAI,KAAK,SAAS,IAAK,YAAY,OAAO,KAAM,KAAK;AACjG,cAAM,YAAY,MAAM,OAAO,QAAQ,GAAG,aACrC,MAAM,OAAO,QAAQ,GAAG,SACxBoB,8BAA6B,OAAO,SAAS,QAAQ,YAAY,QAAQ,KAAK,OAAO,QAAQ;AAClG,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQ,MAAM,YAAY,YAAYpB,cAAa,eAAe,IAAI;AAAA,YACtE,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,aAAa,MAAM,YAAY,OAAO;AAAA,YACtC,IAAI,KAAK;AAAA,YACT,IAAI,KAAK,OAAO,KAAK;AAAA,YACrB,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,UARC,4BAA4B,QAAQ;AAAA,QAS3C;AAAA,MAEJ,CAAC;AAAA,MACA4C;AAAA,MACA;AAAA,MACA,MAAM,YAAY,OACjB;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAQ,KAAK;AAAA,UACb,QAAQ5C,cAAa,eAAe,GAAG;AAAA,UACvC,aAAa;AAAA,UACb,OAAO,KAAK;AAAA,UACZ,GAAG,KAAK;AAAA,UACR,GAAG,KAAK;AAAA;AAAA,MACV;AAAA,OAEJ;AAAA,EAEJ;AAEA,QAAM,OAAOE,OAAM,MAAM,QAAQ,SAAS,MAAM,YAAY,KAAK,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK;AAC5F,QAAM,OAAOA,OAAM,MAAM,QAAQ,SAAS,MAAM,YAAY,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK;AAC3F,QAAM,iBAAiB,MAAM,QAAQ,WAAW;AAChD,QAAM,sBAAsBA;AAAA,KACzB,MAAM,QAAQ,gBAAgB,iBAAiB,KAAK,MAAM;AAAA,IAC3D;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAaA,QAAO,MAAM,QAAQ,gBAAgB,OAAO,KAAK,KAAK,CAAC;AAC1E,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,OAAO,KAAK,IAAI,IAAI;AAC1B,QAAM,OAAO,KAAK,IAAI,IAAI;AAG1B,QAAM,YAA8B,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aACnE,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAACoC,IAAG,gBAAgB;AAC/C,UAAM,QAAQ,OAAO,QAAQ,EAAE,WAAW;AAC1C,UAAM,WAAW,SAAS;AAC1B,UAAM,cAAc,QAAQ,IAAI,KAAM,eAAe,OAAO,KAAM,OAAO;AACzE,UAAM,cAAc,WAAY,IAAK,QAAQ,aAAa,UAAU,YAAa,OAAO,OAAO,aAAe,MAAM;AACpH,UAAM,cAAc,QAAQ,IAAI,KAAM,YAAY,OAAO,KAAM,OAAO;AAEtE,UAAM,KAAK,cAAc,OAAO,cAAc;AAC9C,UAAM,KAAK,CAAC,cAAc,OAAO,cAAc;AAC/C,UAAM,KAAK,cAAc,OAAO,KAAK;AACrC,UAAM,KAAK,cAAc,OAAO,KAAK;AACrC,UAAM,cAAc,iBAChB,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,OAAO,sBAAsB,IAAI,IAC9D;AAEJ,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AAAA,EACF,CAAC,CACF;AAED,QAAM,SAAS,UAAU,KAAK;AAC9B,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;AACvD,QAAM,QAAQ,KAAK;AAAA,IACjB,OAAO,KAAK,QAAQ,KAAK,IAAI,MAAM,OAAO,IAAI;AAAA,IAC9C,OAAO,KAAK,SAAS,KAAK,IAAI,MAAM,OAAO,IAAI;AAAA,EACjD,IAAI;AACJ,QAAM,UAAU,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AACvD,QAAM,UAAU,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AACvD,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,cAAc,OAAO,QAAQ;AAEnC,QAAM,SAAS,UAAU,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW;AAAA,IACxD,GAAG;AAAA,IACH,GAAG,WAAW,MAAM,IAAI,cAAc;AAAA,IACtC,GAAG,WAAW,MAAM,IAAI,cAAc;AAAA,EACxC,EAAE,CAAC;AAEH,QAAM,YAAYhC,yBAAwB,OAAO,OAAO;AACxD,QAAM,YAAY,MAAM,iBAAiBN,cAAa,WAAW,GAAG;AAQpE,QAAM,QAAgB,CAAC;AACvB,WAAS,WAAW,GAAG,WAAW,OAAO,GAAG,YAAY,GAAG;AACzD,aAAS,cAAc,GAAG,cAAc,OAAO,GAAG,eAAe,GAAG;AAClE,YAAM,MAAM,OAAO,QAAQ,EAAE,WAAW;AACxC,YAAM,MAAM,OAAO,QAAQ,EAAE,cAAc,CAAC;AAC5C,YAAM,MAAM,OAAO,WAAW,CAAC,EAAE,cAAc,CAAC;AAChD,YAAM,MAAM,OAAO,WAAW,CAAC,EAAE,WAAW;AAC5C,UAAI,CAAC,IAAI,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,YAAY,CAAC,IAAI,UAAU;AACpE;AAAA,MACF;AACA,YAAM,gBAAgB,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS;AACvE,YAAM,QAAQE,QAAO,eAAe,aAAa,UAAU,WAAW,GAAG,CAAC;AAC1E,YAAM,KAAK;AAAA,QACT,OAAO,oBAAoB,OAAO,SAAS,KAAK;AAAA,QAChD,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,SAAS;AAAA,QACzD,KAAK,gBAAgB,QAAQ,IAAI,WAAW;AAAA,QAC5C,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,QAC/E,QAAQF,cAAa,WAAW,IAAI;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AACA,QAAM,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK;AAEpD,QAAM,sBAAsB,CAAC,aACxB,MAAM;AACL,UAAM,6BAA6B,oBAAI,IAAqC;AAC5E,UAAM,aAAa,OAAO,MAAM,MAAM,GAAG,EAAE;AAC3C,aAAS,WAAW,GAAG,WAAW,OAAO,GAAG,YAAY,GAAG;AACzD,eAAS,cAAc,GAAG,cAAc,OAAO,GAAG,eAAe,GAAG;AAClE,cAAM,UAAU,OAAO,QAAQ,EAAE,WAAW;AAC5C,cAAM,WAAW,OAAO,QAAQ,EAAE,cAAc,CAAC;AACjD,cAAM,cAAc,OAAO,WAAW,CAAC,EAAE,cAAc,CAAC;AACxD,cAAM,aAAa,OAAO,WAAW,CAAC,EAAE,WAAW;AACnD,YAAI,CAAC,QAAQ,YAAY,CAAC,SAAS,YAAY,CAAC,YAAY,YAAY,CAAC,WAAW,UAAU;AAC5F;AAAA,QACF;AACA,cAAM,UAAU;AAAA,UACd,EAAE,OAAO,SAAS,OAAO,QAAQ,MAAM;AAAA,UACvC,EAAE,OAAO,UAAU,OAAO,SAAS,MAAM;AAAA,UACzC,EAAE,OAAO,aAAa,OAAO,YAAY,MAAM;AAAA,UAC/C,EAAE,OAAO,YAAY,OAAO,WAAW,MAAM;AAAA,QAC/C;AACA,cAAM,QAAiE;AAAA,UACrE,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,UACvB,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,QACzB;AACA,mBAAW,QAAQ,CAAC,cAAc;AAChC,gBAAM,gBAAoC,CAAC;AAC3C,gBAAM,QAAQ,CAAC,CAAC,OAAO,GAAG,MAAM;AAC9B,kBAAM,QAAQ,IAAI,QAAQ,MAAM;AAChC,gBAAI,UAAU,GAAG;AACf;AAAA,YACF;AACA,kBAAM,UAAW,MAAM,QAAQ,aAAa,IAAI,QAAQ,aAAe,MAAM,QAAQ,aAAa,IAAI,QAAQ;AAC9G,gBAAI,CAAC,SAAS;AACZ;AAAA,YACF;AACA,kBAAM,SAAS,YAAY,MAAM,SAAS;AAC1C,0BAAc,KAAK;AAAA,cACjB,GAAG,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,KAAK;AAAA,cACnD,GAAG,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAM,MAAM,KAAK;AAAA,YACrD,CAAC;AAAA,UACH,CAAC;AACD,cAAI,cAAc,WAAW,GAAG;AAC9B,kBAAM,WAAW,2BAA2B,IAAI,SAAS,KAAK,CAAC;AAC/D,qBAAS,KAAK;AAAA,cACZ,KAAK,cAAc,CAAC,KAAK,cAAc,CAAC,KAAK,EAAE,GAAG,SAAS,GAAG,GAAG,SAAS,EAAE;AAAA,cAC5E,OAAO,cAAc,CAAC,KAAK,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE;AAAA,YAC1D,CAAC;AACD,uCAA2B,IAAI,WAAW,QAAQ;AAAA,UACpD,WAAW,cAAc,WAAW,GAAG;AACrC,kBAAM,UAAU,QAAQ,QAAQ,SAAS,QAAQ,YAAY,QAAQ,WAAW,SAAS;AACzF,kBAAM,WAAW,UAAU,YACvB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IACf,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnB,qBAAS,QAAQ,CAAC,CAAC,YAAY,QAAQ,MAAM;AAC3C,oBAAM,aAAa,cAAc,UAAU,KAAK,cAAc,CAAC;AAC/D,oBAAM,WAAW,cAAc,QAAQ,KAAK,cAAc,cAAc,SAAS,CAAC;AAClF,kBAAI,CAAC,cAAc,CAAC,UAAU;AAC5B;AAAA,cACF;AACA,oBAAM,WAAW,2BAA2B,IAAI,SAAS,KAAK,CAAC;AAC/D,uBAAS,KAAK;AAAA,gBACZ,KAAK;AAAA,gBACL,OAAO;AAAA,cACT,CAAC;AACD,yCAA2B,IAAI,WAAW,QAAQ;AAAA,YACpD,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,MAAM,KAAK,2BAA2B,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,WAAW,QAAQ,GAAG,mBACtF,8BAA8B,QAAQ,EAAE,IAAI,CAAC,YAAY,cAAc;AACrE,YAAM,OAAO,uBAAuB,YAAY,IAAI;AACpD,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,GAAG;AAAA,UACH,MAAK;AAAA,UACL,QAAQC,aAAYc,gCAA+B,OAAO,SAAS,QAAQ,SAAS,GAAG,IAAI;AAAA,UAC3F,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,aAAa;AAAA;AAAA,QANR,sBAAsB,cAAc,IAAI,SAAS;AAAA,MAOxD;AAAA,IAEJ,CAAC,CACF;AAAA,EACH,GAAG,IACH,CAAC;AAEL,QAAM,uBAAuB,CAC3B,eACA,WACA,aACA,gBAEA,sBAAsB,aAAa,EAAE,IAAI,CAAC,KAAK,aAAa;AAC1D,UAAM,OAAO,uBAAuB,KAAK,MAAM,cAAc,IAAI;AACjE,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,GAAG;AAAA,QACH,MAAK;AAAA,QACL,QAAQ;AAAA,QACR,eAAc;AAAA,QACd,gBAAe;AAAA,QACf;AAAA;AAAA,MANK,GAAG,SAAS,IAAI,QAAQ;AAAA,IAO/B;AAAA,EAEJ,CAAC;AAGH,SACE,8CAAC,OACE;AAAA,gBACC,8EACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,QAAQ,OAAO,KAAK;AAAA,UACpB,QAAQf,cAAa,WAAW,IAAI;AAAA,UACpC,aAAa;AAAA,UACb,OAAO,OAAO,KAAK;AAAA,UACnB,GAAG,OAAO,KAAK;AAAA,UACf,GAAG,OAAO,KAAK;AAAA;AAAA,MACjB;AAAA,MACC,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,gBAAgB;AAChD,cAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ,IAAI,OAAO,KAAK,QAAQ,IAAK,eAAe,OAAO,KAAM,OAAO,KAAK;AAC3G,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQA,cAAa,eAAe,IAAI;AAAA,YACxC,aAAa;AAAA,YACb,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI,OAAO,KAAK;AAAA,YAChB,IAAI,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA;AAAA,UAN7B,gCAAgC,WAAW;AAAA,QAOlD;AAAA,MAEJ,CAAC;AAAA,MACA,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAAa;AAC7C,cAAM,IAAI,OAAO,KAAK,MAAM,OAAO,KAAK,UAAU,QAAQ,IAAI,OAAO,KAAK,SAAS,IAAK,YAAY,OAAO,KAAM,OAAO,KAAK;AAC7H,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,QAAQA,cAAa,eAAe,IAAI;AAAA,YACxC,aAAa;AAAA,YACb,IAAI,OAAO,KAAK;AAAA,YAChB,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,YACnC,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,UANC,6BAA6B,QAAQ;AAAA,QAO5C;AAAA,MAEJ,CAAC;AAAA,OACH,IACE;AAAA,IACH,MAAM,YAAY,OAAO,MAAM,IAAI,CAAC,SACnC;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,aAAa;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,aAAa;AAAA;AAAA,MALR,KAAK;AAAA,IAMZ,CACD;AAAA,IACA,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,aAAa;AAC7C,YAAM,YAAY,OAAO,QAAQ;AACjC,YAAM,eAAe,OAAO,QAAQ,GAChC,OAAO,CAAC,UAA2B,SAAS,IAAI,EACjD,OAAO,CAAC,KAAK,OAAOsC,IAAG,WAAW,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,MAAM,GAAG,CAAC,KAAK,OAAO;AAC5F,YAAM,YAAY,MAAM,YACnB,MAAM,OAAO,QAAQ,GAAG,aACpB,MAAM,OAAO,QAAQ,GAAG,SACxBlB,8BAA6B,OAAO,SAAS,QAAQ,YAAY,IACtEnB,aAAYgB,yBAAwB,OAAO,SAAS,QAAQ,YAAY,GAAG,GAAG;AAClF,aACE,6CAAC,OACE;AAAA,QACC;AAAA,QACA,eAAe,QAAQ;AAAA,QACvB;AAAA,QACA,MAAM,YAAY,KAAK,IAAI,MAAM,MAAM,OAAO,QAAQ,GAAG,eAAe,GAAG,IAAI;AAAA,MACjF,KANM,eAAe,QAAQ,EAO/B;AAAA,IAEJ,CAAC;AAAA,IACA,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,gBAAgB;AAChD,YAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAACqB,IAAG,aAAa,OAAO,QAAQ,EAAE,WAAW,CAAC;AAChG,YAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAACA,IAAG,aAAa,OAAO,QAAQ,IAAI,WAAW,CAAC,EAC/F,OAAO,CAAC,UAA2B,SAAS,IAAI;AACnD,YAAM,gBAAgB,aAAa,SAAS,IACxC,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,aAAa,SACnE,OAAO;AACX,YAAM,eAAe,MAAM,YACvBlB,8BAA6B,OAAO,SAAS,QAAQ,aAAa,IAClEnB,aAAYgB,yBAAwB,OAAO,SAAS,QAAQ,aAAa,GAAG,GAAG;AACnF,aACE,6CAAC,OACE;AAAA,QACC;AAAA,QACA,kBAAkB,WAAW;AAAA,QAC7B;AAAA,QACA,MAAM,YAAY,OAAO;AAAA,MAC3B,KANM,kBAAkB,WAAW,EAOrC;AAAA,IAEJ,CAAC;AAAA,IACA;AAAA,IACA,MAAM,YACL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,QAAQ,OAAO,KAAK;AAAA,QACpB,QAAQjB,cAAa,WAAW,IAAI;AAAA,QACpC,aAAa;AAAA,QACb,OAAO,OAAO,KAAK;AAAA,QACnB,GAAG,OAAO,KAAK;AAAA,QACf,GAAG,OAAO,KAAK;AAAA;AAAA,IACjB,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,YAAY,QAA6B,SAAiB;AACjE,QAAM,QAAQ,OAAO,UAAU,CAAC,UAAU,QAAQ,MAAM,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC;AACxF,SAAO,SAAS,IAAI,QAAQ;AAC9B;AAEA,SAAS,iBAAiB,OAAkB,SAA+B,QAAqB;AAC9F,QAAM,aAAa,kBAAkB,KAAK;AAC1C,MAAI,WAAW,WAAW,KAAK,MAAM,OAAO,SAAS,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,wBAAwB,KAAK;AAC3C,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,WAAW,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,OAAO,SAAS,CAAC;AACjE,QAAM,aAAa,MAAM,SAAS,KAAK,IAAI,GAAG,MAAM,OAAO,SAAS,CAAC;AACrE,QAAM,YAAY,MAAM;AACxB,QAAM,cAAc,MAAM,UAAU,QAAQ,CAAC,CAAC,WAAW,UAAU,YAAY,SAAS,EAAE,SAAS,MAAM,MAAM,IAC3G,MAAM,SACN;AACJ,QAAM,OAAO,MAAM,OAAO,SAAS;AACnC,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,QAAM,QAAQ,MAAM,OAAO,UAAU;AACrC,QAAM,OAAO,aAAa,OAAO,MAAM,OAAO,SAAS,IAAI;AAC3D,QAAM,SAAS,eAAe,OAAO,MAAM,OAAO,WAAW,IAAI;AAEjE,QAAM,SAAS,WACZ,IAAI,CAAC,UAAU,UAAU;AACxB,UAAM,YAAYG,YAAW,KAAK,OAAO,KAAK,CAAC;AAC/C,UAAM,WAAWA,YAAW,IAAI,OAAO,KAAK,CAAC;AAC7C,UAAM,aAAaA,YAAW,MAAM,OAAO,KAAK,CAAC;AACjD,UAAM,YAAY,OAAOA,YAAW,KAAK,OAAO,KAAK,CAAC,IAAI;AAC1D,UAAM,cAAc,SAASA,YAAW,OAAO,OAAO,KAAK,CAAC,IAAI;AAChE,QAAI,aAAa,QAAQ,YAAY,QAAQ,cAAc,MAAM;AAC/D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC,EACA,OAAO,CAAC,UAA+H,SAAS,IAAI;AACvJ,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO;AACpB,QAAM,YAAY,UAAU,QAAQ,OAAO,KAAK,CAAC,WAAW,MAAM,UAAU,KAAK,CAAC;AAClF,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,eAAe,oBAAoB,OAAO,SAAS;AACzD,QAAM,cAAc,YAChB,KAAK,IAAI,GAAG,GAAG,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,MAAM,UAAU,CAAC,CAAC,CAAC,IAChH,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,GAAG,CAAC;AAChD,QAAM,cAAc,YAChB,KAAK,IAAI,GAAG,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,MAAM,MAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,MAAM,UAAU,CAAC,CAAC,CAAC,IAC9G,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACjD,QAAM,iBAAiB;AAAA,IACrB,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAAI,MAAM,UAAU,MAAM;AAAA,IACzG,OAAO,MAAM,WAAW,QAAQ,YAAY,OAAO,SAAS,MAAM,UAAU,GAAG,IAAI,MAAM,UAAU,MAAM;AAAA,IACzG,MAAM,WAAW;AAAA,IACjB;AAAA,EACF;AACA,QAAM,aAAS,6BAAY,EACxB,OAAO,CAAC,eAAe,KAAK,eAAe,GAAG,CAAC,EAC/C,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC3C,QAAM,aAAS,2BAAkB,EAC9B,OAAO,UAAU,EACjB,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC,EACzC,aAAa,IAAI,EACjB,aAAa,IAAI;AACpB,QAAM,QAAQ,eAAe;AAC7B,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,gBAAgB,aAAa;AACnC,QAAM,iBAAiB,aAAa,OAAO,aAAa,YAAY,aAAa;AACjF,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;AACrG,QAAM,QAAQ,OAAO,KAAK,IAAI,eAAe,KAAK,CAAC,CAAC;AAEpD,SACE,8CAAC,OACE;AAAA,UAAM,IAAI,CAAC,SACV,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQH,cAAa,WAAW,IAAI;AAAA,UACpC,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,OAAO,KAAK;AAAA,UACrB,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,OAAO,IAAI;AAAA;AAAA,MACjB;AAAA,MACA,6CAAC,UAAK,MAAM,YAAY,UAAU,IAAI,YAAW,OAAM,GAAG,KAAK,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,GACxF,0BAAgB,IAAI,GACvB;AAAA,SAXM,cAAc,IAAI,EAY1B,CACD;AAAA,IACA,WAAW,IAAI,CAAC,UAAU,UAAU;AACnC,UAAI,QAAQ,cAAc,KAAK,UAAU,WAAW,SAAS,GAAG;AAC9D,eAAO;AAAA,MACT;AACA,YAAM,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,OAAO,UAAU,IAAI;AACjE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAW;AAAA,UACX;AAAA,UACA,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,UAE3B;AAAA;AAAA,QAPI,aAAa,QAAQ;AAAA,MAQ5B;AAAA,IAEJ,CAAC;AAAA,IACD,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,IACnH,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,IAC7I,OAAO,IAAI,CAAC,OAAO,UAAU;AAC5B,YAAM,KAAK,OAAO,MAAM,QAAQ,KAAK,KAAK,QAAQ,OAAO,UAAU,IAAI;AACvE,YAAM,gBAAgB,QAAQ,IAAI,OAAO,QAAQ,CAAC,GAAG,SAAS,MAAM,QAAQ,MAAM;AAClF,YAAM,OAAO,MAAM,QAAQ,OACvB,MAAM,SAAS,MAAM,OACrB,MAAM,SAAS;AACnB,YAAM,SAAS,aAAa;AAC5B,YAAM,cAAc,KAAK,IAAI,GAAG,OAAO,UAAU,IAAI,IAAI;AACzD,YAAM,WAAW,IAAI,cAAc;AACnC,YAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,MAAM,IAAI,IAAI;AACxD,YAAM,SAAS,OAAO,MAAM,KAAK;AACjC,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,YAAM,OAAO,OAAO,MAAM,GAAG;AAC7B,aACE,8CAAC,OACE;AAAA,qBAAa,MAAM,UAAU,OAC5B;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,aAAa;AAAA,YACnB,QAAQ,KAAK,IAAI,GAAG,QAAQ,OAAO,MAAM,MAAM,CAAC;AAAA,YAChD,SAAS;AAAA,YACT,QAAO;AAAA,YACP,OAAO,KAAK,IAAI,GAAG,OAAO,UAAU,IAAI,IAAI;AAAA,YAC5C,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,UAAU,IAAI,IAAI,IAAI;AAAA,YAChD,GAAG,OAAO,MAAM,MAAM;AAAA;AAAA,QACxB,IACE;AAAA,QACJ,6CAAC,UAAK,QAAgB,aAAa,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,MAAM;AAAA,QAC1E,MAAM,QAAQ,QAAQ,SAAS,OAC9B,KAAK,IAAI,QAAQ,MAAM,KAAK,IAC1B;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,OAAO,aAAa,SAAS,aAAa;AAAA,YAChD,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,SAAS,KAAK,CAAC;AAAA,YAC9C;AAAA,YACA,aAAa;AAAA,YACb,OAAO;AAAA,YACP,GAAG;AAAA,YACH,GAAG,KAAK,IAAI,OAAO,MAAM;AAAA;AAAA,QAC3B,IAEA,6CAAC,UAAK,QAAgB,aAAa,KAAK,IAAI,UAAU,IAAI,WAAW,aAAa,IAAI,QAAQ,IAAI,QAAQ,IAG5G,6CAAC,UAAK,QAAQ,gBAAgB,aAAa,KAAK,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAI,QAAQ;AAAA,QAE3F,MAAM,QAAQ,QAAQ,SAAS,OAC9B,6CAAC,UAAK,QAAQ,eAAe,aAAa,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,IACrF;AAAA,WAhCE,eAAe,KAAK,EAiC5B;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,qBAAqB,OAAkB,SAA+B,QAAqB;AAClG,QAAM,SAAS,iBAAiB,KAAK;AACrC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO;AACpB,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK;AAChD,QAAM,aAAS,2BAAkB,EAC9B,OAAO,MAAM,EACb,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,CAAC,EACzC,aAAa,IAAI,EACjB,aAAa,IAAI;AAEpB,QAAM,OAA0E,CAAC;AACjF,MAAI,eAAe;AACnB,SAAO,QAAQ,CAAC,OAAO,UAAU;AAC/B,UAAM,QAAQ,MAAM,aAAa,IAAI;AACrC,UAAM,MAAM,MAAM,aAAa,eAAe,eAAe,MAAM;AACnE,QAAI,CAAC,MAAM,YAAY;AACrB,qBAAe;AAAA,IACjB;AACA,SAAK,KAAK,EAAE,GAAG,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,EAC3C,CAAC;AAED,QAAM,UAAU,KAAK,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC;AAC7D,MAAI,WAAW,KAAK,IAAI,GAAG,OAAO;AAClC,MAAI,WAAW,KAAK,IAAI,GAAG,OAAO;AAClC,MAAI,YAAY,UAAU;AACxB,eAAW,WAAW;AAAA,EACxB;AAEA,QAAM,aAAS,6BAAY,EACxB,OAAO,CAAC,UAAU,QAAQ,CAAC,EAC3B,MAAM,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AAC3C,QAAM,QAAQ,uBAAuB,UAAU,UAAU,MAAM,WAAW,SAAS;AACnF,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAElD,SACE,8CAAC,OACE;AAAA,UAAM,IAAI,CAAC,SACV,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,QAAQA,cAAa,WAAW,IAAI;AAAA,UACpC,aAAa;AAAA,UACb,IAAI,KAAK;AAAA,UACT,IAAI,KAAK,OAAO,KAAK;AAAA,UACrB,IAAI,OAAO,IAAI;AAAA,UACf,IAAI,OAAO,IAAI;AAAA;AAAA,MACjB;AAAA,MACA,6CAAC,UAAK,MAAM,YAAY,UAAU,IAAI,YAAW,OAAM,GAAG,KAAK,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,GACxF,0BAAgB,IAAI,GACvB;AAAA,SAXM,eAAe,IAAI,EAY3B,CACD;AAAA,IACD,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ;AAAA,IACnH,6CAAC,UAAK,QAAQ,WAAW,aAAa,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG;AAAA,IACnH,KAAK,IAAI,CAAC,KAAK,UAAU;AACxB,YAAM,WAAW,OAAO,IAAI,KAAK,KAAK,KAAK;AAC3C,YAAM,YAAY,OAAO,UAAU;AACnC,YAAM,WAAW,KAAK,IAAI,IAAI,OAAO,IAAI,GAAG;AAC5C,YAAM,cAAc,KAAK,IAAI,IAAI,OAAO,IAAI,GAAG;AAC/C,YAAM,MAAM,OAAO,QAAQ;AAC3B,YAAM,SAAS,KAAK,IAAI,GAAG,OAAO,WAAW,IAAI,GAAG;AACpD,YAAM,OAAO,IAAI,aACbC,aAAY,IAAI,OAAO,IAAI,IAC3B,IAAI,SAAS,IACX,IAAI,QACJD,cAAa,IAAI,OAAO,IAAI;AAClC,YAAM,iBAAiB,QAAQ,IAAI,KAAK,QAAQ,CAAC,IAAI;AACrD,YAAM,aAAa,iBAAiB,OAAO,eAAe,GAAG,IAAI;AAEjE,aACE,8CAAC,OACE;AAAA,yBACC;AAAA,UAAC;AAAA;AAAA,YACC,QAAQA,cAAa,WAAW,IAAI;AAAA,YACpC,iBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,KAAK,OAAO,eAAe,KAAK,KAAK,KAAK,QAAQ,OAAO,UAAU;AAAA,YACnE,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN,IACE;AAAA,QACJ;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,QAAQC,aAAY,MAAM,IAAI;AAAA,YAC9B,aAAa;AAAA,YACb,GAAG;AAAA,YACH,GAAG;AAAA,YACH,OAAO;AAAA,YACP;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,WAAW,YAAY;AAAA,YAC1B,GAAG,KAAK,MAAM,KAAK,SAAS;AAAA,YAE3B,cAAI;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,WAAW,YAAY;AAAA,YAC1B,GAAG,MAAM;AAAA,YAER,0BAAgB,IAAI,GAAG;AAAA;AAAA,QAC1B;AAAA,WAxCM,iBAAiB,KAAK,EAyC9B;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,kBAAkB,OAAkB,SAA+B,QAAqB;AAC/F,QAAM,SAAS,iBAAiB,KAAK,EAClC,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,OAAO,KAAK,IAAI,GAAG,MAAM,KAAK,EAAE,EAAE,EAC9D,OAAO,CAAC,UAAU,MAAM,QAAQ,CAAC;AACpC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC/D,QAAM,gBAAgB,KAAK,SAAS,OAAO;AAC3C,QAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,QAAM,aAAa,sBAAsB,KAAK;AAE9C,SACE,6CAAC,OACE,iBAAO,IAAI,CAAC,OAAO,UAAU;AAC5B,UAAM,aAAc,MAAM,QAAQ,WAAY,KAAK;AACnD,UAAM,OAAO,KAAK,MAAM,QAAQ;AAChC,UAAM,cAAc,KAAK,IAAI,GAAG,gBAAgB,CAAC;AACjD,UAAM,OAAO,UAAU,aAAa;AACpC,UAAM,OAAO,MAAM,aAAaA,aAAY,MAAM,OAAO,IAAI,IAAI,MAAM;AACvE,UAAM,kBAAkB,aAAa;AAErC,WACE,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,QAAQ;AAAA,UACR,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,QAAQA,aAAY,MAAM,GAAG;AAAA,UAC7B,aAAa;AAAA,UACb,OAAO;AAAA,UACP,GAAG;AAAA,UACH,GAAG;AAAA;AAAA,MACL;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,YAAY,kBAAkB,WAAW;AAAA,UACzC,GAAG,kBAAkB,UAAU,UAAU,aAAa,MAAM;AAAA,UAC5D,GAAG,OAAO,gBAAgB;AAAA,UAEzB,aAAG,MAAM,KAAK,IAAI,gBAAgB,MAAM,KAAK,CAAC;AAAA;AAAA,MACjD;AAAA,SApBM,gBAAgB,KAAK,EAqB7B;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,oBAAoB,OAAkB,SAA+B,QAAqB;AACjG,QAAM,gBAAgB,mBAAmB,KAAK;AAC9C,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,WAAO,oBAAA6C,WAAY,aAAa,EACnC,IAAI,CAAC,SAAS,KAAK,YAAY,KAAK,SAAS,SAAS,IAAI,IAAI,KAAK,IAAI,MAAQ,KAAK,SAAS,CAAC,CAAC,EAC/F,KAAK,CAAC,MAAM,WAAW,MAAM,SAAS,MAAM,KAAK,SAAS,EAAE;AAC/D,QAAM,kBAAc,oBAAAC,WAAiC,EAClD,KAAK,CAAC,KAAK,KAAK,GAAG,KAAK,SAAS,CAAC,CAAC,EAAE,IAAI;AAC5C,QAAM,OAAO,OAAO;AACpB,QAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,OAAO,KAAK,MAAM,IAAI,GAAG;AACnE,QAAM,aAAa,SAAS;AAC5B,QAAM,UAAU,KAAK,OAAO,KAAK,QAAQ;AACzC,QAAM,UAAU,KAAK,MAAM,KAAK,SAAS;AACzC,QAAM,WAAW,KAAK,IAAI,GAAG,YAAY,UAAU,CAAC;AACpD,QAAM,iBAAa,gBAAAJ,KAAqD,EACrE,WAAW,CAAC,SAAS,KAAK,EAAE,EAC5B,SAAS,CAAC,SAAS,KAAK,EAAE,EAC1B,SAAS,IAAK,EACd,UAAU,MAAM,EAChB,YAAY,CAAC,SAAS,cAAe,KAAK,KAAK,KAAK,YAAa,SAAS,WAAW,EACrF,YAAY,CAAC,SAAS,cAAe,KAAK,KAAK,KAAK,YAAa,SAAS,cAAc,CAAC;AAE5F,SACE,8CAAC,OAAE,WAAW,aAAa,OAAO,KAAK,OAAO,KAC3C;AAAA,gBAAY,YAAY,EAAE,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,MAAM,UAAU;AAC/E,YAAM,OAAO,WAAW,IAAI;AAC5B,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,YAAM,cAAc,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK;AACzD,YAAM,cAAc,eAAgB,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,YAAa,SAAS;AAC1F,YAAM,SAAS,KAAK,IAAI,UAAU,IAAI;AACtC,YAAM,SAAS,KAAK,IAAI,UAAU,IAAI;AACtC,YAAM,UAAU,KAAK,KAAK,KAAK;AAC/B,YAAM,eAAe,UAAU,cAAc;AAC7C,YAAM,OAAO,0BAA0B,OAAO,IAAI;AAElD,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH;AAAA,YACA,QAAQ,QAAQ;AAAA,YAChB,aAAa;AAAA;AAAA,QACf;AAAA,QACC,eACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM1C,aAAY,MAAM,IAAI;AAAA,YAC5B,UAAU;AAAA,YACV,YAAW;AAAA,YACX,WAAW,aAAa,MAAM,KAAK,MAAM,YAAa,aAAa,MAAO,KAAK,EAAE;AAAA,YAEhF,eAAK,KAAK;AAAA;AAAA,QACb,IACE;AAAA,WAhBE,iBAAiB,KAAK,EAiB9B;AAAA,IAEJ,CAAC;AAAA,IACD,6CAAC,YAAO,MAAM,MAAM,sBAAsB,QAAQ,SAAS,GAAG,aAAa,GAAG;AAAA,KAChF;AAEJ;AAEA,SAAS,mBAAmB,OAAkB,SAA+B,QAAqB;AAChG,QAAM,gBAAgB,mBAAmB,KAAK;AAC9C,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,WAAO,oBAAA6C,WAAY,aAAa,EACnC,IAAI,CAAC,SAAS,KAAK,YAAY,KAAK,SAAS,SAAS,IAAI,IAAI,KAAK,IAAI,MAAQ,KAAK,SAAS,CAAC,CAAC,EAC/F,KAAK,CAAC,MAAM,WAAW,MAAM,SAAS,MAAM,KAAK,SAAS,EAAE;AAC/D,QAAM,kBAAc,oBAAAE,SAA+B,EAChD,KAAK,CAAC,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,CAAC,EAC5C,aAAa,CAAC,EACd,aAAa,CAAC,EACd,MAAM,IAAI,EACV,KAAK,gBAAgB,EAAE,IAAI;AAE9B,SACE,6CAAC,OAAE,WAAW,aAAa,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,GAAG,KAC5D,sBAAY,OAAO,EAAE,IAAI,CAAC,MAAM,UAAU;AACzC,UAAM,OAAO,wBAAwB,OAAO,IAAI;AAChD,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE;AAC3C,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE;AAC5C,UAAM,eAAe,QAAQ,MAAM,SAAS;AAE5C,WACE,8CAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,QAAQ,QAAQ;AAAA,UAChB,aAAa;AAAA,UACb,GAAG,KAAK;AAAA,UACR,GAAG,KAAK;AAAA,UACR;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MACC,eACC,8EACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM/C,aAAY,MAAM,IAAI;AAAA,YAC5B,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,GAAG,KAAK,KAAK;AAAA,YACb,GAAG,KAAK,KAAK;AAAA,YAEZ,eAAK,KAAK;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAMA,aAAY,MAAM,IAAI;AAAA,YAC5B,UAAU;AAAA,YACV,GAAG,KAAK,KAAK;AAAA,YACb,GAAG,KAAK,KAAK;AAAA,YAEZ,0BAAgB,KAAK,SAAS,CAAC;AAAA;AAAA,QAClC;AAAA,SACF,IACE;AAAA,SAhCE,gBAAgB,KAAK,EAiC7B;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,sBAAsB,OAAkB,SAA+B,QAAqB;AACnG,QAAM,gBAAgB,MAAM,OAAO,OAAO,CAAC,WAAW,OAAO,WAAW,IAAI;AAC5E,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,cAAc,IAAI,CAAC,QAAQ,WAAW;AAAA,IACxD,OAAO,OAAO,SAAS,iBAAiB,OAAO,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAK;AAAA,IAC9G,OAAO,uBAAuB,OAAO,IAAI,KAAK,UAAU,QAAQ,CAAC;AAAA,IACjE,WAAW,OAAO,aAAa,OAAO,SAAS,iBAAiB,OAAO,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAK;AAAA,IACtI;AAAA,IACA,OAAO,uBAAuB,MAAM;AAAA,IACpC,YAAY,4BAA4B,MAAM;AAAA,EAChD,EAAE,EAAE,OAAO,CAAC,UAOP,MAAM,SAAS,IAAI;AAExB,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,YAAY,QAAQ,CAAC,UAAU;AAAA,IAC/C,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,EACd,CAAC;AACD,QAAM,WAAW,KAAK,IAAI,GAAG,SAAS;AACtC,QAAM,WAAW,KAAK,IAAI,GAAG,SAAS;AACtC,QAAM,cAAc,oCAAoC,MAAM,WAAW,UAAU,UAAU,KAAK;AAClG,QAAM,aAAS,6BAAY,EACxB,OAAO,CAAC,YAAY,KAAK,YAAY,GAAG,CAAC,EACzC,MAAM,CAAC,OAAO,KAAK,MAAM,OAAO,KAAK,QAAQ,OAAO,KAAK,GAAG,CAAC;AAChE,QAAM,aAAS,4BAAmB,EAC/B,OAAO,YAAY,IAAI,CAAC,GAAG,UAAU,KAAK,CAAC,EAC3C,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;AAC3E,QAAM,MAAM,YAAY,SAAS,IAC7B,KAAK,KAAK,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,KAAK,EAAE,IAC5C,OAAO,KAAK,QAAQ;AACxB,QAAM,WAAWC,OAAM,MAAM,MAAM,IAAI,EAAE;AACzC,QAAM,WAAW,KAAK,IAAI,GAAG,WAAW,IAAI;AAC5C,QAAM,YAAY,MAAM,iBAAiB,MAAM,wBAAwB,QAAQ;AAC/E,QAAM,aAAa,0BAA0B,KAAK;AAClD,QAAM,iBAAiB,YACpB,OAAO,CAAC,UAAU,MAAM,WAAW,QAAQ,EAC3C,IAAI,CAAC,OAAO,UAAU,GAAG,OAAO,KAAK,KAAK,OAAO,KAAK,IAAI,IAAI,OAAO,MAAM,MAAM,IAAI,CAAC,EAAE;AAE3F,SACE,8CAAC,OACE;AAAA,gBAAY,MAAM,IAAI,CAAC,MAAM,UAAU;AACtC,YAAM,IAAI,OAAO,IAAI;AACrB,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQF,cAAa,WAAW,IAAI;AAAA,YACpC,aAAa;AAAA,YACb,IAAI,OAAO,KAAK;AAAA,YAChB,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,YACnC,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX,GAAG,OAAO,KAAK,OAAO;AAAA,YACtB,GAAG,IAAI;AAAA,YAEN,0BAAgB,IAAI;AAAA;AAAA,QACvB;AAAA,WAjBM,oBAAoB,KAAK,EAkBjC;AAAA,IAEJ,CAAC;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,IAAI,OAAO,KAAK;AAAA,QAChB,IAAI,OAAO,KAAK;AAAA,QAChB,IAAI,OAAO,KAAK;AAAA,QAChB,IAAI,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA;AAAA,IACpC;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,IAAI,OAAO,KAAK;AAAA,QAChB,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,QACnC,IAAI,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA,QAClC,IAAI,OAAO,KAAK,MAAM,OAAO,KAAK;AAAA;AAAA,IACpC;AAAA,IACC,eAAe,UAAU,IACxB;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,QAAQ,eAAe,KAAK,GAAG;AAAA,QAC/B,QAAQC,aAAY,WAAW,GAAG;AAAA,QAClC,iBAAgB;AAAA,QAChB,aAAa;AAAA;AAAA,IACf,IACE;AAAA,IACH,YAAY,IAAI,CAAC,OAAO,UAAU;AACjC,YAAM,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK;AACvC,YAAM,SAAS,OAAO,MAAM,MAAM,EAAE;AACpC,YAAM,YAAY,OAAO,MAAM,MAAM,EAAE;AACvC,YAAM,UAAU,OAAO,MAAM,MAAM,MAAM;AACzC,YAAM,gBAAgB,OAAO,MAAM,MAAM,YAAY;AACrD,YAAM,gBAAgB,OAAO,MAAM,MAAM,YAAY;AACrD,YAAM,QAAQ,OAAO,MAAM,MAAM,IAAI;AACrC,YAAM,gBAAgB,MAAM,WAAW,cACnC,MAAM,MAAM,gBACZ,CAAC;AACL,YAAM,WAAW,MAAM,WAAW,WAC9B,MAAM,MAAM,WACZ,CAAC;AAEL,aACE,8CAAC,OACC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,MAAM;AAAA,YACd,aAAa;AAAA,YACb,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,MAAM;AAAA,YACd,aAAa;AAAA,YACb,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,MAAM;AAAA,YACd,aAAa;AAAA,YACb,IAAI,IAAI,WAAW;AAAA,YACnB,IAAI,IAAI,WAAW;AAAA,YACnB,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,MAAM;AAAA,YACd,aAAa;AAAA,YACb,IAAI,IAAI,WAAW;AAAA,YACnB,IAAI,IAAI,WAAW;AAAA,YACnB,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAMD,cAAa,MAAM,OAAO,IAAI;AAAA,YACpC,aAAa;AAAA,YACb,QAAQ,KAAK,IAAI,GAAG,YAAY,MAAM;AAAA,YACtC,QAAQ,MAAM;AAAA,YACd,aAAa;AAAA,YACb,OAAO;AAAA,YACP,GAAG,IAAI,WAAW;AAAA,YAClB,GAAG;AAAA;AAAA,QACL;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQC,aAAY,MAAM,WAAW,IAAI;AAAA,YACzC,aAAa;AAAA,YACb,IAAI,IAAI,WAAW;AAAA,YACnB,IAAI,IAAI,WAAW;AAAA,YACnB,IAAI;AAAA,YACJ,IAAI;AAAA;AAAA,QACN;AAAA,QACC,MAAM,WAAW,aAChB,8EACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQA,aAAY,MAAM,WAAW,IAAI;AAAA,cACzC,aAAa;AAAA,cACb,IAAI,IAAI;AAAA,cACR,IAAI,IAAI;AAAA,cACR,IAAI,QAAQ;AAAA,cACZ,IAAI,QAAQ;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,QAAQA,aAAY,MAAM,WAAW,IAAI;AAAA,cACzC,aAAa;AAAA,cACb,IAAI,IAAI;AAAA,cACR,IAAI,IAAI;AAAA,cACR,IAAI,QAAQ;AAAA,cACZ,IAAI,QAAQ;AAAA;AAAA,UACd;AAAA,WACF,IACE;AAAA,QACH,cAAc,IAAI,CAAC,OAAO,eAAe;AACxC,gBAAM,IAAI,OAAO,KAAK;AACtB,gBAAM,UAAW,aAAa,IAAK,MAAM,WAAW;AACpD,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI,IAAI;AAAA,cACR,IAAI;AAAA,cACJ,MAAM,MAAM;AAAA,cACZ,aAAa;AAAA,cACb,GAAG;AAAA,cACH,QAAO;AAAA;AAAA,YANF,uBAAuB,KAAK,IAAI,UAAU;AAAA,UAOjD;AAAA,QAEJ,CAAC;AAAA,QACA,SAAS,IAAI,CAAC,OAAO,eAAe;AACnC,gBAAM,IAAI,OAAO,KAAK;AACtB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,GAAG;AAAA,cACH,QAAQ,MAAM;AAAA,cACd,aAAa;AAAA;AAAA,YANR,uBAAuB,KAAK,IAAI,UAAU;AAAA,UAOjD;AAAA,QAEJ,CAAC;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,YAAW;AAAA,YACX;AAAA,YACA,GAAG,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AAAA,YAEzC,gBAAM;AAAA;AAAA,QACT;AAAA,WA5GM,sBAAsB,KAAK,EA6GnC;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,qBAAqB,OAAkB,SAA+B,QAAqB;AAClG,QAAM,qBAAqB,KAAK,IAAI,GAAG,MAAM,OAAO,UAAU,CAAC,WAAW,OAAO,WAAW,IAAI,CAAC;AACjG,QAAM,gBAAgB,MAAM,OAAO,kBAAkB,KAAK;AAC1D,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,kBAAkB,KAAK;AACtC,QAAM,mBAAmB,iCAAiC,aAAa;AACvE,QAAM,YAAY,kBAAkB,aAAa,OAAO,iBAAiB,cAAc,WACnF,iBAAiB,YACjB;AACJ,QAAM,aAAa,2BAA2B,QAAQ,SAAS;AAC/D,QAAM,mBAAmB,OAAO,WAAW,qBAAqB,WAC5D,UAAU,mBACV;AACJ,QAAM,iBAAiB,OAAO,WAAW,mBAAmB,WACxD,UAAU,iBACV;AACJ,QAAM,aAAa,eAAe,iBAC9B,2BAAY,IACZ,mBAAmB,eACjB,2BAAY,QACZ,gCAAiB;AACvB,QAAM,oBAAoB,yBAAyB,UAAU;AAC7D,QAAM,oBAAoB,6BAA6B,aAAa;AACpE,QAAM,0BAA0B,oBAC5B,IAAI;AAAA,IACF,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAAC,EAAE,IAAI,CAAC,OAAO,UAAU;AAAA,MAC3D;AAAA,MACA,gBAAgB,OAAO,OAAO,kBAAkB;AAAA,IAClD,CAAC;AAAA,EACH,IACA;AACJ,QAAM,UAAU,OAAO,IAAI,CAAC,OAAO,UAAU;AAC3C,UAAM,UAAU,wBAAwB,OAAO,UAAU;AACzD,UAAM,QAAQE,YAAW,cAAc,OAAO,KAAK,CAAC;AACpD,UAAM,aAAa,oBAAoB,KAAK,KAAK;AACjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,uBAAuB,KAAK;AAAA,MACjC,OAAO,uBAAuB,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,WAAW,SAAS,MAAM,SAAS,QAAQ,MAAM,cAAc,KAAK;AAO/F,QAAM,mBAAmB,QAAQ,SAAS,MAAM,qBAAqB,cAAc,QAAQ,WAAW;AACtG,QAAM,cAAc,mBAChB,QAAQ,IAAI,CAAC,UAAU,MAAM,OAAO,IACpC;AACJ,aAAW;AAAA,IACT;AAAA,MACE,CAAC,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,MAAM,CAAC;AAAA,MAC1C,CAAC,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS,CAAC;AAAA,IACrF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,WAAO,uBAAQ,UAAU;AAC/B,QAAM,eAAe,mBACjB,cACA;AACJ,QAAM,aAAa,4BAA4B,OAAO,kBAAkB;AACxE,QAAM,eAAe,MAAM,wBAAwB,MAAM,yBAAyB,gBAC9E,MAAM,uBACNF,aAAY,YAAY,IAAI;AAChC,QAAM,qBAAqB,QACxB,IAAI,CAAC,UAAU,MAAM,KAAK,EAC1B,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AACzF,QAAM,WAAW,mBAAmB,SAAS,IAAI,KAAK,IAAI,GAAG,kBAAkB,IAAI;AACnF,QAAM,WAAW,mBAAmB,SAAS,IAAI,KAAK,IAAI,GAAG,kBAAkB,IAAI;AACnF,QAAM,mBAAmB,kBAAkB,sBAAsB;AAEjE,SACE,8CAAC,OACE;AAAA,iBAAa,IAAI,CAAC,SAAS,UAAU;AACpC,YAAM,IAAI,KAAK,OAAO;AACtB,UAAI,CAAC,GAAG;AACN,eAAO;AAAA,MACT;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAM;AAAA,UAEN,QAAQ;AAAA,UACR,gBAAe;AAAA,UACf,aAAa;AAAA;AAAA,QAHR,mBAAmB,QAAQ,MAAM,KAAK;AAAA,MAI7C;AAAA,IAEJ,CAAC;AAAA,IACA,QAAQ,IAAI,CAAC,OAAO,UAAU;AAC7B,YAAM,IAAI,KAAK,MAAM,OAAO;AAC5B,UAAI,CAAC,GAAG;AACN,eAAO;AAAA,MACT;AACA,YAAM,OAAO,MAAM,SAAS,QACvB,MAAM;AACL,cAAM,QAAQ,YAAY,WAAW,KAAK,MAAM,QAAQ,YAAY,KAAK,IAAI,MAAM,WAAW,QAAQ;AACtG,eAAO,2BAA2B,OAAO,oBAAoB,KAAK;AAAA,MACpE,GAAG,IACH,yBAAyB,IAAI,MAAM,cAAc,EAAE,KAAK,0BAA0B,OAAO,kBAAkB;AAC/G,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UAEA,QAAQA,aAAY,MAAM,IAAI;AAAA,UAC9B,gBAAe;AAAA,UACf,aAAa;AAAA;AAAA,QAHR,oBAAoB,MAAM,OAAO,KAAK;AAAA,MAI7C;AAAA,IAEJ,CAAC;AAAA,IACA,mBACG,QAAQ,IAAI,CAAC,OAAO,UAAU;AAC5B,YAAM,SAAS,KAAK,OAAO,MAAM,OAAO;AACxC,YAAM,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI;AAC7B,YAAM,QAAQ,KAAK;AACnB,YAAM,SAAS,KAAK;AACpB,UAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,MAAM,KAAK,QAAQ,MAAM,SAAS,IAAI;AACpF,eAAO;AAAA,MACT;AACA,YAAM,WAAW,KAAK,SAAS,MAAM,OAAO;AAC5C,UAAI,CAAC,OAAO,SAAS,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,SAAS,CAAC,CAAC,GAAG;AAClE,eAAO;AAAA,MACT;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,sBAAsB,KAAK;AAAA,UACjC,UAAU;AAAA,UACV,YAAY;AAAA,UAEZ,YAAW;AAAA,UACX,GAAG,SAAS,CAAC;AAAA,UACb,GAAG,SAAS,CAAC;AAAA,UAEZ,0BAAgB,MAAM,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC;AAAA;AAAA,QALnD,oBAAoB,MAAM,OAAO,KAAK;AAAA,MAM7C;AAAA,IAEJ,CAAC,IACD;AAAA,KACN;AAEJ;AAEA,SAAS,kBAAkB,OAAkB,SAA+B,QAAqB,WAAmB;AAClH,SACE,8CAAC,OACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAMD,cAAa,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AAAA,QACpE,QAAQ,OAAO,KAAK;AAAA,QACpB,QAAQA,cAAa,MAAM,iBAAiB,QAAQ,QAAQ,GAAG;AAAA,QAC/D,iBAAgB;AAAA,QAChB,OAAO,OAAO,KAAK;AAAA,QACnB,GAAG,OAAO,KAAK;AAAA,QACf,GAAG,OAAO,KAAK;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,2BAA2B,KAAK;AAAA,QACtC,UAAU;AAAA,QACV,YAAW;AAAA,QACX,GAAG,OAAO,KAAK,OAAO,OAAO,KAAK,QAAQ;AAAA,QAC1C,GAAG,OAAO,KAAK,MAAM,OAAO,KAAK,SAAS;AAAA,QAEzC,qCAA2B,SAAS;AAAA;AAAA,IACvC;AAAA,KACF;AAEJ;AAEA,SAAS,gBAAgB,OAAkB,SAA+B,QAAqB,WAAmB;AAChH,MAAI,aAAa,KAAK,GAAG;AACvB,WAAO,iBAAiB,OAAO,SAAS,MAAM,KAAK,kBAAkB,OAAO,SAAS,QAAQ,OAAO;AAAA,EACtG;AACA,MACE,cAAc,qBACX,cAAc,mBACd,cAAc,0BACd,cAAc,kBACd,cAAc,gBACd,cAAc,qBACjB;AACA,WAAO,eAAe,OAAO,SAAS,QAAQ,SAAS;AAAA,EACzD;AACA,MACE,cAAc,UACX,cAAc,iBACd,cAAc,wBACd,cAAc,UACd,cAAc,iBACd,cAAc,sBACjB;AACA,WAAO,sBAAsB,OAAO,SAAS,QAAQ,SAAS;AAAA,EAChE;AACA,MAAI,cAAc,WAAW;AAC3B,WAAO,mBAAmB,OAAO,SAAS,QAAQ,KAAK;AAAA,EACzD;AACA,MAAI,cAAc,gBAAgB;AAChC,WAAO,mBAAmB,OAAO,SAAS,QAAQ,KAAK;AAAA,EACzD;AACA,MAAI,cAAc,iBAAiB;AACjC,WAAO,mBAAmB,OAAO,SAAS,QAAQ,IAAI;AAAA,EACxD;AACA,MAAI,cAAc,UAAU;AAC1B,WAAO,kBAAkB,OAAO,SAAS,MAAM;AAAA,EACjD;AACA,MAAI,cAAc,SAAS;AACzB,WAAO,iBAAiB,OAAO,SAAS,MAAM;AAAA,EAChD;AACA,MAAI,cAAc,SAAS,cAAc,WAAW,cAAc,iBAAiB,cAAc,YAAY;AAC3G,WAAO,eAAe,OAAO,SAAS,QAAQ,SAAS;AAAA,EACzD;AACA,MAAI,cAAc,YAAY;AAC5B,WAAO,oBAAoB,OAAO,SAAS,MAAM;AAAA,EACnD;AACA,MAAI,cAAc,WAAW;AAC3B,WAAO,mBAAmB,OAAO,SAAS,MAAM;AAAA,EAClD;AACA,MAAI,cAAc,SAAS;AACzB,WAAO,iBAAiB,OAAO,SAAS,MAAM;AAAA,EAChD;AACA,MAAI,cAAc,aAAa;AAC7B,WAAO,qBAAqB,OAAO,SAAS,MAAM;AAAA,EACpD;AACA,MAAI,cAAc,UAAU;AAC1B,WAAO,kBAAkB,OAAO,SAAS,MAAM;AAAA,EACjD;AACA,MAAI,cAAc,cAAc;AAC9B,WAAO,sBAAsB,OAAO,SAAS,MAAM;AAAA,EACrD;AACA,MAAI,cAAc,YAAY;AAC5B,WAAO,oBAAoB,OAAO,SAAS,MAAM;AAAA,EACnD;AACA,MAAI,cAAc,WAAW;AAC3B,WAAO,mBAAmB,OAAO,SAAS,MAAM;AAAA,EAClD;AACA,MAAI,cAAc,aAAa;AAC7B,WAAO,qBAAqB,OAAO,SAAS,MAAM;AAAA,EACpD;AACA,SAAO,kBAAkB,OAAO,SAAS,QAAQ,SAAS;AAC5D;AAEO,IAAM,eAAqB,YAAK,SAASiD,cAAa,EAAE,OAAO,SAAS,KAAK,GAAkB;AACpG,QAAM,kBAAkB,6BAA6B,KAAK;AAC1D,QAAM,cAAc,eAAe,OAAO,iBAAiB,OAAO;AAClE,QAAM,SAAS,YAAY,OAAO,MAAM,WAAW;AACnD,QAAM,WAAW,MAAM,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAiC;AACrG,QAAM,iBAAiB,UAAU,oBAAoB,QAAQ,UAAU,mBAAmB;AAC1F,QAAM,aAAa,MAAM,uBAAuB,iBAAiB,gBAAgB;AACjF,QAAM,cAAc,MAAM,wBAAwB;AAClD,QAAM,uBAAuB,WAAW,KAAK,EAAE,YAAY;AAC3D,QAAM,wBAAwB,YAAY,KAAK,EAAE,YAAY;AAC7D,QAAM,qBAAqB,yBAAyB,iBAAiB,0BAA0B;AAC/F,QAAM,aAAa,qBAAqB,MAAM,UAAU;AAExD,MAAI,oBAAoB,WAAW;AACjC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,mBAAmB,OAAO,SAAS,MAAM;AAAA,QACnD;AAAA,QACA;AAAA,QACA,SACE,8EACG;AAAA,4BAAkB,OAAO,MAAM;AAAA,UAC/B,YAAY,OAAO,QAAQ,OAAO;AAAA,UAClC,aAAa,OAAO,QAAQ,OAAO;AAAA,WACtC;AAAA,QAEF;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,MAAM,SAAS,MAAM,QAAQ;AAAA,MACzC,MAAK;AAAA,MACL,OAAO,EAAE,SAAS,SAAS,YAAY,QAAQ,QAAQ,eAAe,QAAQ,OAAO,OAAO;AAAA,MAC5F,SAAS,OAAO,OAAO,KAAK,IAAI,OAAO,MAAM;AAAA,MAE5C;AAAA,6BACG,OACA,6CAAC,UAAK,MAAM,YAAY,QAAQ,OAAO,QAAQ,QAAQ,aAAa,aAAa,GAAG,OAAO,OAAO,OAAO,GAAG,GAAG,GAAG,GAAG;AAAA,QACxH,YAAY,OAAO,QAAQ,OAAO;AAAA,QAClC,aAAa,OAAO,QAAQ,OAAO;AAAA,QACnC,gBAAgB,OAAO,SAAS,QAAQ,eAAe;AAAA;AAAA;AAAA,EAC1D;AAEJ,GAAG,CAAC,MAAM,SACR,KAAK,UAAU,KAAK,SACjB,KAAK,YAAY,KAAK,WACtB,KAAK,KAAK,WAAW,KAAK,KAAK,UAC/B,KAAK,KAAK,UAAU,KAAK,KAAK,SAC9B,KAAK,KAAK,SAAS,KAAK,KAAK,QAC7B,KAAK,KAAK,QAAQ,KAAK,KAAK,GAChC;;;ADh2JK,IAAAC,sBAAA;AAjnDN,IAAMC,sBAAqB;AAC3B,IAAMC,qBAAoB;AAC1B,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAMC,2BAA0B;AAChC,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AACjC,IAAM,wBAAwB;AAC9B,IAAM,wBAAwB;AAC9B,IAAM,kCAAkC;AACxC,IAAM,kCAAkC;AACxC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAC7B,IAAM,6BAA6B;AACnC,IAAM,+BAA+B;AACrC,IAAM,8BAA8B;AACpC,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,gBAAgB;AAEtB,IAAM,uBAAuB;AAC7B,IAAM,yBAA0D,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;AAE3G,IAAM,sBAA4F;AAAA,EAChG,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AACL;AAEA,SAAS,yBACP,UACA,YACA,IACA;AACA,aAAO,yCAAmB,UAAU,CAAC,SAAS;AAC5C,OAAG;AAAA,MACD,QAAQ,KAAK,SAAS;AAAA,MACtB,OAAO,KAAK,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,2BACP,UACA,YACA,IACA;AACA,aAAO,2CAAqB,UAAU,CAAC,QAAQ,gBAAgB;AAC7D,OAAG,SAAS,YAAY,WAAW;AAAA,EACrC,CAAC;AACH;AAEA,SAAS,qBACP,QACA,YACA,SACA,UACA;AACA,0CAAc,SAAS,YAAY,SAAS,QAAQ;AACtD;AAEA,SAAS,gBAAgB,WAAmB;AAC1C,SAAO,GAAG,KAAK,MAAM,SAAS,CAAC;AACjC;AAwBA,IAAM,gBAA+B;AAAA,EACnC,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,SAAS;AAAA,EACT,MAAM;AAAA,EACN,gBAAgB;AAClB;AAEA,IAAM,eAA8B;AAAA,EAClC,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,SAAS;AAAA,EACT,MAAM;AAAA,EACN,gBAAgB;AAClB;AAEA,SAASC,eAAc,OAAe;AACpC,QAAM,QAAQ,qBAAqB,KAAK,KAAK;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,MAAM,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC9C,OAAO,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC/C,KAAK,OAAO,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,EAC/C;AACF;AAEA,SAASC,aAAY,OAAe,SAAiB,OAAe;AAClE,QAAM,OAAOD,eAAc,KAAK;AAChC,QAAM,SAASA,eAAc,OAAO;AACpC,MAAI,CAAC,QAAQ,CAAC,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AAC9C,QAAM,aAAa,CAAC,MAAc,UAAkB,KAAK,MAAM,QAAQ,QAAQ,QAAQ,OAAO;AAC9F,SAAO,IAAI;AAAA,IACT,WAAW,KAAK,KAAK,OAAO,GAAG;AAAA,IAC/B,WAAW,KAAK,OAAO,OAAO,KAAK;AAAA,IACnC,WAAW,KAAK,MAAM,OAAO,IAAI;AAAA,EACnC,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AAChE;AAEA,SAASE,cAAa,OAAe,OAAe;AAClD,SAAOD,aAAY,OAAO,WAAW,KAAK;AAC5C;AAEA,SAASE,aAAY,OAAe,OAAe;AACjD,SAAOF,aAAY,OAAO,WAAW,KAAK;AAC5C;AAEA,IAAM,gBAAsB,qBAA2C,IAAI;AAwC3E,SAAS,cAAc,QAAkD;AACvE,SAAO,OAAO,OAAO,OAAO,EAAE,KAAK,GAAG;AACxC;AAEA,SAAS,uBAAuB,cAAyD,SAAwB;AAC/G,SAAO;AACT;AAEA,SAAS,oBAAoB,OAA6B,SAAwB;AAChF,SAAO,cAAc,OAAO,IACxB,uBAAuB,OAAO,cAAc,OAAO,IACnD,OAAO,aAAa,cAAc,CAAC,KAAK;AAC9C;AAEA,SAASG,gBAAe,OAAqC;AAC3D,SAAO;AAAA,IACL,OAAO;AAAA,MACL,KAAK,KAAK,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,MAC5C,KAAK,KAAK,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,IAC9C;AAAA,IACA,KAAK;AAAA,MACH,KAAK,KAAK,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,MAC5C,KAAK,KAAK,IAAI,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,OAA8C;AAC/E,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,UAAU,QAAQ,IAAI,MAAM,MAAM,GAAG;AAC5C,QAAM,MAAM,OAAO,QAAQ;AAC3B,QAAM,MAAM,OAAO,QAAQ;AAC3B,MAAI,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG;AAC1E,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,KAAK,IAAI;AACpB;AAEA,SAAS,WAAW,MAA8B,OAA+B;AAC/E,SAAO,QAAQ,QAAQ,SAAS,KAAK,QAAQ,MAAM,OAAO,KAAK,QAAQ,MAAM,GAAG;AAClF;AAEA,SAAS,cAAc,MAAuB,OAA6B;AACzE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAaA,gBAAe,KAAK;AACvC,SACE,KAAK,OAAO,WAAW,MAAM,OAC7B,KAAK,OAAO,WAAW,IAAI,OAC3B,KAAK,OAAO,WAAW,MAAM,OAC7B,KAAK,OAAO,WAAW,IAAI;AAE/B;AAEA,SAAS,YAAY,MAA4B,OAA6B;AAC5E,MAAI,CAAC,QAAQ,CAAC,OAAO;AACnB,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,iBAAiBA,gBAAe,IAAI;AAC1C,QAAM,kBAAkBA,gBAAe,KAAK;AAC5C,SACE,eAAe,MAAM,QAAQ,gBAAgB,MAAM,OACnD,eAAe,MAAM,QAAQ,gBAAgB,MAAM,OACnD,eAAe,IAAI,QAAQ,gBAAgB,IAAI,OAC/C,eAAe,IAAI,QAAQ,gBAAgB,IAAI;AAEnD;AAEA,SAAS,eAAe,OAA4B;AAClD,SAAO,MAAM,IAAI,WAAW,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,WAAW,CAAC,MAAM;AAC7E;AA0BA,SAAS,gBAAgB,QAAkB;AACzC,QAAM,SAAS,IAAI,MAAM,OAAO,SAAS,CAAC,EAAE,KAAK,CAAC;AAClD,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,WAAO,QAAQ,CAAC,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,eAAe,YAAsB,YAAoB,UAAkB;AAClF,MAAI,aAAa,UAAU;AACzB,WAAO;AAAA,EACT;AAEA,UAAQ,WAAW,WAAW,CAAC,KAAK,MAAM,WAAW,UAAU,KAAK;AACtE;AAEA,SAAS,mBAAmB,eAAyB,oBAA8B,eAAuB;AACxG,QAAM,UAAU,oBAAI,IAAoB;AACxC,MAAI,aAAa;AAEjB,aAAW,eAAe,eAAe;AACvC,YAAQ,IAAI,aAAa,UAAU;AACnC,kBAAc,mBAAmB,WAAW,KAAK;AAAA,EACnD;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,YAAsB,QAAgB;AACtE,QAAM,QAAQ,WAAW,SAAS;AAClC,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AACA,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,MAAI,UAAU,WAAW,KAAK,GAAG;AAC/B,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,MAAM;AACV,MAAI,OAAO,QAAQ;AACnB,SAAO,MAAM,MAAM;AACjB,UAAM,MAAM,KAAK,OAAO,MAAM,QAAQ,CAAC;AACvC,SAAK,WAAW,MAAM,CAAC,KAAK,MAAM,QAAQ;AACxC,YAAM,MAAM;AAAA,IACd,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,QAAgB,WAAmB;AAC7D,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,aAAa,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAK,CAAC,CAAC;AACrE;AAEA,SAAS,sBAAsB,cAAsB,SAAiB,SAAiB;AACrF,SAAO,KAAK,IAAI,eAAe,IAAI,SAAS,OAAO;AACrD;AAEA,SAAS,wBACP,aACA,cACA,cACA,eACA;AACA,MAAI,gBAAgB,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,YAAY,WAAW,GAAG;AAC5B,UAAMC,WAAoB,CAAC;AAC3B,UAAM,YAAY,KAAK,IAAI,cAAc,KAAK,IAAI,GAAG,eAAe,CAAC,CAAC;AACtE,aAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,GAAG;AACjD,UAAI,CAAC,eAAe,IAAI,KAAK,GAAG;AAC9B,QAAAA,SAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,IACF;AACA,aAAS,QAAQ,WAAW,QAAQ,cAAc,SAAS,GAAG;AAC5D,MAAAA,SAAQ,KAAK,KAAK;AAAA,IACpB;AACA,WAAOA;AAAA,EACT;AAEA,QAAM,UAAU,YAAY,OAAO,CAAC,UAAU,QAAQ,YAAY;AAClE,QAAM,cAAc,KAAK,IAAI,GAAG,eAAe,CAAC;AAChD,WAAS,QAAQ,aAAa,QAAQ,cAAc,SAAS,GAAG;AAC9D,YAAQ,KAAK,KAAK;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,4BACP,cACA,SACA,SACA,gBACA,YACA;AACA,QAAM,aAAa,sBAAsB,cAAc,SAAS,OAAO;AACvE,SAAO,iBAAiB,KAAK,IAAI,YAAY,KAAK,IAAI,SAAS,UAAU,CAAC,IAAI;AAChF;AAEA,SAAS,qBAAqB,eAAyB,OAAiB,aAAqB;AAC3F,MAAI,QAAQ;AACZ,WAAS,QAAQ,GAAG,QAAQ,cAAc,QAAQ,SAAS,GAAG;AAC5D,SAAK,cAAc,KAAK,KAAK,MAAM,aAAa;AAC9C;AAAA,IACF;AACA,aAAS,MAAM,KAAK,KAAK;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,uBACP,aACA,eACA,OACA,eACA,YACA,kBACA;AACA,MAAI,oBAAoB,eAAe,KAAK,cAAc,iBAAiB,QAAQ;AACjF,WAAO,iBAAiB,WAAW,KAAK;AAAA,EAC1C;AAEA,QAAM,eAAe,eAAe,IAAI,WAAW;AACnD,MAAI,iBAAiB,UAAa,YAAY;AAC5C,WAAO,WAAW,YAAY,KAAK;AAAA,EACrC;AAEA,SAAO,qBAAqB,eAAe,OAAO,WAAW;AAC/D;AAEA,SAAS,oBACP,QACA,aACA,aACA,YACA,WACA,SAQe;AACf,QAAM,oBAAoB,CAAC,KAAa,iBACtC,mBACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACX,IACA,YAAY,YAAY;AAC1B,QAAM,mBAAmB,CAAC,KAAa,iBACrC,gBACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACX,IACA,YAAY,YAAY;AAE1B,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO;AAAA,MACL,QAAQ,KAAK,IAAI,GAAG,YAAY,OAAO,QAAQ,EAAE,CAAC;AAAA,MAClD,MAAM,mBAAmB,YAAY,OAAO,YAAY,CAAC;AAAA,MACzD,KAAK,gBAAgB,YAAY,OAAO,YAAY,CAAC;AAAA,MACrD,OAAO,KAAK,IAAI,GAAG,YAAY,OAAO,QAAQ,EAAE,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO;AAAA,MACL,QAAQ,KAAK,IAAI,GAAG,YAAY,OAAO,QAAQ,EAAE,CAAC;AAAA,MAClD,MAAM,kBAAkB,OAAO,KAAK,KAAK,OAAO,KAAK,YAAY;AAAA,MACjE,KAAK,iBAAiB,OAAO,KAAK,KAAK,OAAO,KAAK,YAAY;AAAA,MAC/D,OAAO,KAAK,IAAI,GAAG,YAAY,OAAO,QAAQ,EAAE,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,OAAO,kBAAkB,OAAO,KAAK,KAAK,OAAO,KAAK,YAAY;AACxE,QAAM,MAAM,iBAAiB,OAAO,KAAK,KAAK,OAAO,KAAK,YAAY;AACtE,QAAM,QAAQ,kBAAkB,OAAO,GAAG,KAAK,OAAO,GAAG,YAAY;AACrE,QAAM,SAAS,iBAAiB,OAAO,GAAG,KAAK,OAAO,GAAG,YAAY;AAErE,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,GAAG,SAAS,GAAG;AAAA,IAChC;AAAA,IACA;AAAA,IACA,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,iBACP,OACA,aACA,aACA,YACA,WACA,SAQe;AACf,SAAO,oBAAoB,MAAM,QAAQ,aAAa,aAAa,YAAY,WAAW,OAAO;AACnG;AAEA,SAAS,0BAA0B,OAAkB;AACnD,MAAI,MAAM,OAAO,SAAS,YAAY;AACpC,WAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE;AAAA,EAChC;AAEA,MAAI,MAAM,OAAO,SAAS,YAAY;AACpC,WAAO;AAAA,MACL,QAAQ,MAAM,OAAO,KAAK;AAAA,MAC1B,QAAQ,MAAM,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,GAAG;AAAA,IAC3D,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,GAAG;AAAA,EAC7D;AACF;AAwBA,SAAS,0BAA0B,OAAkB;AACnD,MAAI,MAAM,OAAO,SAAS,YAAY;AACpC,WAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE;AAAA,EAChC;AAEA,MAAI,MAAM,OAAO,SAAS,YAAY;AACpC,WAAO;AAAA,MACL,QAAQ,MAAM,OAAO,KAAK;AAAA,MAC1B,QAAQ,MAAM,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,GAAG;AAAA,IAC3D,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,GAAG;AAAA,EAC7D;AACF;AAEA,SAAS,0BAA0B,OAAkB;AACnD,MAAI,MAAM,OAAO,SAAS,YAAY;AACpC,WAAO,EAAE,QAAQ,GAAG,QAAQ,EAAE;AAAA,EAChC;AAEA,MAAI,MAAM,OAAO,SAAS,YAAY;AACpC,WAAO;AAAA,MACL,QAAQ,MAAM,OAAO,KAAK;AAAA,MAC1B,QAAQ,MAAM,OAAO,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,GAAG;AAAA,IAC3D,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,GAAG,GAAG;AAAA,EAC7D;AACF;AAEA,SAAS,uBACP,MACA,UACA,WAAW,KACX;AACA,QAAM,eAAe,SAAS,OAAO;AACrC,QAAM,cAAc,SAAS,MAAM;AACnC,QAAM,gBAAgB,SAAS,OAAO,SAAS,QAAQ;AACvD,QAAM,iBAAiB,SAAS,MAAM,SAAS,SAAS;AACxD,QAAM,YAAY,KAAK,OAAO,KAAK;AACnC,QAAM,aAAa,KAAK,MAAM,KAAK;AACnC,SAAO,aAAa,gBACf,KAAK,QAAQ,iBACb,cAAc,eACd,KAAK,OAAO;AACnB;AAUA,SAAS,yBACP,MACA,YACA,YACA,kBACA,iBACA,aACA,gBACA,iBACmB;AACnB,QAAM,mBACJ,aAAa,OAAO,YAAY,MAAM,KAAK,WAAW,SAAS,IAC3D,WAAW;AAAA,IACT,CAAC,KAAK,QAAQ,KAAK,IAAI,MAAM,eAAe,IAAI,GAAG,KAAK,kBAAkB,iBAAiB,GAAG,KAAKC,oBAAmB;AAAA,IACtH;AAAA,EACF,IACA;AACN,QAAM,kBACJ,aAAa,OAAO,YAAY,MAAM,KAAK,WAAW,SAAS,IAC3D,WAAW;AAAA,IACT,CAAC,KAAK,QAAQ,KAAK,IAAI,MAAM,gBAAgB,IAAI,GAAG,KAAK,qBAAqB,gBAAgB,GAAG,KAAKC,mBAAkB;AAAA,IACxH;AAAA,EACF,IACA;AAEN,QAAM,YAAY,qBAAqB,QAAQ,KAAK,MAAM,KAAK,UAAU,mBAAmB;AAC5F,QAAM,aAAa,oBAAoB,QAAQ,KAAK,OAAO,KAAK,SAAS,kBAAkB;AAE3F,MAAI,aAAa,YAAY;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AACA,MAAI,YAAY;AACd,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAkB,MAA0C;AAC5F,QAAM,cAAc,MAAM,QAAQ,OAAO,IAAI,KAAK,IAAI,GAAG,MAAM,QAAQ,WAAW,CAAC;AACnF,QAAM,cAAc,MAAM,QAAQ,SAAS;AAC3C,QAAM,YAAY,MAAM,MAAM,OAAO,gBAAiB,MAAM,MAAM,SAAS;AAC3E,QAAM,iBAAiB,MAAM,WAAW,KAAK,CAAC,cAAc,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,KAAK,EAAE,SAAS,CAAC,CAAC;AACpH,QAAM,iBAAiB;AAAA,IACrB,MAAM,cAAc,UAAU,MAAM,WAAW,SAAS;AAAA,IACxD,MAAM,QAAQ,eAAe;AAAA,IAC7B,MAAM,QAAQ,eAAe;AAAA,EAC/B,EAAE,OAAO,OAAO;AAEhB,MAAI,eAAoD;AACxD,MAAI,MAAM,aAAa,WAAW;AAChC,mBAAe;AAAA,EACjB,WAAW,MAAM,aAAa,aAAa;AACzC,mBAAe;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,YACE,MAAM,SAAS,kBAAkB,WAC7B,WACA,MAAM,SAAS,kBAAkB,WAC/B,aACA;AAAA,IACR,iBAAiB;AAAA,IACjB,QAAQ,cAAc,IAAI,GAAG,WAAW,YAAY,WAAW,KAAK;AAAA,IACpE;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,gBAAgB;AAAA,IAChB,MAAM,KAAK;AAAA,IACX,SAAS,KAAK,IAAI,MAAM,MAAM,WAAW,GAAG,MAAM,QAAQ,WAAW,CAAC;AAAA,IACtE,UAAU,iBAAiB,WAAW;AAAA,IACtC,UAAU;AAAA,IACV,KAAK,KAAK;AAAA,IACV,WAAW,eAAe,KAAK,GAAG,KAAK;AAAA,IACvC,iBAAiB;AAAA,IACjB,OAAO,KAAK;AAAA,IACZ,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,SAAS,aAAa,OAAe,UAAkB;AACrD,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;AACzC;AAEA,SAAS,uBAAuB,OAAkB,MAAc,UAAkB;AAChF,QAAM,WAAW,MAAM,sBAAsB,IAAI;AACjD,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,SAAO,aAAa,WAAW,KAAM,QAAQ;AAC/C;AAEA,SAAS,gBAAgB,QAAiC;AACxD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,OACJ,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,EAC7D,KAAK,GAAG,IAAI;AACjB;AAEA,SAAS,cAAc,QAAgB,UAAkB,SAAS,IAAsB;AACtF,QAAM,UAAU,YAAY,KAAK,KAAK;AACtC,SAAO;AAAA,IACL,SAAS,KAAK,IAAI,OAAO,IAAI;AAAA,IAC7B,SAAS,KAAK,IAAI,OAAO,IAAI;AAAA,EAC/B;AACF;AAEA,SAAS,wBAAwB,OAAe,cAAc,KAAK,SAAS,IAAI;AAC9E,SAAO;AAAA,IACL,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UAAU,cAAc,QAAQ,cAAe,MAAM,QAAS,KAAK,CAAC;AAAA,EACxG;AACF;AAEA,SAAS,cAAc,QAAgB,aAAqB,cAAc,KAAK,cAAc,IAAI;AAC/F,SAAO;AAAA,IACL,MAAM,KAAK,EAAE,QAAQ,SAAS,EAAE,GAAG,CAAC,GAAG,UAAU;AAC/C,YAAM,SAAS,QAAQ,MAAM,IAAI,cAAc;AAC/C,aAAO,cAAc,QAAQ,cAAe,OAAO,SAAS,KAAM,KAAK;AAAA,IACzE,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBAAmB,QAAgB;AAC1C,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC;AACrD,QAAM,OAAO,MAAM;AACnB,SAAO;AAAA,IACL,KAAK,YAAY;AAAA,IACjB,KAAK,IAAI;AAAA,IACT,eAAe,YAAY;AAAA,IAC3B,SAAS,IAAI;AAAA,IACb,aAAa,IAAI;AAAA,IACjB,KAAK,YAAY;AAAA,IACjB,aAAa,IAAI;AAAA,IACjB,OAAO,YAAY;AAAA,IACnB,SAAS,YAAY;AAAA,IACrB;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,mBAAmB;AAC1B,SAAO;AACT;AAEA,SAAS,aAAa,eAAuB,aAAqB;AAChE,QAAM,CAAC,QAAQ,MAAM,IAAI,cAAc,IAAI,aAAa;AACxD,QAAM,CAAC,MAAM,IAAI,IAAI,cAAc,IAAI,WAAW;AAClD,QAAM,QAAQ,eAAe,gBAAgB,cAAc,gBAAgB,OAAO,gBAAgB;AAClG,QAAM,eAAe,QAAQ,MAAM,IAAI;AACvC,SAAO;AAAA,IACL;AAAA,IACA,KAAK,MAAM,IAAI,MAAM;AAAA,IACrB,aAAa,YAAY,MAAM,IAAI,IAAI,IAAI;AAAA,IAC3C;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,eAAe,eAAuB,aAAqB;AAClE,QAAM,CAAC,QAAQ,MAAM,IAAI,cAAc,IAAI,aAAa;AACxD,QAAM,CAAC,MAAM,IAAI,IAAI,cAAc,IAAI,WAAW;AAClD,QAAM,QAAQ,eAAe,gBAAgB,cAAc,gBAAgB,OAAO,gBAAgB;AAClG,QAAM,eAAe,QAAQ,MAAM,IAAI;AACvC,SAAO;AAAA,IACL,KAAK,MAAM,IAAI,MAAM;AAAA,IACrB,aAAa,YAAY,MAAM,IAAI,IAAI,IAAI;AAAA,IAC3C;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,cAAc,WAAmB;AACxC,QAAM,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC;AAChD,QAAM,QAAQ,KAAK,MAAM;AACzB,QAAM,QAAQ,KAAK,MAAM;AACzB,SAAO,gBAAgB;AAAA,IACrB,CAAC,OAAO,CAAC;AAAA,IACT,CAAC,OAAO,CAAC;AAAA,IACT,CAAC,OAAO,KAAK;AAAA,IACb,CAAC,KAAK,KAAK;AAAA,IACX,CAAC,KAAK,KAAK;AAAA,IACX,CAAC,OAAO,KAAK;AAAA,IACb,CAAC,OAAO,GAAG;AAAA,IACX,CAAC,OAAO,GAAG;AAAA,IACX,CAAC,OAAO,KAAK;AAAA,IACb,CAAC,GAAG,KAAK;AAAA,IACT,CAAC,GAAG,KAAK;AAAA,IACT,CAAC,OAAO,KAAK;AAAA,EACf,CAAC;AACH;AAEA,SAAS,yBAAyB;AAChC,SAAO,gBAAgB;AAAA,IACrB,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,GAAG,EAAE;AAAA,EACR,CAAC;AACH;AAEA,SAAS,wBAAwB;AAC/B,SAAO,gBAAgB;AAAA,IACrB,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,EACT,CAAC;AACH;AAEA,SAAS,2BAA2B,OAAkB;AACpD,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,aAAa,KAAK,IAAI,IAAI,aAAa,GAAG;AAChD,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,QAAM,YAAY,MAAM;AACxB,SAAO,gBAAgB;AAAA,IACrB,CAAC,GAAG,OAAO;AAAA,IACX,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,WAAW,GAAG;AAAA,IACf,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,YAAY,OAAO;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,2BAA2B,OAAkB;AACpD,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,cAAc;AACpB,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,QAAM,YAAY,MAAM;AACxB,SAAO;AAAA,IACL,OAAO,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM,WAAW,IAAI,UAAU,QAAQ,UAAU;AAAA,IAC3F,gBAAgB;AAAA,MACd,CAAC,cAAc,KAAK,OAAO;AAAA,MAC3B,CAAC,WAAW,OAAO;AAAA,MACnB,CAAC,WAAW,CAAC;AAAA,MACb,CAAC,KAAK,EAAE;AAAA,MACR,CAAC,WAAW,GAAG;AAAA,MACf,CAAC,WAAW,UAAU;AAAA,MACtB,CAAC,cAAc,KAAK,UAAU;AAAA,IAChC,CAAC;AAAA,EACH,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,qBAAqB,OAAkB;AAC9C,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,SAAO,gBAAgB;AAAA,IACrB,CAAC,KAAK,MAAM,SAAS;AAAA,IACrB,CAAC,WAAW,MAAM,SAAS;AAAA,IAC3B,CAAC,WAAW,GAAG;AAAA,IACf,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,KAAK,UAAU;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAkB;AAC9C,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,iBAAiB;AACvB,QAAM,UAAU,iBAAiB;AACjC,QAAM,aAAa,iBAAiB;AACpC,SAAO,gBAAgB;AAAA,IACrB,CAAC,GAAG,OAAO;AAAA,IACX,CAAC,MAAM,WAAW,OAAO;AAAA,IACzB,CAAC,MAAM,WAAW,UAAU;AAAA,IAC5B,CAAC,MAAM,YAAY,KAAK,UAAU;AAAA,IAClC,CAAC,KAAK,CAAC;AAAA,IACP,CAAC,MAAM,YAAY,KAAK,UAAU;AAAA,IAClC,CAAC,MAAM,WAAW,UAAU;AAAA,IAC5B,CAAC,MAAM,WAAW,GAAG;AAAA,IACrB,CAAC,MAAM,YAAY,GAAG,GAAG;AAAA,IACzB,CAAC,MAAM,YAAY,GAAG,UAAU;AAAA,IAChC,CAAC,GAAG,UAAU;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,oBAAoB,OAAkB;AAC7C,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,SAAO,gBAAgB;AAAA,IACrB,CAAC,KAAK,GAAG;AAAA,IACT,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,MAAM,WAAW,EAAE;AAAA,IACpB,CAAC,MAAM,WAAW,GAAG;AAAA,EACvB,CAAC;AACH;AAEA,SAAS,0BAA0B,OAAkB;AACnD,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,KAAK;AACvB,SAAO,gBAAgB;AAAA,IACrB,CAAC,YAAY,OAAO;AAAA,IACpB,CAAC,UAAU,OAAO;AAAA,IAClB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,GAAG,UAAU;AAAA,IACd,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,KAAK,UAAU;AAAA,IAChB,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,MAAM,YAAY,OAAO;AAAA,IAC1B,CAAC,MAAM,YAAY,CAAC;AAAA,IACpB,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,MAAM,YAAY,GAAG;AAAA,IACtB,CAAC,MAAM,YAAY,UAAU;AAAA,IAC7B,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,YAAY,GAAG;AAAA,IAChB,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,YAAY,CAAC;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAkB;AAC5C,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,KAAK;AACvB,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,SAAO,gBAAgB;AAAA,IACrB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,YAAY,OAAO;AAAA,IACpB,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,YAAY,MAAM,OAAO;AAAA,IAC1B,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,UAAU,MAAM,UAAU;AAAA,IAC3B,CAAC,SAAS,MAAM,UAAU;AAAA,IAC1B,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,MAAM,SAAS,MAAM,UAAU;AAAA,IAChC,CAAC,WAAW,MAAM,UAAU;AAAA,IAC5B,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,MAAM,YAAY,UAAU;AAAA,IAC7B,CAAC,MAAM,YAAY,MAAM,OAAO;AAAA,IAChC,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,MAAM,YAAY,OAAO;AAAA,IAC1B,CAAC,MAAM,YAAY,UAAU;AAAA,IAC7B,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,MAAM,SAAS,UAAU;AAAA,IAC1B,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,SAAS,UAAU;AAAA,IACpB,CAAC,UAAU,UAAU;AAAA,EACvB,CAAC;AACH;AAEA,SAAS,iBAAiB;AACxB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,yBAAyB;AAChC,SAAO,gBAAgB;AAAA,IACrB,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,EACR,CAAC;AACH;AAEA,SAAS,oBAAoB;AAC3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,iBAAiB;AACxB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,oBAAoB,OAAkB;AAC7C,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,QAAM,YAAY,MAAM;AACxB,SAAO,gBAAgB;AAAA,IACrB,CAAC,GAAG,OAAO;AAAA,IACX,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,WAAW,GAAG;AAAA,IACf,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,GAAG,UAAU;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAkB;AAC5C,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,QAAM,UAAU;AAChB,SAAO,gBAAgB;AAAA,IACrB,CAAC,KAAK,OAAO;AAAA,IACb,CAAC,SAAS,OAAO;AAAA,IACjB,CAAC,SAAS,CAAC;AAAA,IACX,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,SAAS,GAAG;AAAA,IACb,CAAC,SAAS,UAAU;AAAA,IACpB,CAAC,KAAK,UAAU;AAAA,EAClB,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAkB;AAC1C,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,KAAK;AACvB,QAAM,UAAU;AAChB,SAAO,gBAAgB;AAAA,IACrB,CAAC,UAAU,GAAG;AAAA,IACd,CAAC,UAAU,OAAO;AAAA,IAClB,CAAC,GAAG,OAAO;AAAA,IACX,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,KAAK,OAAO;AAAA,IACb,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,WAAW,GAAG;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAkB;AAC5C,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,KAAK;AACvB,QAAM,YAAY,MAAM;AACxB,SAAO,gBAAgB;AAAA,IACrB,CAAC,UAAU,CAAC;AAAA,IACZ,CAAC,UAAU,SAAS;AAAA,IACpB,CAAC,GAAG,SAAS;AAAA,IACb,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,KAAK,SAAS;AAAA,IACf,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,WAAW,CAAC;AAAA,EACf,CAAC;AACH;AAEA,SAAS,wBAAwB,OAAkB;AACjD,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,UAAU,KAAK;AACrB,QAAM,aAAa,KAAK;AACxB,SAAO,gBAAgB;AAAA,IACrB,CAAC,YAAY,OAAO;AAAA,IACpB,CAAC,MAAM,YAAY,OAAO;AAAA,IAC1B,CAAC,MAAM,YAAY,CAAC;AAAA,IACpB,CAAC,KAAK,EAAE;AAAA,IACR,CAAC,MAAM,YAAY,GAAG;AAAA,IACtB,CAAC,MAAM,YAAY,UAAU;AAAA,IAC7B,CAAC,YAAY,UAAU;AAAA,IACvB,CAAC,YAAY,GAAG;AAAA,IAChB,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,YAAY,CAAC;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAkB;AAC9C,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,WAAW,KAAK;AACtB,QAAM,YAAY,KAAK;AACvB,SAAO,gBAAgB;AAAA,IACrB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,UAAU,MAAM,UAAU;AAAA,IAC3B,CAAC,GAAG,MAAM,UAAU;AAAA,IACpB,CAAC,IAAI,GAAG;AAAA,IACR,CAAC,KAAK,MAAM,UAAU;AAAA,IACtB,CAAC,WAAW,MAAM,UAAU;AAAA,IAC5B,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,KAAK,UAAU;AAAA,IAChB,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,GAAG,UAAU;AAAA,EAChB,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAkB;AAC5C,QAAM,YAAY,uBAAuB,OAAO,QAAQ,EAAE;AAC1D,QAAM,aAAa,uBAAuB,OAAO,QAAQ,EAAE;AAC3D,QAAM,YAAY,uBAAuB,OAAO,QAAQ,IAAI;AAC5D,QAAM,QAAQ,uBAAuB,OAAO,QAAQ,KAAK;AACzD,QAAM,UAAU,QAAQ;AACxB,QAAM,aAAa,QAAQ;AAC3B,QAAM,YAAY,MAAM;AACxB,SAAO,gBAAgB;AAAA,IACrB,CAAC,GAAG,OAAO;AAAA,IACX,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,KAAK,KAAK;AAAA,IACX,CAAC,WAAW,GAAG;AAAA,IACf,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,WAAW,GAAG;AAAA,IACf,CAAC,GAAG,GAAG;AAAA,EACT,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAkB;AAC9C,UAAQ,MAAM,UAAU;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,mBAAmB,KAAK;AAAA,QAC9B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,qBAAqB,KAAK;AAAA,QAChC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,sBAAsB;AAAA,QAC5B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,eAAe,KAAK,GAAG;AAAA,QAC7B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,eAAe;AAAA,QACrB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,mBAAmB,KAAK;AAAA,QAC9B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,iBAAiB;AAAA,QACvB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,mBAAmB,uBAAuB,OAAO,OAAO,EAAE,CAAC;AAAA,QACjE,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,eAAe;AAAA,QACrB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,wBAAwB,CAAC;AAAA,QAC/B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,mBAAmB,KAAK;AAAA,QAC9B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,wBAAwB,KAAK;AAAA,QACnC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,wBAAwB,KAAK;AAAA,QACnC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,0BAA0B,KAAK;AAAA,QACrC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,qBAAqB,KAAK;AAAA,QAChC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,uBAAuB;AAAA,QAC7B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,uBAAuB,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5D,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,uBAAuB,OAAO,OAAO,EAAE,CAAC;AAAA,QAC5D,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,2BAA2B,KAAK;AAAA,QACtC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM,aAAa,KAAK,GAAG;AAAA,QAC3B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,uBAAuB;AAAA,QAC7B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,mBAAmB,KAAK;AAAA,QAC9B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,oBAAoB,KAAK;AAAA,QAC/B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,wBAAwB,EAAE;AAAA,QAChC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,wBAAwB,EAAE;AAAA,QAChC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,GAAG,EAAE;AAAA,QACzB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,GAAG,EAAE;AAAA,QACzB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,GAAG,EAAE;AAAA,QACzB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,GAAG,EAAE;AAAA,QACzB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,GAAG,EAAE;AAAA,QACzB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,IAAI,EAAE;AAAA,QAC1B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,IAAI,EAAE;AAAA,QAC1B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,IAAI,EAAE;AAAA,QAC1B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,IAAI,EAAE;AAAA,QAC1B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,IAAI,EAAE;AAAA,QAC1B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,2BAA2B,KAAK;AAAA,QACtC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,cAAc,IAAI,EAAE;AAAA,QAC1B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,kBAAkB;AAAA,QACxB,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,iBAAiB,KAAK;AAAA,QAC5B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,qBAAqB,KAAK;AAAA,QAChC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,qBAAqB,KAAK;AAAA,QAChC,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM,oBAAoB,KAAK;AAAA,QAC/B,SAAS,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MACrC;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,OAAkB;AAC5C,MAAI,MAAM,WAAW,MAAM,YAAY;AACrC,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,qBAAqB,KAAK;AACnC;AAEA,SAAS,0BACP,MACA,UACA,OACA,aACA,MACA,SACA;AACA,MAAI,SAAS,YAAY;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,iBAAkB,QAAQ,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,IAAM,QAAQ,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAM;AAClH,QAAM,aAAa,KAAK,IAAI,gBAAgB,GAAG,gBAAgB,cAAc,CAAC;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,MAEJ,cAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAO;AAAA,MACP,UAAS;AAAA,MACT,MAAM;AAAA,MACN,MAAM,aAAa;AAAA,MACnB,SAAS,OAAO,UAAU,IAAI,UAAU;AAAA,MAExC,uDAAC,UAAK,GAAG,WAAW,UAAU,IAAI,aAAa,CAAC,QAAQ,UAAU,MAAM,MAAM,OAAO;AAAA;AAAA,IAVhF;AAAA,EAWP;AAEJ;AAEA,SAAS,qBACP,WACA,OACA,gBAAkD,QAClD,YAAY,GACZ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,WAAW,UAAU,SAAS;AAAA,QAC9B,YAAY;AAAA,MACd;AAAA,MAEC,oBAAU,KAAK,IAAI,CAAC,KAAK,aACxB;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO;AAAA,YACL,OAAO,IAAI;AAAA,YACX,YAAY,IAAI;AAAA,YAChB,UAAU,IAAI,aAAa,GAAG,IAAI,aAAa,SAAS,OAAO;AAAA,YAC/D,WAAW,IAAI,SAAS,WAAW;AAAA,YACnC,YAAY,IAAI,OAAO,MAAM;AAAA,YAC7B,gBAAgB,IAAI,YAAY,cAAc;AAAA,UAChD;AAAA,UAEC,cAAI;AAAA;AAAA,QAVA;AAAA,MAWP,CACD;AAAA;AAAA,IArBI;AAAA,EAsBP;AAEJ;AAEA,SAAS,eAAe,MAAoC;AAC1D,SAAO;AAAA,IACL,QAAQ,KAAK,IAAI,mBAAmB,KAAK,MAAM;AAAA,IAC/C,MAAM,KAAK,IAAI,kBAAkB,KAAK,IAAI;AAAA,IAC1C,KAAK,KAAK,IAAI,eAAe,KAAK,GAAG;AAAA,IACrC,OAAO,KAAK,IAAI,mBAAmB,KAAK,KAAK;AAAA,EAC/C;AACF;AAEA,SAAS,wBAAwB,UAAyC,QAAgB,SAAsC;AAC9H,QAAM,SAAS,uBAAuB;AACtC,QAAM,QAA6B;AAAA,IACjC,iBAAiB;AAAA,IACjB,QAAQ,aAAa,MAAM;AAAA,IAC3B,cAAc;AAAA,IACd,QAAQ,oBAAoB,QAAQ;AAAA,IACpC,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,MAAM,CAAC;AAAA,EACf;AACA,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,SAAS,CAAC;AAAA,EAClB;AACA,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,OAAO,CAAC;AAAA,EAChB;AACA,MAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,UAAM,QAAQ,CAAC;AAAA,EACjB;AACA,MAAI,aAAa,OAAO,aAAa,KAAK;AACxC,UAAM,OAAO,cAAc,MAAM;AAAA,EACnC;AACA,MAAI,aAAa,OAAO,aAAa,KAAK;AACxC,UAAM,MAAM,cAAc,MAAM;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB;AAC3B,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,gBAAgB;AAC3C,MAAI,UAAU,SAAS,MAAM,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,WAAW,eAAe,OAAO,WAAW,8BAA8B,EAAE;AAC5F;AAEA,SAAS,mBAAmB;AAC1B,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,iBAAiB;AAEpE,EAAM,iBAAU,MAAM;AACpB,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,cAAc,kBAAkB,CAAC;AACtD,UAAM,aAAa,OAAO,WAAW,8BAA8B;AACnE,UAAM,WAAW,IAAI,iBAAiB,MAAM;AAE5C,aAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,iBAAiB,CAAC,SAAS,YAAY;AAAA,MACvC,YAAY;AAAA,IACd,CAAC;AAED,eAAW,mBAAmB,UAAU,MAAM;AAC9C,WAAO;AAEP,WAAO,MAAM;AACX,eAAS,WAAW;AACpB,iBAAW,sBAAsB,UAAU,MAAM;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,aAAa,eAAe;AACrC;AAEA,SAASC,aAAY,KAAqB;AACxC,MAAI,QAAQ;AACZ,MAAI,YAAY;AAEhB,SAAO,aAAa,GAAG;AACrB,YAAQ,OAAO,aAAa,KAAM,YAAY,EAAG,IAAI;AACrD,gBAAY,KAAK,MAAM,YAAY,EAAE,IAAI;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAASC,iBAAgB,MAA+B;AACtD,SAAO,GAAGD,aAAY,KAAK,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC;AAChD;AAEA,SAASE,sBAAqB,WAA2C;AACvE,QAAM,QAAQ,mBAAmB,KAAK,UAAU,KAAK,CAAC;AACtD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,YAAY,OAAO,IAAI;AAChC,MAAI,MAAM;AACV,aAAW,QAAQ,WAAW,YAAY,GAAG;AAC3C,UAAM,MAAM,MAAM,KAAK,WAAW,CAAC,IAAI;AAAA,EACzC;AAEA,SAAO;AAAA,IACL,KAAK,MAAM;AAAA,IACX,KAAK,OAAO,OAAO,IAAI;AAAA,EACzB;AACF;AAEA,SAASC,2BAA0B,OAAyC,KAAa,KAAa;AACpG,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,YAAY,GAAG;AACxC,MAAI,eAAe,QAAW;AAC5B,WAAO,MAAM,UAAU,UAAU,KAAK;AAAA,EACxC;AAEA,QAAM,aAAa,MAAM,YAAY,GAAG;AACxC,MAAI,eAAe,QAAW;AAC5B,WAAO,MAAM,UAAU,UAAU,KAAK;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAwB;AACtD,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI;AAC9D,QAAM,iBAAiB,WAAW,YAAY,GAAG;AACjD,MAAI,iBAAiB,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,WAAW,MAAM,GAAG,cAAc,EAAE,KAAK;AAC9D,QAAM,aAAa,WAAW,MAAM,iBAAiB,CAAC,EAAE,KAAK;AAC7D,QAAM,OAAOD,sBAAqB,UAAU;AAC5C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,aAAa,WAAW,GAAG,KAAK,aAAa,SAAS,GAAG,IACvE,aAAa,MAAM,GAAG,EAAE,EAAE,QAAQ,OAAO,GAAG,IAC5C;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASE,oBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,WAAW,GAAI,EACvB,QAAQ,UAAU,GAAI,EACtB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAASC,WAAU,MAA0D,cAAsD;AACjI,QAAM,QAAQ,qBAAqB,KAAK,OAA8C,YAAY,KAAK;AACvG,QAAM,WAAmC;AAAA,IACvC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACA,QAAM,WAAmC;AAAA,IACvC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,SAAO,GAAG,SAAS,KAAK,KAAK,KAAK,KAAK,IAAI,SAAS,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK;AACrF;AAEA,SAAS,cAAc,SAAwB;AAC7C,SAAO,QAAQ,YAAY,aAAa;AAC1C;AAEA,SAASC,eAAc,OAAgD;AACrE,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAM,WAAW,mBAAmB,KAAK,UAAU;AACnD,MAAI,UAAU;AACZ,UAAM,MAAM,SAAS,CAAC;AACtB,WAAO;AAAA,MACL,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MACnC,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MACnC,OAAO,SAAS,IAAI,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,WAAW,mEAAmE,KAAK,UAAU;AACnG,MAAI,UAAU;AACZ,WAAO;AAAA,MACL,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,MAC3D,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,MAC3D,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,WAAW,sGAAsG,KAAK,UAAU;AACtI,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,OAAQ,OAAO,WAAW,SAAS,CAAC,CAAC,IAAI,MAAO,OAAO,MAAM;AACnE,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,WAAW,SAAS,CAAC,CAAC,IAAI,GAAG,CAAC;AAChF,QAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,WAAW,SAAS,CAAC,CAAC,IAAI,GAAG,CAAC;AAC/E,SAAOC,UAAS,KAAK,YAAY,SAAS;AAC5C;AAEA,SAAS,kBAAkB,OAAe;AACxC,QAAM,MAAMD,eAAc,KAAK;AAC/B,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,KAAK,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY;AAC9C,UAAM,aAAa,UAAU;AAC7B,WAAO,cAAc,UAAU,aAAa,UAAU,aAAa,SAAS,UAAU;AAAA,EACxF,CAAC;AAED,SAAO,SAAS,MAAM,SAAS,QAAQ,SAAS;AAClD;AAEA,SAAS,cAAc,YAAoB,YAAoB;AAC7D,QAAM,sBAAsB,kBAAkB,UAAU;AACxD,QAAM,sBAAsB,kBAAkB,UAAU;AACxD,MAAI,wBAAwB,QAAQ,wBAAwB,MAAM;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,IAAI,qBAAqB,mBAAmB;AACjE,QAAM,SAAS,KAAK,IAAI,qBAAqB,mBAAmB;AAChE,UAAQ,UAAU,SAAS,SAAS;AACtC;AAEA,SAAS,yBACP,gBACA,iBACA,SACA;AACA,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,WAAO,kBAAkB;AAAA,EAC3B;AAEA,MAAI,CAAC,gBAAgB;AACnB,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,oBAAoB,cAAc,gBAAgB,eAAe;AACvE,QAAM,kBAAkB,cAAc,QAAQ,MAAM,eAAe;AACnE,MAAI,sBAAsB,QAAQ,qBAAqB,KAAK;AAC1D,WAAO;AAAA,EACT;AACA,MAAI,oBAAoB,SAAS,sBAAsB,QAAQ,kBAAkB,oBAAoB;AACnG,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO;AACT;AAiCA,SAASE,UAAS,GAAW,GAAW,GAAW;AACjD,MAAI,QAAQ;AACZ,MAAI,QAAQ,GAAG;AACb,aAAS;AAAA,EACX;AACA,MAAI,QAAQ,GAAG;AACb,aAAS;AAAA,EACX;AACA,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC3B;AACA,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO,KAAK,IAAI,MAAM,IAAI,IAAI,SAAS;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAASC,UAAS,KAAa,YAAoB,WAA6C;AAC9F,MAAI,eAAe,GAAG;AACpB,UAAM,OAAO,KAAK,MAAM,YAAY,GAAG;AACvC,WAAO,CAAC,MAAM,MAAM,IAAI;AAAA,EAC1B;AAEA,QAAM,IAAI,YAAY,MAAM,aAAa,IAAI,cAAc,YAAY,aAAa,YAAY;AAChG,QAAM,IAAI,IAAI,YAAY;AAE1B,SAAO;AAAA,IACL,KAAK,MAAMD,UAAS,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,GAAG;AAAA,IAC5C,KAAK,MAAMA,UAAS,GAAG,GAAG,GAAG,IAAI,GAAG;AAAA,IACpC,KAAK,MAAMA,UAAS,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,GAAG;AAAA,EAC9C;AACF;AAmBA,SAAS,oBAAoB,MAAc;AACzC,SAAO,YAAY,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC,MAAM;AAC5F;AAEA,SAAS,4BACP,MACA,cACA;AACA,QAAM,SAAS,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS;AAChE,MAAI,WAAW,SAAS;AACtB,WAAO,cAAc;AAAA,EACvB;AACA,MAAI,WAAW,SAAS;AACtB,WAAO,cAAc;AAAA,EACvB;AACA,SAAO;AACT;AAEA,SAAS,2BACP,MACA,cACA;AACA,QAAM,aAAa;AAAA,IACjB,OAAO,MAAM,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;AAAA,IACpD,4BAA4B,MAAM,YAAY,GAAG,KAAK,KAAK;AAAA,EAC7D,EAAE,OAAO,CAAC,OAAO,OAAO,UAAU,MAAM,SAAS,KAAK,MAAM,QAAQ,KAAK,MAAM,KAAK;AAEpF,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,WAAW,CAAC,GAAG,YAAY;AAC/C,MAAI,gBAAgB,WAAW;AAC7B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,SAAO;AAAA,IACL,GAAG,WAAW,IAAI,mBAAmB;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,6BAA6B,YAAqB;AACzD,QAAM,SAAS,OAAO,eAAe,YAAY,OAAO,SAAS,UAAU,IAAI,aAAa;AAC5F,MAAI,UAAU,IAAI;AAChB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,IAAI;AAChB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAe,SAAiD;AAC3F,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAS,UAAU,OAAO;AAC5B,UAAM,KAAK,kBAAkB,KAAK,EAAE;AAAA,EACtC;AACA,MAAI,SAAS,WAAW,OAAO;AAC7B,UAAM,KAAK,kBAAkB,KAAK,EAAE;AAAA,EACtC;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,eACP,OACA,SACA,cACA,SACqB;AACrB,QAAM,gBAAgB,SAAS,iBAAiB;AAChD,QAAM,cAAc,cAAc,OAAO,IACrC,uBAAuB,cAAc,OAAO,IAC5C,cAAc,cAAc,CAAC,KAAK;AACtC,QAAM,iBAAiB,gBAAgB,oBAAoB,QAAQ,MAAM,IAAI;AAC7E,QAAM,MAA2B;AAAA,IAC/B,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO,yBAAyB,MAAM,aAAa,OAAO;AAAA,IAC1D,YAAY,2BAA2B,EAAE,QAAQ,QAAQ,GAAG,YAAY,KAAK;AAAA,IAC7E,UAAU;AAAA,IACV,YAAY,OAAO,6BAA6B,EAAE,CAAC;AAAA,IACnD,UAAU;AAAA,IACV,SAAS;AAAA,IACT,cAAc;AAAA,IACd,eAAe;AAAA,IACf,YAAY;AAAA,EACd;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM;AACnB,MAAI,oBAAmC;AACvC,MAAI,kBAAkB;AACtB,MAAI,MAAM;AACR,UAAM,YAAY,yBAAyB,MAAM,YAAY;AAC7D,QAAI,UAAU,mBAAmB,UAAU,iBAAiB;AAC1D,wBAAkB;AAClB,0BAAoB,UAAU;AAC9B,UAAI,UAAU,iBAAiB;AAC7B,YAAI,kBAAkB,UAAU;AAAA,MAClC;AACA,UAAI,UAAU,iBAAiB;AAC7B,YAAI,kBAAkB,UAAU;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM;AACnB,MAAI,oBAAmC;AACvC,MAAI,qBAAqB;AACzB,MAAI,MAAM;AACR,QAAI,KAAK,MAAM;AACb,UAAI,aAAa;AAAA,IACnB;AACA,QAAI,KAAK,QAAQ;AACf,UAAI,YAAY;AAAA,IAClB;AACA,QAAI,KAAK,aAAa,KAAK,cAAc,QAAQ;AAC/C,UAAI,iBAAiB;AAAA,IACvB;AACA,QAAI,KAAK,eAAe;AACtB,UAAI,iBAAiB,GAAG,IAAI,kBAAkB,EAAE,gBAAgB,KAAK;AAAA,IACvE;AACA,UAAM,YAAY,qBAAqB,KAAK,OAA8C,YAAY;AACtG,QAAI,WAAW;AACb,0BAAoB;AACpB,UAAI,QAAQ;AAAA,IACd;AACA,QAAI,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,IAAI;AACrD,2BAAqB,KAAK;AAC1B,UAAI,WAAW,GAAG,KAAK,IAAI;AAAA,IAC7B,WAAW,OAAO,KAAK,SAAS,UAAU;AACxC,2BAAqB,KAAK;AAAA,IAC5B;AAEA,UAAM,aAAa,2BAA2B,MAAM,YAAY;AAChE,QAAI,YAAY;AACd,UAAI,aAAa;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,aAAa,OAAO,6BAA6B,kBAAkB,CAAC;AAExE,MAAI,cAAc,OAAO,KAAK,CAAC,IAAI,iBAAiB;AAClD,UAAM,2BAA2B,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB;AACjG,QAAI,QAAQ,yBAAyB,mBAAmB,0BAA0B,OAAO;AAAA,EAC3F,WAAW,CAAC,iBAAiB;AAC3B,QAAI,QAAQ,yBAAyB,mBAAmB,aAAa,OAAO;AAAA,EAC9E;AAEA,QAAM,YAAY,MAAM;AACxB,MAAI,WAAW;AACb,QAAI,UAAU,cAAc,UAAU,eAAe,WAAW;AAC9D,UAAI,YAAY,UAAU;AAAA,IAC5B;AACA,QAAI,UAAU,UAAU;AACtB,YAAM,cAAsC;AAAA,QAC1C,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,KAAK;AAAA,MACP;AACA,YAAM,gBAAgB,YAAY,OAAO,UAAU,QAAQ,CAAC;AAC5D,UAAI,eAAe;AACjB,YAAI,gBAAgB;AAAA,MACtB;AAAA,IACF;AACA,QAAI,UAAU,UAAU;AACtB,UAAI,aAAa;AACjB,UAAI,YAAY;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACrB,MAAI,QAAQ;AACV,UAAM,iBAAiB,QAAQ,OAAO,OAAO,SAAS,OAAO,MAAM,UAAU,MAAM;AACnF,UAAM,kBAAkB,QAAQ,OAAO,QAAQ,SAAS,OAAO,OAAO,UAAU,MAAM;AACtF,QAAI,kBAAkB,kBAAkB,kBAAkB;AACxD,UAAI,YAAY,oBAAoB,QAAQ,QAAQ;AAAA,QAClD,QAAQ,CAAC;AAAA,QACT,OAAO,CAAC;AAAA,MACV,CAAC,KAAK;AAAA,IACR;AACA,QAAI,OAAO,KAAK,SAAS,OAAO,IAAI,UAAU,QAAQ;AACpD,UAAI,YAAYE,WAAU,OAAO,KAA2D,YAAY;AAAA,IAC1G;AACA,QAAI,OAAO,OAAO,SAAS,OAAO,MAAM,UAAU,QAAQ;AACxD,UAAI,cAAcA,WAAU,OAAO,OAA6D,YAAY;AAAA,IAC9G;AACA,QAAI,OAAO,QAAQ,SAAS,OAAO,OAAO,UAAU,QAAQ;AAC1D,UAAI,eAAeA,WAAU,OAAO,QAA8D,YAAY;AAAA,IAChH;AACA,QAAI,OAAO,MAAM,SAAS,OAAO,KAAK,UAAU,QAAQ;AACtD,UAAI,aAAaA,WAAU,OAAO,MAA4D,YAAY;AAAA,IAC5G;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAI,oBAA8C;AAElD,SAAS,qBAAqB,SAAyC;AACrE,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QACZ,KAAK,EACL,MAAM,KAAK,EACX,IAAI,CAAC,UAAU,OAAO,WAAW,KAAK,CAAC,EACvC,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAE3C,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,OAAO,CAAC,IAAI;AAAA,EACrB;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,OAAO,CAAC,IAAI;AAAA,EACrB;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,OAAO,CAAC,IAAI;AAAA,EACrB;AACA,MAAI,OAAO,UAAU,GAAG;AACtB,WAAO,OAAO,CAAC,IAAI,OAAO,CAAC;AAAA,EAC7B;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA4B;AACnD,QAAM,YAAY,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAC1E,QAAM,aACJ,OAAO,MAAM,eAAe,YAAY,OAAO,MAAM,eAAe,WAAW,OAAO,MAAM,UAAU,IAAI;AAC5G,QAAM,WAAW,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AACvE,QAAM,aAAa,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC7E,SAAO,GAAG,SAAS,IAAI,UAAU,IAAI,QAAQ,IAAI,UAAU;AAC7D;AAEA,SAAS,iBAAiB,OAAe,OAA4B;AACnE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO,MAAM,SAAS;AAAA,EACxB;AAEA,wBAAsB,SAAS,cAAc,QAAQ;AACrD,QAAM,UAAU,kBAAkB,WAAW,IAAI;AACjD,MAAI,CAAC,SAAS;AACZ,WAAO,MAAM,SAAS;AAAA,EACxB;AAEA,UAAQ,OAAO,gBAAgB,KAAK;AACpC,SAAO,QAAQ,YAAY,KAAK,EAAE;AACpC;AAEA,SAAS,oBAAoB,MAAsB;AACjD,MAAI,CAAC,KAAK,SAAS,KAAK,WAAW,KAAK,qBAAqB,KAAK,MAAM,eAAe,YAAY;AACjG,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,KAAK,MAAM;AAC7B,MAAI,aAAa,cAAc,UAAU,cAAc,SAAS;AAC9D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,CAAC,KAAK,qBAAqB,CAAC,KAAK,WAAW,KAAK,MAAM,WAAW;AAC3E;AAEA,SAAS,oBAAoB,WAAsB,KAAa,KAAa,aAA4C;AACvH,QAAM,UAAU,UAAU,aAAa,KAAK,GAAG;AAC/C,QAAM,qBAAqB,UAAU,aAAa,sBAAsBC,iBAAgB,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI;AACzG,QAAM,YAAY,UAAU,oBAAoB,KAAK,GAAG;AACxD,MAAI,aAAa,EAAE,WAAW,uBAAuB,UAAa,UAAU,WAAW,GAAG,IAAI;AAC5F,WAAOC,oBAAmB,SAAS;AAAA,EACrC;AAEA,QAAM,YAAY,UAAU,qBAAqB,KAAK,GAAG;AACzD,MAAI,WAAW,uBAAuB,UAAa,UAAU,UAAU;AACrE,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU;AACtB,WAAO,UAAU,QAAQ,KAAK;AAAA,EAChC;AACA,MAAI,UAAU,UAAU;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,SAAS;AAC5B;AAEA,SAAS,oBAAoB,WAAsB,KAAa,KAAa;AAC3E,QAAM,YAAY,UAAU,qBAAqB,KAAK,GAAG;AACzD,MAAI,UAAU,WAAW;AACvB,WAAO,UAAU,SAAS,KAAK;AAAA,EACjC;AACA,MAAI,UAAU,YAAY;AACxB,WAAO,UAAU,UAAU,IAAI,IAAI;AAAA,EACrC;AACA,MAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,OAAO,UAAU,OAAO,KAAK,UAAU,SAAS,CAAC;AACrE,SAAO,OAAO,SAAS,WAAW,IAAI,cAAc;AACtD;AAEA,SAAS,oBAAoB,WAAsB,KAAa,KAAa;AAC3E,QAAM,YAAY,UAAU,qBAAqB,KAAK,GAAG;AACzD,MAAI,UAAU,YAAY;AACxB,WAAO,UAAU,UAAU,KAAK;AAAA,EAClC;AACA,MAAI,UAAU,WAAW;AACvB,UAAM,UAAU,UAAU,SAAS;AACnC,WAAO,WAAW,OAAO,OAAO,YAAY;AAAA,EAC9C;AACA,QAAM,QAAQ,UAAU,OAAO,KAAK,UAAU,SAAS,GAAG,KAAK,EAAE,YAAY;AAC7E,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AASA,SAAS,oBAAoB,OAAe,KAAa,KAAa;AACpE,MAAI,OAAO,KAAK;AACd,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAC7D;AAEA,SAAS,gBACP,WACA,QACA,SACA;AACA,QAAM,QAAQ;AACd,QAAM,SAAS;AACf,QAAM,aAAa,QAAQ;AAC3B,QAAM,cAAc,SAAS;AAC7B,QAAM,SAAS,OAAO,IAAI,CAAC,OAAO,WAAW,EAAE,OAAO,MAAM,EAAE,EAAE,OAAO,CAAC,UAAqD,OAAO,MAAM,UAAU,YAAY,OAAO,SAAS,MAAM,KAAK,CAAC;AAC5L,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,UAAU,iBAAiB;AACjD,QAAM,cAAc,UAAU,SAAS;AACvC,QAAM,cAAc,UAAU,eAAe;AAE7C,MAAI,UAAU,SAAS,WAAW;AAChC,UAAM,mBAAmB,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,OAAO,OAAO,MAAM,SAAS,IAAI,IAAI,GAAG,EAAE;AAC/F,UAAM,eAAe,KAAK,IAAI,GAAG,aAAa,KAAK,IAAI,iBAAiB,SAAS,KAAK,CAAC,CAAC;AACxF,UAAM,MAAM,iBAAiB,SAAS,KAAK,aAAa,eAAe,iBAAiB,WAAW,iBAAiB,SAAS,KAAK;AAClI,UAAM,YAAY;AAClB,UAAM,YAAY,SAAS;AAE3B,WACE,6CAAC,SAAI,eAAY,QAAO,QAAgB,OAAO,EAAE,SAAS,SAAS,UAAU,WAAW,OAAO,OAAO,GAAG,SAAS,OAAO,KAAK,IAAI,MAAM,IAAI,OAAM,QAC/I,2BAAiB,IAAI,CAAC,OAAO,UAAU;AACtC,YAAM,OAAO,IAAI,SAAS,eAAe,KAAK,IAAI,GAAG,GAAG;AACxD,YAAM,IAAI,MAAM,SAAS,IAAI,YAAY;AACzC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,QAAQ;AAAA,UACR,eAAc;AAAA,UACd,aAAa;AAAA,UACb,IAAI;AAAA,UACJ,IAAI,OAAO;AAAA,UACX,IAAI;AAAA,UACJ,IAAI;AAAA;AAAA,QAPC,iBAAiB,KAAK;AAAA,MAQ7B;AAAA,IAEJ,CAAC,GACH;AAAA,EAEJ;AAEA,MAAI,UAAU,SAAS,UAAU;AAC/B,UAAM,mBAAmB;AACzB,UAAMC,YAAW,KAAK,IAAI,GAAG,GAAG,iBAAiB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC5E,UAAMC,YAAW,KAAK,IAAI,GAAG,GAAG,iBAAiB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC5E,UAAM,QAAQ,IAAI,cAAc,oBAAoB,GAAGD,WAAUC,SAAQ,IAAI;AAC7E,UAAM,WAAW,KAAK,IAAI,GAAG,aAAa,KAAK,IAAI,iBAAiB,SAAS,KAAK,CAAC,CAAC;AACpF,UAAM,MAAM,iBAAiB,SAAS,KAAK,aAAa,WAAW,iBAAiB,WAAW,iBAAiB,SAAS,KAAK;AAE9H,WACE,8CAAC,SAAI,eAAY,QAAO,QAAgB,OAAO,EAAE,SAAS,SAAS,UAAU,WAAW,OAAO,OAAO,GAAG,SAAS,OAAO,KAAK,IAAI,MAAM,IAAI,OAAM,QAChJ;AAAA,mDAAC,UAAK,QAAQ,QAAQ,QAAQ,aAAa,GAAG,IAAI,GAAG,IAAI,QAAQ,GAAG,IAAI,OAAO,IAAI,OAAO;AAAA,MACzF,iBAAiB,IAAI,CAAC,OAAO,UAAU;AACtC,cAAM,OAAO,IAAI,SAAS,WAAW,KAAK,IAAI,GAAG,GAAG;AACpD,cAAM,IAAI,IAAI,cAAc,oBAAoB,MAAM,OAAOD,WAAUC,SAAQ,IAAI;AACnF,cAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAC7B,cAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC;AACjD,cAAM,OAAO,MAAM,QAAQ,IAAI,gBAAgB;AAC/C,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,QAAQ;AAAA,YAER,IAAI,UAAU,SAAS,WAAW,IAAI;AAAA,YACtC,IAAI,UAAU,SAAS,WAAW,IAAI;AAAA,YACtC,OAAO;AAAA,YACP,GAAG;AAAA,YACH,GAAG;AAAA;AAAA,UALE,aAAa,KAAK;AAAA,QAMzB;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,EAEJ;AAEA,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC/D,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAC/D,QAAM,QAAQ,OAAO,SAAS,IAAI,cAAc,OAAO,SAAS,KAAK;AACrE,QAAM,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AACxC,UAAM,IAAI,IAAI,QAAQ;AACtB,UAAM,IAAI,IAAI,cAAc,oBAAoB,MAAM,OAAO,UAAU,QAAQ,IAAI;AACnF,WAAO,GAAG,UAAU,IAAI,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EACnE,CAAC,EAAE,KAAK,GAAG;AAEX,QAAM,YAAY,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAChE,QAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC;AAE/D,SACE,8CAAC,SAAI,eAAY,QAAO,QAAgB,OAAO,EAAE,SAAS,SAAS,UAAU,WAAW,OAAO,OAAO,GAAG,SAAS,OAAO,KAAK,IAAI,MAAM,IAAI,OAAM,QAChJ;AAAA,iDAAC,UAAK,GAAG,MAAM,MAAK,QAAO,QAAQ,aAAa,eAAc,SAAQ,gBAAe,SAAQ,aAAa,KAAK;AAAA,IAC9G,UAAU,UAAU,OAAO,IAAI,CAAC,OAAO,UAAU;AAChD,YAAM,IAAI,IAAI,QAAQ;AACtB,YAAM,IAAI,IAAI,cAAc,oBAAoB,MAAM,OAAO,UAAU,QAAQ,IAAI;AACnF,UAAI,OAAO;AACX,UAAI,MAAM,UAAU,aAAa,UAAU,WAAW;AACpD,eAAO,UAAU;AAAA,MACnB,WAAW,MAAM,UAAU,YAAY,UAAU,UAAU;AACzD,eAAO,UAAU;AAAA,MACnB,WAAW,UAAU,KAAK,UAAU,YAAY;AAC9C,eAAO,UAAU;AAAA,MACnB,WAAW,UAAU,OAAO,SAAS,KAAK,UAAU,WAAW;AAC7D,eAAO,UAAU;AAAA,MACnB,WAAW,MAAM,QAAQ,KAAK,UAAU,YAAY,UAAU,eAAe;AAC3E,eAAO,UAAU;AAAA,MACnB;AACA,aAAO,6CAAC,YAAO,IAAI,GAAG,IAAI,GAAG,MAAyC,GAAG,QAA3B,eAAe,KAAK,EAAa;AAAA,IACjF,CAAC,IAAI;AAAA,KACP;AAEJ;AAEA,SAAS,qBAAqB,OAAgB;AAC5C,SAAO,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ;AACtF;AAEA,SAAS,SAAS,OAAgB;AAChC,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAK,QAAoC;AAC5G;AAEA,SAAS,0BAA0B,OAA8C;AAC/E,QAAM,YAAY,SAAS,KAAK;AAChC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,UAAU,OAAO,UAAU,aAAa,WAAW,UAAU,WAAW;AAAA,IACxE,QAAQ,OAAO,UAAU,WAAW,WAAW,UAAU,SAAS;AAAA,IAClE,SAAS,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU;AAAA,EACvE;AACF;AAEA,SAAS,0BAA0B,OAA8C;AAC/E,QAAM,YAAY,SAAS,KAAK;AAChC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,qBAAqB,UAAU,OAAO;AACtD,QAAM,UAAU,qBAAqB,UAAU,OAAO;AACtD,MAAI,YAAY,QAAQ,YAAY,MAAM;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB,SAAS,WAAW;AAAA,EACtB;AACF;AAEA,SAAS,0BACP,UACA,SACA,KACA,KACA,aACA;AACA,QAAM,QACJ,OAAO,aAAa,WAChBC,oBAAmB,QAAQ,IAC3B,aAAa,QAAQ,aAAa,SAChC,KACA,OAAO,QAAQ;AACvB,QAAM,qBAAqB,UAAU,aAAa,sBAAsBC,iBAAgB,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI;AAEzG,MAAI,WAAW,uBAAuB,UAAa,MAAM,WAAW,GAAG,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,MACA,aACA,UACA,QACsB;AACtB,QAAM,QAAQ,oBAAI,IAA6B;AAE/C,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,eAAW,YAAY,MAAkC;AACvD,YAAM,MAAM,qBAAqB,SAAS,KAAK;AAC/C,UAAI,QAAQ,QAAQ,CAAC,MAAM,QAAQ,SAAS,KAAK,GAAG;AAClD;AAAA,MACF;AAEA,iBAAW,aAAa,SAAS,OAAoC;AACnE,cAAM,MAAM,qBAAqB,UAAU,GAAG;AAC9C,YAAI,QAAQ,MAAM;AAChB;AAAA,QACF;AAEA,cAAM,UAAU,OAAO,UAAU,YAAY,WAAW,UAAU,UAAU;AAC5E,cAAM,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI;AAAA,UACzB;AAAA,UACA,WAAW,0BAA0B,UAAU,SAAS;AAAA,UACxD,mBAAmB,UAAU,sBAAsB;AAAA,UACnD,WAAW,0BAA0B,UAAU,SAAS;AAAA,UACxD,OAAO,SAAS,UAAU,KAAK;AAAA,UAC/B,OAAO,0BAA0B,UAAU,OAAO,SAAS,KAAK,KAAK,WAAW;AAAA,QAClF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAqB,KAAa,KAAa;AACrE,SAAO,OAAO;AAAA,IACZ,CAAC,UACC,OAAO,MAAM,MAAM,OACnB,OAAO,MAAM,IAAI,OACjB,OAAO,MAAM,MAAM,OACnB,OAAO,MAAM,IAAI;AAAA,EACrB,KAAK;AACP;AAEA,SAAS,uBACP,MACA,SACA;AACA,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,YAAqC;AAAA,IACzC,GAAI,QAAQ,CAAC;AAAA,IACb,GAAI,WAAW,CAAC;AAAA,EAClB;AAEA,QAAM,gBAAgB,MAAM;AAC5B,QAAM,mBAAmB,SAAS;AAClC,MAAI,iBAAiB,kBAAkB;AACrC,cAAU,YAAY;AAAA,MACpB,GAAI,iBAAiB,CAAC;AAAA,MACtB,GAAI,oBAAoB,CAAC;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACzB,QAAM,gBAAgB,SAAS;AAC/B,MAAI,cAAc,eAAe;AAC/B,cAAU,SAAS;AAAA,MACjB,GAAI,cAAc,CAAC;AAAA,MACnB,GAAI,iBAAiB,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,cAAc,SAAS;AAC7B,MAAI,YAAY,aAAa;AAC3B,cAAU,OAAO,eAAe;AAAA,EAClC;AAEA,QAAM,WAAW,MAAM;AACvB,QAAM,cAAc,SAAS;AAC7B,MAAI,YAAY,aAAa;AAC3B,cAAU,OAAO;AAAA,MACf,GAAI,YAAY,CAAC;AAAA,MACjB,GAAI,eAAe,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBACP,OACA,OACA,KACA,KACA;AACA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM;AACrB,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,aAAsD,EAAE,GAAG,OAAO;AACxE,MAAI,WAAW,YAAY;AACzB,QAAI,MAAM,MAAM,IAAI,KAAK;AACvB,iBAAW,SAAS,WAAW,UAAU,WAAW;AAAA,IACtD;AACA,WAAO,WAAW;AAAA,EACpB;AACA,MAAI,WAAW,UAAU;AACvB,QAAI,MAAM,MAAM,IAAI,KAAK;AACvB,iBAAW,QAAQ,WAAW,SAAS,WAAW;AAAA,IACpD;AACA,WAAO,WAAW;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,sBACP,OACA,KACA,KACA,aACA;AACA,MAAI,CAAC,SAAS,CAAC,aAAa;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,WAAW;AACnC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,YAAY,iBAAiB,SAAS;AACzD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,WAA2C;AAC/C,QAAM,eAAe,CAAC,aAAqB,UAAU,SAAS;AAC5D,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,YAAY,yBAAyB,WAAW,WAAW,KAAK,MAAM,OAAO,KAAK,GAAG;AAC3F,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AACA,eAAW,uBAAuB,UAAU,SAAS;AAAA,EACvD;AAEA,eAAa,YAAY;AACzB,eAAa,eAAe,QAAQ,MAAM,WAAW,eAAe,KAAK,QAAQ,MAAM,MAAM,GAAG;AAChG,eAAa,cAAc,QAAQ,MAAM,WAAW,cAAc,KAAK,QAAQ,MAAM,IAAI,GAAG;AAE5F,QAAM,iBAAiB,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvD,QAAM,cAAc,OAAO,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;AACtE,eAAa,aAAa,WAAW;AAErC,MAAI,eAAe,MAAM,oBAAoB;AAC3C,UAAM,mBAAmB,YAAY,qBAAqB,MAAM,kBAAkB;AAClF,QAAI,kBAAkB;AACpB,iBAAW,uBAAuB,UAAU,gBAAgB;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,MAAM,gBAAgB;AACxB,UAAM,iBAAiB,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvD,iBAAa,YAAY,MAAM,MAAM,IAAI,MAAM,cAAc;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAyB,KAAa,KAAqC;AACvG,MAAI,CAAC,SAAS,QAAQ,MAAM,MAAM,KAAK;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,SAAO,MAAM,QAAQ,KAAK,KAAK;AACjC;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM;AACb,4BAAc;AACd,oBAAM;AAAA,YACR;AAAA,YACA,OAAO;AAAA,cACL,YAAY,cAAc,cAAc,4BAA4B;AAAA,cACpE,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAW;AAAA,YACb;AAAA,YACA,MAAK;AAAA,YACN;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM;AACb,6BAAe;AACf,oBAAM;AAAA,YACR;AAAA,YACA,OAAO;AAAA,cACL,YAAY,cAAc,eAAe,4BAA4B;AAAA,cACrE,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,SAAS;AAAA,cACT,WAAW;AAAA,YACb;AAAA,YACA,MAAK;AAAA,YACN;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,eAAe,EAAE,YAAY,QAAQ,GAAiE;AAC7G,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SACE,8EACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,iBAAiB,QAAQ;AAAA,UACzB,cAAc,aAAa,QAAQ,MAAM;AAAA,UACzC,OAAO,QAAQ;AAAA,UACf,SAAS;AAAA,UACT,KAAK;AAAA,UACL,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,SAAS;AAAA,QACX;AAAA,QAEA;AAAA,uDAAC,SAAI,OAAO,EAAE,UAAU,EAAE,GACxB;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO,QAAQ;AAAA,gBACf,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,YAAY;AAAA,cACd;AAAA,cAEC;AAAA;AAAA,UACH,GACF;AAAA,UACA,8CAAC,SAAI,OAAO,EAAE,YAAY,UAAU,SAAS,QAAQ,KAAK,EAAE,GAC1D;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,YAAY,QAAQ;AAAA,kBACpB,QAAQ,aAAa,QAAQ,YAAY;AAAA,kBACzC,cAAc;AAAA,kBACd,SAAS;AAAA,kBACT,UAAU;AAAA,gBACZ;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,UAAU,CAAC;AAAA,sBACX,SAAS;AAAA,sBACT,OAAO;AAAA,wBACL,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,OAAO,aAAa,QAAQ,aAAa,QAAQ;AAAA,wBACjD,QAAQ,aAAa,YAAY;AAAA,wBACjC,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,SAAS;AAAA,sBACX;AAAA,sBACA,MAAK;AAAA,sBACN;AAAA;AAAA,kBAED;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS;AAAA,sBACT,OAAO;AAAA,wBACL,YAAY,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,gBAAgB,IAAI,gBAAgB,QAAQ;AAAA,wBAC7F,QAAQ;AAAA,wBACR,YAAY,aAAa,QAAQ,YAAY;AAAA,wBAC7C,aAAa,aAAa,QAAQ,YAAY;AAAA,wBAC9C,OAAO,QAAQ;AAAA,wBACf,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,UAAU;AAAA,wBACV,SAAS;AAAA,sBACX;AAAA,sBACA,MAAK;AAAA,sBAEJ,0BAAgB,SAAS;AAAA;AAAA,kBAC5B;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,UAAU,CAAC;AAAA,sBACX,SAAS;AAAA,sBACT,OAAO;AAAA,wBACL,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,OAAO,YAAY,QAAQ,aAAa,QAAQ;AAAA,wBAChD,QAAQ,YAAY,YAAY;AAAA,wBAChC,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,SAAS;AAAA,sBACX;AAAA,sBACA,MAAK;AAAA,sBACN;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YACF;AAAA,YACC,cACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,OAAO;AAAA,kBACL,YAAY,QAAQ;AAAA,kBACpB,QAAQ,aAAa,QAAQ,YAAY;AAAA,kBACzC,cAAc;AAAA,kBACd,OAAO,QAAQ;AAAA,kBACf,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS;AAAA,gBACX;AAAA,gBACA,MAAK;AAAA,gBACN;AAAA;AAAA,YAED,IACE;AAAA,aACN;AAAA;AAAA;AAAA,IACF;AAAA,IACC,KAAK,SAAS,IACb;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,iBAAiB,QAAQ;AAAA,UACzB,cAAc,aAAa,QAAQ,MAAM;AAAA,UACzC,SAAS;AAAA,UACT,KAAK;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,QACX;AAAA,QAEC,eAAK,IAAI,CAAC,KAAK,UACd;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,kBAAkB,KAAK;AAAA,YACtC,OAAO;AAAA,cACL,iBAAiB,UAAU,iBAAiB,QAAQ,qBAAqB,QAAQ;AAAA,cACjF,QAAQ,aAAa,UAAU,iBAAiB,QAAQ,eAAe,aAAa;AAAA,cACpF,cAAc;AAAA,cACd,WAAW,UAAU,iBAAiB,QAAQ,SAAS;AAAA,cACvD,OAAO,UAAU,iBAAiB,QAAQ,kBAAkB,QAAQ;AAAA,cACpE,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,YAAY;AAAA,YACd;AAAA,YACA,MAAK;AAAA,YAEJ,cAAI;AAAA;AAAA,UAhBA,IAAI;AAAA,QAiBX,CACD;AAAA;AAAA,IACH,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,eACP,SACA,oBACA,YACA,SACA;AACA,MAAI,OAAO,YAAY,YAAY;AACjC,WAAO,QAAQ,UAAU;AAAA,EAC3B;AAEA,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,6CAAC,kBAAe,YAAwB,SAAkB;AACnE;AAEA,SAAS,YAAY,YAA2C,OAAc,SAAwB;AACpG,MAAI,OAAO,eAAe,YAAY;AACpC,WAAO,WAAW,KAAK;AAAA,EACzB;AACA,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MAEC,gBAAM;AAAA;AAAA,EACT;AAEJ;AAEA,SAAS,cACP,kBACA,cACA,SACA;AACA,MAAI,qBAAqB,QAAW;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACD;AAAA;AAAA,EAED;AAEJ;AAEA,SAAS,YAAY,YAA2C,SAAwB;AACtF,MAAI,eAAe,QAAW;AAC5B,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MACD;AAAA;AAAA,EAED;AAEJ;AAEA,SAASC,mBAAkB,OAAe;AACxC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,MAAI,QAAQ;AACZ,MAAI,YAAY;AAChB,SAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,aAAS;AACT,iBAAa;AAAA,EACf;AAEA,SAAO,GAAG,SAAS,MAAM,cAAc,IAAI,MAAM,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AACpG;AAEA,SAAS,mBACP,mBACA,aAKA,SACA;AACA,QAAM,cACJ;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,qDAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,MAAM,YAAY,IAAI,GAChD,sBAAY,iBACf;AAAA,QACA,8CAAC,SAAI;AAAA;AAAA,UACQA,mBAAkB,YAAY,aAAa;AAAA,UAAE;AAAA,UAAiC;AAAA,UACxFA,mBAAkB,YAAY,gBAAgB;AAAA,UAAE;AAAA,WACnD;AAAA;AAAA;AAAA,EACF;AAGF,MAAI,OAAO,sBAAsB,YAAY;AAC3C,WAAO,kBAAkB;AAAA,MACvB;AAAA,MACA,iBAAiB,YAAY;AAAA,MAC7B,eAAe,YAAY;AAAA,MAC3B,kBAAkB,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,MAAI,sBAAsB,QAAW;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,MAAqB;AAC1D,QAAM,OAAO,CAAC,IAAI,IAAI,EAAE;AACxB,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzE,QAAM,SAAS;AAEf,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,WAAW;AAAA,QACX,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,KAAK;AAAA,YACL,gBAAgB;AAAA,UAClB;AAAA,UAEC,eAAK,IAAI,CAAC,UAAU,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO;AAAA,gBACL,iBAAiB;AAAA,gBACjB,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,OAAO;AAAA,cACT;AAAA;AAAA,YANK;AAAA,UAOP,CACC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,uBACP,oBACA,OACA,MACA;AACA,QAAM,cAAc,8BAA8B,IAAI;AACtD,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,mBAAmB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,OAAe;AAClC,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,SAAO,QAAQ,QAAQ,YAAY,MAAM,SAAS,GAAG;AACnD,YAAQ;AACR,iBAAa;AAAA,EACf;AAEA,SAAO,GAAG,QAAQ,MAAM,cAAc,IAAI,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC;AACjG;AAEA,SAAS,mBACP,YACA,SACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,SAAS;AAAA,MACX;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,iBAAiB,QAAQ;AAAA,YACzB,QAAQ,aAAa,QAAQ,YAAY;AAAA,YACzC,cAAc;AAAA,YACd,WAAW,QAAQ;AAAA,YACnB,UAAU;AAAA,YACV,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UAEA;AAAA,yDAAC,SAAI,OAAO,EAAE,UAAU,IAAI,YAAY,IAAI,GAAG,qCAAuB;AAAA,YACtE,8CAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,WAAW,UAAU,IAAI,YAAY,KAAK,WAAW,EAAE,GAAG;AAAA;AAAA,cACnE,YAAY,WAAW,wBAAwB,CAAC;AAAA,cAAE;AAAA,eACtE;AAAA,YACA,6CAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,WAAW,UAAU,IAAI,YAAY,KAAK,WAAW,EAAE,GAAG,uHAEvF;AAAA,YACA,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,IAAI,WAAW,GAAG,GACpD;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,WAAW;AAAA,gBACpB,OAAO;AAAA,kBACL,YAAY,QAAQ;AAAA,kBACpB,QAAQ,aAAa,QAAQ,YAAY;AAAA,kBACzC,cAAc;AAAA,kBACd,OAAO,QAAQ;AAAA,kBACf,QAAQ,WAAW,kBAAkB,YAAY;AAAA,kBACjD,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,SAAS,WAAW,kBAAkB,IAAI;AAAA,kBAC1C,SAAS;AAAA,gBACX;AAAA,gBACA,MAAK;AAAA,gBACN;AAAA;AAAA,YAED,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,uBAAuB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,SAAS,mBAAmB,cAAc,OAAO,IAAI,YAAY;AACvE,QAAM,OACJ,sBACA,sBAAsB,MAAM,IAAI,cAAc,OAAO,IAAI,QAAQ,KAAK;AACxE,QAAM,SACJ,wBACA,sBAAsB,MAAM,IAAI,cAAc,OAAO,IAAI,QAAQ,KAAK,KAAK,QAAQ,aAAa;AAElG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAgDA,SAAS,8BAA8B,MAAuD;AAC5F,SAAO,GAAG,KAAK,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,OAC1C,IAAI,CAAC,UAAU,GAAG,MAAM,MAAM,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,EACxF,KAAK,GAAG,CAAC;AACd;AAEA,SAAS,gCACP,WACA,eACA;AACA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ;AAC9E,MAAI,UAAU,SAAS,SAAS,UAAU,SAAS,WAAW;AAC5D,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,IAAI,GAAG,aAAa;AAC1C,QAAM,WAAW,KAAK,IAAI,GAAG,aAAa;AAC1C,MAAI,UAAU,SAAS,OAAO;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS,OAAO;AAC5B,WAAO;AAAA,EACT;AAEA,OAAK,UAAU,SAAS,aAAa,UAAU,SAAS,iBAAiB,kBAAkB,MAAM;AAC/F,WAAO,YAAY,WAAW,aAAa,gBAAgB;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAiB,QAAuE;AACpH,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK,kBAAkB;AACrB,YAAM,cAAc;AAAA,QAClB,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,MACvD;AACA,aAAO,YAAY,MAAM,KAAK,YAAY,YAAY,SAAS,CAAC,KAAK;AAAA,IACvE;AAAA,IACA,KAAK;AAAA,IACL,KAAK,mBAAmB;AACtB,YAAM,cAAc;AAAA,QAClB,EAAE,iBAAiB,WAAW,aAAa,YAAY,oBAAoB,YAAY,UAAU;AAAA,QACjG,EAAE,iBAAiB,WAAW,aAAa,YAAY,oBAAoB,YAAY,UAAU;AAAA,QACjG,EAAE,iBAAiB,WAAW,aAAa,YAAY,oBAAoB,YAAY,UAAU;AAAA,MACnG;AACA,aAAO,YAAY,MAAM,KAAK,YAAY,YAAY,SAAS,CAAC,KAAK;AAAA,IACvE;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,cAAc;AAAA,QAClB,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,MACvD;AACA,aAAO,YAAY,MAAM,KAAK,YAAY,YAAY,SAAS,CAAC,KAAK;AAAA,IACvE;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,EAAE,iBAAiB,WAAW,OAAO,WAAW,OAAO,SAAI;AAAA,QAC3D,EAAE,iBAAiB,WAAW,OAAO,WAAW,OAAO,IAAI;AAAA,QAC3D,EAAE,iBAAiB,WAAW,OAAO,WAAW,OAAO,OAAI;AAAA,MAC7D,EAAE,MAAM,KAAK;AAAA,IACf,KAAK;AACH,aAAO;AAAA,QACL,EAAE,OAAO,WAAW,OAAO,SAAI;AAAA,QAC/B,EAAE,OAAO,WAAW,OAAO,IAAI;AAAA,QAC/B,EAAE,OAAO,WAAW,OAAO,OAAI;AAAA,MACjC,EAAE,MAAM,KAAK;AAAA,IACf,KAAK;AACH,aAAO;AAAA,QACL,EAAE,iBAAiB,WAAW,aAAa,UAAU;AAAA,QACrD,EAAE,iBAAiB,WAAW,aAAa,WAAW,OAAO,UAAK,OAAO,UAAU;AAAA,QACnF,EAAE,iBAAiB,WAAW,aAAa,WAAW,OAAO,UAAK,OAAO,UAAU;AAAA,MACrF,EAAE,MAAM,KAAK;AAAA,IACf;AACE,UAAI,QAAQ,SAAS,QAAQ,GAAG;AAC9B,cAAM,cAAc,QAAQ,SAAS,MAAM,IACvC,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS,IACtD,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAC1D,cAAM,iBAAiB,QAAQ,WAAW,GAAG,IACzC,CAAC,KAAK,GAAG,EAAE,IACX,QAAQ,WAAW,GAAG,IACpB,CAAC,KAAK,KAAK,IAAI,EAAE,IACjB,CAAC,KAAK,KAAK,GAAG,IAAI,EAAE;AAC1B,cAAM,gBAAgB,KAAK,IAAI,QAAQ,YAAY,SAAS,GAAG,eAAe,SAAS,CAAC;AACxF,eAAO;AAAA,UACL,aAAa,QAAQ,SAAS,MAAM,IAAI,YAAYC,aAAY,YAAY,aAAa,KAAK,WAAW,IAAI;AAAA,UAC7G,OAAO,YAAY,aAAa;AAAA,UAChC,aAAa,eAAe,aAAa,KAAK;AAAA,UAC9C,OAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,QACL,iBAAiB;AAAA,QACjB,aAAa;AAAA,MACf;AAAA,EACJ;AACF;AAEA,SAAS,sBAAsB,MAAsD;AACnF,MAAI,KAAK,UAAU,SAAS;AAC1B,UAAM,OAAO,KAAK,SAAS;AAC3B,UAAM,SAAS,KAAK,eAAeA,aAAY,MAAM,IAAI;AACzD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,QAAQ;AAAA,QACR,OAAO,EAAE,SAAS,QAAQ;AAAA,QAC1B,SAAQ;AAAA,QACR,OAAO;AAAA,QAEP,uDAAC,OAAE,WAAW,UAAU,KAAK,eAAe,CAAC,SAC3C;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF;AAAA,YACA;AAAA,YACA,gBAAe;AAAA,YACf,aAAa;AAAA;AAAA,QACf,GACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACA,MAAI,KAAK,OAAO;AACd,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO,KAAK,SAAS;AAAA,UACrB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,OAAO;AAAA,QACT;AAAA,QAEC,eAAK;AAAA;AAAA,IACR;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,iBAAiB,KAAK,mBAAmB;AAAA,QACzC,QAAQ,KAAK,cAAc,aAAa,KAAK,WAAW,KAAK;AAAA,QAC7D,cAAc;AAAA,QACd,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,sBAAsB,SAAkB,SAAwB;AACvE,QAAM,SAAS,cAAc,OAAO,IAAI,YAAY;AACpD,QAAM,OAAO,UAAW,cAAc,OAAO,IAAI,YAAY,YAAa;AAC1E,QAAM,QAAQ,cAAc,OAAO,IAAI,YAAY;AACnD,SACE,8CAAC,SAAI,eAAY,QAAO,QAAQ,IAAI,OAAO,EAAE,SAAS,QAAQ,GAAG,SAAQ,aAAY,OAAO,IAC1F;AAAA,iDAAC,UAAK,MAAY,QAAQ,IAAI,IAAI,GAAG,IAAI,GAAG,QAAgB,aAAa,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG,KAAK;AAAA,IACxG,UACC;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAQ;AAAA,QACR,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAa;AAAA;AAAA,IACf,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,iCACP,KACA,KACA,WACA,OACA,cACsC;AACtC,QAAM,QAAQ,OAAO,0BAA0B,CAAC;AAChD,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,SACC,KAAK,SAAS,aAAa,KAAK,OAAO,KAAK,CAAC,UAAU,cAAc,EAAE,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAC7F;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAoB,WAAW,KAAK,GAAG;AAC5D,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,8BAA8B,YAAY;AAC3D,MAAI,aAAa,aAAa,IAAI,QAAQ;AAC1C,MAAI,CAAC,YAAY;AACf,iBAAa,aAAa,OAAO,QAAQ,CAAC,UAAU;AAClD,YAAM,SAAmB,CAAC;AAC1B,eAAS,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,KAAK,aAAa,GAAG;AAChF,iBAAS,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,KAAK,aAAa,GAAG;AAChF,gBAAM,QAAQ,oBAAoB,WAAW,WAAW,SAAS;AACjE,cAAI,UAAU,MAAM;AAClB,mBAAO,KAAK,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AACD,iBAAa,IAAI,UAAU,UAAU;AAAA,EACvC;AAEA,QAAM,WAAW,gCAAgC,aAAa,MAAM,CAAC,GAAG,UAAU;AAClF,QAAM,WAAW,gCAAgC,aAAa,MAAM,aAAa,MAAM,SAAS,CAAC,GAAG,UAAU;AAC9G,MAAI,aAAa,QAAQ,aAAa,MAAM;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,SAAS,aAAa,aAAa,OAAO,GAAG,IAAK,aAAa,aAAa,IAAK;AAC1G,QAAM,YAAY,OAAO,SAAS,aAAa,aAAa,OAAO,GAAG,IAAK,aAAa,aAAa,MAAO;AAC5G,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ,SAAS,IAAK,gBAAgB,WAAW,IAAI,KAAM,eAAe,YAAY;AAC5F,QAAM,eAAe,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,KAAK,YAAY;AAChF,QAAM,QAAQ,qBAAqB,aAAa,OAAO,OAAO,YAAY;AAC1E,MAAI,CAAC,SAAS,gBAAgB,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,qBAAqB,aAAa,WAAW,OAAO,YAAY,KAAK;AAAA,IAChF,QAAQ,aAAa,UAAU;AAAA,IAC/B,aAAa,qBAAqB,aAAa,aAAa,OAAO,YAAY,KAAK;AAAA,IACpF;AAAA,IACA,UAAU,aAAa,YAAY;AAAA,IACnC,qBAAqB,qBAAqB,aAAa,qBAAqB,OAAO,YAAY,KAAK;AAAA,IACpG,mBAAmB,qBAAqB,aAAa,mBAAmB,OAAO,YAAY,KAAK;AAAA,IAChG;AAAA,EACF;AACF;AAEA,SAAS,oCACP,KACA,KACA,WACA,OACA,cACyC;AACzC,QAAM,QAAQ,OAAO,0BAA0B,CAAC;AAChD,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,SACC,KAAK,SAAS,gBAAgB,KAAK,OAAO,KAAK,CAAC,UAAU,cAAc,EAAE,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAChG;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAoB,WAAW,KAAK,GAAG;AAC5D,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,8BAA8B,YAAY;AAC3D,MAAI,aAAa,aAAa,IAAI,QAAQ;AAC1C,MAAI,CAAC,YAAY;AACf,iBAAa,aAAa,OAAO,QAAQ,CAAC,UAAU;AAClD,YAAM,SAAmB,CAAC;AAC1B,eAAS,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,KAAK,aAAa,GAAG;AAChF,iBAAS,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,KAAK,aAAa,GAAG;AAChF,gBAAM,QAAQ,oBAAoB,WAAW,WAAW,SAAS;AACjE,cAAI,UAAU,MAAM;AAClB,mBAAO,KAAK,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AACD,iBAAa,IAAI,UAAU,UAAU;AAAA,EACvC;AAEA,QAAM,SAAS,aAAa,OACzB,IAAI,CAAC,UAAU,qBAAqB,OAAO,OAAO,YAAY,CAAC,EAC/D,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAC/D,QAAM,aAAa,aAAa,MAC7B,IAAI,CAAC,cAAc,gCAAgC,WAAW,UAAU,CAAC,EACzE,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AACzF,MAAI,OAAO,SAAS,KAAK,WAAW,SAAS,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,IAAI,OAAO,QAAQ,WAAW,MAAM,IAAI;AAC9D,MAAI,gBAAgB,OAAO,OAAO,SAAS,CAAC;AAC5C,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,UAAM,aAAa,WAAW,KAAK,KAAK,WAAW,CAAC;AACpD,UAAM,WAAW,WAAW,QAAQ,CAAC,KAAK,WAAW,WAAW,SAAS,CAAC;AAC1E,QAAI,gBAAgB,YAAY,UAAU,WAAW,GAAG;AACtD,YAAM,QAAQ,aAAa,aAAa,KAAK,eAAe,eAAe,WAAW;AACtF,sBAAgBC,aAAY,OAAO,KAAK,KAAK,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,KAAK,OAAO,OAAO,SAAS,CAAC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC;AACvI;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,cAAc;AAChC;AAEA,SAAS,8BACP,KACA,KACA,WACA,OACA,cACmC;AACnC,QAAM,QAAQ,OAAO,0BAA0B,CAAC;AAChD,QAAM,eAAe,MAAM;AAAA,IACzB,CAAC,SACC,KAAK,SAAS,aAAa,KAAK,OAAO,KAAK,CAAC,UAAU,cAAc,EAAE,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAC7F;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAoB,WAAW,KAAK,GAAG;AAC5D,MAAI,iBAAiB,MAAM;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,8BAA8B,YAAY;AAC3D,MAAI,aAAa,aAAa,IAAI,QAAQ;AAC1C,MAAI,CAAC,YAAY;AACf,iBAAa,aAAa,OAAO,QAAQ,CAAC,UAAU;AAClD,YAAM,SAAmB,CAAC;AAC1B,eAAS,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,KAAK,aAAa,GAAG;AAChF,iBAAS,YAAY,MAAM,MAAM,KAAK,aAAa,MAAM,IAAI,KAAK,aAAa,GAAG;AAChF,gBAAM,QAAQ,oBAAoB,WAAW,WAAW,SAAS;AACjE,cAAI,UAAU,MAAM;AAClB,mBAAO,KAAK,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AACD,iBAAa,IAAI,UAAU,UAAU;AAAA,EACvC;AAEA,QAAM,aAAa,aAAa,MAAM,IAAI,CAAC,cAAc,gCAAgC,WAAW,UAAU,CAAC;AAC/G,MAAI,gBAAgB;AACpB,aAAW,QAAQ,CAAC,WAAW,UAAU;AACvC,QAAI,cAAc,QAAQ,gBAAgB,WAAW;AACnD,sBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,QAAM,YAAY,aAAa,UAC3B,KAAK,IAAI,GAAG,aAAa,MAAM,SAAS,IAAI,aAAa,IACzD;AACJ,QAAM,OAAO,aAAa,MAAM,KAAK,IAAI,WAAW,aAAa,MAAM,SAAS,CAAC,CAAC;AAClF,SAAO,OAAO,qBAAqB,KAAK,SAAS,KAAK,MAAM,IAAI;AAClE;AAEA,SAAS,0BACP,KACA,KACA,OAC8B;AAC9B,QAAM,aAAa,OAAO,gBAAgB,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,CAAC,UAAU,cAAc,EAAE,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC;AAC1H,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,WAAW,cAAc,WAAW,YAAY,EAAE;AAAA,IACtE,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,EACjF;AAEA,SAAO;AAAA,IACL,SAAS,aAAa,KAAK,IAAI;AAAA,IAC/B,cAAc,WAAW,iBAAiB;AAAA,IAC1C,gBAAgB,WAAW;AAAA,EAC7B;AACF;AAEA,SAAS,0BAA0B,eAAqD;AACtF,MAAI,kBAAkB,UAAU;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,OAAO;AAC3B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AA0CA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiB;AACf,QAAM,wBAAwB,kBAAkB,QAAQ,MAAM,oBAAoB,QAAQ,MAAM;AAEhG,SACE,8CAAC,QAAG,iBAAe,WAAW,OAAO,EAAE,QAAQ,UAAU,GACvD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,CAAC,YAAY,eAAe,WAAW,OAAO;AAAA,QACnD,eAAe,CAAC,UAAU,iBAAiB,OAAO,SAAS;AAAA,QAC3D,OAAO;AAAA,UACL,iBAAiB,QAAQ;AAAA,UACzB,cAAc;AAAA,UACd,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,OAAO,QAAQ;AAAA,UACf,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,WAAW;AAAA,UACX,UAAU;AAAA,UACV,SAAS;AAAA,UACT,UAAU;AAAA,UACV,KAAK;AAAA,UACL,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ,cAAc,SAAY,KAAK;AAAA,QACzC;AAAA,QAEA,wDAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GAChC;AAAA,sBAAY;AAAA,UACb;AAAA,YAAC;AAAA;AAAA,cACC,eAAe,CAAC,UAAU,uBAAuB,OAAO,WAAW,SAAS;AAAA,cAC5E,OAAO;AAAA,gBACL,iBAAiB;AAAA,gBACjB,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,QAAQ;AAAA,cACV;AAAA;AAAA,UACF;AAAA,WACF;AAAA;AAAA,IACF;AAAA,IACC,qBAAqB,IACpB;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA;AAAA,IACF,IACE;AAAA,IACH,YAAY,IAAI,CAAC,EAAE,WAAW,IAAI,MAAM;AACvC,YAAM,WAAW,YAAY,WAAW,SAAS;AACjD,UAAI,SAAS,mBAAmB;AAC9B,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,EAAE,KAAK,WAAW,KAAK,UAAU;AAC9C,YAAM,YAAY,WAAW,aAAa,IAAI;AAC9C,YAAM,aAAa,QAAQ,SAAS,cAAc,SAAS,aAAa,CAAC;AACzE,YAAM,YAAY,sBAAsB,oBAAoB,IAAI,IAAI;AACpE,YAAM,aAAa,gBAAgB,IAAI,SAAS;AAChD,YAAM,kBAAkB,YAAY,KAAK;AACzC,YAAM,uBAAuB;AAC7B,YAAM,YAAiC;AAAA,QACrC,GAAG,SAAS;AAAA,QACZ,WAAW;AAAA,QACX,QAAQ,YAAY,SAAS,SAAS,YAAY,YAAY;AAAA,MAChE;AAEA,UAAI,CAAC,SAAS,SAAS;AACrB,kBAAU,SAAS;AACnB,kBAAU,YAAY;AAAA,MACxB;AAEA,UAAI,YAAY;AACd,kBAAU,WAAW;AACrB,kBAAU,SAAS;AAAA,MACrB;AACA,UAAI,SAAS,uBAAuB;AAClC,kBAAU,kBAAkB,SAAS,sBAAsB;AAAA,MAC7D;AACA,UAAI,SAAS,yBAAyB,SAAS,sBAAsB,SAAS,iBAAiB;AAC7F,kBAAU,WAAW;AAAA,MACvB;AACA,UAAI,SAAS,eAAe;AAC1B,kBAAU,WAAW;AACrB,kBAAU,SAAS,KAAK,IAAI,OAAO,UAAU,UAAU,CAAC,GAAG,CAAC;AAAA,MAC9D;AACA,UAAI,cAAc,QAAW;AAC3B,kBAAU,WAAW;AACrB,kBAAU,MAAM;AAChB,kBAAU,SAAS,KAAK,IAAI,OAAO,UAAU,UAAU,CAAC,GAAG,EAAE;AAAA,MAC/D;AACA,UAAI,eAAe,QAAW;AAC5B,kBAAU,OAAO;AACjB,kBAAU,WAAW;AACrB,kBAAU,SAAS,KAAK,IAAI,OAAO,UAAU,UAAU,CAAC,GAAG,cAAc,SAAY,KAAK,EAAE;AAAA,MAC9F;AACA,UAAI,YAAY;AACd,kBAAU,WAAW;AACrB,kBAAU,eAAe;AACzB,kBAAU,WAAW,UAAU,YAAY;AAC3C,kBAAU,SAAS,KAAK,IAAI,OAAO,UAAU,UAAU,CAAC,GAAG,cAAc,SAAY,KAAK,CAAC;AAAA,MAC7F;AACA,UAAI,WAAW;AACb,kBAAU,UAAU;AAAA,MACtB;AAEA,YAAM,mBAAwC;AAAA,QAC5C,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,eAAe;AAAA,QACf,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,gBAAgB,0BAA0B,UAAU,aAAa;AAAA,QACjE,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,QACV,eAAe;AAAA,QACf,WAAW;AAAA,QACX,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AACA,YAAM,iBAAiB,YAAY,KAAK,MAAM,SAAS,kBAAkB,KAAK;AAC9E,UAAI,SAAS,oBAAoB;AAC/B,yBAAiB,WAAW;AAC5B,yBAAiB,SAAS;AAAA,MAC5B;AACA,UAAI,gBAAgB,GAAG;AACrB,yBAAiB,eAAe,gBAAgB;AAAA,MAClD;AACA,UAAI,SAAS,iBAAiB;AAC5B,yBAAiB,WAAW;AAC5B,yBAAiB,SAAS;AAAA,MAC5B;AACA,UAAI,SAAS,aAAa,SAAS,kBAAkB,MAAM;AACzD,yBAAiB,aAAa;AAC9B,yBAAiB,iBAAiB;AAAA,MACpC;AACA,YAAM,QAAQ,CAAC,SAAS,WAAW,SAAS,SAAS,YAAY,SAAS,SAAS,KAAK,EACrF,OAAO,CAAC,OAAO,OAAO,WAA4B,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,MAAM,KAAK,EAClI,KAAK,IAAI;AAEZ,aACE;AAAA,QAAC;AAAA;AAAA,UACC,kBAAgB,GAAG,SAAS,IAAI,SAAS;AAAA,UAEzC,SAAS,SAAS;AAAA,UAClB,SAAS,SAAS;AAAA,UAClB,eAAe,MAAM;AACnB,gBAAI,UAAU;AACZ;AAAA,YACF;AAEA,8BAAkB,IAAI;AAAA,UACxB;AAAA,UACA,SAAS,MAAM,YAAY,MAAM,QAAQ;AAAA,UACzC,eAAe,CAAC,UAAU,kBAAkB,OAAO,IAAI;AAAA,UACvD,OAAO;AAAA,UACP;AAAA,UAEC;AAAA,qBAAS,qBACR;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,MAAM;AAAA,kBACN,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,KAAK;AAAA,kBACL,QAAQ;AAAA,gBACV;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,YAAY,SAAS,mBAAmB,aAAa,QACjD,SAAS,mBAAmB,QAC5B,0BAA0BC,cAAa,SAAS,mBAAmB,OAAO,IAAI,CAAC,QAAQ,SAAS,mBAAmB,KAAK;AAAA,sBAC5H,QAAQ,SAAS,mBAAmB,WAAW,SAAS,SAAS,mBAAmB,cAChF,aAAa,SAAS,mBAAmB,WAAW,KACpD;AAAA,sBACJ,cAAc;AAAA,sBACd,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,OAAO,GAAG,SAAS,mBAAmB,YAAY;AAAA,oBACpD;AAAA;AAAA,gBACF;AAAA;AAAA,YACF,IACE;AAAA,YACH;AAAA,YACA,SAAS,kBACR;AAAA,cAAC;AAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,KAAK;AAAA,kBACL,WAAW;AAAA,kBACX,QAAQ;AAAA,gBACV;AAAA,gBAEC,gCAAsB,SAAS,eAAe;AAAA;AAAA,YACjD,IACE;AAAA,YACH,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU,CAAC,UAAU,qBAAqB,MAAM,OAAO,KAAK;AAAA,gBAC5D,WAAW,CAAC,UAAU;AACpB,wBAAM,gBAAgB;AACtB,sBAAI,MAAM,QAAQ,SAAS;AACzB,0BAAM,eAAe;AACrB,oCAAgB;AAChB;AAAA,kBACF;AAEA,sBAAI,MAAM,QAAQ,UAAU;AAC1B,0BAAM,eAAe;AACrB,oCAAgB;AAAA,kBAClB;AAAA,gBACF;AAAA,gBACA,OAAO;AAAA,kBACL,iBAAiB;AAAA,kBACjB,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,MAAM;AAAA,kBACN,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,OAAO;AAAA,gBACT;AAAA,gBACA,OAAO;AAAA;AAAA,YACT,IACE,aACF;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU,SAAS;AAAA,kBACnB,UAAU;AAAA,kBACV,eAAe;AAAA,kBACf,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO,SAAS;AAAA,gBAClB;AAAA,gBAEC,mBAAS;AAAA;AAAA,YACZ,IACE,SAAS,YACX;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,gBAAgB;AAAA,kBAChB,eAAe;AAAA,kBACf,OAAO;AAAA,gBACT;AAAA,gBAEC,0BAAgB,SAAS,UAAU,QAAQ,SAAS,UAAU,QAAQ,OAAO;AAAA;AAAA,YAChF,IACE,SAAS,iBAAiB,OAC5B;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,gBAAgB;AAAA,kBAChB,eAAe;AAAA,kBACf,OAAO;AAAA,gBACT;AAAA,gBAEC,gCAAsB,SAAS,eAAe,OAAO;AAAA;AAAA,YACxD,IAEA,6CAAC,SAAI,OAAO,kBAAmB,mBAAS,OAAM;AAAA;AAAA;AAAA,QAxI3C;AAAA,MA0IP;AAAA,IAEJ,CAAC;AAAA,IACA,sBAAsB,IACrB;AAAA,MAAC;AAAA;AAAA,QACC,eAAY;AAAA,QACZ,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA;AAAA,IACF,IACE;AAAA,KACN;AAEJ;AAEA,IAAM,cAAoB,YAAK,SAAS,CAAC,MAAM,SAAS;AACtD,MACE,KAAK,cAAc,KAAK,aACxB,KAAK,cAAc,KAAK,aACxB,KAAK,YAAY,KAAK,WACtB,KAAK,aAAa,KAAK,YACvB,KAAK,gBAAgB,KAAK,eAC1B,KAAK,uBAAuB,KAAK,sBACjC,KAAK,oBAAoB,KAAK,mBAC9B,KAAK,cAAc,KAAK,aACxB,KAAK,wBAAwB,KAAK,uBAClC,KAAK,gBAAgB,KAAK,eAC1B,KAAK,gBAAgB,KAAK,eAC1B,KAAK,sBAAsB,KAAK,qBAChC,KAAK,sBAAsB,KAAK,qBAChC,KAAK,oBAAoB,KAAK,mBAC9B,KAAK,oBAAoB,KAAK,mBAC9B,KAAK,yBAAyB,KAAK,wBACnC,KAAK,mBAAmB,KAAK,kBAC7B,KAAK,qBAAqB,KAAK,oBAC/B,KAAK,2BAA2B,KAAK,0BACrC,KAAK,wBAAwB,KAAK,qBAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,KAAK,aAAa,QAAQ,KAAK,YAAY,KAAK,YAAY,MAAM;AACzF,QAAM,iBAAiB,KAAK,aAAa,QAAQ,KAAK,YAAY,KAAK,YAAY,MAAM;AACzF,MAAI,mBAAmB,gBAAgB;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,MAAM,KAAK,iBAAiB,KAAK,cAAc;AACpE,WAAO;AAAA,EACT;AAEA,SAAO;AACT,CAAC;AAED,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAMG;AACD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AACJ,QAAM,YAAkB,cAAuB,IAAI;AACnD,QAAM,aAAmB,cAAuB,IAAI;AACpD,QAAM,WAAiB,cAAyB,IAAI;AACpD,QAAM,sBAA4B,cAAuB,IAAI;AAC7D,QAAM,6BAAmC,cAAuB,IAAI;AACpE,QAAM,gBAAsB,cAAuB,IAAI;AACvD,QAAM,eAAqB,cAAuB,IAAI;AACtD,QAAM,iBAAuB,cAAO,oBAAI,IAAiC,CAAC;AAC1E,QAAM,oBAA0B,cAAO,oBAAI,IAAkC,CAAC;AAC9E,QAAM,iBAAuB,cAAO,oBAAI,IAAiC,CAAC;AAC1E,QAAM,oBAA0B,cAAO,oBAAI,IAAkC,CAAC;AAC9E,QAAM,mBAAyB,cAAqD,IAAI;AACxF,QAAM,gBAAsB,cAAqD,IAAI;AACrF,QAAM,gBAAsB,cAA+B,UAAU;AACrE,QAAM,qBAA2B,cAAsB,eAAe;AACtE,QAAM,qBAA2B,cAAsB,eAAe;AACtE,QAAM,4BAAkC,cAA6B,IAAI;AACzE,QAAM,0BAAgC,cAAsB,IAAI;AAChE,QAAM,eAAqB,cAA6B,IAAI;AAC5D,QAAM,iBAAuB,cAA+B,IAAI;AAChE,QAAM,cAAoB,cAAO,QAAQ;AACzC,QAAM,wBAA8B,cAA6B,IAAI;AACrE,QAAM,qBAA2B,cAA2B,MAAS;AACrE,QAAM,oBAA0B,cAA2B,MAAS;AACpE,QAAM,qBAA2B,cAA2B,MAAS;AACrE,QAAM,oBAA0B,cAA2B,MAAS;AACpE,QAAM,qBAA2B,cAAO,oBAAI,IAA4B,CAAC;AACzE,QAAM,mCAAyC,cAAO,oBAAI,IAAsB,CAAC;AACjF,QAAM,iBAAuB,cAS3B,IAAI;AACN,QAAM,iBAAuB,cAAsB,IAAI;AACvD,QAAM,0BAAgC,cAOpC,IAAI;AACN,QAAM,mBAAyB,cAkB7B,IAAI;AACN,QAAM,cAAoB,cAOxB,IAAI;AACN,QAAM,0BAAgC,cAA4B,IAAI;AACtE,QAAM,qBAA2B,cAA4B,IAAI;AACjE,QAAM,wBAA8B,cAAuB,IAAI;AAC/D,QAAM,6BAAmC,cAA4B,IAAI;AACzE,QAAM,sBAA4B,cAqBhC,IAAI;AACN,QAAM,6BAAmC,cAA4B,IAAI;AACzE,QAAM,sBAA4B,cAqBhC,IAAI;AACN,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAiC,IAAI;AACjF,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAS,EAAE;AACzD,QAAM,CAAC,eAAe,gBAAgB,IAAU,gBAAiE,IAAI;AACrH,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAA+B,IAAI;AACzF,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAqD,IAAI;AAC/G,QAAM,sBAA4B,cAAmD,IAAI;AACzF,QAAM,wBAA8B,cAAsB,IAAI;AAC9D,QAAM,2BAAiC,cAgB7B,IAAI;AACd,QAAM,CAAC,iBAAiB,kBAAkB,IAAU,gBAA0B;AAAA,IAC5E,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AACD,QAAM,2BAAiC,cAA6B,IAAI;AACxE,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAqD,IAAI;AAC/G,QAAM,sBAA4B,cAAmD,IAAI;AACzF,QAAM,uBAA6B,cAAsB,IAAI;AAC7D,QAAM,yBAA+B,cAAmD,IAAI;AAC5F,QAAM,uBAA6B,cAAsB,IAAI;AAC7D,QAAM,yBAA+B,cAAmD,IAAI;AAC5F,QAAM,wBAA8B,cAAsB,IAAI;AAC9D,QAAM,CAAC,mBAAmB,oBAAoB,IAAU,gBAA+D,IAAI;AAC3H,QAAM,qBAA2B,cAAmC,MAAM;AAC1E,QAAM,qBAA2B,mBAAY,CAAC,SAAqC;AACjF,uBAAmB,UAAU;AAAA,EAC/B,GAAG,CAAC,CAAC;AACL,QAAM,YAAY,mBAAmB;AACrC,QAAM,sBAA4B,eAAQ,MAAO,YAAYC,gBAAe,SAAS,IAAI,MAAO,CAAC,SAAS,CAAC;AAC3G,QAAM,aAAmB,eAAQ,MAAM,KAAK,IAAI,KAAK,YAAY,GAAG,GAAG,CAAC,SAAS,CAAC;AAClF,QAAM,wBAA8B,cAAO,UAAU;AACrD,QAAM,kBAAkB;AACxB,QAAM,CAAC,iBAAiB,kBAAkB,IAAU;AAAA,IAAS,MAC3D;AAAA,MACE,aAAa,cAAc;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,QAAQ,cAAc;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,iBAAiB,kBAAkB,IAAU;AAAA,IAAS,MAC3D;AAAA,MACE,aAAa,cAAc;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,QAAQ,cAAc;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,QAAM,eAAqB,eAAQ,MAAM,IAAI,IAAI,aAAa,cAAc,CAAC,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC;AAC1G,QAAM,eAAqB,eAAQ,MAAM,IAAI,IAAI,aAAa,cAAc,CAAC,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC;AAC1G,QAAM,sBAA4B,mBAAY,CAAC,aAAoC;AACjF,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,uBAAmB,CAAC,YAAY;AAC9B,YAAM,OAAO;AAAA,QACX,QAAQ,SAAS,eAAe;AAAA,QAChC,MAAM,SAAS,aAAa;AAAA,QAC5B,KAAK,SAAS,YAAY;AAAA,QAC1B,OAAO,SAAS,cAAc;AAAA,MAChC;AACA,aAAO,QAAQ,SAAS,KAAK,QACxB,QAAQ,QAAQ,KAAK,OACrB,QAAQ,UAAU,KAAK,SACvB,QAAQ,WAAW,KAAK,SACzB,UACA;AAAA,IACN,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,CAAC;AACf,QAAM,cAAoB,eAAQ,MAAM;AACtC,WAAO;AAAA,MACL,aAAa,eAAe,CAAC;AAAA,MAC7B;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,aAAa,aAAa,iBAAiB,YAAY,CAAC;AACrF,QAAM,cAAoB,eAAQ,MAAM;AACtC,WAAO;AAAA,MACL,aAAa,eAAe,CAAC;AAAA,MAC7B;AAAA,MACA,aAAa,cAAc;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,aAAa,aAAa,iBAAiB,YAAY,CAAC;AACrF,QAAM,aAAmB,eAAQ,MAAM;AACrC,UAAM,YAAY,aAAa,aAAa,OAAO;AACnD,QAAI,aAAa,GAAG;AAClB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,YAAY,OAAO,CAAC,QAAQ,MAAM,SAAS;AAAA,EACpD,GAAG,CAAC,aAAa,aAAa,KAAK,WAAW,CAAC;AAC/C,QAAM,aAAmB,eAAQ,MAAM;AACrC,UAAM,YAAY,aAAa,aAAa,OAAO;AACnD,QAAI,aAAa,GAAG;AAClB,aAAO,CAAC;AAAA,IACV;AAEA,WAAO,YAAY,OAAO,CAAC,QAAQ,MAAM,SAAS;AAAA,EACpD,GAAG,CAAC,aAAa,aAAa,KAAK,WAAW,CAAC;AAC/C,QAAM,kBAAwB;AAAA,IAC5B,MAAM;AACJ,YAAM,SAAS,IAAI,MAAM,eAAe,EAAE,KAAK,CAAC;AAChD,YAAM,gBAAgB,aAAa,iBAAiB;AACpD,YAAM,gBAAgB,KAAK;AAAA,QACzB,+BAA+B,aAAa,qBAAqBC,oBAAmB,aAAa;AAAA,QACjGA,qBAAoB;AAAA,MACtB;AAEA,UAAI,WAAW;AACb,iBAAS,MAAM,GAAG,MAAM,iBAAiB,OAAO,GAAG;AACjD,cAAI,UAAU,eAAe,GAAG,GAAG;AACjC;AAAA,UACF;AAEA,gBAAM,QAAQ,UAAU,eAAe,GAAG;AAC1C,cAAI,UAAU,UAAa,UAAU,MAAM;AACzC,mBAAO,GAAG,IAAI,KAAK;AAAA,cACjB;AAAA,gBACE,8BAA8B,OAAO,aAAa,2BAA2B;AAAA,gBAC7E;AAAA,cACF;AAAA,cACAA,qBAAoB;AAAA,YACtB;AACA;AAAA,UACF;AAEA,iBAAO,GAAG,IAAI,KAAK;AAAA,YACjB;AAAA,cACE,aAAa,oBAAoB,GAAG,KAAK,aAAa,qBAAqBA;AAAA,cAC3E;AAAA,YACF;AAAA,YACAA,qBAAoB;AAAA,UACtB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB,aAAa,eAAe,CAAC;AACrD,YAAM,oBAAoB,aAAa,aAAa,CAAC;AACrD,eAAS,QAAQ,GAAG,QAAQ,gBAAgB,QAAQ,SAAS,GAAG;AAC9D,cAAM,MAAM,gBAAgB,KAAK;AACjC,YAAI,QAAQ,UAAa,OAAO,iBAAiB;AAC/C;AAAA,QACF;AAEA,eAAO,GAAG,IAAI,KAAK;AAAA,UACjB,+BAA+B,kBAAkB,KAAK,KAAK,aAAa,qBAAqBA,oBAAmB,aAAa;AAAA,UAC7HA,qBAAoB;AAAA,QACtB;AAAA,MACF;AAEA,eAAS,MAAM,KAAK,IAAI,IAAI,aAAa,cAAc,MAAM,CAAC,GAAG,MAAM,iBAAiB,OAAO,GAAG;AAChG,eAAO,GAAG,IAAI;AAAA,MAChB;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,mBAAyB;AAAA,IAC7B,MAAM;AACJ,YAAM,UAAU,IAAI,MAAM,eAAe,EAAE,KAAK,CAAC;AACjD,YAAM,gBAAgB,aAAa,iBAAiB;AACpD,YAAM,iBAAiB,KAAK;AAAA,QAC1B,+BAA+B,aAAa,sBAAsBC,qBAAoB,aAAa;AAAA,QACnGA,sBAAqB;AAAA,MACvB;AAEA,UAAI,WAAW;AACb,iBAAS,MAAM,GAAG,MAAM,iBAAiB,OAAO,GAAG;AACjD,cAAI,UAAU,YAAY,GAAG,GAAG;AAC9B;AAAA,UACF;AAEA,gBAAM,SAAS,UAAU,aAAa,GAAG;AACzC,cAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,oBAAQ,GAAG,IAAI,KAAK;AAAA,cAClB,+BAA+B,4BAA4B,MAAM,GAAG,aAAa;AAAA,cACjFA,sBAAqB;AAAA,YACvB;AACA;AAAA,UACF;AAEA,kBAAQ,GAAG,IAAI,KAAK;AAAA,YAClB;AAAA,cACE,aAAa,qBAAqB,GAAG,KAAK,aAAa,sBAAsBA;AAAA,cAC7E;AAAA,YACF;AAAA,YACAA,sBAAqB;AAAA,UACvB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAEA,YAAM,kBAAkB,aAAa,eAAe,CAAC;AACrD,YAAM,qBAAqB,aAAa,cAAc,CAAC;AACvD,eAAS,QAAQ,GAAG,QAAQ,gBAAgB,QAAQ,SAAS,GAAG;AAC9D,cAAM,MAAM,gBAAgB,KAAK;AACjC,YAAI,QAAQ,UAAa,OAAO,iBAAiB;AAC/C;AAAA,QACF;AAEA,gBAAQ,GAAG,IAAI,KAAK;AAAA,UAClB,+BAA+B,mBAAmB,KAAK,KAAK,aAAa,sBAAsBA,qBAAoB,aAAa;AAAA,UAChIA,sBAAqB;AAAA,QACvB;AAAA,MACF;AAEA,eAAS,MAAM,KAAK,IAAI,IAAI,aAAa,cAAc,MAAM,CAAC,GAAG,MAAM,iBAAiB,OAAO,GAAG;AAChG,gBAAQ,GAAG,IAAI;AAAA,MACjB;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,qBAA2B;AAAA,IAC/B,MAAM,YAAY,IAAI,CAAC,QAAQ,gBAAgB,GAAG,KAAKD,kBAAiB;AAAA,IACxE,CAAC,iBAAiB,WAAW;AAAA,EAC/B;AACA,QAAM,sBAA4B;AAAA,IAChC,MAAM,YAAY,IAAI,CAAC,QAAQ,iBAAiB,GAAG,KAAKC,mBAAkB;AAAA,IAC1E,CAAC,kBAAkB,WAAW;AAAA,EAChC;AACA,QAAM,mBAAyB,eAAQ,MAAM,IAAI,IAAI,YAAY,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;AAClH,QAAM,mBAAyB,eAAQ,MAAM,IAAI,IAAI,YAAY,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;AAClH,QAAM,iBAAuB,cAAiB,WAAW;AACzD,QAAM,iBAAuB,cAAiB,WAAW;AACzD,QAAM,yBAA+B,cAAiB,mBAAmB;AACzE,QAAM,wBAA8B,cAAiB,kBAAkB;AACvE,QAAM,gBAAsB,eAAQ,MAAM,gBAAgB,mBAAmB,GAAG,CAAC,mBAAmB,CAAC;AACrG,QAAM,gBAAsB,eAAQ,MAAM,gBAAgB,kBAAkB,GAAG,CAAC,kBAAkB,CAAC;AACnG,QAAM,sBAA4B,eAAQ,MAAM,gBAAgB,gBAAgB,GAAG,CAAC,gBAAgB,CAAC;AACrG,QAAM,sBAA4B,eAAQ,MAAM,gBAAgB,eAAe,GAAG,CAAC,eAAe,CAAC;AACnG,QAAM,iBAAuB;AAAA,IAC3B,MAAM,mBAAmB,YAAY,kBAAkB,aAAa;AAAA,IACpE,CAAC,kBAAkB,UAAU;AAAA,EAC/B;AACA,QAAM,kBAAwB;AAAA,IAC5B,MAAM,mBAAmB,YAAY,iBAAiB,gBAAgB;AAAA,IACtE,CAAC,iBAAiB,UAAU;AAAA,EAC9B;AACA,QAAM,mBAAyB;AAAA,IAC7B,MACE,WAAW,SAAS,IAChB,WAAW;AAAA,MACT,CAAC,KAAK,QAAQ,KAAK,IAAI,MAAM,eAAe,IAAI,GAAG,KAAK,kBAAkB,iBAAiB,GAAG,KAAKA,oBAAmB;AAAA,MACtH;AAAA,IACF,IACA;AAAA,IAEN,CAAC,kBAAkB,YAAY,cAAc;AAAA,EAC/C;AACA,QAAM,kBAAwB;AAAA,IAC5B,MACE,WAAW,SAAS,IAChB,WAAW;AAAA,MACT,CAAC,KAAK,QAAQ,KAAK,IAAI,MAAM,gBAAgB,IAAI,GAAG,KAAK,qBAAqB,gBAAgB,GAAG,KAAKD,mBAAkB;AAAA,MACxH;AAAA,IACF,IACA;AAAA,IAEN,CAAC,iBAAiB,YAAY,eAAe;AAAA,EAC/C;AACA,QAAM,+BAA+B,eAAe;AACpD,QAAM,mBAAyB,cAAiB,aAAa;AAC7D,QAAM,mBAAyB,cAAiB,aAAa;AAC7D,QAAM,kBAAkB,YAAY,CAAC;AACrC,QAAM,iBAAiB,YAAY,YAAY,SAAS,CAAC;AACzD,QAAM,kBAAkB,YAAY,CAAC;AACrC,QAAM,iBAAiB,YAAY,YAAY,SAAS,CAAC;AACzD,QAAM,qBAAqB,oBAAoB;AAC/C,QAAM,iBAAuB,eAAQ,MAAM;AACzC,UAAM,eAAe,OAAO;AAAA,MAC1B,CAAC,SAAS,UAAU;AAClB,cAAM,UAAU,0BAA0B,KAAK;AAC/C,eAAO;AAAA,UACL,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,UAC/C,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QACjD;AAAA,MACF;AAAA,MACA,EAAE,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAC3B;AACA,UAAM,eAAe,OAAO;AAAA,MAC1B,CAAC,SAAS,UAAU;AAClB,cAAM,UAAU,0BAA0B,KAAK;AAC/C,eAAO;AAAA,UACL,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,UAC/C,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QACjD;AAAA,MACF;AAAA,MACA,EAAE,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAC3B;AACA,UAAM,eAAe,OAAO;AAAA,MAC1B,CAAC,SAAS,UAAU;AAClB,cAAM,UAAU,0BAA0B,KAAK;AAC/C,eAAO;AAAA,UACL,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,UAC/C,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,MAAM;AAAA,QACjD;AAAA,MACF;AAAA,MACA,EAAE,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAC3B;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK,IAAI,aAAa,QAAQ,aAAa,QAAQ,aAAa,MAAM;AAAA,MAC9E,QAAQ,KAAK,IAAI,aAAa,QAAQ,aAAa,QAAQ,aAAa,MAAM;AAAA,IAChF;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,MAAM,CAAC;AAC3B,QAAM,iBAAiB,aAAa,aAAa,OAAO;AACxD,QAAM,uBAAuB,CAAC,aAAa,qBACrC,YAAY,0BAA0B,KAAK,YAAY,yBAAyB;AACtF,QAAM,uBAAuB,CAAC,aAAa,uBAAuB,WAAW,WAAW;AAExF,QAAM,qBAAiB,qCAAe;AAAA,IACpC,OAAO,YAAY;AAAA,IACnB,cAAc,CAAC,UAAU,oBAAoB,KAAK,KAAKC;AAAA,IACvD,kBAAkB,MAAM,UAAU;AAAA,IAClC,YAAY,CAAC,UAAU,YAAY,KAAK,KAAK;AAAA,IAC7C,sBAAsB,CAAC,UAAU,OAAO,2BAA2B,UAAU,YAAY,EAAE;AAAA,IAC3F,oBAAoB,CAAC,UAAU,OAAO,yBAAyB,UAAU,YAAY,EAAE;AAAA,IACvF,UAAU;AAAA,IACV,YAAY,CAAC,QAAQ,SAAS,aAAa,qBAAqB,QAAQ,YAAY,SAAS,QAAQ;AAAA,EACvG,CAAC;AACD,QAAM,qBAAiB,qCAAe;AAAA,IACpC,OAAO,YAAY;AAAA,IACnB,cAAc,CAAC,UAAU,mBAAmB,KAAK,KAAKD;AAAA,IACtD,kBAAkB,MAAM,UAAU;AAAA,IAClC,YAAY,CAAC,UAAU,YAAY,KAAK,KAAK;AAAA,IAC7C,YAAY;AAAA,IACZ,sBAAsB,CAAC,UAAU,OAAO,2BAA2B,UAAU,YAAY,EAAE;AAAA,IAC3F,oBAAoB,CAAC,UAAU,OAAO,yBAAyB,UAAU,YAAY,EAAE;AAAA,IACvF,UAAU;AAAA,IACV,YAAY,CAAC,QAAQ,SAAS,aAAa,qBAAqB,QAAQ,YAAY,SAAS,QAAQ;AAAA,EACvG,CAAC;AACD,QAAM,yBAAyB,eAAe,gBAAgB;AAC9D,QAAM,yBAAyB,eAAe,gBAAgB;AAC9D,QAAM,0BAAgC;AAAA,IACpC,MAAM,WACH,IAAI,CAAC,QAAQ,iBAAiB,IAAI,GAAG,CAAC,EACtC,OAAO,CAAC,UAA2B,UAAU,MAAS;AAAA,IACzD,CAAC,YAAY,gBAAgB;AAAA,EAC/B;AACA,QAAM,qBAA2B;AAAA,IAC/B,MAAM,sBAAsB,aAAa,cAAc,IAAI,oBAAoB,qBAAqB;AAAA,IACpG,CAAC,aAAa,UAAU;AAAA,EAC1B;AACA,QAAM,qBAA2B;AAAA,IAC/B,MAAM,sBAAsB,aAAa,cAAc,IAAI,oBAAoB,qBAAqB;AAAA,IACpG,CAAC,aAAa,UAAU;AAAA,EAC1B;AAEA,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AAEA,UAAM,sBAAsB,uBAAuB,uBAAuB,SAAS,CAAC,GAAG,SAAS;AAChG,UAAM,sBAAsB,uBAAuB,uBAAuB,SAAS,CAAC,GAAG,SAAS;AAEhG,QACE,uBAAuB,YAAY,SAAS,mCACzC,kBAAkB,oBACrB;AACA,yBAAmB,CAAC,YAAY,KAAK,IAAI,oBAAoB,UAAU,qBAAqB,CAAC;AAAA,IAC/F;AAEA,QACE,uBAAuB,YAAY,SAAS,mCACzC,kBAAkB,oBACrB;AACA,yBAAmB,CAAC,YAAY,KAAK,IAAI,oBAAoB,UAAU,qBAAqB,CAAC;AAAA,IAC/F;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,EACd,CAAC;AAED,EAAM,iBAAU,MAAM;AACpB,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,UAAU,CAAC;AAEf,EAAM,iBAAU,MAAM;AACpB,uBAAmB,UAAU;AAAA,EAC/B,GAAG,CAAC,eAAe,CAAC;AAEpB,EAAM,iBAAU,MAAM;AACpB,uBAAmB,UAAU;AAAA,EAC/B,GAAG,CAAC,eAAe,CAAC;AAEpB,EAAM,iBAAU,MAAM;AACpB,iBAAa,UAAU;AAAA,EACzB,GAAG,CAAC,mBAAmB,CAAC;AAExB,EAAM,iBAAU,MAAM;AACpB,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAM,iBAAU,MAAM;AACpB,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,EAAM,iBAAU,MAAM;AACpB,wBAAoB,UAAU;AAAA,EAChC,GAAG,CAAC,gBAAgB,CAAC;AAErB,EAAM,iBAAU,MAAM;AACpB,wBAAoB,UAAU;AAAA,EAChC,GAAG,CAAC,gBAAgB,CAAC;AAErB,EAAM,iBAAU,MAAM,MAAM;AAC1B,QAAI,wBAAwB,YAAY,MAAM;AAC5C,aAAO,qBAAqB,wBAAwB,OAAO;AAC3D,8BAAwB,UAAU;AAAA,IACpC;AACA,QAAI,qBAAqB,YAAY,MAAM;AACzC,aAAO,qBAAqB,qBAAqB,OAAO;AACxD,2BAAqB,UAAU;AAAA,IACjC;AACA,QAAI,qBAAqB,YAAY,MAAM;AACzC,aAAO,qBAAqB,qBAAqB,OAAO;AACxD,2BAAqB,UAAU;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,2BAAiC,mBAAY,CAAC,YAAiD;AACnG,2BAAuB,UAAU;AACjC,QAAI,qBAAqB,YAAY,MAAM;AACzC;AAAA,IACF;AACA,yBAAqB,UAAU,OAAO,sBAAsB,MAAM;AAChE,2BAAqB,UAAU;AAC/B,YAAM,cAAc,uBAAuB;AAC3C,6BAAuB,UAAU;AACjC,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA,0BAAoB,UAAU;AAC9B,0BAAoB,WAAW;AAAA,IACjC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,2BAAiC,mBAAY,CAAC,YAAiD;AACnG,2BAAuB,UAAU;AACjC,QAAI,qBAAqB,YAAY,MAAM;AACzC;AAAA,IACF;AACA,yBAAqB,UAAU,OAAO,sBAAsB,MAAM;AAChE,2BAAqB,UAAU;AAC/B,YAAM,cAAc,uBAAuB;AAC3C,6BAAuB,UAAU;AACjC,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA,0BAAoB,UAAU;AAC9B,0BAAoB,WAAW;AAAA,IACjC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM;AACpB,0BAAsB,UAAU,yBAAyB,WAAW;AAAA,EACtE,GAAG,CAAC,kBAAkB,CAAC;AAEvB,EAAM,iBAAU,MAAM;AACpB,UAAM,eAAe,yBAAyB;AAC9C,QAAI,CAAC,gBAAgB,iBAAiB,WAAW,YAAY,SAAS;AACpE;AAAA,IACF;AAEA,QAAI,uBAAuB,YAAY,cAAc,mBAAmB,GAAG;AACzE,+BAAyB,UAAU;AACnC,4BAAsB,UAAU;AAChC;AAAA,IACF;AAEA,QAAI,CAAC,uBAAuB,CAAC,oBAAoB;AAC/C,+BAAyB,UAAU;AACnC,4BAAsB,UAAU;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,oBAAoB,mBAAmB,CAAC;AAE5C,EAAM,iBAAU,MAAM;AACpB,uBAAmB,UAAU;AAC7B,sBAAkB,UAAU;AAC5B,uBAAmB,UAAU;AAC7B,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,iBAAiB,iBAAiB,gBAAgB,cAAc,CAAC;AAErE,EAAM,iBAAU,MAAM;AACpB,mBAAe,UAAU;AACzB,mBAAe,UAAU;AACzB,2BAAuB,UAAU;AACjC,0BAAsB,UAAU;AAChC,qBAAiB,UAAU;AAC3B,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,eAAe,oBAAoB,qBAAqB,eAAe,aAAa,WAAW,CAAC;AAEpG,EAAM,uBAAgB,MAAM;AAC1B,UAAM,WAAW,UAAU;AAC3B,UAAM,qBAAqB,sBAAsB;AACjD,QAAI,CAAC,YAAY,uBAAuB,YAAY;AAClD,4BAAsB,UAAU;AAChC;AAAA,IACF;AAEA,aAAS,aAAc,SAAS,aAAa,qBAAsB;AACnE,aAAS,YAAa,SAAS,YAAY,qBAAsB;AACjE,0BAAsB,UAAU;AAChC,mBAAe,QAAQ;AACvB,mBAAe,QAAQ;AACvB,wBAAoB,QAAQ;AAAA,EAC9B,GAAG,CAAC,gBAAgB,gBAAgB,qBAAqB,UAAU,CAAC;AAEpE,EAAM,uBAAgB,MAAM;AAC1B,wBAAoB,UAAU,OAAO;AAAA,EACvC,GAAG,CAAC,aAAa,gBAAgB,iBAAiB,iBAAiB,qBAAqB,UAAU,CAAC;AAEnG,EAAM,uBAAgB,MAAM;AAC1B,UAAM,WAAW,UAAU;AAC3B,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,wBAAoB,QAAQ;AAC5B,QAAI,OAAO,mBAAmB,aAAa;AACzC;AAAA,IACF;AACA,UAAM,WAAW,IAAI,eAAe,MAAM;AACxC,0BAAoB,QAAQ;AAAA,IAC9B,CAAC;AACD,aAAS,QAAQ,QAAQ;AACzB,WAAO,MAAM;AACX,eAAS,WAAW;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,aAAa,mBAAmB,CAAC;AAErC,EAAM,iBAAU,MAAM;AACpB;AAAA,MACE;AAAA,QACE,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,QAAQ,cAAc;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AACA;AAAA,MACE;AAAA,QACE,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,QAAQ,cAAc;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,YAAY,aAAa,YAAY,kBAAkB,cAAc,CAAC;AAEvF,EAAM,iBAAU,MAAM;AACpB,UAAM,kBAAkB,qBAAqB,IAAI,OAAO;AACxD,UAAM,kBAAkB,qBAAqB,IAAI,OAAO;AACxD,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,QACE,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,OACC,YAAY,OAAO,MAAM,wBAAwB;AAAA,MAClD,kBAAkB,wBAAwB;AAAA,MAC1C,eAAe,SAAS,wBAAwB;AAAA,IAClD;AACA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,QACE,aAAa,cAAc;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,OACC,YAAY,OAAO,MAAM,wBAAwB;AAAA,MAClD,kBAAkB,wBAAwB;AAAA,MAC1C,eAAe,SAAS,wBAAwB;AAAA,IAClD;AAEA,uBAAmB,CAAC,YAAa,UAAU,eAAe,eAAe,OAAQ;AACjF,uBAAmB,CAAC,YAAa,UAAU,eAAe,eAAe,OAAQ;AAAA,EACnF,GAAG;AAAA,IACD;AAAA,IACA,aAAa;AAAA,IACb,aAAa;AAAA,IACb,eAAe;AAAA,IACf,eAAe;AAAA,IACf,qBAAqB,IAAI;AAAA,IACzB,qBAAqB,IAAI;AAAA,EAC3B,CAAC;AAED,EAAM,iBAAU,MAAM;AACpB,QAAI,sBAAsB;AACxB,qBAAe,eAAe,CAAC;AAAA,IACjC,WAAW,UAAU,SAAS;AAC5B,gBAAU,QAAQ,YAAY;AAAA,IAChC;AACA,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ,aAAa;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,kBAAkB,gBAAgB,oBAAoB,CAAC;AAE3D,EAAM,iBAAU,MAAM;AACpB,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,aAAa,gBAAgB,CAAC;AAElC,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,qBAAqB,kBAAkB,eAAe,kBAAkB;AAC3E;AAAA,IACF;AAEA,eAAW,kBAAkB,IAAI;AACjC,yBAAqB,IAAI;AAAA,EAC3B,GAAG,CAAC,kBAAkB,mBAAmB,UAAU,CAAC;AAEpD,EAAM,iBAAU,MAAM;AACpB,QAAI,sBAAsB;AACxB,qBAAe,QAAQ;AAAA,IACzB;AACA,QAAI,sBAAsB;AACxB,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,kBAAkB,gBAAgB,UAAU,gBAAgB,sBAAsB,sBAAsB,YAAY,QAAQ,YAAY,MAAM,CAAC;AAEnJ,QAAM,uBAA6B,mBAAY,CAAC,UAAyC;AACvF,UAAM,kBAAkB,MAAM;AAC9B,0BAAsB,UAAU;AAChC,wBAAoB,eAAe;AACnC,SACG,gBAAgB,gBAAgB,gBAAgB,YAAY,gBAAgB,iBAAiB,aAC9F,4BACA;AACA,yBAAmB,CAAC,YAAY,UAAU,oBAAoB;AAAA,IAChE;AAEA,SACG,gBAAgB,eAAe,gBAAgB,aAAa,gBAAgB,gBAAgB,aAC7F,8BACA;AACA,yBAAmB,CAAC,YAAY,UAAU,oBAAoB;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,qBAAqB,UAAU,CAAC;AAEpC,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA,aAAS,kBAAkB,OAAqB;AAC9C,UAAI,aAAa,SAAS,SAAS,MAAM,MAAc,GAAG;AACxD;AAAA,MACF;AACA,uBAAiB,IAAI;AAAA,IACvB;AAEA,aAAS,cAAc,OAAsB;AAC3C,UAAI,MAAM,QAAQ,UAAU;AAC1B,yBAAiB,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM;AACX,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,iCAAuC,mBAAY,CAAC,SAAiB,YAA4C;AACrH,UAAM,UAAU,WAAW;AAC3B,UAAM,WAAW,UAAU;AAC3B,UAAM,qBAAqB,eAAe;AAC1C,UAAM,qBAAqB,eAAe;AAC1C,UAAM,uBAAuB,iBAAiB;AAC9C,UAAM,uBAAuB,iBAAiB;AAE9C,QAAI,CAAC,WAAW,CAAC,YAAY,mBAAmB,WAAW,KAAK,mBAAmB,WAAW,GAAG;AAC/F,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,sBAAsB,WAAW,SAAS,sBAAsB;AACrF,QACE,UAAU,aAAa,QACvB,UAAU,aAAa,SACvB,UAAU,aAAa,OACvB,UAAU,aAAa,QACvB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,UAAU,aAAa;AAC9C,UAAM,iBAAiB,UAAU,aAAa;AAC9C,UAAM,SACH,iBAAiB,cACf,kBAAkB,kBAAkB,aAAc,SAAS,aAAa,aAAc;AAC3F,UAAM,SACH,iBAAiB,cACf,kBAAkB,mBAAmB,aAAc,SAAS,YAAY,aAAc;AAC3F,UAAM,mBAAmB,SAAS;AAClC,UAAM,mBAAmB,SAAS;AAClC,QAAI,eAAuC;AAE3C,QAAI,UAAU,iBAAiB,SAAS,kBAAkB;AACxD,YAAM,WAAW,yBAAyB,sBAAsB,gBAAgB;AAChF,YAAM,YAAY,mBAAmB,QAAQ;AAC7C,UAAI,cAAc,UAAa,mBAAmB,YAAY,QAAW;AACvE,uBAAe,EAAE,KAAK,WAAW,KAAK,mBAAmB,QAAQ;AAAA,MACnE;AAAA,IACF,WAAW,SAAS,iBAAiB,UAAU,kBAAkB;AAC/D,YAAM,WAAW,yBAAyB,sBAAsB,gBAAgB;AAChF,YAAM,YAAY,mBAAmB,QAAQ;AAC7C,UAAI,cAAc,UAAa,mBAAmB,YAAY,QAAW;AACvE,uBAAe,EAAE,KAAK,mBAAmB,SAAS,KAAK,UAAU;AAAA,MACnE;AAAA,IACF,WAAW,UAAU,iBAAiB,UAAU,kBAAkB;AAChE,YAAM,WAAW,yBAAyB,sBAAsB,gBAAgB;AAChF,YAAM,WAAW,yBAAyB,sBAAsB,gBAAgB;AAChF,YAAM,YAAY,mBAAmB,QAAQ;AAC7C,YAAM,YAAY,mBAAmB,QAAQ;AAC7C,UAAI,cAAc,UAAa,cAAc,QAAW;AACtD,uBAAe,EAAE,KAAK,WAAW,KAAK,UAAU;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,kBAAkB,iBAAiB,UAAU,CAAC;AAElD,QAAM,gCAAsC,mBAAY,CAAC,SAAiB,YAA4C;AACpH,UAAM,kBAAkB,OAAO,SAAS,sBAAsB,aAC1D,SAAS,kBAAkB,SAAS,OAAO,IAC3C,CAAC,SAAS,iBAAiB,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,YAAgC,QAAQ,OAAO,CAAC;AAC1G,eAAW,WAAW,iBAAiB;AACrC,UAAI,EAAE,mBAAmB,cAAc;AACrC;AAAA,MACF;AAEA,YAAM,OAAO,0BAA0B,QAAQ,QAAqB,kBAAkB,GAAG,aAAa,gBAAgB,KAAK,IAAI;AAC/H,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAEA,YAAM,YAAY,QAAQ,QAAqB,wBAAwB;AACvE,UAAI,aAAa,mBAAmB,YAAY,QAAW;AACzD,cAAM,YAAY,OAAO,UAAU,aAAa,sBAAsB,CAAC;AACvE,YAAI,OAAO,UAAU,SAAS,KAAK,aAAa,GAAG;AACjD,iBAAO,EAAE,KAAK,mBAAmB,SAAS,KAAK,UAAU;AAAA,QAC3D;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ,QAA6B,mBAAmB;AAC3E,UAAI,cAAc,mBAAmB,YAAY,QAAW;AAC1D,cAAM,YAAY,OAAO,WAAW,aAAa,eAAe,CAAC;AACjE,YAAI,OAAO,UAAU,SAAS,KAAK,aAAa,GAAG;AACjD,iBAAO,EAAE,KAAK,WAAW,KAAK,mBAAmB,QAAQ;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,+BAAqC,mBAAY,CAAC,SAAiB,YAA4C;AACnH,UAAM,eAAe,+BAA+B,SAAS,OAAO;AACpE,QAAI,gBAAgB,CAAC,WAAW,kBAAkB,aAAa,KAAK,aAAa,GAAG,GAAG;AACrF,aAAO;AAAA,IACT;AAEA,WAAO,8BAA8B,SAAS,OAAO,KAAK;AAAA,EAC5D,GAAG,CAAC,gCAAgC,+BAA+B,SAAS,CAAC;AAE7E,QAAM,8BAAoC,mBAAY,CACpD,WAUA,SACA,YAC2B;AAC3B,UAAM,eAAe,+BAA+B,SAAS,OAAO;AACpE,UAAM,UAAU,8BAA8B,SAAS,OAAO;AAC9D,UAAM,YACJ,WAAW,iBAAiB,IAAI,QAAQ,GAAG,IACvC,QAAQ,MACR,cAAc;AACpB,UAAM,YAAY,cAAc,OAAO,SAAS;AAChD,QAAI,cAAc,UAAa,cAAc,QAAW;AACtD,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,SAAS,OAAO;AAC5B,aAAO,EAAE,KAAK,WAAW,KAAK,UAAU,WAAW,IAAI;AAAA,IACzD;AAEA,QAAI,UAAU,SAAS,UAAU;AAC/B,aAAO,EAAE,KAAK,UAAU,WAAW,KAAK,KAAK,UAAU;AAAA,IACzD;AAEA,QAAI,WAAW,kBAAkB,WAAW,SAAS,GAAG;AACtD,aAAO,WAAW;AAAA,IACpB;AAEA,WAAO,EAAE,KAAK,WAAW,KAAK,UAAU;AAAA,EAC1C,GAAG,CAAC,gCAAgC,+BAA+B,kBAAkB,SAAS,CAAC;AAE/F,QAAM,2BAAiC,mBAAY,CACjD,MACA,MACA,SACA,YACG;AACH,UAAM,WAAW,iBAAiB,IAAI,KAAK,GAAG;AAC9C,UAAM,WAAW,iBAAiB,IAAI,KAAK,GAAG;AAC9C,QAAI,aAAa,UAAa,aAAa,QAAW;AACpD,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,mBAAmB,QAAQ,KAAKA;AACrD,UAAM,gBAAgB,oBAAoB,QAAQ,KAAKC;AACvD,UAAM,gBAAgB,KAAK,IAAI,MAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ,eAAe,UAAU;AAC9F,UAAM,gBAAgB,KAAK,IAAI,MAAQ,KAAK,SAAS,IAAI,KAAK,SAAS,gBAAgB,UAAU;AAEjG,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,iBACG,cAAc,QAAQ,KAAK,KAC1B,oBAAoB,UAAU,KAAK,QAAQ,eAAe,YAAY;AAAA,MAC1E,iBACG,cAAc,QAAQ,KAAK,KAC1B,oBAAoB,UAAU,KAAK,OAAO,eAAe,aAAa;AAAA,IAC5E;AAAA,EACF,GAAG,CAAC,kBAAkB,eAAe,oBAAoB,qBAAqB,kBAAkB,eAAe,UAAU,CAAC;AAE1H,QAAM,0BAAgC,mBAAY,CAChD,WACA,MACA,YACG;AACH,UAAM,WAAW,iBAAiB,IAAI,SAAS;AAC/C,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,oBAAoB,QAAQ,KAAKA;AACvD,UAAM,gBAAgB,KAAK,IAAI,MAAQ,KAAK,SAAS,IAAI,KAAK,SAAS,gBAAgB,UAAU;AACjG,WAAO;AAAA,MACL,eAAe,KAAK,IAAI,MAAQ,UAAU;AAAA,MAC1C;AAAA,MACA,gBAAgB,cAAc,CAAC,KAAK;AAAA,MACpC,iBACG,cAAc,QAAQ,KAAK,KAC1B,oBAAoB,UAAU,KAAK,OAAO,eAAe,aAAa;AAAA,IAC5E;AAAA,EACF,GAAG,CAAC,eAAe,qBAAqB,kBAAkB,eAAe,UAAU,CAAC;AAEpF,QAAM,6BAAmC,mBAAY,CACnD,WACA,MACA,YACG;AACH,UAAM,WAAW,iBAAiB,IAAI,SAAS;AAC/C,QAAI,aAAa,QAAW;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,mBAAmB,QAAQ,KAAKD;AACrD,UAAM,gBAAgB,KAAK,IAAI,MAAQ,KAAK,QAAQ,IAAI,KAAK,QAAQ,eAAe,UAAU;AAC9F,WAAO;AAAA,MACL;AAAA,MACA,eAAe,KAAK,IAAI,MAAQ,UAAU;AAAA,MAC1C,iBACG,cAAc,QAAQ,KAAK,KAC1B,oBAAoB,UAAU,KAAK,QAAQ,eAAe,YAAY;AAAA,MAC1E,gBAAgB,cAAc,CAAC,KAAK;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,kBAAkB,eAAe,oBAAoB,eAAe,UAAU,CAAC;AAEnF,QAAM,qBAA2B,mBAAY,CAAC,WAAmB,YAA2B;AAC1F,UAAM,aAAa,eAAe,QAAQ,IAAI,SAAS;AACvD,QAAI,YAAY;AACd,iBAAW,MAAM,QAAQ,YAAY,OAAO,KAAK,GAAG,OAAO;AAAA,IAC7D;AAEA,UAAM,YAAY,YAAY,QAAQ,SAAS;AAC/C,UAAM,YAAY,aAAa,IAAK,mBAAmB,SAAS,KAAKA,qBAAqBA;AAC1F,UAAM,eAAe,WAAW;AAChC,UAAM,iBAAiB,mBAAmB,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI;AACnF,UAAM,aAAa,eAAe;AAClC,QAAI,SAAS,SAAS;AACpB,eAAS,QAAQ,MAAM,QAAQ,GAAG,iBAAiB,UAAU;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,oBAAoB,WAAW,CAAC;AAEpC,QAAM,kBAAwB,mBAAY,CAAC,WAAmB,aAA4B;AACxF,UAAM,aACJ,eAAe,QAAQ,IAAI,SAAS,KACpC,WAAW,SAAS,cAAmC,qBAAqB,SAAS,IAAI,KACzF;AACF,QAAI,YAAY;AACd,qBAAe,QAAQ,IAAI,WAAW,UAAU;AAChD,iBAAW,MAAM,SAAS,aAAa,OAAO,KAAK,GAAG,QAAQ;AAAA,IAChE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAM,iBAAU,MAAM;AACpB,4BAAwB,UAAU;AAClC,uBAAmB,UAAU;AAC7B,+BAA2B,UAAU;AACrC,+BAA2B,UAAU;AACrC,4BAAwB,UAAU;AAClC,uBAAmB,UAAU;AAC7B,+BAA2B,UAAU;AACrC,+BAA2B,UAAU;AACrC,qBAAiB,UAAU;AAC3B,gBAAY,UAAU;AACtB,wBAAoB,UAAU;AAC9B,wBAAoB,UAAU;AAC9B,4BAAwB,UAAU;AAClC,QAAI,iBAAiB,SAAS;AAC5B,yBAAmB,iBAAiB,QAAQ,aAAa,IAAI;AAAA,IAC/D;AACA,QAAI,cAAc,SAAS;AACzB,sBAAgB,cAAc,QAAQ,aAAa,IAAI;AAAA,IACzD;AACA,qBAAiB,UAAU;AAC3B,kBAAc,UAAU;AACxB,mBAAe,IAAI;AACnB,oBAAgB,EAAE;AAClB,wBAAoB,IAAI;AACxB,wBAAoB,UAAU;AAC9B,wBAAoB,IAAI;AACxB,wBAAoB,UAAU;AAC9B,wBAAoB,IAAI;AACxB,6BAAyB,UAAU;AACnC,uBAAmB,MAAM;AAAA,EAC3B,GAAG,CAAC,kBAAkB,QAAQ,CAAC;AAE/B,QAAM,YAAkB,mBAAY,MAAM;AACxC,cAAU,SAAS,MAAM;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAsB,mBAAY,CAAC,QAAwB,aAA6B;AAC5F,UAAM,iBAAiB,uBAAuB,YAAY,MAAM;AAChE,QAAI,gBAAgB;AAClB,YAAM,mBAAmB,OAAO,UAAU,CAAC,UAAU,MAAM,SAAS,eAAe,SAAS;AAC5F,UAAI,oBAAoB,GAAG;AACzB,YAAI,qBAAqB,kBAAkB;AACzC,qBAAW,eAAe,IAAI;AAAA,QAChC,OAAO;AACL,+BAAqB;AAAA,YACnB,MAAM,eAAe;AAAA,YACrB,YAAY;AAAA,UACd,CAAC;AACD,8BAAoB,gBAAgB;AAAA,QACtC;AACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,iBAAiB,UAAU,CAAC,OAAO,WAAW,GAAG,IAAI,SAAS;AACpE,QAAI,kBAAkB,OAAO,WAAW,aAAa;AACnD,aAAO,KAAK,gBAAgB,UAAU,qBAAqB;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,kBAAkB,YAAY,qBAAqB,MAAM,CAAC;AAE9D,QAAM,eAAqB;AAAA,IACzB,CAAC,MAAuB,iBAA0B;AAChD,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,iBAAW,IAAI;AACf,qBAAe,IAAI;AACnB,sBAAgB,gBAAgB,8BAA8B,IAAI,CAAC;AAAA,IACrE;AAAA,IACA,CAAC,+BAA+B,UAAU,UAAU;AAAA,EACtD;AAEA,QAAM,gBAAsB,mBAAY,MAAM;AAC5C,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,qBAAe,IAAI;AACnB,sBAAgB,EAAE;AAClB,gBAAU;AACV;AAAA,IACF;AAEA,iBAAa,aAAa,YAAY;AACtC,mBAAe,IAAI;AACnB,oBAAgB,EAAE;AAClB,cAAU;AAAA,EACZ,GAAG,CAAC,aAAa,cAAc,WAAW,UAAU,YAAY,CAAC;AAEjE,QAAM,gBAAsB,mBAAY,MAAM;AAC5C,mBAAe,IAAI;AACnB,oBAAgB,EAAE;AAClB,cAAU;AAAA,EACZ,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,CAAC,EAAE,oBAAoB,IAAU,qBAAc;AACrD,QAAM,CAAC,EAAE,wBAAwB,IAAU,qBAAc;AACzD,QAAM,CAAC,uBAAuB,wBAAwB,IAAU,gBAAsC,IAAI;AAC1G,QAAM,kBAAwB,eAAQ,MAAM;AAC1C,UAAM,uBAAuB,uBAAuB,CAAC,GAAG;AACxD,UAAM,sBAAsB,uBAAuB,uBAAuB,SAAS,CAAC,GAAG;AACvF,UAAME,mBAAkB,yBAAyB,SAAY,SAAY,YAAY,oBAAoB;AACzG,UAAMC,kBAAiB,wBAAwB,SAAY,SAAY,YAAY,mBAAmB;AACtG,QAAID,qBAAoB,UAAaC,oBAAmB,UAAaA,kBAAiBD,kBAAiB;AACrG,aAAO;AAAA,IACT;AAEA,UAAM,WAAW;AACjB,UAAM,WAAW,KAAK,IAAI,GAAGA,mBAAkB,QAAQ;AACvD,UAAM,SAASC,kBAAiB;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,wBAAwB,WAAW,CAAC;AAExC,QAAM,uBAA6B,eAAqC,MAAM;AAC5E,QAAI,CAAC,wBAAwB,CAAC,aAAa,qBAAqB,CAAC,iBAAiB;AAChF,aAAO;AAAA,IACT;AAEA,UAAM,yBAAyB;AAC/B,QAAI,OAAO,uBAAuB,iBAAiB,YAAY;AAC7D,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,OAAO,uBAAuB,aAAa,gBAAgB,UAAU,gBAAgB,SAAS,gBAAgB,WAAW,GAAG;AAAA,QAChI,iBAAiB;AAAA,QACjB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,oBAAoB;AAAA,MACtB,CAAC;AACD,aAAO,0BAA0B,MAA0B,eAAe,MAAM,gBAAgB,UAAU,gBAAgB,MAAM;AAAA,IAClI,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,aAAa,mBAAmB,sBAAsB,iBAAiB,SAAS,CAAC;AAErF,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,eAAe,CAAC,iBAAiB;AACnF,+BAAyB,IAAI;AAC7B;AAAA,IACF;AAEA,QACE,yBACG,gBAAgB,YAAY,sBAAsB,YAClD,gBAAgB,UAAU,sBAAsB,QACnD;AACA;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,SAAK;AAAA,MACH,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,gBAAgB,SAAS,gBAAgB,WAAW;AAAA,IACtD,EACG,KAAK,CAAC,SAAS;AACd,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB;AACA,2BAAqB,MAAM;AACzB,iCAAyB,SAAS;AAAA,MACpC,CAAC;AAAA,IACH,CAAC,EACA,MAAM,MAAM;AACX,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,2BAAqB,MAAM;AACzB,iCAAyB,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,aAAa,uBAAuB,mBAAmB,sBAAsB,sBAAsB,eAAe,CAAC;AAEvH,QAAM,mBAAmB,oBAAoB,wBAAwB;AAErE,EAAM,iBAAU,MAAM;AACpB,uBAAmB,QAAQ,MAAM;AAAA,EACnC,GAAG,CAAC,kBAAkB,iBAAiB,iBAAiB,SAAS,UAAU,kBAAkB,SAAS,CAAC;AAEvG,EAAM,iBAAU,MAAM;AACpB,6BAAyB,IAAI;AAAA,EAC/B,GAAG,CAAC,kBAAkB,QAAQ,CAAC;AAE/B,QAAM,mBAAyB,eAAQ,MAAM;AAC3C,UAAM,MAAM,oBAAI,IAAiD;AACjE,eAAW,aAAa,aAAa,cAAc,CAAC,GAAG;AACrD,UAAI,IAAI,GAAG,UAAU,OAAO,GAAG,IAAI,UAAU,OAAO,GAAG,IAAI,SAAS;AAAA,IACtE;AACA,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,UAAU,CAAC;AAE5B,QAAM,cAAoB,mBAAY,CAAC,KAAa,QAAgC;AAClF,UAAM,WAAW,GAAG,GAAG,IAAI,GAAG;AAC9B,UAAM,SAAS,mBAAmB,QAAQ,IAAI,QAAQ;AACtD,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,mBAAmB,OAAO,iBAAiB,YAAY,OAAO,iBAAiB,SAAS;AAC/G,UAAM,cAAc,iBAAiB,kBAAkB,MAAM,IAAI,QAAQ,IAAI;AAE7E,QAAI,CAAC,aAAa,CAAC,aAAa;AAC9B,YAAM,YAA4B;AAAA,QAChC,mBAAmB;AAAA,QACnB,OAAO;AAAA,UACL,iBAAiB,oBAAoB,aAAa,OAAO;AAAA,UACzD,cAAc;AAAA,UACd,aAAa;AAAA,UACb,WAAW,aAAa,gBAAgB,oBAAoB,QAAQ,MAAM,IAAI;AAAA,UAC9E,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,QACd;AAAA,QACA,OAAO;AAAA,MACT;AACA,yBAAmB,QAAQ,IAAI,UAAU,SAAS;AAClD,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,mBAAmB;AAClC,YAAM,sBAAsC;AAAA,QAC1C,mBAAmB;AAAA,QACnB,OAAO,CAAC;AAAA,QACR,OAAO;AAAA,MACT;AACA,yBAAmB,QAAQ,IAAI,UAAU,mBAAmB;AAC5D,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,eAAe,CAAC,kBAAkB,WAAW,kBAAkB,KAAK,GAAG,GAAG;AAC7E,YAAM,sBAAsC;AAAA,QAC1C,mBAAmB;AAAA,QACnB,OAAO,CAAC;AAAA,QACR,OAAO;AAAA,MACT;AACA,yBAAmB,QAAQ,IAAI,UAAU,mBAAmB;AAC5D,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,iBACV,aAAa,YACZ,WAAW,aAAa,KAAK,GAAG;AACrC,UAAM,iBAAiBC,2BAA0B,aAAa,KAAK,GAAG;AACtE,UAAM,iBAAiB,iBACnB,aAAa,SAAS,OACrB,WAAW,eAAe,KAAK,GAAG,KAAoD;AAC3F,UAAM,WAAW,uBAAuB,gBAAgB,cAAc;AACtE,UAAM,QAAQ,eAAe,iBAAiB,KAAK,GAAG;AACtD,UAAM,aAAa,sBAAsB,OAAO,KAAK,KAAK,WAAW;AACrE,UAAM,cAAc,uBAAuB,UAAU,UAAU;AAC/D,UAAM,iBAAiB,QAAQ,KAAK,IAAI,MAAM,gBAAgB,CAAC,IAAI;AACnE,UAAM,eAAe,iBACjB,aAAa,YACZ,WAAW,eAAe,KAAK,GAAG;AAIvC,UAAM,YAAY,iBAAiB,IAAI,QAAQ,KAAK;AACpD,UAAM,kBAAkB,aAAa,YAE/B,UAAU,MAAM,MAAM,QAAQ,UAAU,MAAM,IAAI,MAC9C,MAAM;AAAA,MACJ,EAAE,QAAQ,KAAK,IAAI,UAAU,MAAM,IAAI,MAAM,UAAU,MAAM,MAAM,GAAG,IAAI,EAAE;AAAA,MAC5E,CAAC,GAAG,UAAU;AAAA,QACZ;AAAA,QACA,UAAU,MAAM,MAAM;AAAA,QACtB,KAAK,IAAI,UAAU,MAAM,MAAM,KAAK,UAAU,MAAM,IAAI,GAAG,IAAI;AAAA,MACjE;AAAA,IACF,IACA,MAAM;AAAA,MACJ,EAAE,QAAQ,KAAK,IAAI,UAAU,MAAM,IAAI,MAAM,UAAU,MAAM,MAAM,GAAG,IAAI,EAAE;AAAA,MAC5E,CAAC,GAAG,UAAU;AAAA,QACZ;AAAA,QACA,KAAK,IAAI,UAAU,MAAM,MAAM,KAAK,UAAU,MAAM,IAAI,GAAG,IAAI;AAAA,QAC/D,UAAU,MAAM,MAAM;AAAA,MACxB;AAAA,IACF,IAEN;AACJ,UAAM,gBAAgB,aAAa,eAAe,YAC9C,oBAAoB,WAAW,KAAK,GAAG,IACvC;AACJ,UAAM,WAA2B;AAAA,MAC/B;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,oBAAoB,YAChB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiC;AAAA,MACnC,IACA;AAAA,MACJ,uBAAuB,YACnB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiC;AAAA,MACnC,IACA;AAAA,MACJ,iBAAiB,YACb;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iCAAiC;AAAA,MACnC,IACA;AAAA,MACJ,WAAW,gBAAgB;AAAA,MAC3B,mBAAmB;AAAA,MACnB,eAAe,QAAQ,SAAS,OAAO,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM,cAAc;AAAA,MAChG,SAAS,OAAO;AAAA,MAChB,WAAW,aAAa,kBAAkB,EAAE,QAAQ,WAAW,QAAQ,gBAAgB,IAAI;AAAA,MAC3F,OAAO,eAAe,aAAa,SAAS,aAAa,cAAc;AAAA,QACrE,eAAe,aAAa;AAAA,MAC9B,CAAC;AAAA,MACD,YAAY,0BAA0B,KAAK,KAAK,WAAW;AAAA,MAC3D,OAAO,YACH,KACA,kBAAkB,OAChB,KACA,kBAAkB,CAAC,YACjB,aAAa,SAAS,KACtB,oBAAoB,WAAW,KAAK,KAAK,WAAW;AAAA,IAC9D;AAEA,QAAI,oBAAoB,QAAQ,GAAG;AACjC,YAAM,gBAAgB,iBAAiB,IAAI,GAAG;AAC9C,UAAI,kBAAkB,QAAW;AAC/B,cAAM,oBAAoB,qBAAqB,SAAS,MAAM,OAAO;AACrE,cAAM,YAAY,iBAAiB,SAAS,OAAO,SAAS,KAAK;AACjE,cAAM,gBAAgB,YAAY,oBAAoB;AACtD,YAAI,iBAAiB,mBAAmB,aAAa,KAAKJ;AAE1D,YAAI,gBAAgB,gBAAgB;AAClC,mBAAS,eAAe,gBAAgB,GAAG,eAAe,YAAY,QAAQ,gBAAgB,GAAG;AAC/F,kBAAM,gBAAgB,YAAY,YAAY;AAC9C,gBAAI,kBAAkB,QAAW;AAC/B;AAAA,YACF;AAEA,kBAAM,eAAe,YAAY,KAAK,aAAa;AACnD,gBAAI,CAAC,uBAAuB,YAAY,GAAG;AACzC;AAAA,YACF;AAEA,8BAAkB,mBAAmB,YAAY,KAAKA;AACtD,gBAAI,iBAAiB,gBAAgB;AACnC;AAAA,YACF;AAAA,UACF;AAEA,cAAI,kBAAkB,mBAAmB,aAAa,KAAKA,qBAAoB;AAC7E,qBAAS,aAAa,KAAK,IAAI,GAAG,iBAAiB,iBAAiB;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,uBAAmB,QAAQ,IAAI,UAAU,QAAQ;AACjD,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,kBAAkB,oBAAoB,iBAAiB,SAAS,kBAAkB,kBAAkB,aAAa,SAAS,CAAC;AAE5I,EAAM,iBAAU,MAAM;AACpB,qCAAiC,QAAQ,MAAM;AAAA,EACjD,GAAG,CAAC,aAAa,wBAAwB,aAAa,oBAAoB,QAAQ,CAAC;AAEnF,QAAM,mBAAyB,eAAQ,MAAM;AAC3C,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,aAAaD,gBAAe,kBAAkB;AACpD,UAAM,gBAAgB,iBAAiB,IAAI,WAAW,MAAM,GAAG;AAC/D,UAAM,cAAc,iBAAiB,IAAI,WAAW,IAAI,GAAG;AAC3D,UAAM,gBAAgB,iBAAiB,IAAI,WAAW,MAAM,GAAG;AAC/D,UAAM,cAAc,iBAAiB,IAAI,WAAW,IAAI,GAAG;AAE3D,QACE,kBAAkB,UAClB,gBAAgB,UAChB,kBAAkB,UAClB,gBAAgB,QAChB;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,QAAQ,eAAe,eAAe,eAAe,WAAW;AAAA,MAChE,MAAM,mBAAmB,eAAe,eAAe,GAAG,gBAAgB,CAAC;AAAA,MAC3E,KAAK,gBAAgB,eAAe,eAAe,GAAG,gBAAgB,CAAC;AAAA,MACvE,OAAO,eAAe,eAAe,eAAe,WAAW;AAAA,IACjE;AAAA,EACF,GAAG,CAAC,kBAAkB,eAAe,oBAAoB,kBAAkB,aAAa,CAAC;AACzF,QAAM,2BAA2B;AACjC,QAAM,cAAoB;AAAA,IACxB,MACE,uBACI,eAAe,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;AAAA,MACpD,KAAK,WAAW;AAAA,MAChB,OAAO,WAAW;AAAA,MAClB,KAAK,WAAW;AAAA,MAChB,MAAM,WAAW;AAAA,MACjB,OAAO,WAAW;AAAA,IACpB,EAAE,IACF,YAAY,IAAI,CAAC,GAAG,WAAW;AAAA,MAC7B,KAAK,cAAc,QAAQ,CAAC,KAAK;AAAA,MACjC;AAAA,MACA,KAAK,YAAY,KAAK,KAAK;AAAA,MAC3B,MAAM,mBAAmB,KAAK,KAAKC;AAAA,MACnC,OAAO,cAAc,KAAK,KAAK;AAAA,IACjC,EAAE;AAAA,IACR,CAAC,eAAe,gBAAgB,oBAAoB,sBAAsB,WAAW;AAAA,EACvF;AACA,QAAM,eAAqB;AAAA,IACzB,MAAM;AACJ,YAAM,UAA4B,CAAC;AACnC,kBAAY,QAAQ,CAAC,eAAe;AAClC,cAAM,YAAY,YAAY,WAAW,KAAK;AAC9C,YAAI,cAAc,QAAW;AAC3B;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,KAAK;AAAA,UACL,MAAM,WAAW;AAAA,UACjB,cAAc,WAAW;AAAA,QAC3B,CAAC;AAAA,MACH,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,CAAC,oBAAoB,aAAa,WAAW;AAAA,EAC/C;AACA,QAAM,oBAAoB,cAAc,cAAc,SAAS,CAAC,KAAK;AACrE,QAAM,2BAA2B,uBAAwB,YAAY,CAAC,GAAG,SAAS,IAAK;AACvF,QAAM,4BAA4B,uBAC9B,qBAAqB,YAAY,YAAY,SAAS,CAAC,GAAG,OAAO,KACjE;AACJ,QAAM,aAAmB;AAAA,IACvB,MACE,aACI,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB;AAAA,MACA,MACE,oBAAoB,iBAAiB,OAAO,MAAM,KAC9C,iBAAiB,OACjB,iBAAiB,OAAO,aAAa,aAAa,qBAAqB,oBAAoB;AAAA,QACzF;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACT,EAAE,IACF,CAAC;AAAA,IACP;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAmB;AAAA,IACvB,MACE,aACI,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB,MAAM,oBAAoB,MAAM,QAAQ,aAAa,aAAa,qBAAqB,oBAAoB;AAAA,QACzG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD;AAAA,IACF,EAAE,IACF,CAAC;AAAA,IACP;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAmB;AAAA,IACvB,MACE,aACI,OAAO,IAAI,CAAC,WAAW;AAAA,MACrB;AAAA,MACA,MACE,oBAAoB,iBAAiB,OAAO,MAAM,KAC9C,iBAAiB,OACjB,oBAAoB,MAAM,QAAQ,aAAa,aAAa,qBAAqB,oBAAoB;AAAA,QACnG;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACT,EAAE,IACF,CAAC;AAAA,IACP;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gCAAsC,mBAAY,CAAC,YAAyB;AAChF,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,QAAQ,sBAAsB;AAClD,UAAM,cAAc,QAAQ,sBAAsB;AAClD,UAAM,eAAe,QAAQ,eAAe;AAC5C,UAAM,gBAAgB,QAAQ,gBAAgB;AAC9C,UAAM,SAAS,KAAK,IAAI,MAAQ,YAAY,QAAQ,IAAI,YAAY,QAAQ,eAAe,CAAC;AAC5F,UAAM,SAAS,KAAK,IAAI,MAAQ,YAAY,SAAS,IAAI,YAAY,SAAS,gBAAgB,CAAC;AAE/F,WAAO;AAAA,MACL,QAAQ,YAAY,SAAS;AAAA,MAC7B,OAAO,YAAY,OAAO,YAAY,QAAQ;AAAA,MAC9C,MAAM,YAAY,MAAM,YAAY,OAAO;AAAA,MAC3C,OAAO,YAAY,QAAQ;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,0CAAgD,mBAAY,CAAC,SAA0B;AAC3F,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,QAAQ,cAA2B,oBAAoB,KAAK,GAAG,IAAI,KAAK,GAAG,IAAI;AAC/F,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,WAAO,8BAA8B,OAAO;AAAA,EAC9C,GAAG,CAAC,6BAA6B,CAAC;AAElC,QAAM,6BAAmC,mBAAY,CAAC,UAAyB;AAC7E,UAAM,aAAaD,gBAAe,KAAK;AACvC,UAAM,gBAAgB,iBAAiB,IAAI,WAAW,MAAM,GAAG;AAC/D,UAAM,cAAc,iBAAiB,IAAI,WAAW,IAAI,GAAG;AAC3D,UAAM,gBAAgB,iBAAiB,IAAI,WAAW,MAAM,GAAG;AAC/D,UAAM,cAAc,iBAAiB,IAAI,WAAW,IAAI,GAAG;AAE3D,QACE,kBAAkB,UAClB,gBAAgB,UAChB,kBAAkB,UAClB,gBAAgB,QAChB;AACA,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,mBAAmB,eAAe,eAAe,GAAG,gBAAgB,CAAC;AAChF,QAAI,MAAM,gBAAgB,eAAe,eAAe,GAAG,gBAAgB,CAAC;AAC5E,QAAI,QAAQ,eAAe,eAAe,eAAe,WAAW;AACpE,QAAI,SAAS,eAAe,eAAe,eAAe,WAAW;AAErE,UAAM,gBAAgB,iBAAiB;AACvC,QAAI,eAAe;AACjB,YAAM,eAAe,iBAAiB,IAAI,cAAc,WAAW;AACnE,UAAI,iBAAiB,QAAW;AAC9B,cAAM,YAAY,mBAAmB,YAAY,KAAKC;AACtD,cAAM,aAAa,cAAc,OAAO;AACxC,YAAI,eAAe,eAAe;AAChC,kBAAQ;AAAA,QACV;AACA,YAAI,gBAAgB,iBAAiB,gBAAgB,aAAa;AAChE,mBAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,cAAc;AACjC,QAAI,YAAY;AACd,YAAM,eAAe,iBAAiB,IAAI,WAAW,WAAW;AAChE,UAAI,iBAAiB,QAAW;AAC9B,cAAM,aAAa,oBAAoB,YAAY,KAAKC;AACxD,cAAM,cAAc,WAAW,OAAO;AACtC,YAAI,eAAe,eAAe;AAChC,iBAAO;AAAA,QACT;AACA,YAAI,gBAAgB,iBAAiB,gBAAgB,aAAa;AAChE,oBAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK,IAAI,GAAG,MAAM;AAAA,MAC1B,MAAM,KAAK,IAAI,kBAAkB,IAAI;AAAA,MACrC,KAAK,KAAK,IAAI,eAAe,GAAG;AAAA,MAChC,OAAO,KAAK,IAAI,GAAG,KAAK;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,kBAAkB,eAAe,oBAAoB,qBAAqB,kBAAkB,aAAa,CAAC;AAE9G,QAAM,iCAAuC,mBAAY,CAAC,OAAsB,iBAK1E;AACJ,UAAM,aAAaF,gBAAe,KAAK;AACvC,UAAM,YAAY,wCAAwC,WAAW,KAAK;AAC1E,UAAM,eAAe,wCAAwC,EAAE,KAAK,WAAW,MAAM,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC;AACnH,UAAM,iBAAiB,wCAAwC,EAAE,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,MAAM,IAAI,CAAC;AACrH,UAAM,UAAU,wCAAwC,WAAW,GAAG;AAEtE,UAAM,WAAW,aAAa;AAC9B,UAAM,UAAU,aAAa;AAC7B,UAAM,YAAY,gBAAgB;AAClC,UAAM,aAAa,kBAAkB;AAErC,UAAM,OAAO,WAAW,SAAS,OAAO,aAAa;AACrD,UAAM,MAAM,UAAU,QAAQ,MAAM,aAAa;AACjD,UAAM,QAAQ,YAAY,UAAU,OAAO,UAAU,QAAQ,aAAa,OAAO,aAAa;AAC9F,UAAM,SAAS,aAAa,WAAW,MAAM,WAAW,SAAS,aAAa,MAAM,aAAa;AAEjG,WAAO;AAAA,MACL,QAAQ,KAAK,IAAI,GAAG,SAAS,GAAG;AAAA,MAChC,MAAM,KAAK,IAAI,kBAAkB,IAAI;AAAA,MACrC,KAAK,KAAK,IAAI,eAAe,GAAG;AAAA,MAChC,OAAO,KAAK,IAAI,GAAG,QAAQ,IAAI;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,uCAAuC,CAAC;AAE5C,QAAM,yBAA+B,mBAAY,CAAC,UAAyB;AACzE,UAAM,YAAY,iBAAiB;AACnC,QAAI,CAAC,aAAa,CAAC,UAAU,WAAW,UAAU,SAAS,UAAU,CAAC,UAAU,mBAAmB;AACjG,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,2BAA2B,KAAK;AAClD,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,UAAU;AAC7B,UAAM,aAAaA,gBAAe,KAAK;AACvC,QAAI,YAAY,YAAY,EAAE,OAAO,UAAU,YAAY,KAAK,UAAU,WAAW,CAAC,GAAG;AACvF,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,UAAU;AAC7B,UAAM,eAAe,WAAW,QAAQ,WAAW,MAAM;AACzD,UAAM,cAAc,WAAW,QAAQ,WAAW,MAAM;AACxD,UAAM,oBAAoB,+BAA+B,OAAO,SAAS;AACzE,UAAM,gBAAgB,kBAAkB,OAAO,kBAAkB;AACjE,UAAM,iBAAiB,kBAAkB,MAAM,kBAAkB;AACjE,UAAM,cAAc,WAAW,OAAO,WAAW;AACjD,UAAM,eAAe,WAAW,MAAM,WAAW;AACjD,UAAM,OAAO,eAAe,WAAW,OAAO,KAAK,IAAI,WAAW,MAAM,kBAAkB,IAAI;AAC9F,UAAM,MAAM,cAAc,WAAW,MAAM,KAAK,IAAI,WAAW,KAAK,kBAAkB,GAAG;AACzF,UAAM,QAAQ,eAAe,KAAK,IAAI,aAAa,aAAa,IAAI;AACpE,UAAM,SAAS,cAAc,KAAK,IAAI,cAAc,cAAc,IAAI;AAEtE,WAAO;AAAA,MACL,QAAQ,KAAK,IAAI,WAAW,QAAQ,SAAS,GAAG;AAAA,MAChD;AAAA,MACA;AAAA,MACA,OAAO,KAAK,IAAI,WAAW,OAAO,QAAQ,IAAI;AAAA,IAChD;AAAA,EACF,GAAG,CAAC,4BAA4B,8BAA8B,CAAC;AAE/D,QAAM,qBAA2B,mBAAY,CAAC,UAAyB;AACrE,UAAM,aAAaA,gBAAe,KAAK;AACvC,QAAI,WAAW,MAAM,QAAQ,WAAW,IAAI,OAAO,WAAW,MAAM,QAAQ,WAAW,IAAI,KAAK;AAC9F,YAAM,OAAO,wCAAwC,WAAW,KAAK;AACrE,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,eAAe,2BAA2B,KAAK;AACrD,QAAI,cAAc;AAChB,aAAO,+BAA+B,OAAO,YAAY;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT,GAAG;AAAA,IACD;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,qBAA2B,eAAQ,MAAM;AAC7C,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,gBAAgB,KAAK,CAAC,UAAU,MAAM,SAAS,cAAc,SAAS,KAAK;AACzF,UAAM,SAAS,qBAAqB,OAAO,cAAc,KAAK,cAAc,GAAG;AAC/E,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS;AACjC,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,QAAQ,cAA2B,oBAAoB,cAAc,GAAG,IAAI,cAAc,GAAG,IAAI;AAC9G,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA,MAAM,KAAK,aAAa,KAAK,cAAc;AAAA,MAC3C;AAAA,MACA,KAAK,KAAK,YAAY,KAAK,eAAe;AAAA,IAC5C;AAAA,EACF,GAAG,CAAC,iBAAiB,aAAa,CAAC;AAEnC,QAAM,uBAA6B,mBAAY,CAAC,UAAgC;AAC9E,UAAM,aAAa,QAAQA,gBAAe,KAAK,IAAI;AAEnD,sBAAkB,QAAQ,QAAQ,CAAC,SAAS,cAAc;AACxD,cAAQ,MAAM,kBAAkB,cAAc,aAAa,WAAW,MAAM,OAAO,aAAa,WAAW,IAAI,MAC3G,iCACA,QAAQ;AAAA,IACd,CAAC;AAED,sBAAkB,QAAQ,QAAQ,CAAC,SAAS,cAAc;AACxD,cAAQ,MAAM,kBAAkB,cAAc,aAAa,WAAW,MAAM,OAAO,aAAa,WAAW,IAAI,MAC3G,iCACA,QAAQ;AAAA,IACd,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,eAAe,QAAQ,gBAAgB,CAAC;AAEpD,QAAM,kBAAwB,mBAAY,CAAC,WAAmB,YAAyC;AACrG,QAAI,SAAS;AACX,wBAAkB,QAAQ,IAAI,WAAW,OAAO;AAChD,YAAM,QAAQ,yBAAyB,WAAW,sBAAsB;AACxE,cAAQ,MAAM,kBAAkB,SAAS,aAAa,MAAM,MAAM,OAAO,aAAa,MAAM,IAAI,MAC5F,iCACA,QAAQ;AACZ;AAAA,IACF;AAEA,sBAAkB,QAAQ,OAAO,SAAS;AAAA,EAC5C,GAAG,CAAC,QAAQ,gBAAgB,CAAC;AAE7B,QAAM,kBAAwB,mBAAY,CAAC,WAAmB,YAAyC;AACrG,QAAI,SAAS;AACX,wBAAkB,QAAQ,IAAI,WAAW,OAAO;AAChD,YAAM,QAAQ,yBAAyB,WAAW,sBAAsB;AACxE,cAAQ,MAAM,kBAAkB,SAAS,aAAa,MAAM,MAAM,OAAO,aAAa,MAAM,IAAI,MAC5F,iCACA,QAAQ;AACZ;AAAA,IACF;AAEA,sBAAkB,QAAQ,OAAO,SAAS;AAAA,EAC5C,GAAG,CAAC,QAAQ,aAAa,CAAC;AAE1B,QAAM,sBAA4B,mBAAY,CAAC,UAAgC;AAC7E,UAAM,UAAU,oBAAoB;AACpC,QAAI,CAAC,WAAW,CAAC,OAAO;AACtB,2BAAqB,KAAK;AAC1B;AAAA,IACF;AAEA,UAAM,WACJ,iBAAiB,SAAS,WAAW,YAAY,UAC7C,uBAAuB,KAAK,KAAK,2BAA2B,KAAK,KAAK,mBAAmB,KAAK,IAC9F,mBAAmB,KAAK;AAC9B,QAAI,CAAC,UAAU;AACb,2BAAqB,KAAK;AAC1B;AAAA,IACF;AAEA,YAAQ,MAAM,OAAO,GAAG,SAAS,IAAI;AACrC,YAAQ,MAAM,MAAM,GAAG,SAAS,GAAG;AACnC,YAAQ,MAAM,QAAQ,GAAG,SAAS,KAAK;AACvC,YAAQ,MAAM,SAAS,GAAG,SAAS,MAAM;AACzC,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAC3B,UAAM,aAAa,cAAc;AACjC,QAAI,YAAY;AACd,iBAAW,MAAM,OAAO,GAAG,SAAS,OAAO,SAAS,QAAQ,CAAC;AAC7D,iBAAW,MAAM,MAAM,GAAG,SAAS,MAAM,SAAS,SAAS,CAAC;AAAA,IAC9D;AACA,yBAAqB,KAAK;AAAA,EAC5B,GAAG,CAAC,sBAAsB,wBAAwB,4BAA4B,kBAAkB,CAAC;AAEjG,QAAM,iCAAuC,mBAAY,CAAC,SAAsB,UAAyB;AACvG,UAAM,UAAU,oBAAoB;AACpC,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,UAAM,WAAW,8BAA8B,OAAO,KAAK,mBAAmB,KAAK;AACnF,QAAI,CAAC,UAAU;AACb,2BAAqB,KAAK;AAC1B;AAAA,IACF;AAEA,YAAQ,MAAM,OAAO,GAAG,SAAS,IAAI;AACrC,YAAQ,MAAM,MAAM,GAAG,SAAS,GAAG;AACnC,YAAQ,MAAM,QAAQ,GAAG,SAAS,KAAK;AACvC,YAAQ,MAAM,SAAS,GAAG,SAAS,MAAM;AACzC,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAC3B,UAAM,aAAa,cAAc;AACjC,QAAI,YAAY;AACd,iBAAW,MAAM,OAAO,GAAG,SAAS,OAAO,SAAS,QAAQ,CAAC;AAC7D,iBAAW,MAAM,MAAM,GAAG,SAAS,MAAM,SAAS,SAAS,CAAC;AAAA,IAC9D;AACA,yBAAqB,KAAK;AAAA,EAC5B,GAAG,CAAC,sBAAsB,+BAA+B,kBAAkB,CAAC;AAE5E,QAAM,8BAAoC,mBAAY,CAAC,SAAiC;AACtF,UAAM,UAAU,2BAA2B;AAC3C,QAAI,CAAC,WAAW,CAAC,QAAQ,eAAe,WAAW,iBAAiB,WAAW,YAAY,SAAS;AAClG,UAAI,SAAS;AACX,gBAAQ,MAAM,UAAU;AACxB,gBAAQ,MAAM,aAAa;AAAA,MAC7B;AACA;AAAA,IACF;AAEA,UAAM,WAAW,YAAY,KAAK,KAAK,KAAK,GAAG;AAC/C,UAAM,aAAa,SAAS,YAAY,mBAAmB,UAAU,SAAS,WAAW;AACzF,UAAM,OAAO,aAAa,mBAAmB,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC,IAAI;AAC3E,QAAI,CAAC,MAAM;AACT,cAAQ,MAAM,UAAU;AACxB,cAAQ,MAAM,aAAa;AAC3B;AAAA,IACF;AAEA,YAAQ,MAAM,OAAO,GAAG,KAAK,OAAO,KAAK,QAAQ,EAAE;AACnD,YAAQ,MAAM,MAAM,GAAG,KAAK,MAAO,KAAK,SAAS,CAAE;AACnD,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAAA,EAC7B,GAAG,CAAC,aAAa,kBAAkB,CAAC;AAEpC,QAAM,uBAA6B,mBAAY,CAAC,UAAyB;AACvE,UAAM,aAAaA,gBAAe,KAAK;AACvC,QACE,aAAa,WACb,YAAY,aAAa,SAAS,UAAU,KAC5C,WAAW,cAAc,SAAS,WAAW,GAAG,KAChD,mBAAmB,YAAY,QAC/B,mBAAmB,YAAY,MAC/B;AACA;AAAA,IACF;AAEA,8BAA0B,UAAU;AACpC,QAAI,wBAAwB,YAAY,MAAM;AAC5C;AAAA,IACF;AAEA,4BAAwB,UAAU,OAAO,sBAAsB,MAAM;AACnE,8BAAwB,UAAU;AAClC,YAAM,eAAe,0BAA0B;AAC/C,gCAA0B,UAAU;AACpC,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AAEA,UACE,aAAa,WACb,YAAY,aAAa,SAAS,YAAY,KAC9C,WAAW,cAAc,SAAS,aAAa,GAAG,KAClD,mBAAmB,YAAY,QAC/B,mBAAmB,YAAY,MAC/B;AACA;AAAA,MACF;AAEA,+BAAyB,MAAM;AAC7B,oBAAY,YAAY;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,wBAAwB,CAAC;AAE1C,QAAM,qCAA2C,mBAAY,MAAM;AACjE,QAAI,sBAAsB,SAAS;AACjC,0BAAoB,sBAAsB,OAAO;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,mBAAmB,CAAC;AAExB,EAAM,iBAAU,MAAM;AACpB,aAAS,kBAAkB,OAAqB;AAC9C,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,8BAAwB,UAAU;AAAA,QAChC,aAAa,MAAM;AAAA,QACnB,MACE,MAAM,SAAS,WACX,KAAK,IAAIC,qBAAoB,GAAG,MAAM,aAAc,MAAM,UAAU,MAAM,iBAAiB,UAAW,IACtG,KAAK,IAAIC,sBAAqB,KAAK,MAAM,aAAc,MAAM,UAAU,MAAM,iBAAiB,UAAW;AAAA,QAC/G,MAAM,MAAM;AAAA,MACd;AAEA,UAAI,eAAe,YAAY,MAAM;AACnC;AAAA,MACF;AAEA,qBAAe,UAAU,OAAO,sBAAsB,MAAM;AAC1D,uBAAe,UAAU;AACzB,cAAM,UAAU,wBAAwB;AACxC,YAAI,CAAC,SAAS;AACZ;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,UAAU;AAC7B,2BAAiB,UAAU,EAAE,aAAa,QAAQ,aAAa,MAAM,QAAQ,KAAK;AAClF,6BAAmB,QAAQ,aAAa,QAAQ,IAAI;AAAA,QACtD,OAAO;AACL,wBAAc,UAAU,EAAE,aAAa,QAAQ,aAAa,MAAM,QAAQ,KAAK;AAC/E,0BAAgB,QAAQ,aAAa,QAAQ,IAAI;AAAA,QACnD;AACA,2CAAmC;AAAA,MACrC,CAAC;AAAA,IACH;AAEA,aAAS,gBAAgB,OAAqB;AAC5C,UAAI,eAAe,SAAS,cAAc,MAAM,WAAW;AACzD,cAAM,cAAc,eAAe;AACnC,cAAM,UAAU,wBAAwB;AACxC,uBAAe,UAAU;AACzB,gCAAwB,UAAU;AAClC,2BAAmB,MAAM;AACzB,iBAAS,KAAK,MAAM,SAAS;AAC7B,iBAAS,KAAK,MAAM,aAAa;AAEjC,YAAI,eAAe,YAAY,MAAM;AACnC,iBAAO,qBAAqB,eAAe,OAAO;AAClD,yBAAe,UAAU;AAAA,QAC3B;AAEA,YAAI,YAAY,SAAS,UAAU;AACjC,6BAAmB,YAAY,aAAa,IAAI;AAChD,2BAAiB,UAAU;AAAA,QAC7B,OAAO;AACL,0BAAgB,YAAY,aAAa,IAAI;AAC7C,wBAAc,UAAU;AACxB,cAAI,sBAAsB;AACxB,2BAAe,QAAQ;AAAA,UACzB;AAAA,QACF;AACA,YAAI,WAAW,QAAQ,gBAAgB,YAAY,eAAe,QAAQ,SAAS,YAAY,MAAM;AACnG,cAAI,QAAQ,SAAS,UAAU;AAC7B,uBAAW,aAAa,QAAQ,aAAa,QAAQ,IAAI;AAAA,UAC3D,OAAO;AACL,uBAAW,UAAU,QAAQ,aAAa,QAAQ,IAAI;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,iBAAiB,eAAe;AAExD,WAAO,MAAM;AACX,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,iBAAiB,eAAe;AAC3D,UAAI,eAAe,YAAY,MAAM;AACnC,eAAO,qBAAqB,eAAe,OAAO;AAClD,uBAAe,UAAU;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,oBAAoB,iBAAiB,YAAY,oCAAoC,gBAAgB,sBAAsB,UAAU,CAAC;AAE1I,WAAS,2BACP,WACA,MACsB;AACtB,QAAI,UAAU,SAAS,OAAO;AAC5B,UAAI,oBAAoB,UAAa,mBAAmB,QAAW;AACjE,eAAO;AAAA,MACT;AAEA,aAAOF,gBAAe;AAAA,QACpB,OAAO,EAAE,KAAK,UAAU,OAAO,KAAK,KAAK,gBAAgB;AAAA,QACzD,KAAK,EAAE,KAAK,KAAK,KAAK,KAAK,eAAe;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,QAAI,UAAU,SAAS,UAAU;AAC/B,UAAI,oBAAoB,UAAa,mBAAmB,QAAW;AACjE,eAAO;AAAA,MACT;AAEA,aAAOA,gBAAe;AAAA,QACpB,OAAO,EAAE,KAAK,iBAAiB,KAAK,UAAU,OAAO,IAAI;AAAA,QACzD,KAAK,EAAE,KAAK,gBAAgB,KAAK,KAAK,IAAI;AAAA,MAC5C,CAAC;AAAA,IACH;AAEA,WAAOA,gBAAe,EAAE,OAAO,UAAU,QAAQ,KAAK,KAAK,CAAC;AAAA,EAC9D;AAEA,WAAS,8BAA8B,WAAmB;AACxD,4BAAwB,UAAU;AAClC,QAAI,qBAAsD;AAC1D,QAAI,mBAAkC;AAEtC,UAAM,mBAAmB,MAAM;AAC7B,yBAAmB;AACnB,YAAM,eAAe;AACrB,2BAAqB;AACrB,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AAEA,YAAM,YAAY,iBAAiB;AACnC,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,UAAI,CAAC,UAAU,SAAS;AACtB,cAAM,SAAS,KAAK,IAAI,aAAa,IAAI,UAAU,YAAY;AAC/D,cAAM,SAAS,KAAK,IAAI,aAAa,IAAI,UAAU,YAAY;AAC/D,YAAI,SAAS,+BAA+B,SAAS,6BAA6B;AAChF;AAAA,QACF;AAEA,kBAAU,UAAU;AAAA,MACtB;AAEA,YAAM,WAAW,4BAA4B,WAAW,aAAa,GAAG,aAAa,CAAC;AACtF,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,YAAM,YAAY,2BAA2B,WAAW,QAAQ;AAChE,UAAI,CAAC,aAAa,YAAY,WAAW,UAAU,YAAY,GAAG;AAChE;AAAA,MACF;AAEA,gBAAU,eAAe;AACzB,+BAAyB,UAAU;AACnC,4BAAsB,UAAU;AAChC,0BAAoB,SAAS;AAAA,IAC/B;AAEA,UAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AACA,2BAAqB,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ;AAC1D,UAAI,qBAAqB,MAAM;AAC7B;AAAA,MACF;AACA,yBAAmB,OAAO,sBAAsB,gBAAgB;AAAA,IAClE;AAEA,UAAM,sBAAsB,CAAC,UAAwB;AACnD,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AACA,UAAI,qBAAqB,MAAM;AAC7B,eAAO,qBAAqB,gBAAgB;AAC5C,2BAAmB;AAAA,MACrB;AACA,2BAAqB;AAErB,YAAM,YAAY,iBAAiB;AACnC,YAAM,WAAW,YAAY,4BAA4B,WAAW,MAAM,SAAS,MAAM,OAAO,IAAI;AACpG,UAAI,YAAY,WAAW,gBAAgB;AAC3C,UAAI,WAAW,WAAW,YAAY,WAAW;AAC/C,oBAAY,2BAA2B,WAAW,QAAQ;AAAA,MAC5D;AAEA,uBAAiB,UAAU;AAC3B,4BAAsB,UAAU;AAChC,UAAI,cAAc,WAAW,WAAW,CAAC,WAAW,yBAAyB;AAC3E,iCAAyB,UAAU;AACnC,8BAAsB,UAAU;AAChC,6BAAqB,SAAS;AAAA,MAChC,WAAW,CAAC,WAAW;AACrB,iCAAyB,UAAU;AAAA,MACrC;AACA,yBAAmB,MAAM;AACzB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,8BAAwB,UAAU;AAClC,8BAAwB,UAAU;AAAA,IACpC;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,aAAa,mBAAmB;AACxD,WAAO,iBAAiB,iBAAiB,mBAAmB;AAC5D,4BAAwB,UAAU,MAAM;AACtC,UAAI,qBAAqB,MAAM;AAC7B,eAAO,qBAAqB,gBAAgB;AAC5C,2BAAmB;AAAA,MACrB;AACA,2BAAqB;AACrB,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,aAAa,mBAAmB;AAC3D,aAAO,oBAAoB,iBAAiB,mBAAmB;AAAA,IACjE;AAAA,EACF;AAEA,WAAS,yBAAyB,WAAmB,aAA4B;AAC/E,uBAAmB,UAAU;AAC7B,QAAI,qBAAsD;AAC1D,QAAI,mBAAkC;AAEtC,UAAM,mBAAmB,MAAM;AAC7B,yBAAmB;AACnB,YAAM,eAAe;AACrB,2BAAqB;AACrB,UAAI,CAAC,cAAc;AACjB;AAAA,MACF;AACA,YAAM,WAAW,6BAA6B,aAAa,GAAG,aAAa,CAAC;AAC5E,UAAI,UAAU;AACZ,0BAAkB,QAAQ;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AACA,2BAAqB,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ;AAC1D,UAAI,qBAAqB,MAAM;AAC7B;AAAA,MACF;AACA,yBAAmB,OAAO,sBAAsB,gBAAgB;AAAA,IAClE;AAEA,UAAM,iBAAiB,CAAC,UAAwB;AAC9C,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AACA,UAAI,qBAAqB,MAAM;AAC7B,eAAO,qBAAqB,gBAAgB;AAC5C,2BAAmB;AAAA,MACrB;AACA,2BAAqB;AAErB,YAAM,WAAW,6BAA6B,MAAM,SAAS,MAAM,OAAO;AAC1E,UAAI,UAAU;AACZ,0BAAkB,QAAQ;AAAA,MAC5B;AAEA,YAAM,YAAY,YAAY,SAAS,gBAAgB;AACvD,kBAAY,UAAU;AACtB,4BAAsB,UAAU;AAChC,yBAAmB,MAAM;AACzB,0BAAoB,IAAI;AACxB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,oBAAc,SAAS;AACvB,yBAAmB,UAAU;AAC7B,yBAAmB,UAAU;AAAA,IAC/B;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,aAAa,cAAc;AACnD,WAAO,iBAAiB,iBAAiB,cAAc;AACvD,uBAAmB,UAAU,MAAM;AACjC,UAAI,qBAAqB,MAAM;AAC7B,eAAO,qBAAqB,gBAAgB;AAC5C,2BAAmB;AAAA,MACrB;AACA,2BAAqB;AACrB,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,aAAa,cAAc;AACtD,aAAO,oBAAoB,iBAAiB,cAAc;AAAA,IAC5D;AAAA,EACF;AAEA,EAAM,uBAAgB,MAAM;AAC1B,UAAM,eAAe,yBAAyB,WAAW;AACzD,QAAI,CAAC,gBAAgB,CAAC,WAAW,SAAS;AACxC,2BAAqB,IAAI;AACzB,UAAI,oBAAoB,SAAS;AAC/B,4BAAoB,QAAQ,MAAM,UAAU;AAC5C,4BAAoB,QAAQ,MAAM,aAAa;AAAA,MACjD;AACA;AAAA,IACF;AAEA,wBAAoB,YAAY;AAAA,EAClC,GAAG,CAAC,sBAAsB,qBAAqB,oBAAoB,QAAQ,CAAC;AAE5E,EAAM,uBAAgB,MAAM;AAC1B,gCAA4B,UAAU;AAAA,EACxC,GAAG,CAAC,YAAY,aAAa,UAAU,2BAA2B,CAAC;AAEnE,QAAM,wBAA8B,mBAAY,CAAC,SAA0B;AACzE,iBAAa,IAAI;AAAA,EACnB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,kBAAwB,mBAAY,CAAC,MAAuB,aAA6B;AAC7F,QAAI,CAAC,SAAS,WAAW;AACvB;AAAA,IACF;AAEA,kBAAc,SAAS,UAAU,QAAQ,SAAS,UAAU,QAAQ;AAAA,EACtE,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,wBAA8B,mBAAY,CAC9C,OACA,SACG;AACH,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,cAAU;AACV,UAAM,mBAAmB,aAAa;AACtC,UAAM,SAAS,MAAM,YAAY,mBAAmB,iBAAiB,QAAQ;AAC7E,UAAM,eAAeA,gBAAe,EAAE,OAAO,QAAQ,KAAK,KAAK,CAAC;AAChE,UAAM,WAAW,WAAW,cAAc,SAAS,IAAI;AACvD,UAAM,yBAAyB,CAAC,YAAY,CAAC,eAAe;AAC5D,UAAM,gBAAgB,yBAAyB,MAAM,MAAM,cAAc,sBAAsB,GAAG,MAAM,SAAS,MAAM,OAAO;AAC9H,UAAM,oBAAoB,8BAA8B,MAAM,aAAa;AAC3E,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,mCAA+B,MAAM,eAAe,YAAY;AAChE,QAAI,wBAAwB;AAC1B,2BAAqB,YAAY;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,gCAAgC,sBAAsB,WAAW,0BAA0B,6BAA6B,CAAC;AAE7H,QAAM,uBAA6B,mBAAY,CAC7C,OACA,cACG;AACH,QAAI,MAAM,WAAW,KAAK,oBAAoB,UAAa,mBAAmB,QAAW;AACvF;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,cAAU;AACV,UAAM,mBAAmB,aAAa;AACtC,UAAM,YAAY,MAAM,YAAY,mBAAmB,iBAAiB,MAAM,MAAM;AACpF,UAAM,eAAeA,gBAAe;AAAA,MAClC,OAAO,EAAE,KAAK,WAAW,KAAK,gBAAgB;AAAA,MAC9C,KAAK,EAAE,KAAK,WAAW,KAAK,eAAe;AAAA,IAC7C,CAAC;AACD,UAAM,gBAAgB,wBAAwB,WAAW,MAAM,cAAc,sBAAsB,GAAG,MAAM,OAAO;AACnH,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA;AAAA,MACE,MAAM;AAAA,MACN,EAAE,KAAK,WAAW,KAAK,gBAAgB;AAAA,MACvC;AAAA,MACA,EAAE,KAAK,WAAW,KAAK,gBAAgB;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,yBAAqB,YAAY;AAAA,EACnC,GAAG,CAAC,sBAAsB,iBAAiB,WAAW,gBAAgB,uBAAuB,CAAC;AAE9F,QAAM,0BAAgC,mBAAY,CAChD,OACA,cACG;AACH,QAAI,MAAM,WAAW,KAAK,oBAAoB,UAAa,mBAAmB,QAAW;AACvF;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,cAAU;AACV,UAAM,mBAAmB,aAAa;AACtC,UAAM,YACJ,MAAM,YAAY,mBAAmB,iBAAiB,MAAM,MAAM;AACpE,UAAM,eAAeA,gBAAe;AAAA,MAClC,OAAO,EAAE,KAAK,iBAAiB,KAAK,UAAU;AAAA,MAC9C,KAAK,EAAE,KAAK,gBAAgB,KAAK,UAAU;AAAA,IAC7C,CAAC;AACD,UAAM,gBAAgB,2BAA2B,WAAW,MAAM,cAAc,sBAAsB,GAAG,MAAM,OAAO;AACtH,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AAEA;AAAA,MACE,MAAM;AAAA,MACN,EAAE,KAAK,iBAAiB,KAAK,UAAU;AAAA,MACvC;AAAA,MACA,EAAE,KAAK,iBAAiB,KAAK,UAAU;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AACA,yBAAqB,YAAY;AAAA,EACnC,GAAG,CAAC,sBAAsB,iBAAiB,WAAW,gBAAgB,0BAA0B,CAAC;AAEjG,QAAM,6BAAmC,mBAAY,CACnD,OACA,WACA,cACG;AACH,QAAI,YAAY,SAAS;AACvB;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,mBAAe,MAAM,WAAW,WAAW,WAAW,MAAM,OAAO;AAAA,EACrE,GAAG,CAAC,CAAC;AAEL,QAAM,sBAA4B,mBAAY,CAAC,SAA0B;AACvE,UAAM,QAAQ,eAAe,iBAAiB,KAAK,KAAK,KAAK,GAAG;AAChE,UAAM,cAAc,qBAAqB,OAAO,KAAK,KAAK,KAAK,GAAG;AAClE,QAAI,CAAC,SAAS,CAAC,aAAa;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,YACJ,aAAa,UAAU,cAAc,MAAM,QAAQ,UAAU,gBAAgB,YAAY,QACrF,UAAU,YACV;AAEN,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAe,CAAC,UAAU;AACxB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AAAA,QACxB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AACtB;AAAA,YAAiB,CAAC,YAChB,WACA,QAAQ,cAAc,MAAM,QAC5B,QAAQ,QAAQ,KAAK,OACrB,QAAQ,QAAQ,KAAK,MACjB,OACA,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,WAAW,MAAM,KAAK;AAAA,UAC5D;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,UAAU;AAAA,UACV,OAAO;AAAA,UACP,KAAK;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,QACA,MAAK;AAAA,QAEJ,wBAAc,cAAc,WAAM,cAAc,eAAe,WAAM;AAAA;AAAA,IACxE;AAAA,EAEJ,GAAG,CAAC,iBAAiB,QAAQ,WAAW,SAAS,CAAC;AAElD,QAAM,iBAAuB,mBAAY,CACvC,OACA,OACA,SACG;AACH,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,cAAU;AACV,gBAAY,MAAM,EAAE;AAEpB,QAAI,YAAY,WAAW,MAAM,aAAa,OAAO;AACnD;AAAA,IACF;AAEA,UAAM,cAAc,oBAAoB,MAAM,SAAS;AACvD,wBAAoB,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,MACT,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,MACpB,MAAM;AAAA,IACR;AACA,wBAAoB,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK;AACnD,wBAAoB,EAAE,IAAI,MAAM,IAAI,KAAK,CAAC;AAC1C,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AACjC,qCAAiC,MAAM,SAAS;AAAA,EAClD,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,QAAM,mBAAyB,mBAAY,CACzC,OACA,OACA,MACA,WACG;AACH,QAAI,YAAY,WAAW,MAAM,aAAa,SAAS,MAAM,WAAW,GAAG;AACzE;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,cAAU;AACV,gBAAY,MAAM,EAAE;AACpB,UAAM,cAAc,oBAAoB,MAAM,SAAS;AACvD,wBAAoB,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,MACT;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,MACpB,MAAM;AAAA,IACR;AACA,wBAAoB,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK;AACnD,wBAAoB,EAAE,IAAI,MAAM,IAAI,KAAK,CAAC;AAC1C,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,SAAS,OAAO,oBAAoB,MAAM,CAAC;AAC/D,aAAS,KAAK,MAAM,aAAa;AACjC,qCAAiC,MAAM,SAAS;AAAA,EAClD,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,QAAM,iBAAuB,mBAAY,CACvC,OACA,OACA,SACG;AACH,QAAI,MAAM,WAAW,GAAG;AACtB;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,cAAU;AACV,gBAAY,MAAM,EAAE;AAEpB,QAAI,YAAY,WAAW,MAAM,aAAa,OAAO;AACnD;AAAA,IACF;AAEA,UAAM,cAAc,oBAAoB,MAAM,SAAS;AACvD,wBAAoB,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,MACpB,MAAM;AAAA,IACR;AACA,wBAAoB,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK;AACnD,wBAAoB,EAAE,IAAI,MAAM,IAAI,KAAK,CAAC;AAC1C,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AACjC,qCAAiC,MAAM,SAAS;AAAA,EAClD,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,QAAM,mBAAyB,mBAAY,CACzC,OACA,OACA,MACA,WACG;AACH,QAAI,YAAY,WAAW,MAAM,aAAa,SAAS,MAAM,WAAW,GAAG;AACzE;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,cAAU;AACV,gBAAY,MAAM,EAAE;AACpB,UAAM,cAAc,oBAAoB,MAAM,SAAS;AACvD,wBAAoB,UAAU;AAAA,MAC5B,UAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,MACpB,MAAM;AAAA,IACR;AACA,wBAAoB,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK;AACnD,wBAAoB,EAAE,IAAI,MAAM,IAAI,KAAK,CAAC;AAC1C,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,SAAS,OAAO,oBAAoB,MAAM,CAAC;AAC/D,aAAS,KAAK,MAAM,aAAa;AACjC,qCAAiC,MAAM,SAAS;AAAA,EAClD,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,QAAM,mBAAyB,mBAAY,CAAC,UAAqB;AAC/D,QAAI,sBAAsB,YAAY,MAAM,IAAI;AAC9C,4BAAsB,UAAU;AAChC;AAAA,IACF;AAEA,QAAI,MAAM,WAAW;AACnB,oBAAc,MAAM,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,mBAAyB,mBAAY,CAAC,UAAqB;AAC/D,QAAI,MAAM,WAAW;AACnB,oBAAc,MAAM,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,mBAAyB,mBAAY,CAAC,UAAqB;AAC/D,QAAI,sBAAsB,YAAY,MAAM,IAAI;AAC9C,4BAAsB,UAAU;AAChC;AAAA,IACF;AAEA,gBAAY,MAAM,EAAE;AAAA,EACtB,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,WAAW;AACb,WAAO,6EAAG,wBAAc,kBAAkB,cAAc,OAAO,GAAE;AAAA,EACnE;AAEA,MAAI,gBAAgB;AAClB,WAAO,6EAAG,6BAAmB,EAAE,GAAG,YAAY,iBAAiB,sBAAsB,sBAAsB,eAAe,GAAG,OAAO,GAAE;AAAA,EACxI;AAEA,MAAI,OAAO;AACT,QAAI,iBAAiB,gCAAgC;AACnD,aACE,6EACG;AAAA,QACC;AAAA,QACA;AAAA,UACE;AAAA,UACA,eAAe,MAAM;AAAA,UACrB,kBAAkB,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,MACF,GACF;AAAA,IAEJ;AAEA,WAAO,6EAAG,sBAAY,YAAY,OAAO,OAAO,GAAE;AAAA,EACpD;AAEA,MAAI,CAAC,eAAe,WAAW,SAAS,cAAc;AACpD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,iBAAiB,QAAQ;AAAA,UACzB,SAAS;AAAA,UACT,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,UAAU;AAAA,UACV,SAAS;AAAA,QACX;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,iBAAiB,QAAQ;AAAA,cACzB,QAAQ,aAAa,QAAQ,MAAM;AAAA,cACnC,cAAc;AAAA,cACd,SAAS;AAAA,cACT,KAAK;AAAA,cACL,qBAAqB,OAAO,SAAS,IAAI,yCAAyC;AAAA,cAClF,SAAS;AAAA,cACT,OAAO;AAAA,YACT;AAAA,YAEC,iBAAO,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU;AACzC,oBAAM,iBAAiB,EAAE,QAAQ,KAAK,MAAM,GAAG,KAAK,GAAG,OAAO,IAAI;AAClE,qBACE,6CAAC,SAAmB,OAAO,EAAE,WAAW,KAAK,UAAU,WAAW,GAC/D,4BACG,uBAAuB,oBAAoB,OAAO,cAAc,IAChE,6CAAC,gBAAa,OAAc,SAAkB,MAAM,gBAAgB,KAHhE,MAAM,EAIhB;AAAA,YAEJ,CAAC,IACC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,OAAO,QAAQ;AAAA,kBACf,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,gBAAgB;AAAA,kBAChB,WAAW;AAAA,gBACb;AAAA,gBACD;AAAA;AAAA,YAED;AAAA;AAAA,QAEJ;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,CAAC,aAAa;AAChB,WAAO,6EAAG,sBAAY,YAAY,OAAO,GAAE;AAAA,EAC7C;AAEA,QAAM,cAAc,CAAC,uBACjB,YAAY,IAAI,CAAC,WAAW,WAAW;AAAA,IACrC,KAAK,cAAc,QAAQ,CAAC,KAAK;AAAA,IACjC;AAAA,IACA,KAAK;AAAA,IACL,MAAM,oBAAoB,KAAK,KAAKE;AAAA,IACpC,OAAO,cAAc,KAAK,KAAK;AAAA,EACjC,EAAE,KACD,MAAM;AACL,UAAM,sBAAsB,oBAAI,IAA8B;AAC9D,2BAAuB,QAAQ,CAAC,eAAe;AAC7C,0BAAoB,IAAI,WAAW,OAAO;AAAA,QACxC,KAAK,WAAW;AAAA,QAChB,OAAO,WAAW;AAAA,QAClB,KAAK,YAAY,WAAW,KAAK,KAAK,WAAW;AAAA,QACjD,MAAM,WAAW;AAAA,QACjB,OAAO,WAAW;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAED,4BAAwB,QAAQ,CAAC,UAAU;AACzC,UAAI,oBAAoB,IAAI,KAAK,GAAG;AAClC;AAAA,MACF;AACA,0BAAoB,IAAI,OAAO;AAAA,QAC7B,KAAK,cAAc,QAAQ,CAAC,KAAK;AAAA,QACjC;AAAA,QACA,KAAK,YAAY,KAAK,KAAK;AAAA,QAC3B,MAAM,oBAAoB,KAAK,KAAKA;AAAA,QACpC,OAAO,cAAc,KAAK,KAAK;AAAA,MACjC,CAAC;AAAA,IACH,CAAC;AAED,WAAO,MAAM,KAAK,oBAAoB,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK;AAAA,EAChG,GAAG;AACP,QAAM,cAAc,uBAChB,eAAe,aAAa,IAC3B,cAAc,cAAc,SAAS,CAAC,KAAK;AAChD,QAAM,aAAa,oBAAoB;AACvC,QAAM,qBAAqB,gBAAgB;AAC3C,QAAM,oBAAoB,qBAAqB;AAC/C,QAAM,mBAAmB,aAAa;AACtC,QAAM,EAAE,MAAM,eAAe,QAAQ,wBAAwB,QAAQ,gBAAgB,IAAI,uBAAuB;AAAA,IAC9G;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,uBAAuB;AAC7B,QAAM,aAAa,aAAa,SAAS,KAAK,2BAA2B,IAAI,IAAI,MAAM,4BAA4B,IAAI,IAAI;AAC3H,QAAM,wBAAwB,kBAAkB,QAAQ,MAAM,oBAAoB,QAAQ,MAAM;AAChG,QAAM,kBAAuC;AAAA,IAC3C,iBAAiB,QAAQ;AAAA,IACzB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO,QAAQ;AAAA,IACf,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,KAAK;AAAA,IACL,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACA,QAAM,0BAA+C;AAAA,IACnD,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,WAAS,mBAAmB,MAAqB;AAC/C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,mBAAmB,OAAkB,MAAqB,MAAyB;AAC1F,UAAM,cAAc,mBAAmB,IAAI;AAC3C,QAAI,gBAAgB,MAAM;AACxB,aAAO;AAAA,IACT;AACA,UAAM,sBAAsB,gBAAgB,QAAQ,KAAK,gBAAgB,SAAS;AAClF,QAAI,SAAS,YAAY,uBAAuB,CAAC,uBAAuB,MAAM,eAAe,GAAG;AAC9F,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,SAAS;AACjC,UAAM,QAAQ,MAAM,SAAS;AAC7B,UAAM,cAAc,MAAM,UAAU;AACpC,UAAM,cAAc,MAAM,UAAU;AACpC,UAAM,cAAc,KAAK,IAAI,aAAa,WAAW;AACrD,UAAM,YAAY;AAClB,UAAM,YAAY,gBAAgB,IAAI,KAAK,QAAQ,cAAc,KAAK;AACtE,UAAM,aAAa,gBAAgB,IAAI,KAAK,SAAS,cAAc,KAAK;AACxE,UAAM,cAAc,mBAAmB,KAAK;AAC5C,UAAM,cAAc,MAAM,QAAQ,OAAO,gBAAiB,MAAM,QAAQ,SAAS;AACjF,UAAM,qBAAqB,MAAM,QAAQ,YAAY,MAAM,aAAa,SAAS,IAAI,MAAM;AAC3F,UAAM,eAAe,GAAG,MAAM,EAAE,IAAI,IAAI;AACxC,UAAM,eAAe,GAAG,MAAM,EAAE,IAAI,IAAI;AACxC,UAAM,aAAa,cACf;AAAA,MACE,MAAM,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,IACA;AACJ,UAAM,aAAa,cACf;AAAA,MACE,MAAM,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IACd,IACA;AACJ,UAAM,QAAQ;AAAA,MACZ,GAAG,yBAAyB,OAAO,IAAI;AAAA,MACvC,GAAI,cAAc;AAAA,QAChB,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MACV,IAAI;AAAA,IACN;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,SAAS,MAAM,iBAAiB,KAAK;AAAA,QACrC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS;AAAA,UACT,QAAQ,MAAM,YAAY,YAAY;AAAA,UACtC,MAAM,MAAM;AAAA,UACZ,eAAe,MAAM,YAAY,SAAS;AAAA,UAC1C,KAAK,MAAM;AAAA,UACX,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM;AAAA,QACtD;AAAA,QACA,OAAO,MAAM;AAAA,QAEZ;AAAA,wBACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,qBAAoB;AAAA,cACpB,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,OAAO;AAAA,cACT;AAAA,cACA,SAAS,OAAO,YAAY,QAAQ,KAAK,IAAI,YAAY,QAAQ,MAAM;AAAA,cAEtE;AAAA,8BAAc,aAAa,8CAAC,UAAM;AAAA;AAAA,kBAAY;AAAA,mBAAW,IAAU;AAAA,gBACpE;AAAA,kBAAC;AAAA;AAAA,oBACC,GAAG,YAAY;AAAA,oBACf,MAAM,MAAM,MAAM,OAAO,gBAAiB,MAAM,MAAM,SAAS;AAAA,oBAC/D,aAAa,MAAM,MAAM,WAAW;AAAA,oBACpC,WAAW,aAAa,QAAQ,YAAY,MAAM;AAAA,oBAClD,aAAa,aAAa,QAAQ,YAAY,MAAM;AAAA,oBACpD,QAAQ;AAAA,oBACR,eAAe,MAAM,QAAQ,WAAW;AAAA,oBACxC,aAAa;AAAA,oBACb,cAAa;AAAA;AAAA,gBACf;AAAA;AAAA;AAAA,UACF,IACE;AAAA,UACJ;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,MAAM;AAAA,gBACN,eAAe;AAAA,gBACf,KAAK;AAAA,gBACL,QAAQ;AAAA,gBACR,gBACE,MAAM,SAAS,kBAAkB,WAC7B,WACA,MAAM,SAAS,kBAAkB,WAC/B,aACA;AAAA,gBACR,eAAe,OAAO,UAAU;AAAA,gBAChC,aAAa,OAAO,QAAQ;AAAA,gBAC5B,cAAc,OAAO,SAAS;AAAA,gBAC9B,YAAY,OAAO,OAAO;AAAA,gBAC1B,eAAe;AAAA,gBACf,UAAU;AAAA,gBACV,WACE,gBAAgB,KAAK,gBAAgB,IACjC,SAAS,WAAW,KAAK,WAAW,MACpC;AAAA,gBACN,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,QAAQ;AAAA,cACV;AAAA,cAEC,gBAAM,WAAW,IAAI,CAAC,WAAW,UAAU;AAAA,gBAC1C;AAAA,gBACA;AAAA,gBACA,MAAM,SAAS,mBAAmB;AAAA,gBAClC;AAAA,cACF,CAAC;AAAA;AAAA,UACH;AAAA;AAAA;AAAA,MA1EK,GAAG,IAAI,IAAI,MAAM,EAAE;AAAA,IA2E1B;AAAA,EAEJ;AAEA,WAAS,mBACP,OACA,MACA,MACA;AACA,UAAM,cAAc,mBAAmB,IAAI;AAC3C,QAAI,gBAAgB,MAAM;AACxB,aAAO;AAAA,IACT;AACA,UAAM,sBAAsB,gBAAgB,QAAQ,KAAK,gBAAgB,SAAS;AAClF,QAAI,SAAS,YAAY,uBAAuB,CAAC,uBAAuB,MAAM,eAAe,GAAG;AAC9F,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,SAAS;AACjC,UAAM,eAAe,CAAC,YAAY,MAAM,aAAa;AACrD,UAAM,QAA6B;AAAA,MACjC,SAAS;AAAA,MACT,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,UAAU;AAAA,MACV,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM;AAAA,IACtD;AACA,UAAM,cACJ;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,MAAM,eAAe,MAAM,QAAQ;AAAA,QACxC,WAAW;AAAA,QACX,KAAK,MAAM;AAAA,QACX,OAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,OAAO;AAAA,QACT;AAAA;AAAA,IACF;AAEF,UAAM,gBAAgB,oBAAoB,MAAM,KAC9C;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,UACV,eAAe;AAAA,UACf,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM,SAAS;AAAA,QAC/D;AAAA,QAEC,iCACG,qBAAqB;AAAA,UACnB,aACE;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,QAAQ,eAAe,eAAe;AAAA,gBACtC,WAAW,aAAa,QAAQ,OAAO;AAAA,gBACvC,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,eAAe;AAAA,gBACf,UAAU;AAAA,cACZ;AAAA,cAEC,yBACG,uBAAuB,IAAI,CAAC,aAC1B;AAAA,gBAAC;AAAA;AAAA,kBAEC,eAAe,CAAC,UAAU,iBAAiB,OAAO,OAAO,MAAM,QAAQ;AAAA,kBACvE,OAAO,wBAAwB,UAAU,iBAAiB,QAAQ,OAAO;AAAA;AAAA,gBAFpE;AAAA,cAGP,CACD,IACD;AAAA;AAAA,UACN;AAAA,UAEF,gBAAgB,CAAC,cAAc;AAAA,YAC7B,eAAe,CAAC,UAAU;AACxB,kBAAI,cAAc;AAChB,iCAAiB,OAAO,OAAO,MAAM,QAAQ;AAAA,cAC/C;AAAA,YACF;AAAA,YACA,OAAO,eACH,wBAAwB,UAAU,iBAAiB,QAAQ,OAAO,IAClE,EAAE,GAAG,wBAAwB,UAAU,iBAAiB,QAAQ,OAAO,GAAG,SAAS,OAAO;AAAA,UAChG;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC,IAEC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ,eAAe,eAAe;AAAA,cACtC,WAAW,aAAa,QAAQ,OAAO;AAAA,cACvC,WAAW;AAAA,cACX,OAAO;AAAA,cACP,eAAe;AAAA,cACf,UAAU;AAAA,YACZ;AAAA,YAEC,yBACG,uBAAuB,IAAI,CAAC,aAC1B;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAe,CAAC,UAAU,iBAAiB,OAAO,OAAO,MAAM,QAAQ;AAAA,gBACvE,OAAO,wBAAwB,UAAU,iBAAiB,QAAQ,OAAO;AAAA;AAAA,cAFpE;AAAA,YAGP,CACD,IACD;AAAA;AAAA,QACN;AAAA;AAAA,IAER,IACE;AAEJ,WACE,8CAAO,iBAAN,EACE;AAAA,oBACG,6CAAC,SAAI,OAAe,sBAAY,EAAE,aAAa,OAAO,MAAM,MAAM,CAAC,GAAE,IACrE,6CAAC,SAAI,OAAe,uBAAY;AAAA,MACpC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,iBAAiB,KAAK;AAAA,UACrC,eAAe,CAAC,UAAU,eAAe,OAAO,OAAO,IAAI;AAAA,UAC3D,OAAO;AAAA,YACL,GAAG;AAAA,YACH,YAAY;AAAA,YACZ,QAAQ,gBAAgB,oBAAoB,MAAM,KAAK,SAAS,MAAM,YAAY,YAAY;AAAA,YAC9F,eAAe;AAAA,YACf,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM,SAAS;AAAA,UAC/D;AAAA;AAAA,MACF;AAAA,MACC;AAAA,SAfkB,GAAG,IAAI,IAAI,MAAM,EAAE,EAgBxC;AAAA,EAEJ;AAEA,WAAS,mBACP,OACA,MACA,MACA;AACA,UAAM,cAAc,mBAAmB,IAAI;AAC3C,QAAI,gBAAgB,MAAM;AACxB,aAAO;AAAA,IACT;AACA,UAAM,sBAAsB,gBAAgB,QAAQ,KAAK,gBAAgB,SAAS;AAClF,QAAI,SAAS,YAAY,uBAAuB,CAAC,uBAAuB,MAAM,eAAe,GAAG;AAC9F,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,SAAS;AACjC,UAAM,eAAe,CAAC,YAAY,MAAM,aAAa;AACrD,UAAM,QAA6B;AAAA,MACjC,SAAS;AAAA,MACT,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,MACf,UAAU;AAAA,MACV,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM;AAAA,IACtD;AACA,UAAM,gBAAgB,oBAAoB,MAAM,KAC9C;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU;AAAA,UACV,eAAe;AAAA,UACf,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM,SAAS;AAAA,QAC/D;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,QAAQ,eAAe,eAAe;AAAA,cACtC,WAAW,aAAa,QAAQ,OAAO;AAAA,cACvC,WAAW;AAAA,cACX,OAAO;AAAA,cACP,eAAe;AAAA,cACf,UAAU;AAAA,YACZ;AAAA,YAEC,yBACG,uBAAuB,IAAI,CAAC,aAC1B;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAe,CAAC,UAAU,iBAAiB,OAAO,OAAO,MAAM,QAAQ;AAAA,gBACvE,OAAO,wBAAwB,UAAU,iBAAiB,QAAQ,OAAO;AAAA;AAAA,cAFpE;AAAA,YAGP,CACD,IACD;AAAA;AAAA,QACN;AAAA;AAAA,IACF,IACE;AAEJ,WACE,8CAAO,iBAAN,EACC;AAAA,mDAAC,SAAI,OACF,4BACG,uBAAuB,oBAAoB,OAAO,IAAI,IACtD,6CAAC,gBAAa,OAAc,SAAkB,MAAY,GAChE;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,MAAM,iBAAiB,KAAK;AAAA,UACrC,eAAe,CAAC,UAAU,eAAe,OAAO,OAAO,IAAI;AAAA,UAC3D,OAAO;AAAA,YACL,GAAG;AAAA,YACH,YAAY;AAAA,YACZ,QAAQ,gBAAgB,oBAAoB,MAAM,KAAK,SAAS;AAAA,YAChE,eAAe;AAAA,YACf,QAAQ,kBAAkB,MAAM,SAAS,KAAK,MAAM,SAAS;AAAA,UAC/D;AAAA;AAAA,MACF;AAAA,MACC;AAAA,SAjBkB,GAAG,IAAI,IAAI,MAAM,EAAE,EAkBxC;AAAA,EAEJ;AAEA,QAAM,qBAA0C;AAAA,IAC9C,OAAO;AAAA,IACP,eAAe;AAAA,IACf,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACA,QAAM,kBAAuC;AAAA,IAC3C,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,eAAe;AAAA,IACf,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,mBAAwC;AAAA,IAC5C,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,UAAU;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,qBAA0C;AAAA,IAC9C,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACA,QAAM,2BAA2B,yBAAyB;AAC1D,QAAM,2BACJ,6BAA6B,QAC1B,yBAAyB,eAAe,cACxC,yBAAyB,eAAe,cACxC,yBAAyB,eAAe,cACxC,yBAAyB,eAAe,cACxC,yBAAyB,oBAAoB,mBAC7C,yBAAyB,oBAAoB,mBAC7C,yBAAyB,aAAa,YACtC,yBAAyB,oBAAoB,mBAC7C,yBAAyB,uBAAuB,sBAChD,yBAAyB,gBAAgB,eACzC,yBAAyB,yBAAyB,wBAClD,yBAAyB,oBAAoB,mBAC7C,yBAAyB,YAAY,WACrC,yBAAyB,gBAAgB,SAAS,gBAAgB,QAClE,yBAAyB,gBAAgB,QAAQ,gBAAgB,OACjE,yBAAyB,gBAAgB,UAAU,gBAAgB,SACnE,yBAAyB,gBAAgB,WAAW,gBAAgB;AACzE,QAAM,mBAAmB,2BACrB,yBAAyB,QACxB,CAAC,aACE;AAAA,IACE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,EACP,IACA;AAAA,IACE,QACE,8EACG;AAAA,iBAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC7E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC7E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,QAAQ,CAAC;AAAA,OAChF;AAAA,IAEF,MACE,8EACG;AAAA,iBAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,MAAM,CAAC;AAAA,MAC3E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,MAAM,CAAC;AAAA,MAC3E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,MAAM,CAAC;AAAA,OAC9E;AAAA,IAEF,QACE,8EACG;AAAA,iBAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC7E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC7E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,QAAQ,CAAC;AAAA,OAChF;AAAA,IAEF,KACE,8EACG;AAAA,iBAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,KAAK,CAAC;AAAA,MAC1E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,KAAK,CAAC;AAAA,MAC1E,WAAW,IAAI,CAAC,EAAE,OAAO,KAAK,MAAM,mBAAmB,OAAO,MAAM,KAAK,CAAC;AAAA,OAC7E;AAAA,EAEJ;AAER,MAAI,CAAC,0BAA0B;AAC7B,6BAAyB,UAAU;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,kBAAkB,WAAmB,WAAmB,SAAiB,QAAgB;AAChG,QAAI,UAAU;AACZ;AAAA,IACF;AAEA,mBAAe,UAAU;AAAA,MACvB,aAAa;AAAA,MACb,WAAW;AAAA,MACX;AAAA,MACA,eAAe;AAAA,MACf,MAAM;AAAA,IACR;AACA,qBAAiB,UAAU,EAAE,aAAa,WAAW,MAAM,QAAQ;AACnE,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC;AAEA,WAAS,eAAe,WAAmB,WAAmB,UAAkB,QAAgB;AAC9F,QAAI,UAAU;AACZ;AAAA,IACF;AAEA,mBAAe,UAAU;AAAA,MACvB,aAAa;AAAA,MACb,WAAW;AAAA,MACX;AAAA,MACA,eAAe;AAAA,MACf,MAAM;AAAA,IACR;AACA,kBAAc,UAAU,EAAE,aAAa,WAAW,MAAM,SAAS;AACjE,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC;AAEA,WAAS,mBACP,WACA,QACA,MACA,YACA,eAMA,mBACA,wBACA,cACA,cACA,cACA;AACA,0BAAsB,UAAU,UAAU,SAAS,sBAAsB,KAAK;AAC9E,qBAAiB,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA,eAAe,cAAc;AAAA,MAC7B,eAAe,cAAc;AAAA,MAC7B;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,gBAAgB,cAAc;AAAA,MAC9B,gBAAgB,cAAc;AAAA,MAC9B;AAAA,MACA,cAAcF,gBAAe,YAAY;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AACA,6BAAyB,UAAUA,gBAAe,YAAY;AAC9D,0BAAsB,UAAU,yBAAyB;AACzD,wBAAoB,yBAAyB,OAAO;AACpD,uBAAmB,QAAQ;AAC3B,aAAS,KAAK,MAAM,aAAa;AACjC,kCAA8B,SAAS;AAAA,EACzC;AAEA,WAAS,iBAAiB,aAA4B,MAAsC;AAC1F,UAAM,mBAAmBA,gBAAe,WAAW;AACnD,QAAI,cAAc,MAAM,gBAAgB,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,IAAI,GAAG,iBAAiB,MAAM,MAAM,KAAK,GAAG;AACvE,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,MAAM,iBAAiB,IAAI,GAAG;AACrE,UAAM,eAAe,KAAK,IAAI,GAAG,iBAAiB,MAAM,MAAM,KAAK,GAAG;AACtE,UAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,MAAM,iBAAiB,IAAI,GAAG;AACrE,UAAM,mBAAmB,KAAK,IAAI,eAAe,aAAa;AAC9D,UAAM,qBAAqB,KAAK,IAAI,cAAc,aAAa;AAE/D,QAAI,oBAAoB,oBAAoB;AAC1C,aAAOA,gBAAe;AAAA,QACpB,OAAO;AAAA,UACL,KAAK,gBAAgB,IAAI,KAAK,MAAM,iBAAiB,MAAM;AAAA,UAC3D,KAAK,iBAAiB,MAAM;AAAA,QAC9B;AAAA,QACA,KAAK;AAAA,UACH,KAAK,gBAAgB,IAAI,KAAK,MAAM,iBAAiB,IAAI;AAAA,UACzD,KAAK,iBAAiB,IAAI;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAOA,gBAAe;AAAA,MACpB,OAAO;AAAA,QACL,KAAK,iBAAiB,MAAM;AAAA,QAC5B,KAAK,eAAe,IAAI,KAAK,MAAM,iBAAiB,MAAM;AAAA,MAC5D;AAAA,MACA,KAAK;AAAA,QACH,KAAK,iBAAiB,IAAI;AAAA,QAC1B,KAAK,gBAAgB,IAAI,KAAK,MAAM,iBAAiB,IAAI;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,cAAc,WAAmB,aAA4B;AACpE,QAAI,UAAU;AACZ;AAAA,IACF;AAEA,0BAAsB,UAAU,UAAU,SAAS,sBAAsB,KAAK;AAC9E,UAAM,mBAAmBA,gBAAe,WAAW;AACnD,gBAAY,UAAU;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AACA,wBAAoB,gBAAgB;AACpC,uBAAmB,MAAM;AACzB,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AACjC,6BAAyB,WAAW,gBAAgB;AAAA,EACtD;AAEA,WAAS,kBAAkB,MAAuB;AAChD,UAAM,YAAY,YAAY;AAC9B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,YAAY,iBAAiB,UAAU,aAAa,IAAI;AAC9D,cAAU,eAAe;AACzB,wBAAoB,SAAS;AAAA,EAC/B;AAEA,WAAS,iCAAiC,WAAmB;AAC3D,+BAA2B,UAAU;AAErC,UAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AAEA,YAAM,cAAc,oBAAoB;AACxC,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,UAAU,YAAY,gBAAgB;AAC5D,YAAM,UAAU,MAAM,UAAU,YAAY,gBAAgB;AAC5D,UAAI,CAAC,YAAY,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI;AAC1E,oBAAY,UAAU;AAAA,MACxB;AACA,YAAM,WAAW;AAAA,QACf,YAAY,SAAS,SACjB;AAAA,UACE,GAAG,YAAY;AAAA,UACf,MAAM,YAAY,SAAS,OAAO;AAAA,UAClC,KAAK,YAAY,SAAS,MAAM;AAAA,QAClC,IACA,gBAAgB,YAAY,UAAU,YAAY,QAAQ,QAAQ,QAAQ,iBAAiB;AAAA,MACjG;AAEA,+BAAyB,EAAE,IAAI,YAAY,SAAS,MAAM,SAAS,CAAC;AAAA,IACtE;AAEA,UAAM,UAAU,MAAM;AACpB,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,iBAAiB,eAAe;AAAA,IAC7D;AAEA,UAAM,kBAAkB,CAAC,UAAwB;AAC/C,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AAEA,YAAM,cAAc,oBAAoB;AACxC,UAAI,qBAAqB,YAAY,MAAM;AACzC,eAAO,qBAAqB,qBAAqB,OAAO;AACxD,6BAAqB,UAAU;AAAA,MACjC;AACA,YAAM,iBAAiB,uBAAuB;AAC9C,6BAAuB,UAAU;AACjC,UAAI,gBAAgB;AAClB,4BAAoB,UAAU;AAC9B,4BAAoB,cAAc;AAAA,MACpC;AACA,YAAM,UAAU,kBAAkB,oBAAoB;AACtD,0BAAoB,UAAU;AAC9B,iCAA2B,UAAU;AACrC,yBAAmB,MAAM;AACzB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,cAAQ;AACR,UAAI,eAAe,WAAW,QAAQ,OAAO,YAAY,SAAS;AAChE,YAAI,YAAY,SAAS;AACvB,gCAAsB,UAAU,YAAY;AAAA,QAC9C;AACA,qBAAa,YAAY,SAAS,QAAQ,IAAI;AAAA,MAChD;AACA,0BAAoB,UAAU;AAC9B,0BAAoB,IAAI;AAAA,IAC1B;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,iBAAiB,eAAe;AACxD,+BAA2B,UAAU;AAAA,EACvC;AAEA,WAAS,iCAAiC,WAAmB;AAC3D,+BAA2B,UAAU;AAErC,UAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AAEA,YAAM,cAAc,oBAAoB;AACxC,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,UAAU,YAAY,gBAAgB;AAC5D,YAAM,UAAU,MAAM,UAAU,YAAY,gBAAgB;AAC5D,UAAI,CAAC,YAAY,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI;AAC1E,oBAAY,UAAU;AAAA,MACxB;AACA,YAAM,WAAW;AAAA,QACf,YAAY,SAAS,SACjB;AAAA,UACE,GAAG,YAAY;AAAA,UACf,MAAM,YAAY,SAAS,OAAO;AAAA,UAClC,KAAK,YAAY,SAAS,MAAM;AAAA,QAClC,IACA,gBAAgB,YAAY,UAAU,YAAY,QAAQ,QAAQ,QAAQ,EAAE;AAAA,MAClF;AAEA,+BAAyB,EAAE,IAAI,YAAY,SAAS,MAAM,SAAS,CAAC;AAAA,IACtE;AAEA,UAAM,UAAU,MAAM;AACpB,aAAO,oBAAoB,eAAe,iBAAiB;AAC3D,aAAO,oBAAoB,aAAa,eAAe;AACvD,aAAO,oBAAoB,iBAAiB,eAAe;AAAA,IAC7D;AAEA,UAAM,kBAAkB,CAAC,UAAwB;AAC/C,UAAI,MAAM,cAAc,WAAW;AACjC;AAAA,MACF;AAEA,YAAM,cAAc,oBAAoB;AACxC,UAAI,qBAAqB,YAAY,MAAM;AACzC,eAAO,qBAAqB,qBAAqB,OAAO;AACxD,6BAAqB,UAAU;AAAA,MACjC;AACA,YAAM,iBAAiB,uBAAuB;AAC9C,6BAAuB,UAAU;AACjC,UAAI,gBAAgB;AAClB,4BAAoB,UAAU;AAC9B,4BAAoB,cAAc;AAAA,MACpC;AACA,YAAM,UAAU,kBAAkB,oBAAoB;AACtD,0BAAoB,UAAU;AAC9B,iCAA2B,UAAU;AACrC,yBAAmB,MAAM;AACzB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,cAAQ;AACR,UAAI,eAAe,WAAW,QAAQ,OAAO,YAAY,SAAS;AAChE,YAAI,YAAY,SAAS;AACvB,gCAAsB,UAAU,YAAY;AAAA,QAC9C;AACA,qBAAa,YAAY,SAAS,QAAQ,IAAI;AAAA,MAChD;AACA,0BAAoB,UAAU;AAC9B,0BAAoB,IAAI;AAAA,IAC1B;AAEA,WAAO,iBAAiB,eAAe,iBAAiB;AACxD,WAAO,iBAAiB,aAAa,eAAe;AACpD,WAAO,iBAAiB,iBAAiB,eAAe;AACxD,+BAA2B,UAAU;AAAA,EACvC;AAEA,WAAS,qBAAqB;AAC5B,QAAI,cAAc,iBAAiB,IAAI,WAAW,GAAG,KAAK,iBAAiB,IAAI,WAAW,GAAG,GAAG;AAC9F,aAAO;AAAA,IACT;AACA,QAAI,oBAAoB,UAAa,oBAAoB,QAAW;AAClE,aAAO;AAAA,IACT;AACA,WAAO,EAAE,KAAK,iBAAiB,KAAK,gBAAgB;AAAA,EACtD;AAEA,WAAS,cAAc,cAAsB,cAAsB,QAAiB;AAClF,UAAM,UAAU,YAAY,YAAY;AACxC,UAAM,UAAU,YAAY,YAAY;AACxC,QAAI,YAAY,UAAa,YAAY,QAAW;AAClD;AAAA,IACF;AAEA,eAAW,EAAE,KAAK,SAAS,KAAK,QAAQ,GAAG,SAAS,EAAE,QAAQ,KAAK,IAAI,MAAS;AAAA,EAClF;AAGA,SACE,6CAAC,SAAI,OAAO,EAAE,iBAAiB,QAAQ,QAAQ,SAAS,QAAQ,MAAM,GAAG,WAAW,GAAG,UAAU,EAAE,GACjG;AAAA,IAAC;AAAA;AAAA,MAEC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,CAAC,UAAU;AACjB,YAAI,aAAa;AACf;AAAA,QACF;AAEA,cAAM,YAAY,MAAM;AACxB,cAAM,gBAAgB,iBAAiB;AACvC,YAAI,CAAC,eAAe;AAClB;AAAA,QACF;AAEA,cAAM,eAAe;AACrB,YAAI,WAAW;AACb,oBAAU,QAAQ,cAAc,cAAc,IAAI;AAClD,oBAAU,QAAQ,aAAa,cAAc,IAAI;AACjD,oBAAU,QAAQM,0BAAyB,cAAc,UAAU;AACnE;AAAA,QACF;AAEA,aAAK,yBAAyB;AAAA,MAChC;AAAA,MACA,WAAW,CAAC,UAAU;AACpB,YAAI,aAAa;AACf;AAAA,QACF;AAEA,YAAI,CAAC,aAAa,MAAM,WAAW,MAAM,YAAY,CAAC,MAAM,QAAQ;AAClE,gBAAM,gBAAgB,MAAM,IAAI,YAAY;AAC5C,cAAI,kBAAkB,OAAO,MAAM,UAAU;AAC3C,kBAAM,eAAe;AACrB,iBAAK;AACL;AAAA,UACF;AAEA,cAAI,kBAAkB,KAAK;AACzB,kBAAM,eAAe;AACrB,iBAAK;AACL;AAAA,UACF;AAEA,cAAI,kBAAkB,KAAK;AACzB,kBAAM,eAAe;AACrB,iBAAK;AACL;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAAc,mBAAmB;AACvC,YAAI,CAAC,aAAa;AAChB;AAAA,QACF;AAEA,cAAM,kBAAkB,iBAAiB,IAAI,YAAY,GAAG,KAAK;AACjE,cAAM,kBAAkB,iBAAiB,IAAI,YAAY,GAAG,KAAK;AAEjE,YAAI,CAAC,YAAY,eAAe,KAAK,GAAG;AACtC,gBAAM,eAAe;AACrB,uBAAa,aAAa,MAAM,GAAG;AACnC;AAAA,QACF;AAEA,gBAAQ,MAAM,KAAK;AAAA,UACjB,KAAK;AACH,kBAAM,eAAe;AACrB,0BAAc,KAAK,IAAI,kBAAkB,GAAG,YAAY,SAAS,CAAC,GAAG,iBAAiB,MAAM,QAAQ;AACpG;AAAA,UACF,KAAK;AACH,kBAAM,eAAe;AACrB,0BAAc,KAAK,IAAI,kBAAkB,GAAG,CAAC,GAAG,iBAAiB,MAAM,QAAQ;AAC/E;AAAA,UACF,KAAK;AACH,kBAAM,eAAe;AACrB,0BAAc,iBAAiB,KAAK,IAAI,kBAAkB,GAAG,CAAC,GAAG,MAAM,QAAQ;AAC/E;AAAA,UACF,KAAK;AACH,kBAAM,eAAe;AACrB,0BAAc,iBAAiB,KAAK,IAAI,kBAAkB,GAAG,YAAY,SAAS,CAAC,GAAG,MAAM,QAAQ;AACpG;AAAA,UACF,KAAK;AACH,kBAAM,eAAe;AACrB;AAAA,cACE;AAAA,cACA,MAAM,WAAW,KAAK,IAAI,kBAAkB,GAAG,CAAC,IAAI,KAAK,IAAI,kBAAkB,GAAG,YAAY,SAAS,CAAC;AAAA,cACxG;AAAA,YACF;AACA;AAAA,UACF,KAAK;AACH,kBAAM,eAAe;AACrB,gBAAI,MAAM,WAAW,MAAM,WAAW,MAAM,QAAQ;AAClD;AAAA,YACF;AACA,gBAAI,MAAM,UAAU;AAClB,4BAAc,KAAK,IAAI,kBAAkB,GAAG,CAAC,GAAG,iBAAiB,KAAK;AACtE;AAAA,YACF;AACA,0BAAc,KAAK,IAAI,kBAAkB,GAAG,YAAY,SAAS,CAAC,GAAG,iBAAiB,KAAK;AAC3F;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AACH,gBAAI,CAAC,UAAU;AACb,oBAAM,eAAe;AACrB,iCAAmB;AAAA,YACrB;AACA;AAAA,UACF,KAAK;AACH,gBAAI,CAAC,UAAU;AACb,oBAAM,eAAe;AACrB,2BAAa,WAAW;AAAA,YAC1B;AACA;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,YAAI,eAAe,UAAU;AAC3B;AAAA,QACF;AAEA,cAAM,YAAY,MAAM;AACxB,YAAI,CAAC,WAAW;AACd,gBAAM,eAAe;AACrB,eAAK,mBAAmB;AACxB;AAAA,QACF;AAEA,cAAM,oBAAoB,UAAU,QAAQA,wBAAuB;AACnE,cAAM,cAAc,UAAU,QAAQ,YAAY;AAClD,YAAI,CAAC,qBAAqB,CAAC,aAAa;AACtC;AAAA,QACF;AAEA,cAAM,eAAe;AACrB,YAAI,mBAAmB;AACrB,uCAA6B,iBAAiB;AAC9C;AAAA,QACF;AAEA,kBAAU,WAAW;AAAA,MACvB;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,QACL,CAAC,oBAA8B,GAAG;AAAA,QAClC,CAAC,oBAA8B,GAAG,QAAQ;AAAA,QAC1C,CAAC,qBAA+B,GAAG,QAAQ;AAAA,QAC3C,CAAC,yBAAmC,GAAG;AAAA,QACvC,iBAAiB,QAAQ;AAAA,QACzB,OAAO,QAAQ;AAAA,QACf,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,iBAAiB,oBAAoB,aAAa,OAAO;AAAA,YACzD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,UAAU;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,WAAW;AAAA,gBACX,iBAAiB;AAAA,gBACjB,MAAM,+BAA+B,aAAa;AAAA,gBAClD,OAAO;AAAA,cACT;AAAA,cAEC;AAAA,6BACC,8EACE;AAAA,+DAAC,SAAI,OAAO,iBAAkB,2BAAiB,KAAI;AAAA,kBACnD,6CAAC,SAAI,OAAO,kBAAmB,2BAAiB,MAAK;AAAA,kBACrD,6CAAC,SAAI,OAAO,oBAAqB,2BAAiB,QAAO;AAAA,kBACzD,6CAAC,SAAI,OAAO,oBAAqB,2BAAiB,QAAO;AAAA,mBAC3D,IACE;AAAA,gBACJ;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,OAAO;AAAA,sBACL,gBAAgB;AAAA,sBAChB,OAAO;AAAA,sBACP,MAAM;AAAA,sBACN,aAAa;AAAA,sBACb,OAAO;AAAA,oBACT;AAAA,oBAEA;AAAA,oEAAC,cACC;AAAA,qEAAC,SAAI,OAAO,EAAE,OAAO,iBAAiB,GAAG;AAAA,wBACxC,2BAA2B,IAAI,6CAAC,SAAI,OAAO,EAAE,OAAO,yBAAyB,GAAG,IAAK;AAAA,wBACrF,aAAa,IAAI,CAAC,WACjB;AAAA,0BAAC;AAAA;AAAA,4BAEC,KAAK,CAAC,YAAY;AAChB,kCAAI,SAAS;AACX,+CAAe,QAAQ,IAAI,OAAO,WAAW,OAAO;AAAA,8BACtD,OAAO;AACL,+CAAe,QAAQ,OAAO,OAAO,SAAS;AAAA,8BAChD;AAAA,4BACF;AAAA,4BACA,OAAO,EAAE,OAAO,OAAO,KAAK;AAAA;AAAA,0BARvB,OAAO;AAAA,wBASd,CACD;AAAA,wBACA,4BAA4B,IAAI,6CAAC,SAAI,OAAO,EAAE,OAAO,0BAA0B,GAAG,IAAK;AAAA,yBAC1F;AAAA,sBACA,6CAAC,WAAM,OAAO,EAAE,UAAU,UAAU,KAAK,GAAG,QAAQ,GAAG,GACrD,wDAAC,QACC;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,GAAG;AAAA,8BACH,iBAAiB,QAAQ;AAAA,8BACzB,MAAM;AAAA,8BACN,OAAO;AAAA,8BACP,QAAQ;AAAA,4BACV;AAAA;AAAA,wBACF;AAAA,wBACC,2BAA2B,IAC1B,6CAAC,QAAG,eAAY,QAAO,OAAO,EAAE,GAAG,iBAAiB,SAAS,GAAG,OAAO,yBAAyB,GAAG,IACjG;AAAA,wBACH,aAAa,IAAI,CAAC,WACjB;AAAA,0BAAC;AAAA;AAAA,4BACC,wBAAsB,OAAO;AAAA,4BAE7B,KAAK,CAAC,YAAY,gBAAgB,OAAO,WAAW,OAAO;AAAA,4BAC3D,eAAe,CAAC,UAAU,wBAAwB,OAAO,OAAO,SAAS;AAAA,4BACzE,OAAO;AAAA,8BACL,GAAG;AAAA,8BACH,MAAM,gBAAgB,IAAI,OAAO,SAAS;AAAA,8BAC1C,QAAQ,gBAAgB,IAAI,OAAO,SAAS,IAAI,KAAK,gBAAgB;AAAA,4BACvE;AAAA,4BAEA,wDAAC,SAAI,OAAO,EAAE,UAAU,WAAW,GAChC;AAAA,8BAAAC,aAAY,OAAO,SAAS;AAAA,8BAC7B;AAAA,gCAAC;AAAA;AAAA,kCACC,eAAe,CAAC,UAAU;AACxB,wCAAI,UAAU;AACZ;AAAA,oCACF;AAEA,0CAAM,eAAe;AACrB,0CAAM,gBAAgB;AACtB;AAAA,sCACE,MAAM;AAAA,sCACN,OAAO;AAAA,sCACP,OAAO;AAAA,sCACP,MAAM;AAAA,oCACR;AAAA,kCACF;AAAA,kCACA,OAAO;AAAA;AAAA,8BACT;AAAA,+BACF;AAAA;AAAA,0BA5BK,OAAO;AAAA,wBA6Bd,CACD;AAAA,wBACA,4BAA4B,IAC3B,6CAAC,QAAG,eAAY,QAAO,OAAO,EAAE,GAAG,iBAAiB,SAAS,GAAG,OAAO,0BAA0B,GAAG,IAClG;AAAA,yBACN,GACF;AAAA,sBACA,8CAAC,WACE;AAAA,oCAAY,IAAI,CAAC,YAAY,UAAU;AACtC,gCAAM,YAAY,YAAY,WAAW,KAAK;AAC9C,8BAAI,cAAc,QAAW;AAC3B,mCAAO;AAAA,0BACT;AAEA,gCAAM,cAAc,UAAU,IAAI,IAAK,YAAY,QAAQ,CAAC,GAAG,OAAO;AACtE,gCAAM,YAAY,KAAK,IAAI,GAAG,WAAW,QAAQ,WAAW;AAE5D,iCACE,8CAAO,iBAAN,EACE;AAAA,wCAAY,IACX,6CAAC,QAAG,eAAY,QAAO,OAAO,EAAE,QAAQ,UAAU,GAChD,uDAAC,QAAG,SAAS,YAAY,GAC3B,IACE;AAAA,4BACJ;AAAA,8BAAC;AAAA;AAAA,gCACC;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA;AAAA,gCAEA,oBAAoB;AAAA,gCACpB,aAAa;AAAA,gCACb,mBAAmB;AAAA,gCACnB,mBAAmB;AAAA,gCACnB,iBAAiB;AAAA,gCACjB,iBAAiB;AAAA,gCACjB,sBAAsB;AAAA,gCACtB,gBAAgB;AAAA,gCAChB,kBAAkB;AAAA,gCAClB,wBAAwB;AAAA,gCACxB;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA,WAAW,WAAW;AAAA,gCACtB;AAAA,gCACA,WAAW,eAAe,IAAI,SAAS;AAAA,gCACvC,qBAAqB;AAAA,gCACrB,aAAa;AAAA;AAAA,8BAlBR,WAAW;AAAA,4BAmBlB;AAAA,+BA9BmB,gBAAgB,WAAW,GAAG,EA+BnD;AAAA,wBAEJ,CAAC;AAAA,wBACA,YAAY,SAAS,KAAK,eAAe,YAAY,YAAY,SAAS,CAAC,GAAG,OAAO,eAAe,IACnG;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,QAAQ,eAAe,YAAY,YAAY,SAAS,CAAC,GAAG,OAAO;AAAA,4BACrE;AAAA,4BAEA,uDAAC,QAAG,SAAS,YAAY;AAAA;AAAA,wBAC3B,IACE;AAAA,yBACN;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,OAAO;AAAA,sBACL,iBAAiB;AAAA,sBACjB,WAAW;AAAA,sBACX,WAAW,eAAe,oBAAoB,MAAM,eAAe;AAAA,sBACnE,SAAS;AAAA,sBACT,QAAQ,0BAA0B,UAAU;AAAA,sBAC5C,MAAM,0BAA0B,QAAQ;AAAA,sBACxC,SAAS,2BAA2B,IAAI;AAAA,sBACxC,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK,0BAA0B,OAAO;AAAA,sBACtC,YAAY,2BAA2B,YAAY;AAAA,sBACnD,OAAO,0BAA0B,SAAS;AAAA,sBAC1C,QAAQ;AAAA,oBACV;AAAA;AAAA,gBACF;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,eAAY;AAAA,oBACZ,OAAO;AAAA,sBACL,YAAY;AAAA,sBACZ,OAAO,QAAQ;AAAA,sBACf,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,QAAQ;AAAA,sBACR,gBAAgB;AAAA,sBAChB,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,WAAW;AAAA,sBACX,YAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,QAAQ;AAAA,oBACV;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,eAAe,CAAC,UAAU;AACxB,0BAAI,YAAY,MAAM,WAAW,KAAK,CAAC,uBAAuB,CAAC,0BAA0B;AACvF;AAAA,sBACF;AAEA,4BAAM,eAAe;AACrB,4BAAM,gBAAgB;AACtB,oCAAc,MAAM,WAAW,mBAAmB;AAAA,oBACpD;AAAA,oBACA,OAAO;AAAA,sBACL,iBAAiB;AAAA,sBACjB,QAAQ,aAAa,QAAQ,OAAO;AAAA,sBACpC,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,SAAS,CAAC,YAAY,2BAA2B,UAAU;AAAA,sBAC3D,QAAQ;AAAA,sBACR,MAAM,2BAA2B,yBAAyB,OAAO,yBAAyB,QAAQ,IAAI;AAAA,sBACtG,eAAe;AAAA,sBACf,UAAU;AAAA,sBACV,KAAK,2BAA2B,yBAAyB,MAAM,yBAAyB,SAAS,IAAI;AAAA,sBACrG,OAAO;AAAA,sBACP,QAAQ;AAAA,oBACV;AAAA;AAAA,gBACF;AAAA,gBACC,qBACC;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,OAAO;AAAA,sBACL,OAAO,QAAQ;AAAA,sBACf,MAAM,KAAK,IAAI,mBAAmB,GAAG,mBAAmB,IAAI;AAAA,sBAC5D,UAAU;AAAA,sBACV,KAAK,mBAAmB;AAAA,sBACxB,QAAQ;AAAA,oBACV;AAAA,oBAEC,kCACG,sBAAsB;AAAA,sBACpB,OAAO,MAAM,iBAAiB,IAAI;AAAA,sBAClC,QAAQ,mBAAmB;AAAA,sBAC3B,WACE,aACA,UAAU,cAAc,mBAAmB,MAAM,QACjD,UAAU,gBAAgB,mBAAmB,OAAO,QAChD,UAAU,YACV;AAAA,sBACN,eAAe,MAAM,UAAU,mBAAmB,MAAM,MAAM,mBAAmB,OAAO,OAAO,WAAW;AAAA,sBAC1G,gBAAgB,MAAM,UAAU,mBAAmB,MAAM,MAAM,mBAAmB,OAAO,OAAO,YAAY;AAAA,sBAC5G,OAAO,mBAAmB;AAAA,oBAC5B,CAAC,IAED;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO,MAAM,iBAAiB,IAAI;AAAA,wBAClC,QAAQ,mBAAmB;AAAA,wBAC3B,WACE,aACA,UAAU,cAAc,mBAAmB,MAAM,QACjD,UAAU,gBAAgB,mBAAmB,OAAO,QAChD,UAAU,YACV;AAAA,wBAEN,eAAe,MAAM,UAAU,mBAAmB,MAAM,MAAM,mBAAmB,OAAO,OAAO,WAAW;AAAA,wBAC1G,gBAAgB,MAAM,UAAU,mBAAmB,MAAM,MAAM,mBAAmB,OAAO,OAAO,YAAY;AAAA,wBAC5G,OAAO,mBAAmB;AAAA;AAAA,oBAC5B;AAAA;AAAA,gBAEN,IACE;AAAA;AAAA;AAAA,UACN;AAAA;AAAA,MACF;AAAA;AAAA,IAtbK;AAAA,EAubP,GACF;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB;AACF,GAEG;AACD,QAAM,UAAU,iBAAiB;AAEjC,SACE,6CAAC,cAAc,UAAd,EAAuB,OAAO,YAC7B;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,WAAW,qBAAqB,SAAS;AAAA,MACpD,OAAO;AAAA,QACL,WAAW;AAAA,QACX,iBAAiB,QAAQ;AAAA,QACzB,QAAQ,aAAa,QAAQ,MAAM;AAAA,QACnC,cAAc,UAAU,KAAK;AAAA,QAC7B,OAAO,QAAQ;AAAA,QACf,SAAS;AAAA,QACT,MAAM;AAAA,QACN,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAAA,MAEC;AAAA,uBAAe,SAAS,oBAAoB,YAAY,OAAO;AAAA,QAChE,6CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,MAAM,GAAG,WAAW,GAAG,UAAU,EAAE,GAChE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF,GACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;AAEA,SAAS,+BAA+B,OAAwB;AAC9D,QAAM,aAAa,wBAAwB,KAAK;AAChD,SAAO,6CAAC,mBAAiB,GAAG,OAAO,YAAwB;AAC7D;AAEA,SAAS,uCAAuC;AAAA,EAC9C;AAAA,EACA,GAAG;AACL,GAAgD;AAC9C,QAAM,aAAa,wBAAwB,OAAO;AAClD,SAAO,6CAAC,cAAc,UAAd,EAAuB,OAAO,YAAa,UAAS;AAC9D;AAEO,SAAS,mBAAmB,EAAE,UAAU,YAAY,GAAG,QAAQ,GAA4B;AAChG,MAAI,YAAY;AACd,WAAO,6CAAC,cAAc,UAAd,EAAuB,OAAO,YAAa,UAAS;AAAA,EAC9D;AAEA,SAAO,6CAAC,0CAAwC,GAAG,SAAU,UAAS;AACxE;AAEO,SAAS,gBAAgB;AAC9B,QAAM,UAAgB,kBAAW,aAAa;AAC9C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AAEA,SAAO;AACT;AAEO,SAAS,yBAA8C;AAC5D,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,SAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,YAAY,mBAAmB,gBAAgB,sBAAsB,YAAY,aAAa,SAAS;AAAA,EAC1G;AACF;AAEO,SAAS,oBAAoC;AAClD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,SAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,uBAA0C;AACxD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,SAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,qBAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBAAwC;AACtD,QAAM,EAAE,WAAW,WAAW,OAAO,IAAI,cAAc;AAEvD,SAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,WAAW,WAAW,MAAM;AAAA,EAC/B;AACF;AAEO,SAAS,sBAAwC;AACtD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,SAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBAAwC;AACtD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,cAAc;AAElB,SAAa;AAAA,IACX,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,WAAW,OAAwB;AACjD,QAAM,oBAA0B,kBAAW,aAAa;AAExD,MAAI,MAAM,YAAY;AACpB,WAAO,6CAAC,mBAAiB,GAAG,OAAO,YAAY,MAAM,YAAY;AAAA,EACnE;AAEA,MAAI,mBAAmB;AACrB,WAAO,6CAAC,mBAAiB,GAAG,OAAO,YAAY,mBAAmB;AAAA,EACpE;AAEA,SAAO,6CAAC,kCAAgC,GAAG,OAAO;AACpD;AAEO,SAAS,qBAAqB;AACnC,QAAM,aAAa,cAAc;AACjC,QAAM,UAAU,iBAAiB;AACjC,SAAO,6CAAC,kBAAe,YAAwB,SAAkB;AACnE;","names":["import_fflate","styleAppearance","plotAreaShapeProperties","document","primarySeries","ext","cx","cy","normalizeHexColor","parseHexColor","rgbToHsl","hueToRgb","hslToRgb","rgbToHex","import_fflate","EMU_PER_PIXEL","normalizeArchivePath","dirname","parseXml","document","serializeXml","readArchiveText","isElementNode","normalizeHexColor","rgbToHex","extNode","updateAnchorNode","extNode","readArchiveText","parseXml","serializeXml","normalizeArchivePath","EMU_PER_PIXEL","MIN_ROW_HEIGHT_PX","EMU_PER_PIXEL","parseA1CellReference","parseA1RangeReference","cloneBytes","timeoutHandle","text","error","visibleSheetIndexByWorkbookSheetIndex","getCellDisplayValue","options","React","React","React","normalizeBuiltinSurfaceStyleId","getBuiltinSurfacePalette","MemoSurfaceChartComposite","createREGL","import_jsx_runtime","topojsonFeature","countries50m","countiesAlbers10m","parseRgbColor","mixRgbColor","lightenColor","darkenColor","clamp","safeNumber","canonicalKey","normalizeLegendPosition","resolveSurfaceBaseColor","normalizeBuiltinSurfaceStyleId","hasExplicitSurfaceBaseColor","buildMonochromeSurfacePalette","getBuiltinSurfacePalette","shouldPreferBuiltinSurfacePalette","getSurfaceBandCount","isContourSurfaceChart","getSurfaceColorStops","resolveSurfaceBandPaletteColor","getSurfaceDomain","resolveSurfaceBandColor","d3Line","getSurfaceWireframePalette","resolveSurfaceWireframeColor","projectCartesian3dPoint","d3Symbol","startCenter","endCenter","startAxisA","endAxisA","startAxisB","endAxisB","backStartArc","backEndArc","frontStartArc","frontEndArc","backWallPath","frontWallPath","endCapPath","positive","negative","_","start","end","d3Area","d3Pie","d3Arc","quads","points","d3Hierarchy","d3Partition","d3Treemap","MemoChartSvg","import_jsx_runtime","DEFAULT_ROW_HEIGHT","DEFAULT_COL_WIDTH","INTERNAL_CLIPBOARD_MIME","parseRgbColor","mixRgbColor","lightenColor","darkenColor","normalizeRange","visible","DEFAULT_ROW_HEIGHT","DEFAULT_COL_WIDTH","columnLabel","cellAddressToA1","parseA1CellReference","resolveInheritedCellStyle","decodeHtmlEntities","mapBorder","parseHexColor","hslToRgb","hueToRgb","hslToRgb","mapBorder","cellAddressToA1","decodeHtmlEntities","minValue","maxValue","decodeHtmlEntities","cellAddressToA1","formatBinaryBytes","darkenColor","mixRgbColor","lightenColor","normalizeRange","DEFAULT_COL_WIDTH","DEFAULT_ROW_HEIGHT","firstVisibleRow","lastVisibleRow","resolveInheritedCellStyle","INTERNAL_CLIPBOARD_MIME","columnLabel","getCellDisplayValue"]}
|