{"version":3,"file":"index.cjs","names":["stripLeadingSlash","str","formatXmlAttributes","resolve_path","RELTYPE","RELTYPE","RELTYPE"],"sources":["../src/errors.ts","../src/zip/crc32.ts","../src/zip/streams.ts","../src/zip/index.ts","../src/xml/limits.ts","../src/xml/parser.ts","../src/xml/escape.ts","../src/xml/writer.ts","../src/xml/namespaces.ts","../src/opc/content-types.ts","../src/opc/relationships.ts","../src/opc/core-properties.ts","../src/opc/extended-properties.ts","../src/opc/custom-properties.ts","../src/xlsx/shared-strings.ts","../src/ssf/table.ts","../src/xlsx/styles.ts","../src/xlsx/theme.ts","../src/xlsx/workbook.ts","../src/types.ts","../src/utils/cell.ts","../src/utils/date.ts","../src/ssf/format.ts","../src/utils/worksheet-budget.ts","../src/utils/export-range.ts","../src/xlsx/formula.ts","../src/xlsx/worksheet.ts","../src/utils/helpers.ts","../src/xlsx/comments.ts","../src/xlsx/vml.ts","../src/xlsx/metadata.ts","../src/xlsx/calc-chain.ts","../src/xlsx/parse-zip.ts","../src/utils/base64.ts","../src/api/format.ts","../src/api/json.ts","../src/api/aoa.ts","../src/api/csv.ts","../src/api/html-entities.ts","../src/api/html.ts","../src/read.ts","../src/xlsx/write-zip.ts","../src/write.ts","../src/api/book.ts","../src/index.ts"],"sourcesContent":["/**\n * Stable failure categories exposed by {@link XlsxError}.\n *\n * Codes are intentionally broader than individual messages so callers can\n * handle failures without depending on human-readable text.\n */\nexport type XlsxErrorCode =\n\t| \"INVALID_ARGUMENT\"\n\t| \"MALFORMED\"\n\t| \"LIMIT_EXCEEDED\"\n\t| \"UNSUPPORTED\"\n\t| \"CRC_MISMATCH\"\n\t| \"NOT_FOUND\"\n\t| \"DUPLICATE\";\n\n/** Error subclass thrown by xlsx-format for deterministic failure handling. */\nexport class XlsxError extends Error {\n\treadonly code: XlsxErrorCode;\n\n\tconstructor(code: XlsxErrorCode, message: string, options?: ErrorOptions) {\n\t\tsuper(message, options);\n\t\tthis.name = \"XlsxError\";\n\t\tthis.code = code;\n\t\tObject.setPrototypeOf(this, new.target.prototype);\n\t}\n}\n","/**\n * Pre-computed CRC32 lookup table using the standard polynomial 0xEDB88320\n * (ISO 3309 / ITU-T V.42, bit-reversed form of 0x04C11DB7).\n *\n * Each entry TABLE[i] is the CRC32 of the single byte i, computed by\n * shifting through all 8 bits and XOR-ing with the polynomial when the LSB is set.\n */\nconst TABLE = new Uint32Array(256);\nfor (let i = 0; i < 256; i++) {\n\tlet c = i;\n\tfor (let j = 0; j < 8; j++) {\n\t\t// If LSB is set, shift right and XOR with polynomial; otherwise just shift\n\t\tc = c & 1 ? (c >>> 1) ^ 0xedb88320 : c >>> 1;\n\t}\n\tTABLE[i] = c;\n}\n\n/**\n * Compute the CRC32 checksum of a byte buffer.\n *\n * Uses the standard table-driven algorithm: start with all bits set (0xFFFFFFFF),\n * fold each byte through the lookup table, and invert at the end.\n *\n * @param buf - Input bytes\n * @returns Unsigned 32-bit CRC32 value\n */\nexport function crc32(buf: Uint8Array): number {\n\tlet crc = 0xffffffff;\n\tfor (let i = 0; i < buf.length; i++) {\n\t\t// XOR bottom byte with input byte to get table index, then shift and XOR\n\t\tcrc = (crc >>> 8) ^ TABLE[(crc ^ buf[i]) & 0xff];\n\t}\n\t// Final inversion; >>> 0 ensures unsigned 32-bit result\n\treturn (crc ^ 0xffffffff) >>> 0;\n}\n","import { XlsxError } from \"../errors.js\";\n\n/**\n * Read all chunks from a {@link ReadableStream} and concatenate them into a single {@link Uint8Array}.\n *\n * Collects chunks incrementally, then copies them into a contiguous buffer.\n */\nasync function collectStream(readable: ReadableStream<Uint8Array>, maxBytes = Infinity): Promise<Uint8Array> {\n\tconst reader = readable.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet totalLength = 0;\n\tfor (;;) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) {\n\t\t\tbreak;\n\t\t}\n\t\tchunks.push(value);\n\t\ttotalLength += value.length;\n\t\tif (totalLength > maxBytes) {\n\t\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", `Invalid ZIP: decompressed data exceeds limit (${maxBytes} bytes)`);\n\t\t}\n\t}\n\tconst result = new Uint8Array(totalLength);\n\tlet offset = 0;\n\tfor (const chunk of chunks) {\n\t\tresult.set(chunk, offset);\n\t\toffset += chunk.length;\n\t}\n\treturn result;\n}\n\n/**\n * Decompress raw DEFLATE data using the built-in {@link DecompressionStream} API.\n *\n * Uses \"deflate-raw\" format (no zlib header or gzip wrapper), which matches\n * the compression used inside ZIP archives (method 8).\n *\n * @param data - Compressed bytes (raw deflate, no zlib/gzip wrapper)\n * @param maxBytes - Maximum allowed decompressed size\n * @returns Decompressed bytes\n */\nexport async function inflate(data: Uint8Array, maxBytes = Infinity): Promise<Uint8Array> {\n\tconst ds = new DecompressionStream(\"deflate-raw\");\n\tconst writer = ds.writable.getWriter();\n\tconst writePromise = writer.write(data as Uint8Array<ArrayBuffer>).then(() => writer.close());\n\ttry {\n\t\tconst [result] = await Promise.all([collectStream(ds.readable, maxBytes), writePromise]);\n\t\treturn result;\n\t} catch (err) {\n\t\ttry {\n\t\t\tawait writer.abort(err);\n\t\t} catch {\n\t\t\t/* ignore abort errors while preserving the original stream error */\n\t\t}\n\t\tthrow err;\n\t}\n}\n\n/**\n * Compress data using raw DEFLATE via the built-in {@link CompressionStream} API.\n *\n * Uses \"deflate-raw\" format (no zlib header or gzip wrapper), which matches\n * the compression expected inside ZIP archives (method 8).\n *\n * @param data - Uncompressed bytes\n * @returns Compressed bytes (raw deflate, no zlib/gzip wrapper)\n */\nexport async function deflate(data: Uint8Array): Promise<Uint8Array> {\n\tconst cs = new CompressionStream(\"deflate-raw\");\n\tconst writer = cs.writable.getWriter();\n\tconst writePromise = writer.write(data as Uint8Array<ArrayBuffer>).then(() => writer.close());\n\ttry {\n\t\tconst [result] = await Promise.all([collectStream(cs.readable), writePromise]);\n\t\treturn result;\n\t} catch (err) {\n\t\ttry {\n\t\t\tawait writer.abort(err);\n\t\t} catch {\n\t\t\t/* ignore abort errors while preserving the original stream error */\n\t\t}\n\t\tthrow err;\n\t}\n}\n","import { XlsxError } from \"../errors.js\";\nimport { crc32 } from \"./crc32.js\";\nimport { inflate, deflate } from \"./streams.js\";\n\n/** In-memory representation of a ZIP archive as a flat filename-to-data map. */\nexport interface ZipArchive {\n\t/** Map of file paths to their uncompressed contents. */\n\tfiles: Record<string, Uint8Array>;\n}\n\n/** Limits applied while reading untrusted ZIP archives. */\nexport interface ZipReadOptions {\n\t/** Maximum number of central-directory entries to parse. */\n\tmaxZipEntries?: number;\n\t/** Maximum total uncompressed size across file entries. */\n\tmaxTotalUncompressedBytes?: number;\n\t/** Maximum uncompressed size for a single file entry. */\n\tmaxEntryUncompressedBytes?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nconst DEFAULT_MAX_ZIP_ENTRIES = 10000;\nconst DEFAULT_MAX_TOTAL_UNCOMPRESSED_BYTES = 512 * 1024 * 1024;\nconst DEFAULT_MAX_ENTRY_UNCOMPRESSED_BYTES = 256 * 1024 * 1024;\n\nfunction stripLeadingSlash(path: string): string {\n\treturn path.charAt(0) === \"/\" ? path.slice(1) : path;\n}\n\nfunction asciiLower(path: string): string {\n\treturn path.replace(/[A-Z]/g, (character) => character.toLowerCase());\n}\n\n/** Resolve an OPC part name using exact, leading-slash, then ASCII case-insensitive matching. */\nfunction resolveZipPath(archive: ZipArchive, path: string): string | null {\n\tif (Object.hasOwn(archive.files, path)) {\n\t\treturn path;\n\t}\n\tconst alternate = path.startsWith(\"/\") ? path.slice(1) : \"/\" + path;\n\tif (Object.hasOwn(archive.files, alternate)) {\n\t\treturn alternate;\n\t}\n\n\tconst foldedPath = asciiLower(stripLeadingSlash(path));\n\tconst matches = Object.keys(archive.files).filter(\n\t\t(candidate) => asciiLower(stripLeadingSlash(candidate)) === foldedPath,\n\t);\n\tif (matches.length > 1) {\n\t\tthrow new XlsxError(\"DUPLICATE\", `Ambiguous ZIP entry path ${path} matches ${matches.join(\", \")}`);\n\t}\n\treturn matches[0] || null;\n}\n\n// -- ZIP format signatures (little-endian magic numbers) --\n/** Local file header signature: \"PK\\x03\\x04\" */\nconst SIG_LOCAL = 0x04034b50;\n/** Central directory file header signature: \"PK\\x01\\x02\" */\nconst SIG_CENTRAL = 0x02014b50;\n/** End of Central Directory record signature: \"PK\\x05\\x06\" */\nconst SIG_EOCD = 0x06054b50;\n\nconst ZIP64_U16 = 0xffff;\nconst ZIP64_U32 = 0xffffffff;\n\nfunction optionLimit(value: number | undefined, fallback: number, name: string): number {\n\tif (value == null) {\n\t\treturn fallback;\n\t}\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `Invalid ZIP option: ${name} must be a non-negative finite number`);\n\t}\n\treturn value;\n}\n\nfunction assertRange(data: Uint8Array, off: number, len: number, what: string): void {\n\tif (!Number.isInteger(off) || !Number.isInteger(len) || off < 0 || len < 0 || off > data.length - len) {\n\t\tthrow new XlsxError(\"MALFORMED\", `Invalid ZIP: ${what} out of bounds`);\n\t}\n}\n\nfunction readU16At(buf: Uint8Array, off: number, what: string): number {\n\tassertRange(buf, off, 2, what);\n\treturn readU16(buf, off);\n}\n\nfunction readU32At(buf: Uint8Array, off: number, what: string): number {\n\tassertRange(buf, off, 4, what);\n\treturn readU32(buf, off);\n}\n\nfunction rejectZip64(): never {\n\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported ZIP: Zip64 archives are not supported\");\n}\n\nfunction assertCrc(name: string, data: Uint8Array, expected: number): void {\n\tconst actual = crc32(data);\n\tif (actual !== expected) {\n\t\tthrow new XlsxError(\"CRC_MISMATCH\", `Invalid ZIP: CRC mismatch for ${name}`);\n\t}\n}\n\n/** Read an unsigned 16-bit little-endian integer from a buffer */\nfunction readU16(buf: Uint8Array, off: number): number {\n\treturn buf[off] | (buf[off + 1] << 8);\n}\n\n/** Read an unsigned 32-bit little-endian integer from a buffer */\nfunction readU32(buf: Uint8Array, off: number): number {\n\treturn (buf[off] | (buf[off + 1] << 8) | (buf[off + 2] << 16) | (buf[off + 3] << 24)) >>> 0;\n}\n\n/** Write an unsigned 16-bit little-endian integer to a buffer */\nfunction writeU16(buf: Uint8Array, off: number, val: number): void {\n\tbuf[off] = val & 0xff;\n\tbuf[off + 1] = (val >> 8) & 0xff;\n}\n\n/** Write an unsigned 32-bit little-endian integer to a buffer */\nfunction writeU32(buf: Uint8Array, off: number, val: number): void {\n\tbuf[off] = val & 0xff;\n\tbuf[off + 1] = (val >> 8) & 0xff;\n\tbuf[off + 2] = (val >> 16) & 0xff;\n\tbuf[off + 3] = (val >> 24) & 0xff;\n}\n\n/**\n * Parse a ZIP archive from raw bytes.\n *\n * Locates the End of Central Directory (EOCD) record by scanning backward,\n * then reads the central directory to find all file entries. Deflated entries\n * are decompressed one at a time to keep peak memory bounded by entry limits.\n *\n * @param data - Raw ZIP file bytes\n * @returns Parsed archive with decompressed file contents\n * @throws XlsxError if the ZIP structure is invalid or uses an unsupported compression method\n */\nexport async function zipRead(data: Uint8Array, opts?: ZipReadOptions): Promise<ZipArchive> {\n\tconst maxZipEntries = optionLimit(opts?.maxZipEntries, DEFAULT_MAX_ZIP_ENTRIES, \"maxZipEntries\");\n\tconst maxTotalUncompressedBytes = optionLimit(\n\t\topts?.maxTotalUncompressedBytes,\n\t\tDEFAULT_MAX_TOTAL_UNCOMPRESSED_BYTES,\n\t\t\"maxTotalUncompressedBytes\",\n\t);\n\tconst maxEntryUncompressedBytes = optionLimit(\n\t\topts?.maxEntryUncompressedBytes,\n\t\tDEFAULT_MAX_ENTRY_UNCOMPRESSED_BYTES,\n\t\t\"maxEntryUncompressedBytes\",\n\t);\n\n\t// Scan backward for EOCD signature; EOCD is at least 22 bytes, max 65557 with comment\n\tlet eocdOffset = -1;\n\tfor (let i = data.length - 22; i >= 0 && i >= data.length - 65557; i--) {\n\t\tif (readU32(data, i) === SIG_EOCD) {\n\t\t\tconst commentLen = readU16(data, i + 20);\n\t\t\tif (i + 22 + commentLen === data.length) {\n\t\t\t\teocdOffset = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (eocdOffset === -1) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid ZIP: EOCD not found\");\n\t}\n\n\tassertRange(data, eocdOffset, 22, \"EOCD\");\n\tconst eocdCommentLen = readU16At(data, eocdOffset + 20, \"EOCD comment length\");\n\tassertRange(data, eocdOffset, 22 + eocdCommentLen, \"EOCD comment\");\n\n\tconst diskNumber = readU16At(data, eocdOffset + 4, \"EOCD disk number\");\n\tconst cdDiskNumber = readU16At(data, eocdOffset + 6, \"EOCD central directory disk number\");\n\tconst cdEntriesOnDisk = readU16At(data, eocdOffset + 8, \"EOCD disk entry count\");\n\tconst cdEntries = readU16At(data, eocdOffset + 10, \"EOCD entry count\");\n\tconst cdSize = readU32At(data, eocdOffset + 12, \"EOCD central directory size\");\n\tconst cdOffset = readU32At(data, eocdOffset + 16, \"EOCD central directory offset\");\n\tif (cdEntriesOnDisk === ZIP64_U16 || cdEntries === ZIP64_U16 || cdSize === ZIP64_U32 || cdOffset === ZIP64_U32) {\n\t\trejectZip64();\n\t}\n\tif (diskNumber !== 0 || cdDiskNumber !== 0 || cdEntriesOnDisk !== cdEntries) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported ZIP: multi-disk archives are not supported\");\n\t}\n\tif (cdEntries > maxZipEntries) {\n\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", `Invalid ZIP: entry count ${cdEntries} exceeds limit ${maxZipEntries}`);\n\t}\n\tassertRange(data, cdOffset, cdSize, \"central directory\");\n\tif (cdOffset + cdSize > eocdOffset) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid ZIP: central directory overlaps EOCD\");\n\t}\n\n\t// Parse central directory entries\n\tinterface CdEntry {\n\t\tmethod: number;\n\t\tcrc: number;\n\t\tcompSize: number;\n\t\tuncompSize: number;\n\t\tname: string;\n\t\tlocalOffset: number;\n\t}\n\tconst entries: CdEntry[] = [];\n\tlet pos = cdOffset;\n\tconst cdEnd = cdOffset + cdSize;\n\tfor (let i = 0; i < cdEntries; i++) {\n\t\tassertRange(data, pos, 46, \"central directory entry\");\n\t\tif (pos + 46 > cdEnd) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid ZIP: central directory entry exceeds declared size\");\n\t\t}\n\t\tif (readU32At(data, pos, \"central directory signature\") !== SIG_CENTRAL) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid ZIP: bad central directory entry\");\n\t\t}\n\t\tconst method = readU16At(data, pos + 10, \"central directory compression method\");\n\t\tconst crcVal = readU32At(data, pos + 16, \"central directory CRC\");\n\t\tconst compSize = readU32At(data, pos + 20, \"central directory compressed size\");\n\t\tconst uncompSize = readU32At(data, pos + 24, \"central directory uncompressed size\");\n\t\tconst nameLen = readU16At(data, pos + 28, \"central directory file name length\");\n\t\tconst extraLen = readU16At(data, pos + 30, \"central directory extra length\");\n\t\tconst commentLen = readU16At(data, pos + 32, \"central directory comment length\");\n\t\tconst diskStart = readU16At(data, pos + 34, \"central directory disk start\");\n\t\tconst localOffset = readU32At(data, pos + 42, \"central directory local header offset\");\n\t\tif (\n\t\t\tcompSize === ZIP64_U32 ||\n\t\t\tuncompSize === ZIP64_U32 ||\n\t\t\tlocalOffset === ZIP64_U32 ||\n\t\t\tdiskStart === ZIP64_U16\n\t\t) {\n\t\t\trejectZip64();\n\t\t}\n\t\tif (diskStart !== 0) {\n\t\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported ZIP: multi-disk archives are not supported\");\n\t\t}\n\t\tconst entryEnd = pos + 46 + nameLen + extraLen + commentLen;\n\t\tif (entryEnd > cdEnd) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid ZIP: central directory entry exceeds declared size\");\n\t\t}\n\t\tconst nameBytes = data.subarray(pos + 46, pos + 46 + nameLen);\n\t\tconst name = decoder.decode(nameBytes);\n\t\tentries.push({ method, crc: crcVal, compSize, uncompSize, name, localOffset });\n\t\tpos = entryEnd;\n\t}\n\n\t// Read file data from local headers -- collect deflated entries for bounded decompression\n\tconst files: Record<string, Uint8Array> = Object.create(null);\n\tconst seenNames = new Set<string>();\n\tconst inflateJobs: { name: string; compressed: Uint8Array; expectedSize: number; crc: number }[] = [];\n\tlet totalUncompressedBytes = 0;\n\n\tfor (const entry of entries) {\n\t\tconst name = entry.name;\n\n\t\t// Skip directory entries (paths ending with \"/\")\n\t\tif (name.endsWith(\"/\")) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (seenNames.has(name)) {\n\t\t\tthrow new XlsxError(\"DUPLICATE\", `Invalid ZIP: duplicate entry ${name}`);\n\t\t}\n\t\tseenNames.add(name);\n\n\t\tconst loc = entry.localOffset;\n\t\tassertRange(data, loc, 30, `local file header for ${entry.name}`);\n\t\tif (readU32At(data, loc, \"local file header signature\") !== SIG_LOCAL) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid ZIP: bad local file header\");\n\t\t}\n\t\tconst localMethod = readU16At(data, loc + 8, \"local file header compression method\");\n\t\tconst localNameLen = readU16At(data, loc + 26, \"local file header file name length\");\n\t\tconst localExtraLen = readU16At(data, loc + 28, \"local file header extra length\");\n\t\tconst dataStart = loc + 30 + localNameLen + localExtraLen;\n\t\tassertRange(data, dataStart, entry.compSize, `file data for ${entry.name}`);\n\t\tconst dataEnd = dataStart + entry.compSize;\n\t\tif (localMethod !== entry.method) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", `Invalid ZIP: local header method mismatch for ${entry.name}`);\n\t\t}\n\t\tconst localName = decoder.decode(data.subarray(loc + 30, loc + 30 + localNameLen));\n\t\tif (localName !== name) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", `Invalid ZIP: local header file name mismatch for ${name}`);\n\t\t}\n\t\tif (entry.uncompSize > maxEntryUncompressedBytes) {\n\t\t\tthrow new XlsxError(\n\t\t\t\t\"LIMIT_EXCEEDED\",\n\t\t\t\t`Invalid ZIP: entry ${name} uncompressed size ${entry.uncompSize} exceeds limit ${maxEntryUncompressedBytes}`,\n\t\t\t);\n\t\t}\n\t\ttotalUncompressedBytes += entry.uncompSize;\n\t\tif (totalUncompressedBytes > maxTotalUncompressedBytes) {\n\t\t\tthrow new XlsxError(\n\t\t\t\t\"LIMIT_EXCEEDED\",\n\t\t\t\t`Invalid ZIP: total uncompressed size ${totalUncompressedBytes} exceeds limit ${maxTotalUncompressedBytes}`,\n\t\t\t);\n\t\t}\n\n\t\tif (entry.method === 0) {\n\t\t\tif (entry.compSize !== entry.uncompSize) {\n\t\t\t\tthrow new XlsxError(\n\t\t\t\t\t\"MALFORMED\",\n\t\t\t\t\t`Invalid ZIP: stored entry ${name} has mismatched compressed and uncompressed sizes`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Method 0: Stored (no compression)\n\t\t\tconst fileData = data.subarray(dataStart, dataEnd);\n\t\t\tassertCrc(name, fileData, entry.crc);\n\t\t\tfiles[name] = fileData;\n\t\t} else if (entry.method === 8) {\n\t\t\t// Method 8: Deflated -- decompress after all structural checks pass\n\t\t\tinflateJobs.push({\n\t\t\t\tname,\n\t\t\t\tcompressed: data.subarray(dataStart, dataEnd),\n\t\t\t\texpectedSize: entry.uncompSize,\n\t\t\t\tcrc: entry.crc,\n\t\t\t});\n\t\t} else {\n\t\t\tthrow new XlsxError(\"UNSUPPORTED\", `Unsupported ZIP compression method: ${entry.method}`);\n\t\t}\n\t}\n\n\t// Decompress deflated entries sequentially so a failing archive cannot keep\n\t// multiple max-sized decompressed buffers alive after the first rejection.\n\tfor (const job of inflateJobs) {\n\t\tconst result = await inflate(job.compressed, job.expectedSize);\n\t\tif (result.length !== job.expectedSize) {\n\t\t\tthrow new XlsxError(\n\t\t\t\t\"MALFORMED\",\n\t\t\t\t`Invalid ZIP: entry ${job.name} inflated to ${result.length} bytes, expected ${job.expectedSize}`,\n\t\t\t);\n\t\t}\n\t\tassertCrc(job.name, result, job.crc);\n\t\tfiles[job.name] = result;\n\t}\n\n\treturn { files };\n}\n\n/**\n * Serialize a {@link ZipArchive} to raw ZIP file bytes.\n *\n * Writes local file headers, central directory, and EOCD record.\n * When {@link compress} is `true`, entries are deflated in parallel using {@link CompressionStream}.\n *\n * @param archive - Archive to serialize\n * @param compress - Whether to deflate file entries (default: stored uncompressed)\n * @returns Raw ZIP file bytes\n */\nexport async function zipWrite(archive: ZipArchive, compress?: boolean): Promise<Uint8Array> {\n\tconst names = Object.keys(archive.files);\n\tconst rawEntries = names.map((name) => ({\n\t\tname,\n\t\tnameBytes: encoder.encode(name),\n\t\tdata: archive.files[name],\n\t\tcrc: crc32(archive.files[name]),\n\t}));\n\n\t// Compress all entries in parallel if requested\n\tlet compressedDatas: Uint8Array[];\n\tlet methods: number[];\n\tif (compress) {\n\t\tconst results = await Promise.all(rawEntries.map(async (e) => deflate(e.data)));\n\t\tcompressedDatas = results;\n\t\tmethods = rawEntries.map(() => 8); // method 8 = deflate\n\t} else {\n\t\tcompressedDatas = rawEntries.map((e) => e.data);\n\t\tmethods = rawEntries.map(() => 0); // method 0 = stored\n\t}\n\n\t// Pre-calculate total buffer size: local headers + central directory + EOCD\n\tlet totalSize = 0;\n\tfor (let i = 0; i < rawEntries.length; i++) {\n\t\ttotalSize += 30 + rawEntries[i].nameBytes.length + compressedDatas[i].length; // local header + data\n\t\ttotalSize += 46 + rawEntries[i].nameBytes.length; // central directory entry\n\t}\n\ttotalSize += 22; // EOCD record (fixed 22 bytes with no comment)\n\n\tconst buf = new Uint8Array(totalSize);\n\tlet offset = 0;\n\tconst centralEntries: { offset: number; index: number }[] = [];\n\n\t// Write local file headers + file data\n\tfor (let i = 0; i < rawEntries.length; i++) {\n\t\tconst entry = rawEntries[i];\n\t\tconst compData = compressedDatas[i];\n\t\tcentralEntries.push({ offset, index: i });\n\n\t\twriteU32(buf, offset, SIG_LOCAL);\n\t\twriteU16(buf, offset + 4, 20); // version needed to extract (2.0)\n\t\twriteU16(buf, offset + 6, 0); // general purpose bit flags\n\t\twriteU16(buf, offset + 8, methods[i]); // compression method\n\t\twriteU16(buf, offset + 10, 0); // last mod file time\n\t\twriteU16(buf, offset + 12, 0); // last mod file date\n\t\twriteU32(buf, offset + 14, entry.crc); // CRC-32\n\t\twriteU32(buf, offset + 18, compData.length); // compressed size\n\t\twriteU32(buf, offset + 22, entry.data.length); // uncompressed size\n\t\twriteU16(buf, offset + 26, entry.nameBytes.length); // file name length\n\t\twriteU16(buf, offset + 28, 0); // extra field length\n\t\tbuf.set(entry.nameBytes, offset + 30);\n\t\tbuf.set(compData, offset + 30 + entry.nameBytes.length);\n\t\toffset += 30 + entry.nameBytes.length + compData.length;\n\t}\n\n\t// Write central directory headers\n\tconst cdStart = offset;\n\tfor (const ce of centralEntries) {\n\t\tconst entry = rawEntries[ce.index];\n\t\tconst compData = compressedDatas[ce.index];\n\n\t\twriteU32(buf, offset, SIG_CENTRAL);\n\t\twriteU16(buf, offset + 4, 20); // version made by (2.0)\n\t\twriteU16(buf, offset + 6, 20); // version needed to extract (2.0)\n\t\twriteU16(buf, offset + 8, 0); // general purpose bit flags\n\t\twriteU16(buf, offset + 10, methods[ce.index]); // compression method\n\t\twriteU16(buf, offset + 12, 0); // last mod file time\n\t\twriteU16(buf, offset + 14, 0); // last mod file date\n\t\twriteU32(buf, offset + 16, entry.crc); // CRC-32\n\t\twriteU32(buf, offset + 20, compData.length); // compressed size\n\t\twriteU32(buf, offset + 24, entry.data.length); // uncompressed size\n\t\twriteU16(buf, offset + 28, entry.nameBytes.length); // file name length\n\t\twriteU16(buf, offset + 30, 0); // extra field length\n\t\twriteU16(buf, offset + 32, 0); // file comment length\n\t\twriteU16(buf, offset + 34, 0); // disk number start\n\t\twriteU16(buf, offset + 36, 0); // internal file attributes\n\t\twriteU32(buf, offset + 38, 0); // external file attributes\n\t\twriteU32(buf, offset + 42, ce.offset); // relative offset of local header\n\t\tbuf.set(entry.nameBytes, offset + 46);\n\t\toffset += 46 + entry.nameBytes.length;\n\t}\n\n\t// Write End of Central Directory record\n\tconst cdSize = offset - cdStart;\n\twriteU32(buf, offset, SIG_EOCD);\n\twriteU16(buf, offset + 4, 0); // number of this disk\n\twriteU16(buf, offset + 6, 0); // disk where CD starts\n\twriteU16(buf, offset + 8, rawEntries.length); // number of CD entries on this disk\n\twriteU16(buf, offset + 10, rawEntries.length); // total number of CD entries\n\twriteU32(buf, offset + 12, cdSize); // size of central directory\n\twriteU32(buf, offset + 16, cdStart); // offset of start of CD\n\twriteU16(buf, offset + 20, 0); // ZIP file comment length\n\n\treturn buf;\n}\n\n/**\n * Read a file from a ZIP archive as a UTF-8 string.\n * XML parsers consume this decoded text directly; do not decode it again.\n *\n * Falls back to trying with/without a leading slash if the exact path is not found.\n *\n * @param archive - ZIP archive to read from\n * @param path - File path within the archive\n * @returns Decoded string, or `null` if the file is not found\n */\nexport function zipReadString(archive: ZipArchive, path: string): string | null {\n\tconst resolvedPath = resolveZipPath(archive, path);\n\tif (resolvedPath == null) {\n\t\treturn null;\n\t}\n\treturn decoder.decode(archive.files[resolvedPath]);\n}\n\n/**\n * Add a UTF-8 string as a file entry in the archive.\n *\n * @param archive - Target archive\n * @param path - File path within the archive\n * @param content - String content to encode as UTF-8\n */\nexport function zipAddString(archive: ZipArchive, path: string, content: string): void {\n\tarchive.files[path] = encoder.encode(content);\n}\n\n/** Create a new empty ZIP archive with no file entries. */\nexport function zipCreate(): ZipArchive {\n\treturn { files: {} };\n}\n\n/**\n * Check if a file exists in the archive.\n *\n * Tries an exact match first, then with/without a leading slash,\n * and finally a case-insensitive search as a last resort.\n *\n * @param archive - ZIP archive to search\n * @param path - File path to look for\n * @returns `true` if the file exists\n */\nexport function zipHas(archive: ZipArchive, path: string): boolean {\n\treturn resolveZipPath(archive, path) != null;\n}\n","import { XlsxError } from \"../errors.js\";\n\n/** Limits applied while reading XML-based workbook parts. */\nexport interface XmlLimitOptions {\n\t/** Maximum decoded XML part size. */\n\tmaxXmlPartBytes?: number;\n\t/** Maximum number of raw XML tags in a single part. */\n\tmaxXmlTags?: number;\n\t/** Maximum nesting depth for XML elements in a single part. */\n\tmaxXmlNestingDepth?: number;\n\t/** Maximum number of characters in a single XML tag. */\n\tmaxXmlTagLength?: number;\n\t/** Maximum number of attributes in a single XML tag. */\n\tmaxXmlAttributesPerTag?: number;\n\t/** Maximum number of shared string items to parse. */\n\tmaxSharedStringItems?: number;\n\t/** Maximum number of worksheet row elements to scan. */\n\tmaxWorksheetRows?: number;\n\t/** Maximum cumulative explicit and derived worksheet cell work. */\n\tmaxWorksheetCells?: number;\n}\n\nexport const DEFAULT_MAX_XML_PART_BYTES = 128 * 1024 * 1024;\nexport const DEFAULT_MAX_XML_TAGS = 5_000_000;\nexport const DEFAULT_MAX_XML_NESTING_DEPTH = 256;\nexport const DEFAULT_MAX_XML_TAG_LENGTH = 1024 * 1024;\nexport const DEFAULT_MAX_XML_ATTRIBUTES_PER_TAG = 10_000;\nexport const DEFAULT_MAX_SHARED_STRING_ITEMS = 1_000_000;\nexport const DEFAULT_MAX_WORKSHEET_ROWS = 1_048_576;\nexport const DEFAULT_MAX_WORKSHEET_CELLS = 10_000_000;\n\nexport function xmlOptionLimit(value: number | undefined, fallback: number, name: string): number {\n\tif (value == null) {\n\t\treturn fallback;\n\t}\n\tif (!Number.isFinite(value) || value < 0) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `Invalid XML option: ${name} must be a non-negative finite number`);\n\t}\n\treturn value;\n}\n\nexport function assertXmlCountWithinLimit(kind: string, count: number, limit: number): void {\n\tif (count > limit) {\n\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", `Invalid XML: ${kind} count ${count} exceeds limit ${limit}`);\n\t}\n}\n\nexport function assertXmlPartLimits(partName: string, data: string, opts?: XmlLimitOptions): void {\n\tconst maxXmlPartBytes = xmlOptionLimit(opts?.maxXmlPartBytes, DEFAULT_MAX_XML_PART_BYTES, \"maxXmlPartBytes\");\n\tif (data.length > maxXmlPartBytes) {\n\t\tthrow new XlsxError(\n\t\t\t\"LIMIT_EXCEEDED\",\n\t\t\t`Invalid XML: ${partName} size ${data.length} exceeds limit ${maxXmlPartBytes}`,\n\t\t);\n\t}\n\n\tconst maxXmlTags = xmlOptionLimit(opts?.maxXmlTags, DEFAULT_MAX_XML_TAGS, \"maxXmlTags\");\n\tconst maxXmlNestingDepth = xmlOptionLimit(\n\t\topts?.maxXmlNestingDepth,\n\t\tDEFAULT_MAX_XML_NESTING_DEPTH,\n\t\t\"maxXmlNestingDepth\",\n\t);\n\tconst maxXmlTagLength = xmlOptionLimit(opts?.maxXmlTagLength, DEFAULT_MAX_XML_TAG_LENGTH, \"maxXmlTagLength\");\n\tlet tagCount = 0;\n\tlet depth = 0;\n\tlet offset = -1;\n\twhile ((offset = data.indexOf(\"<\", offset + 1)) !== -1) {\n\t\tassertXmlCountWithinLimit(`${partName} tag`, ++tagCount, maxXmlTags);\n\t\tconst closeOffset = data.indexOf(\">\", offset + 1);\n\t\tconst tagLength = closeOffset === -1 ? data.length - offset : closeOffset - offset + 1;\n\t\tif (tagLength > maxXmlTagLength) {\n\t\t\tthrow new XlsxError(\n\t\t\t\t\"LIMIT_EXCEEDED\",\n\t\t\t\t`Invalid XML: ${partName} tag length ${tagLength} exceeds limit ${maxXmlTagLength}`,\n\t\t\t);\n\t\t}\n\t\tif (closeOffset === -1) {\n\t\t\tbreak;\n\t\t}\n\t\tlet tagStart = offset + 1;\n\t\twhile (tagStart < closeOffset && data.charCodeAt(tagStart) <= 32) {\n\t\t\t++tagStart;\n\t\t}\n\t\tconst first = data.charCodeAt(tagStart);\n\t\tconst isClosingTag = first === 47;\n\t\tconst isProcessingOrDeclaration = first === 33 || first === 63;\n\t\tconst isSelfClosing = data.charCodeAt(closeOffset - 1) === 47;\n\t\tif (isClosingTag) {\n\t\t\tdepth = Math.max(0, depth - 1);\n\t\t} else if (!isProcessingOrDeclaration && !isSelfClosing && ++depth > maxXmlNestingDepth) {\n\t\t\tthrow new XlsxError(\n\t\t\t\t\"LIMIT_EXCEEDED\",\n\t\t\t\t`Invalid XML: ${partName} nesting depth ${depth} exceeds limit ${maxXmlNestingDepth}`,\n\t\t\t);\n\t\t}\n\t\toffset = closeOffset;\n\t}\n}\n","import type { XmlLimitOptions } from \"./limits.js\";\nimport { assertXmlCountWithinLimit, DEFAULT_MAX_XML_ATTRIBUTES_PER_TAG, xmlOptionLimit } from \"./limits.js\";\n\n// Matches attribute key=\"value\" pairs within an XML tag. Captures the attribute\n// name, then handles double-quoted, single-quoted, or unquoted values.\nconst attregexg = /\\s([^\"\\s?>/=]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)'|([^'\">\\s]+))/g;\n\n// Strict XML tag regex: matches well-formed tags with optional attributes\nconst tagregex1 = /<[/?]?[\\w:-]+(?:\\s+[^\"\\s?<>/]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^'\"<>\\s=]+))*\\s*[/?]?>/g;\n// Lenient fallback: matches anything between < and >\nconst tagregex2 = /<[^<>]*>/g;\n\n/** Standard XML declaration header with UTF-8 encoding and Windows line ending */\nexport const XML_HEADER = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n';\n\n/**\n * The regex used to tokenize XML tags throughout the codebase.\n * Uses the strict pattern if it can match the XML header, otherwise falls back to the lenient one.\n */\nexport const XML_TAG_REGEX: RegExp = XML_HEADER.match(tagregex1) ? tagregex1 : tagregex2;\n\n// Matches namespace-prefixed opening or closing tags like <ns:tag or </ns:tag\nconst nsregex2 = /<(\\/?)\\w+:/;\n\n/**\n * Parse XML attributes from a raw tag string into a key-value record.\n * Handles namespace prefixes by stripping them (e.g., \"r:id\" becomes \"id\").\n * Stores the tag name itself under key `0` unless skip_root is true.\n * @param tag - the raw XML tag string (e.g., `<Relationship Id=\"rId1\" Target=\"...\"/>`)\n * @param skip_root - if true, do not store the tag name under key `0`\n * @param skip_LC - if true, do not store lowercase copies of attribute names\n * @param opts - XML parsing limits\n * @returns a record mapping attribute names to their values\n */\nexport function parseXmlTag(\n\ttag: string,\n\tskip_root?: boolean,\n\tskip_LC?: boolean,\n\topts?: XmlLimitOptions,\n): Record<string, any> {\n\tconst attrs: Record<string, any> = {};\n\tlet scanPos = 0;\n\tlet charCode = 0;\n\t// Scan forward to find the end of the tag name (terminated by space, LF, or CR)\n\tfor (; scanPos !== tag.length; ++scanPos) {\n\t\tif ((charCode = tag.charCodeAt(scanPos)) === 32 || charCode === 10 || charCode === 13) {\n\t\t\tbreak; // 32=space, 10=LF, 13=CR\n\t\t}\n\t}\n\tif (!skip_root) {\n\t\tattrs[0] = tag.slice(0, scanPos);\n\t}\n\tif (scanPos === tag.length) {\n\t\treturn attrs;\n\t}\n\tconst maxXmlAttributesPerTag = xmlOptionLimit(\n\t\topts?.maxXmlAttributesPerTag,\n\t\tDEFAULT_MAX_XML_ATTRIBUTES_PER_TAG,\n\t\t\"maxXmlAttributesPerTag\",\n\t);\n\tattregexg.lastIndex = 0;\n\tlet attrMatch: RegExpExecArray | null;\n\tlet attrCount = 0;\n\twhile ((attrMatch = attregexg.exec(tag))) {\n\t\tassertXmlCountWithinLimit(\"XML attribute\", ++attrCount, maxXmlAttributesPerTag);\n\t\t// Strip the leading whitespace character captured by the regex\n\t\tconst attrStr = attrMatch[0].slice(1);\n\t\tlet eqPos = 0;\n\t\t// Find the '=' separator (charCode 61)\n\t\tfor (eqPos = 0; eqPos < attrStr.length; ++eqPos) {\n\t\t\tif (attrStr.charCodeAt(eqPos) === 61) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tlet attrName = attrStr.slice(0, eqPos).trim();\n\t\t// Skip any spaces between '=' and the value\n\t\twhile (attrStr.charCodeAt(eqPos + 1) === 32) {\n\t\t\t++eqPos;\n\t\t}\n\t\t// Detect and skip surrounding quotes (charCode 34=\" or 39=')\n\t\tconst quoteOffset = (scanPos = attrStr.charCodeAt(eqPos + 1)) === 34 || scanPos === 39 ? 1 : 0;\n\t\tconst attrValue = attrStr.slice(eqPos + 1 + quoteOffset, attrStr.length - quoteOffset);\n\n\t\t// Check for namespace prefix by finding ':' (charCode 58)\n\t\tlet colonPos = 0;\n\t\tfor (colonPos = 0; colonPos < attrName.length; ++colonPos) {\n\t\t\tif (attrName.charCodeAt(colonPos) === 58) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (colonPos === attrName.length) {\n\t\t\t// No namespace prefix -- truncate at underscore if present (handles extended names)\n\t\t\tif (attrName.indexOf(\"_\") > 0) {\n\t\t\t\tattrName = attrName.slice(0, attrName.indexOf(\"_\"));\n\t\t\t}\n\t\t\tattrs[attrName] = attrValue;\n\t\t\tif (!skip_LC) {\n\t\t\t\tattrs[attrName.toLowerCase()] = attrValue;\n\t\t\t}\n\t\t} else {\n\t\t\t// Has namespace prefix -- extract the local name.\n\t\t\t// Special case: \"xmlns:foo\" keeps \"xmlns\" prefix for the local name.\n\t\t\tconst localName =\n\t\t\t\t(colonPos === 5 && attrName.slice(0, 5) === \"xmlns\" ? \"xmlns\" : \"\") + attrName.slice(colonPos + 1);\n\t\t\t// Skip \"ext\" namespace attributes if a non-ext value already exists\n\t\t\tif (attrs[localName] && attrName.slice(colonPos - 3, colonPos) === \"ext\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tattrs[localName] = attrValue;\n\t\t\tif (!skip_LC) {\n\t\t\t\tattrs[localName.toLowerCase()] = attrValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn attrs;\n}\n\n/**\n * Strip namespace prefixes from XML tag names (e.g., `<a:foo>` becomes `<foo>`).\n * @param x - XML string with possible namespace prefixes\n * @returns the XML string with namespace prefixes removed from tag names\n */\nexport function stripNamespace(x: string): string {\n\treturn x.replace(nsregex2, \"<$1\");\n}\n\n/**\n * Parse xsd:boolean-compatible values to a native boolean.\n * Accepts 1, true, \"1\", \"true\" as truthy; 0, false, \"0\", \"false\" as falsy.\n * @param value - the value to interpret as boolean\n * @returns true or false\n */\nexport function parseXmlBoolean(value: any): boolean {\n\tswitch (value) {\n\t\tcase 1:\n\t\tcase true:\n\t\tcase \"1\":\n\t\tcase \"true\":\n\t\t\treturn true;\n\t\tcase 0:\n\t\tcase false:\n\t\tcase \"0\":\n\t\tcase \"false\":\n\t\t\treturn false;\n\t}\n\treturn false;\n}\n","/** Lookup table mapping XML named entities to their decoded characters */\nconst encodings: Record<string, string> = {\n\t\"&quot;\": '\"',\n\t\"&apos;\": \"'\",\n\t\"&gt;\": \">\",\n\t\"&lt;\": \"<\",\n\t\"&amp;\": \"&\",\n};\n\n/** Reverse lookup: special characters to their XML entity representations */\nconst XML_ESCAPE_MAP: Record<string, string> = {\n\t'\"': \"&quot;\",\n\t\"'\": \"&apos;\",\n\t\">\": \"&gt;\",\n\t\"<\": \"&lt;\",\n\t\"&\": \"&amp;\",\n};\n\n// Matches XML named entities (&quot; etc.) and numeric character references (&#x1A; or &#26;)\nconst encregex = /&(?:quot|apos|gt|lt|amp|#(?:x([\\da-f]+)|(\\d+)));/gi;\n// Matches OOXML-style escaped Unicode characters like _x0020_ (underscore-hex encoding)\nconst coderegex = /_x([\\da-fA-F]{4})_/g;\n// Matches the leading underscore of literal text that would otherwise be interpreted as an OOXML escape on read.\nconst literalCoderegex = /_(?=x[\\da-fA-F]{4}_)/g;\n// Matches characters that must be escaped in XML: & < > ' \"\nconst decregex = /[&<>'\"]/g;\n// Matches XML-illegal control characters (U+0000-U+0008, U+000B-U+001F, U+FFFE-U+FFFF)\n// eslint-disable-next-line no-control-regex\nconst charegex = /[\\u0000-\\u0008\\u000b-\\u001f\\uFFFE\\uFFFF]/g;\n\n/**\n * Check whether a number is a character allowed by the XML 1.0 Char production.\n * XML excludes surrogate code points and values outside the listed ranges.\n */\nfunction isValidXmlCodePoint(codePoint: number): boolean {\n\treturn (\n\t\tcodePoint === 0x9 ||\n\t\tcodePoint === 0xa ||\n\t\tcodePoint === 0xd ||\n\t\t(codePoint >= 0x20 && codePoint <= 0xd7ff) ||\n\t\t(codePoint >= 0xe000 && codePoint <= 0xfffd) ||\n\t\t(codePoint >= 0x10000 && codePoint <= 0x10ffff)\n\t);\n}\n\n/**\n * Recursively unescape XML entities, handling CDATA sections.\n * @param text - raw XML text potentially containing entities and CDATA blocks\n * @returns the fully unescaped string\n */\nfunction rawUnescapeXml(text: string): string {\n\tconst str = text;\n\tconst i = str.indexOf(\"<![CDATA[\");\n\tif (i === -1) {\n\t\t// No CDATA: replace named/numeric entities then OOXML _xHHHH_ escapes\n\t\treturn str\n\t\t\t.replace(encregex, ($$, $1, $2) => {\n\t\t\t\t// Try named entity first, then parse as hex (&#xHH;) or decimal (&#DD;)\n\t\t\t\tif (encodings[$$]) {\n\t\t\t\t\treturn encodings[$$];\n\t\t\t\t}\n\t\t\t\tconst codePoint = Number.parseInt($1 || $2, $1 ? 16 : 10);\n\t\t\t\treturn isValidXmlCodePoint(codePoint) ? String.fromCodePoint(codePoint) : $$;\n\t\t\t})\n\t\t\t.replace(coderegex, (_m, c) => {\n\t\t\t\treturn String.fromCharCode(parseInt(c, 16));\n\t\t\t});\n\t}\n\t// Split around CDATA: unescape text before and after, keep CDATA content verbatim\n\tconst cdataEndIdx = str.indexOf(\"]]>\");\n\treturn rawUnescapeXml(str.slice(0, i)) + str.slice(i + 9, cdataEndIdx) + rawUnescapeXml(str.slice(cdataEndIdx + 3));\n}\n\n/**\n * Unescape XML entities in a string. Optionally normalize line endings for XLSX.\n * @param text - XML-encoded text to unescape\n * @param xlsx - when true, normalize \\r\\n line endings to \\n\n * @returns the unescaped string\n */\nexport function unescapeXml(text: string, xlsx?: boolean): string {\n\tconst out = rawUnescapeXml(text);\n\treturn xlsx ? out.replace(/\\r\\n/g, \"\\n\") : out;\n}\n\n/**\n * Escape a string for safe inclusion as XML text content.\n * Replaces &, <, >, ', \" with named entities, and encodes illegal\n * control characters using OOXML _xHHHH_ notation.\n * @param text - plain text to escape\n * @returns XML-safe string\n */\nexport function escapeXml(text: string): string {\n\tconst str = text;\n\treturn (\n\t\tstr\n\t\t\t.replace(decregex, (char) => XML_ESCAPE_MAP[char])\n\t\t\t// A literal _xHHHH_ would be decoded as an OOXML escape during a roundtrip.\n\t\t\t// Escaping its leading underscore as _x005F_ makes the reader decode it once.\n\t\t\t.replace(literalCoderegex, () => \"_x005F_\")\n\t\t\t.replace(charegex, (char) => \"_x\" + (\"000\" + char.charCodeAt(0).toString(16)).slice(-4) + \"_\")\n\t);\n}\n\n/**\n * Escape a string for use in XML tag names.\n * In addition to standard XML escaping, spaces are encoded as _x0020_.\n * @param text - raw tag name text\n * @returns escaped tag name suitable for XML\n */\nexport function escapeXmlTag(text: string): string {\n\treturn escapeXml(text).replace(/ /g, \"_x0020_\");\n}\n\n// Matches control characters U+0000-U+001F (all ASCII control chars including tab, newline, etc.)\n// eslint-disable-next-line no-control-regex\nconst htmlcharegex = /[\\u0000-\\u001f]/g;\n\n/**\n * Escape a string for HTML output.\n * Replaces XML-special characters with entities, converts newlines to <br/>,\n * and encodes remaining control characters as hex character references.\n * @param text - plain text to escape for HTML\n * @returns HTML-safe string\n */\nexport function escapeHtml(text: string): string {\n\tconst str = text;\n\treturn str\n\t\t.replace(decregex, (char) => XML_ESCAPE_MAP[char])\n\t\t.replace(/\\n/g, \"<br/>\")\n\t\t.replace(htmlcharegex, (char) => \"&#x\" + (\"000\" + char.charCodeAt(0).toString(16)).slice(-4) + \";\");\n}\n\n/** Pre-compiled entity patterns paired with their replacement characters for HTML decoding */\nconst entities: [RegExp, string][] = [\n\t[\"nbsp\", \" \"],\n\t[\"middot\", \"\\u00B7\"],\n\t[\"quot\", '\"'],\n\t[\"apos\", \"'\"],\n\t[\"gt\", \">\"],\n\t[\"lt\", \"<\"],\n\t[\"amp\", \"&\"], // &amp; must be last so earlier replacements don't get double-decoded\n].map(([name, ch]) => [new RegExp(\"&\" + name + \";\", \"gi\"), ch]);\n\n/**\n * Decode an HTML string to plain text.\n * Strips tags, collapses whitespace, converts <br> to newlines,\n * and decodes named HTML entities.\n * @param str - HTML string to decode\n * @returns decoded plain text\n */\nexport function htmlDecode(str: string): string {\n\tlet result = str\n\t\t.replace(/^[\\t\\n\\r ]+/, \"\") // trim leading whitespace\n\t\t.replace(/(^|[^\\t\\n\\r ])[\\t\\n\\r ]+$/, \"$1\") // trim trailing whitespace (preserve last non-ws char)\n\t\t.replace(/>\\s+/g, \">\") // collapse whitespace after closing brackets\n\t\t.replace(/\\b\\s+</g, \"<\") // collapse whitespace before opening brackets\n\t\t.replace(/[\\t\\n\\r ]+/g, \" \") // normalize internal whitespace to single spaces\n\t\t.replace(/<\\s*br\\s*\\/?>/gi, \"\\n\") // convert <br> / <BR/> variants to newlines\n\t\t.replace(/<[^<>]*>/g, \"\"); // strip all remaining HTML tags\n\tfor (let i = 0; i < entities.length; ++i) {\n\t\tresult = result.replace(entities[i][0], entities[i][1]);\n\t}\n\treturn result;\n}\n","import { XlsxError } from \"../errors.js\";\nimport { escapeXml } from \"./escape.js\";\n\n// Detects leading/trailing whitespace or embedded newlines that require xml:space=\"preserve\"\nconst wtregex = /(^\\s|\\s$|\\n)/;\n\n/**\n * Write a simple XML tag wrapping text content.\n * Automatically adds xml:space=\"preserve\" when the content has\n * leading/trailing whitespace or embedded newlines.\n * @param tagName - the XML element name\n * @param content - the text content to wrap\n * @returns an XML string like `<tag>content</tag>`\n */\nexport function writeXmlTag(tagName: string, content: string): string {\n\treturn (\n\t\t\"<\" + tagName + (content.match(wtregex) ? ' xml:space=\"preserve\"' : \"\") + \">\" + content + \"</\" + tagName + \">\"\n\t);\n}\n\n/**\n * Format a key-value record as XML attribute pairs.\n * @param attributes - attribute name/value pairs\n * @returns a string of ` key=\"value\"` segments (with leading spaces)\n */\nfunction formatXmlAttributes(attributes: Record<string, string>): string {\n\treturn Object.keys(attributes)\n\t\t.map((key) => \" \" + key + '=\"' + attributes[key] + '\"')\n\t\t.join(\"\");\n}\n\nconst HTML_ATTRIBUTE_ESCAPE_MAP: Record<string, string> = {\n\t\"&\": \"&amp;\",\n\t\"<\": \"&lt;\",\n\t\">\": \"&gt;\",\n\t'\"': \"&quot;\",\n\t\"'\": \"&#39;\",\n};\n\n// Attribute values cannot use the HTML text escaper: newlines must remain\n// inside the attribute instead of becoming <br/> markup.\n// eslint-disable-next-line no-control-regex\nconst htmlAttributeEscapeRegex = /[&<>\"'\\u0000-\\u001f\\u007f]/g;\n\n/** Escape a value for a double-quoted HTML attribute. */\nexport function escapeHtmlAttribute(value: string): string {\n\treturn value.replace(htmlAttributeEscapeRegex, (character) => {\n\t\treturn (\n\t\t\tHTML_ATTRIBUTE_ESCAPE_MAP[character] || \"&#x\" + character.charCodeAt(0).toString(16).padStart(4, \"0\") + \";\"\n\t\t);\n\t});\n}\n\nfunction formatHtmlAttributes(attributes: Record<string, string>): string {\n\treturn Object.keys(attributes)\n\t\t.map((key) => \" \" + key + '=\"' + escapeHtmlAttribute(attributes[key]) + '\"')\n\t\t.join(\"\");\n}\n\n/**\n * Write an HTML element whose content is already safe markup and whose\n * attribute values are escaped for a double-quoted HTML attribute context.\n */\nexport function writeHtmlElement(tagName: string, content: string, attributes?: Record<string, string> | null): string {\n\treturn (\n\t\t\"<\" +\n\t\ttagName +\n\t\t(attributes != null ? formatHtmlAttributes(attributes) : \"\") +\n\t\t\">\" +\n\t\tcontent +\n\t\t\"</\" +\n\t\ttagName +\n\t\t\">\"\n\t);\n}\n\n/**\n * Write an XML element with optional attributes and optional content.\n * When content is null/undefined, emits a self-closing tag (`<tag .../>`).\n * When content is provided, adds xml:space=\"preserve\" if needed.\n * @param tagName - the XML element name\n * @param content - text content, or null for self-closing tag\n * @param attributes - optional attribute key-value pairs\n * @returns the complete XML element string\n */\nexport function writeXmlElement(\n\ttagName: string,\n\tcontent?: string | null,\n\tattributes?: Record<string, string> | null,\n): string {\n\treturn (\n\t\t\"<\" +\n\t\ttagName +\n\t\t(attributes != null ? formatXmlAttributes(attributes) : \"\") +\n\t\t// If content is non-null, emit open+close tags; otherwise self-close with \"/>\"\n\t\t(content != null\n\t\t\t? (content.match(wtregex) ? ' xml:space=\"preserve\"' : \"\") + \">\" + content + \"</\" + tagName\n\t\t\t: \"/\") +\n\t\t\">\"\n\t);\n}\n\n/**\n * Write a W3C datetime string (ISO 8601 without fractional seconds) from a Date object.\n * Used for dcterms:created/modified and vt:filetime elements.\n * @param date - the Date to serialize\n * @param throwOnError - when true, rethrow invalid Date errors instead of returning \"\"\n * @returns an ISO datetime string like \"2024-01-15T10:30:00Z\", or \"\" on error\n */\nexport function writeW3cDatetime(date: Date, throwOnError?: boolean): string {\n\ttry {\n\t\t// Strip fractional seconds (.000) from ISO string\n\t\treturn date.toISOString().replace(/\\.\\d*/, \"\");\n\t} catch (error) {\n\t\tif (throwOnError) {\n\t\t\tthrow error;\n\t\t}\n\t}\n\treturn \"\";\n}\n\n/**\n * Write an OPC variant-type (vt:) XML element for a given JavaScript value.\n * Dispatches on the runtime type to choose the appropriate vt: element:\n * - string  -> vt:lpwstr\n * - number  -> vt:i4 (integer) or vt:r8 (float)\n * - boolean -> vt:bool\n * - Date    -> vt:filetime\n * @param value - the value to serialize\n * @param xlsx - when true, escape double-quotes as _x0022_ (OOXML convention)\n * @returns an XML string containing the appropriate vt: element\n * @throws XlsxError if value is an unsupported type\n */\nexport function writeVariantType(value: any, xlsx?: boolean): string {\n\tswitch (typeof value) {\n\t\tcase \"string\": {\n\t\t\tlet output = writeXmlElement(\"vt:lpwstr\", escapeXml(value));\n\t\t\tif (xlsx) {\n\t\t\t\t// OOXML uses _x0022_ instead of &quot; for double quotes in custom properties\n\t\t\t\toutput = output.replace(/&quot;/g, \"_x0022_\");\n\t\t\t}\n\t\t\treturn output;\n\t\t}\n\t\tcase \"number\":\n\t\t\t// Use vt:i4 for integers (bitwise OR test), vt:r8 for floating-point\n\t\t\treturn writeXmlElement((value | 0) === value ? \"vt:i4\" : \"vt:r8\", escapeXml(String(value)));\n\t\tcase \"boolean\":\n\t\t\treturn writeXmlElement(\"vt:bool\", value ? \"true\" : \"false\");\n\t}\n\tif (value instanceof Date) {\n\t\treturn writeXmlElement(\"vt:filetime\", writeW3cDatetime(value));\n\t}\n\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Unable to serialize \" + String(value));\n}\n","/**\n * Standard XML namespace URIs used in OPC (Open Packaging Conventions) and OOXML documents.\n * Keys are short identifiers used throughout the codebase; values are the full namespace URIs.\n */\nexport const XMLNS: Record<string, string> = {\n\tCORE_PROPS: \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\",\n\tCUST_PROPS: \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\",\n\tEXT_PROPS: \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\",\n\tCT: \"http://schemas.openxmlformats.org/package/2006/content-types\",\n\tRELS: \"http://schemas.openxmlformats.org/package/2006/relationships\",\n\tTCMNT: \"http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments\",\n\tdc: \"http://purl.org/dc/elements/1.1/\",\n\tdcterms: \"http://purl.org/dc/terms/\",\n\tdcmitype: \"http://purl.org/dc/dcmitype/\",\n\tmx: \"http://schemas.microsoft.com/office/mac/excel/2008/main\",\n\tr: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n\tsjs: \"http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties\",\n\tvt: \"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\",\n\txsi: \"http://www.w3.org/2001/XMLSchema-instance\",\n\txsd: \"http://www.w3.org/2001/XMLSchema\",\n};\n\n/**\n * Recognized namespace URIs for the SpreadsheetML main namespace.\n * Multiple URIs exist because OOXML has both ECMA-376 and transitional/strict variants,\n * plus Microsoft-specific extensions.\n */\nexport const XMLNS_main = [\n\t\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\",\n\t\"http://purl.oclc.org/ooxml/spreadsheetml/main\",\n\t\"http://schemas.microsoft.com/office/excel/2006/main\",\n\t\"http://schemas.microsoft.com/office/excel/2006/2\",\n];\n\n/**\n * OPC relationship type URIs.\n * Each key is a short identifier; each value is the full relationship type URI\n * used in .rels files to link package parts together.\n */\nexport const RELS = {\n\tWB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tSHEET: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n\tCHARTSHEET: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\",\n\tHLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n\tVML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n\tCMNT: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n\tCORE_PROPS: \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n\tEXT_PROPS: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n\tCUST_PROPS: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties\",\n\tSST: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n\tSTY: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n\tTHEME: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n\tCHART: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n\tCCHAIN: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/calcChain\",\n\tTCMNT: \"http://schemas.microsoft.com/office/2017/10/relationships/threadedComment\",\n\tPEOPLE: \"http://schemas.microsoft.com/office/2017/10/relationships/person\",\n\tDRAWING: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n\tMETA: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata\",\n\tXLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n};\n","import { XlsxError } from \"../errors.js\";\nimport { parseXmlTag, XML_HEADER, XML_TAG_REGEX } from \"../xml/parser.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS } from \"../xml/namespaces.js\";\nimport type { XmlLimitOptions } from \"../xml/limits.js\";\n\n// Extracts the namespace prefix from the first tag in a string (e.g., \"w\" from \"<w:Types>\")\nconst nsregex = /<(\\w+):/;\n\n/**\n * Map from OOXML content-type MIME strings to internal category names.\n * Used during parsing to classify each Override entry into the correct bucket.\n */\nconst CONTENT_TYPE_MAP: Record<string, string> = {\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\t\"application/vnd.ms-excel.sheet.macroEnabled.main+xml\": \"workbooks\",\n\t\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\": \"workbooks\",\n\t\"application/vnd.ms-excel.addin.macroEnabled.main+xml\": \"workbooks\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\": \"workbooks\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\": \"sheets\",\n\t\"application/vnd.ms-excel.worksheet\": \"sheets\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": \"charts\",\n\t\"application/vnd.ms-excel.chartsheet\": \"charts\",\n\t\"application/vnd.ms-excel.macrosheet+xml\": \"macros\",\n\t\"application/vnd.ms-excel.macrosheet\": \"macros\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": \"dialogs\",\n\t\"application/vnd.ms-excel.dialogsheet\": \"dialogs\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\": \"strs\",\n\t\"application/vnd.ms-excel.sharedStrings\": \"strs\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\": \"styles\",\n\t\"application/vnd.ms-excel.styles\": \"styles\",\n\t\"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n\t\"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n\t\"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": \"comments\",\n\t\"application/vnd.ms-excel.comments\": \"comments\",\n\t\"application/vnd.ms-excel.threadedcomments+xml\": \"threadedcomments\",\n\t\"application/vnd.ms-excel.person+xml\": \"people\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"metadata\",\n\t\"application/vnd.ms-excel.sheetMetadata\": \"metadata\",\n\t\"application/vnd.ms-excel.calcChain\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\t\"application/vnd.ms-office.vbaProject\": \"vba\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"links\",\n\t\"application/vnd.ms-excel.externalLink\": \"links\",\n\t\"application/vnd.openxmlformats-officedocument.drawing+xml\": \"drawings\",\n\t\"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n};\n\n/**\n * Reverse lookup: maps internal category names to the preferred content-type strings\n * for writing, keyed by book type (e.g., \"xlsx\", \"xlsm\").\n */\nconst CT_LIST: Record<string, Record<string, string>> = {\n\tworkbooks: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n\t\txlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n\t},\n\tstrs: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n\t},\n\tcomments: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\",\n\t},\n\tsheets: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n\t},\n\tcharts: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\",\n\t},\n\tdialogs: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\",\n\t},\n\tmacros: {\n\t\txlsx: \"application/vnd.ms-excel.macrosheet+xml\",\n\t},\n\tmetadata: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\",\n\t},\n\tstyles: {\n\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n\t},\n};\n\n/** Parsed representation of the [Content_Types].xml file, with parts grouped by category */\nexport interface ContentTypes {\n\tworkbooks: string[];\n\tsheets: string[];\n\tcharts: string[];\n\tdialogs: string[];\n\tmacros: string[];\n\trels: string[];\n\tstrs: string[];\n\tcomments: string[];\n\tthreadedcomments: string[];\n\tlinks: string[];\n\tcoreprops: string[];\n\textprops: string[];\n\tcustprops: string[];\n\tthemes: string[];\n\tstyles: string[];\n\tcalcchains: string[];\n\tvba: string[];\n\tdrawings: string[];\n\tmetadata: string[];\n\tpeople: string[];\n\txmlns: string;\n\t/** Shortcut to the first calc chain part path */\n\tcalcchain?: string;\n\t/** Shortcut to the first shared strings part path */\n\tsst?: string;\n\t/** Shortcut to the first styles part path */\n\tstyle?: string;\n\t/** Default content types by file extension (from <Default> elements) */\n\tdefaults?: Record<string, string>;\n}\n\n/**\n * Create an empty ContentTypes object with all category arrays initialized.\n * @returns a fresh ContentTypes with empty arrays for every category\n */\nexport function createContentTypes(): ContentTypes {\n\treturn {\n\t\tworkbooks: [],\n\t\tsheets: [],\n\t\tcharts: [],\n\t\tdialogs: [],\n\t\tmacros: [],\n\t\trels: [],\n\t\tstrs: [],\n\t\tcomments: [],\n\t\tthreadedcomments: [],\n\t\tlinks: [],\n\t\tcoreprops: [],\n\t\textprops: [],\n\t\tcustprops: [],\n\t\tthemes: [],\n\t\tstyles: [],\n\t\tcalcchains: [],\n\t\tvba: [],\n\t\tdrawings: [],\n\t\tmetadata: [],\n\t\tpeople: [],\n\t\txmlns: \"\",\n\t};\n}\n\n/**\n * Parse the [Content_Types].xml file from an OPC package.\n * Processes `<Default>` entries (file extension -> content type) and\n * `<Override>` entries (part path -> content type), classifying each\n * override into the appropriate category array.\n * @param data - raw XML string of the [Content_Types].xml file (may be null/undefined)\n * @returns a populated ContentTypes object\n * @throws XlsxError if the root namespace is not the expected OPC content-types namespace\n */\nexport function parseContentTypes(data: string | null | undefined, opts?: XmlLimitOptions): ContentTypes {\n\tconst ct = createContentTypes();\n\tif (!data) {\n\t\treturn ct;\n\t}\n\tconst ctext: Record<string, string> = {};\n\tconst matches = data.match(XML_TAG_REGEX) || [];\n\tfor (const x of matches) {\n\t\tconst y = parseXmlTag(x, undefined, undefined, opts);\n\t\t// Strip namespace prefix from tag name for uniform matching\n\t\tswitch ((y[0] as string).replace(nsregex, \"<\")) {\n\t\t\tcase \"<?xml\":\n\t\t\t\tbreak;\n\t\t\tcase \"<Types\":\n\t\t\t\t// Extract the xmlns attribute, accounting for possible namespace prefix on the tag itself\n\t\t\t\tct.xmlns = y[\"xmlns\" + ((y[0] as string).match(/<(\\w+):/) || [\"\", \"\"])[1]];\n\t\t\t\tbreak;\n\t\t\tcase \"<Default\":\n\t\t\t\t// Map file extension (lowercased) to its content type\n\t\t\t\tctext[y.Extension.toLowerCase()] = y.ContentType;\n\t\t\t\tbreak;\n\t\t\tcase \"<Override\":\n\t\t\t\t// Classify the part into the correct category based on its content type\n\t\t\t\tif (CONTENT_TYPE_MAP[y.ContentType] && (ct as any)[CONTENT_TYPE_MAP[y.ContentType]] !== undefined) {\n\t\t\t\t\t(ct as any)[CONTENT_TYPE_MAP[y.ContentType]].push(y.PartName);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tif (ct.xmlns !== XMLNS.CT) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unknown Namespace: \" + ct.xmlns);\n\t}\n\t// Set convenience shortcuts to the first entry in commonly-used categories\n\tct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : \"\";\n\tct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n\tct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n\tct.defaults = ctext;\n\treturn ct;\n}\n\n/**\n * Build a reverse map from category name to an array of content-type strings.\n * @param obj - the forward map (content-type -> category)\n * @returns a record mapping each category to all its content-type strings\n */\nfunction invertToArrayMap(obj: Record<string, string>): Record<string, string[]> {\n\tconst o: Record<string, string[]> = {};\n\tfor (const [k, v] of Object.entries(obj)) {\n\t\tif (!o[v]) {\n\t\t\to[v] = [];\n\t\t}\n\t\to[v].push(k);\n\t}\n\treturn o;\n}\n\n/**\n * Serialize a ContentTypes object to [Content_Types].xml format.\n * Emits `<Default>` entries for file extensions and `<Override>` entries\n * for each registered part, choosing the correct content-type string\n * based on the target book type.\n * @param ct - the ContentTypes object to serialize\n * @param opts - options containing the target bookType (e.g., \"xlsx\", \"xlsm\")\n * @returns the complete XML string for [Content_Types].xml\n */\nexport function writeContentTypes(ct: ContentTypes, opts: { bookType?: string }): string {\n\tconst type2ct = invertToArrayMap(CONTENT_TYPE_MAP);\n\tconst o: string[] = [];\n\n\to.push(XML_HEADER);\n\to.push(\n\t\twriteXmlElement(\"Types\", null, {\n\t\t\txmlns: XMLNS.CT,\n\t\t\t\"xmlns:xsd\": XMLNS.xsd,\n\t\t\t\"xmlns:xsi\": XMLNS.xsi,\n\t\t}),\n\t);\n\n\t// Default content types by file extension\n\tconst defaults: [string, string][] = [\n\t\t[\"xml\", \"application/xml\"],\n\t\t[\"bin\", \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\"],\n\t\t[\"vml\", \"application/vnd.openxmlformats-officedocument.vmlDrawing\"],\n\t\t[\"data\", \"application/vnd.openxmlformats-officedocument.model+data\"],\n\t\t[\"bmp\", \"image/bmp\"],\n\t\t[\"png\", \"image/png\"],\n\t\t[\"gif\", \"image/gif\"],\n\t\t[\"emf\", \"image/x-emf\"],\n\t\t[\"wmf\", \"image/x-wmf\"],\n\t\t[\"jpg\", \"image/jpeg\"],\n\t\t[\"jpeg\", \"image/jpeg\"],\n\t\t[\"tif\", \"image/tiff\"],\n\t\t[\"tiff\", \"image/tiff\"],\n\t\t[\"pdf\", \"application/pdf\"],\n\t\t[\"rels\", \"application/vnd.openxmlformats-package.relationships+xml\"],\n\t];\n\n\tfor (const [ext, contentType] of defaults) {\n\t\to.push(writeXmlElement(\"Default\", null, { Extension: ext, ContentType: contentType }));\n\t}\n\n\t// f1: write an Override for only the first entry in a category (singleton parts like workbook, SST, styles)\n\tconst f1 = (w: string) => {\n\t\tif ((ct as any)[w] && (ct as any)[w].length > 0) {\n\t\t\tconst v = (ct as any)[w][0];\n\t\t\to.push(\n\t\t\t\twriteXmlElement(\"Override\", null, {\n\t\t\t\t\tPartName: (v[0] === \"/\" ? \"\" : \"/\") + v,\n\t\t\t\t\tContentType: CT_LIST[w]?.[opts.bookType || \"xlsx\"] || CT_LIST[w]?.xlsx,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t};\n\n\t// f2: write Overrides for every entry in a category (multi-instance parts like sheets, charts)\n\tconst f2 = (w: string) => {\n\t\tfor (const v of (ct as any)[w] || []) {\n\t\t\to.push(\n\t\t\t\twriteXmlElement(\"Override\", null, {\n\t\t\t\t\tPartName: (v[0] === \"/\" ? \"\" : \"/\") + v,\n\t\t\t\t\tContentType: CT_LIST[w]?.[opts.bookType || \"xlsx\"] || CT_LIST[w]?.xlsx,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t};\n\n\t// f3: write Overrides using the reverse content-type map (for types not in CT_LIST)\n\tconst f3 = (t: string) => {\n\t\tfor (const v of (ct as any)[t] || []) {\n\t\t\to.push(\n\t\t\t\twriteXmlElement(\"Override\", null, {\n\t\t\t\t\tPartName: (v[0] === \"/\" ? \"\" : \"/\") + v,\n\t\t\t\t\tContentType: type2ct[t]?.[0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t};\n\n\t// Emit overrides in a specific order matching typical XLSX file structure\n\tf1(\"workbooks\");\n\tf2(\"sheets\");\n\tf2(\"charts\");\n\tf3(\"themes\");\n\tf1(\"strs\");\n\tf1(\"styles\");\n\tf3(\"coreprops\");\n\tf3(\"extprops\");\n\tf3(\"custprops\");\n\tf3(\"vba\");\n\tf3(\"comments\");\n\tf3(\"threadedcomments\");\n\tf3(\"drawings\");\n\tf2(\"metadata\");\n\tf3(\"people\");\n\n\t// Only close the root element if child elements were added\n\tif (o.length > 2) {\n\t\to.push(\"</Types>\");\n\t\t// Convert the self-closing root tag to an opening tag\n\t\to[1] = o[1].replace(\"/>\", \">\");\n\t}\n\treturn o.join(\"\");\n}\n","import { XlsxError } from \"../errors.js\";\nimport { parseXmlTag, XML_HEADER, XML_TAG_REGEX } from \"../xml/parser.js\";\nimport { unescapeXml } from \"../xml/escape.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS, RELS } from \"../xml/namespaces.js\";\nimport type { XmlLimitOptions } from \"../xml/limits.js\";\n\n/** A single relationship entry from a .rels file */\nexport interface RelEntry {\n\tId: string;\n\tType: string;\n\tTarget: string;\n\tTargetMode?: string;\n}\n\n/** Collection of parsed relationships, indexed by resolved target path and by rId */\nexport interface Relationships {\n\t[target: string]: any;\n\t/** Lookup table mapping rId strings (e.g., \"rId1\") to their RelEntry objects */\n\t\"!id\": Record<string, RelEntry>;\n\t/** Auto-incrementing counter for assigning new relationship IDs */\n\t\"!idx\"?: number;\n}\n\n/**\n * Resolve a relative target path against a base file path.\n * Handles \"..\" segments to navigate up the directory tree.\n * Absolute paths (starting with \"/\") are returned as-is.\n * @param target - the relative or absolute target path\n * @param basePath - the path of the file that contains the relationship\n * @returns the resolved absolute path\n */\nfunction resolve_path(target: string, basePath: string): string {\n\tif (target.charAt(0) === \"/\") {\n\t\treturn target;\n\t}\n\t// Extract the directory portion of the base path\n\tconst base = basePath.slice(0, basePath.lastIndexOf(\"/\") + 1);\n\tconst parts = (base + target).split(\"/\");\n\tconst resolved: string[] = [];\n\tfor (const p of parts) {\n\t\tif (p === \"..\") {\n\t\t\tresolved.pop();\n\t\t} else if (p !== \".\") {\n\t\t\tresolved.push(p);\n\t\t}\n\t}\n\treturn resolved.join(\"/\");\n}\n\n/**\n * Get the conventional .rels file path for a given OPC part.\n * For example, \"xl/workbook.xml\" becomes \"xl/_rels/workbook.xml.rels\".\n * @param file - the OPC part path\n * @returns the corresponding .rels file path\n */\nexport function getRelsPath(file: string): string {\n\tconst n = file.lastIndexOf(\"/\");\n\treturn file.slice(0, n + 1) + \"_rels/\" + file.slice(n + 1) + \".rels\";\n}\n\n/**\n * Parse a .rels XML file into a Relationships object.\n * Each Relationship element is stored both by its resolved target path\n * and by its rId in the \"!id\" lookup table.\n * @param data - raw XML string of the .rels file (may be null/undefined)\n * @param currentFilePath - the path of the file that owns this .rels (used for path resolution)\n * @returns the parsed Relationships object\n */\nexport function parseRelationships(\n\tdata: string | null | undefined,\n\tcurrentFilePath: string,\n\topts?: XmlLimitOptions,\n): Relationships {\n\tconst rels = { \"!id\": {} } as any as Relationships;\n\tif (!data) {\n\t\treturn rels;\n\t}\n\t// Ensure the path starts with \"/\" for consistent resolution\n\tif (currentFilePath.charAt(0) !== \"/\") {\n\t\tcurrentFilePath = \"/\" + currentFilePath;\n\t}\n\n\tconst matches = data.match(XML_TAG_REGEX) || [];\n\tfor (const x of matches) {\n\t\tconst y = parseXmlTag(x, undefined, undefined, opts);\n\t\tif (y[0] === \"<Relationship\") {\n\t\t\tconst rel: RelEntry = {\n\t\t\t\tType: y.Type,\n\t\t\t\tTarget: unescapeXml(y.Target),\n\t\t\t\tId: y.Id,\n\t\t\t};\n\t\t\tif (y.TargetMode) {\n\t\t\t\trel.TargetMode = y.TargetMode;\n\t\t\t}\n\t\t\t// External targets (e.g., hyperlinks) are stored as-is; internal targets are resolved\n\t\t\tconst canonictarget = y.TargetMode === \"External\" ? y.Target : resolve_path(y.Target, currentFilePath);\n\t\t\t(rels as any)[canonictarget] = rel;\n\t\t\trels[\"!id\"][y.Id] = rel;\n\t\t}\n\t}\n\treturn rels;\n}\n\n/**\n * Serialize a Relationships object back to .rels XML format.\n * @param rels - the Relationships object to serialize\n * @returns the complete XML string for the .rels file\n */\nexport function writeRelationships(rels: Relationships): string {\n\tconst o: string[] = [\n\t\tXML_HEADER,\n\t\twriteXmlElement(\"Relationships\", null, {\n\t\t\txmlns: XMLNS.RELS,\n\t\t}),\n\t];\n\tfor (const rid of Object.keys(rels[\"!id\"])) {\n\t\to.push(writeXmlElement(\"Relationship\", null, rels[\"!id\"][rid] as any));\n\t}\n\t// Only close the root element if child elements were added\n\tif (o.length > 2) {\n\t\to.push(\"</Relationships>\");\n\t\t// Convert the self-closing root tag to an opening tag\n\t\to[1] = o[1].replace(\"/>\", \">\");\n\t}\n\treturn o.join(\"\");\n}\n\n/**\n * Add a new relationship entry to a Relationships object.\n * If rId is negative, automatically finds the next available rId.\n * Hyperlink-type relationships default to TargetMode=\"External\".\n * @param rels - the Relationships object to modify\n * @param rId - the numeric relationship ID to use, or negative to auto-assign\n * @param f - the target path for the relationship\n * @param type - the relationship type URI\n * @param targetmode - optional TargetMode (\"External\" for hyperlinks, etc.)\n * @returns the numeric rId that was assigned\n * @throws XlsxError if the specified rId is already in use\n */\nexport function addRelationship(\n\trels: Relationships,\n\trId: number,\n\tf: string,\n\ttype: string,\n\ttargetmode?: string,\n): number {\n\tif (!rels[\"!id\"]) {\n\t\t(rels as any)[\"!id\"] = {};\n\t}\n\tif (!(rels as any)[\"!idx\"]) {\n\t\t(rels as any)[\"!idx\"] = 1;\n\t}\n\t// Auto-assign: scan forward from the last used index to find a free slot\n\tif (rId < 0) {\n\t\tfor (rId = (rels as any)[\"!idx\"]; rels[\"!id\"][\"rId\" + rId]; ++rId) {\n\t\t\t/* find next free rId */\n\t\t}\n\t}\n\t(rels as any)[\"!idx\"] = rId + 1;\n\tconst relobj: RelEntry = {\n\t\tId: \"rId\" + rId,\n\t\tType: type,\n\t\tTarget: f,\n\t};\n\tif (targetmode) {\n\t\trelobj.TargetMode = targetmode;\n\t} else if ([RELS.HLINK].indexOf(type) > -1) {\n\t\t// Hyperlinks are always external by default\n\t\trelobj.TargetMode = \"External\";\n\t}\n\tif (rels[\"!id\"][relobj.Id]) {\n\t\tthrow new XlsxError(\"DUPLICATE\", \"Cannot rewrite rId \" + rId);\n\t}\n\trels[\"!id\"][relobj.Id] = relobj;\n\t// Store by normalized target path (ensure single leading slash)\n\t(rels as any)[(\"/\" + relobj.Target).replace(\"//\", \"/\")] = relobj;\n\treturn rId;\n}\n","import type { FullProperties } from \"../types.js\";\nimport { XML_HEADER } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml } from \"../xml/escape.js\";\nimport { writeXmlTag, writeXmlElement, writeW3cDatetime } from \"../xml/writer.js\";\nimport { XMLNS } from \"../xml/namespaces.js\";\n\n/**\n * Mapping of OPC core property XML tag names to their FullProperties keys.\n * Each entry is [xmlTagName, propertyKey, optionalType].\n * When the optional type is \"date\", the parsed value is converted to a Date object.\n */\nconst CORE_PROPS: [string, string, string?][] = [\n\t[\"cp:category\", \"Category\"],\n\t[\"cp:contentStatus\", \"ContentStatus\"],\n\t[\"cp:keywords\", \"Keywords\"],\n\t[\"cp:lastModifiedBy\", \"LastAuthor\"],\n\t[\"cp:lastPrinted\", \"LastPrinted\"],\n\t[\"cp:revision\", \"Revision\"],\n\t[\"cp:version\", \"Version\"],\n\t[\"dc:creator\", \"Author\"],\n\t[\"dc:description\", \"Comments\"],\n\t[\"dc:identifier\", \"Identifier\"],\n\t[\"dc:language\", \"Language\"],\n\t[\"dc:subject\", \"Subject\"],\n\t[\"dc:title\", \"Title\"],\n\t[\"dcterms:created\", \"CreatedDate\", \"date\"],\n\t[\"dcterms:modified\", \"ModifiedDate\", \"date\"],\n];\n\n/**\n * Extract text content between an XML open/close tag pair using simple string search.\n * Does not handle nested tags of the same name -- sufficient for flat OPC property elements.\n * @param data - the XML string to search\n * @param tag - the fully-qualified tag name (e.g., \"dc:title\")\n * @returns the text content between the tags, or null if not found\n */\nfunction xml_extract(data: string, tag: string): string | null {\n\tconst open = \"<\" + tag;\n\tconst close = \"</\" + tag + \">\";\n\tconst openTagIdx = data.indexOf(open);\n\tif (openTagIdx === -1) {\n\t\treturn null;\n\t}\n\t// Find the end of the opening tag (handles tags with attributes)\n\tconst closeAngleIdx = data.indexOf(\">\", openTagIdx);\n\tif (closeAngleIdx === -1) {\n\t\treturn null;\n\t}\n\tconst closeTagIdx = data.indexOf(close, closeAngleIdx);\n\tif (closeTagIdx === -1) {\n\t\treturn null;\n\t}\n\treturn data.slice(closeAngleIdx + 1, closeTagIdx);\n}\n\n/**\n * Parse OPC core properties XML (dc:title, dc:creator, dcterms:created, etc.)\n * into a partial FullProperties object.\n * @param data - raw XML string of the core properties part\n * @returns parsed property values\n */\nexport function parseCoreProperties(data: string): Partial<FullProperties> {\n\tconst p: Record<string, any> = {};\n\n\tfor (const propDef of CORE_PROPS) {\n\t\tconst content = xml_extract(data, propDef[0]);\n\t\tif (content != null && content.length > 0) {\n\t\t\tp[propDef[1]] = unescapeXml(content);\n\t\t}\n\t\t// Convert date-typed properties from string to Date objects\n\t\tif (propDef[2] === \"date\" && p[propDef[1]]) {\n\t\t\tp[propDef[1]] = new Date(p[propDef[1]]);\n\t\t}\n\t}\n\n\treturn p as Partial<FullProperties>;\n}\n\n/**\n * Write a single property field to the output lines array, avoiding duplicates.\n * @param tagName - the XML tag name (e.g., \"dc:title\")\n * @param value - the text value to write (null/undefined/empty are skipped)\n * @param attributes - optional attributes for the element (e.g., xsi:type for dates)\n * @param lines - output array to append the XML element to\n * @param written - tracks already-written tags to prevent duplicate entries\n */\nfunction writePropertyField(\n\ttagName: string,\n\tvalue: string | null | undefined,\n\tattributes: Record<string, string> | null,\n\tlines: string[],\n\twritten: Record<string, any>,\n): void {\n\tif (written[tagName] != null || value == null || value === \"\") {\n\t\treturn;\n\t}\n\twritten[tagName] = value;\n\tvalue = escapeXml(value);\n\tlines.push(attributes ? writeXmlElement(tagName, value, attributes) : writeXmlTag(tagName, value));\n}\n\n/**\n * Serialize OPC core properties to XML.\n * Produces the cp:coreProperties element with Dublin Core metadata fields.\n * @param cp - the properties to serialize (may be undefined)\n * @param opts - optional settings: WTF enables strict date errors, Props provides overrides\n * @returns the complete XML string for the core properties part\n */\nexport function writeCoreProperties(\n\tcp: Partial<FullProperties> | undefined,\n\topts?: { WTF?: boolean; Props?: Record<string, any> },\n): string {\n\tconst lines: string[] = [\n\t\tXML_HEADER,\n\t\twriteXmlElement(\"cp:coreProperties\", null, {\n\t\t\t\"xmlns:cp\": XMLNS.CORE_PROPS,\n\t\t\t\"xmlns:dc\": XMLNS.dc,\n\t\t\t\"xmlns:dcterms\": XMLNS.dcterms,\n\t\t\t\"xmlns:dcmitype\": XMLNS.dcmitype,\n\t\t\t\"xmlns:xsi\": XMLNS.xsi,\n\t\t}),\n\t];\n\tconst written: Record<string, any> = {};\n\tif (!cp && !opts?.Props) {\n\t\treturn lines.join(\"\");\n\t}\n\n\t// Date fields require special handling: they need xsi:type attribute\n\tif (cp) {\n\t\tif (cp.CreatedDate != null) {\n\t\t\twritePropertyField(\n\t\t\t\t\"dcterms:created\",\n\t\t\t\ttypeof cp.CreatedDate === \"string\" ? cp.CreatedDate : writeW3cDatetime(cp.CreatedDate, opts?.WTF),\n\t\t\t\t{ \"xsi:type\": \"dcterms:W3CDTF\" },\n\t\t\t\tlines,\n\t\t\t\twritten,\n\t\t\t);\n\t\t}\n\t\tif (cp.ModifiedDate != null) {\n\t\t\twritePropertyField(\n\t\t\t\t\"dcterms:modified\",\n\t\t\t\ttypeof cp.ModifiedDate === \"string\" ? cp.ModifiedDate : writeW3cDatetime(cp.ModifiedDate, opts?.WTF),\n\t\t\t\t{ \"xsi:type\": \"dcterms:W3CDTF\" },\n\t\t\t\tlines,\n\t\t\t\twritten,\n\t\t\t);\n\t\t}\n\t}\n\n\t// Write remaining properties, with opts.Props taking priority over cp values\n\tfor (const propDef of CORE_PROPS) {\n\t\tlet propValue: any =\n\t\t\topts?.Props?.[propDef[1]] != null ? opts.Props[propDef[1]] : cp ? (cp as any)[propDef[1]] : null;\n\t\t// Coerce booleans and numbers to strings for XML serialization\n\t\tif (propValue === true) {\n\t\t\tpropValue = \"1\";\n\t\t} else if (propValue === false) {\n\t\t\tpropValue = \"0\";\n\t\t} else if (typeof propValue === \"number\") {\n\t\t\tpropValue = String(propValue);\n\t\t}\n\t\tif (propValue != null) {\n\t\t\twritePropertyField(propDef[0], propValue, null, lines, written);\n\t\t}\n\t}\n\t// Only close the root element if child elements were added\n\tif (lines.length > 2) {\n\t\tlines.push(\"</cp:coreProperties>\");\n\t\t// Convert the self-closing root tag to an opening tag\n\t\tlines[1] = lines[1].replace(\"/>\", \">\");\n\t}\n\treturn lines.join(\"\");\n}\n","import type { FullProperties } from \"../types.js\";\nimport { XML_HEADER } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml } from \"../xml/escape.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS } from \"../xml/namespaces.js\";\n\n/**\n * Mapping of extended property XML element names to FullProperties keys and value types.\n * Each entry is [xmlElementName, propertyKey, valueType].\n */\nconst EXT_PROPS: [string, string, string][] = [\n\t[\"Application\", \"Application\", \"string\"],\n\t[\"AppVersion\", \"AppVersion\", \"string\"],\n\t[\"Company\", \"Company\", \"string\"],\n\t[\"DocSecurity\", \"DocSecurity\", \"string\"],\n\t[\"Manager\", \"Manager\", \"string\"],\n\t[\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n\t[\"SharedDoc\", \"SharedDoc\", \"bool\"],\n\t[\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n\t[\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n];\n\n/**\n * Extract text content from an XML tag, allowing for optional namespace prefixes.\n * Builds a regex that matches both `<tag>` and `<ns:tag>` forms.\n * @param data - the XML string to search\n * @param tag - the local element name (without namespace prefix)\n * @returns the text content, or null if not found\n */\nfunction xml_extract_ns(data: string, tag: string): string | null {\n\tconst re = new RegExp(\"<(?:\\\\w+:)?\" + tag + \"[\\\\s>]([\\\\s\\\\S]*?)<\\\\/(?:\\\\w+:)?\" + tag + \">\");\n\tconst m = data.match(re);\n\treturn m ? m[1] : null;\n}\n\n/**\n * Parse OPC extended properties XML (Application, AppVersion, HeadingPairs, etc.)\n * into a partial FullProperties object.\n * @param data - raw XML string of the extended properties part\n * @param props - optional existing properties object to merge into\n * @returns the populated properties object\n */\nexport function parseExtendedProperties(data: string, props?: Partial<FullProperties>): Partial<FullProperties> {\n\tif (!props) {\n\t\tprops = {};\n\t}\n\n\tfor (const propDef of EXT_PROPS) {\n\t\tconst xml = xml_extract_ns(data, propDef[0]);\n\t\tswitch (propDef[2]) {\n\t\t\tcase \"string\":\n\t\t\t\tif (xml) {\n\t\t\t\t\t(props as any)[propDef[1]] = unescapeXml(xml);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"bool\":\n\t\t\t\t(props as any)[propDef[1]] = xml === \"true\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Parse HeadingPairs + TitlesOfParts to extract sheet names and count.\n\t// HeadingPairs contains category labels and counts (e.g., \"Worksheets\" -> 3),\n\t// TitlesOfParts contains all part titles in order.\n\tconst hpMatch = data.match(/<HeadingPairs>([\\s\\S]*?)<\\/HeadingPairs>/);\n\tconst topMatch = data.match(/<TitlesOfParts>([\\s\\S]*?)<\\/TitlesOfParts>/);\n\tif (hpMatch && topMatch) {\n\t\tconst lpstrs = topMatch[1].match(/<vt:lpstr>([\\s\\S]*?)<\\/vt:lpstr>/g);\n\t\tif (lpstrs) {\n\t\t\tconst parts = lpstrs.map((lpstr) => {\n\t\t\t\tconst match = lpstr.match(/<vt:lpstr>([\\s\\S]*?)<\\/vt:lpstr>/);\n\t\t\t\treturn match ? unescapeXml(match[1]) : \"\";\n\t\t\t});\n\t\t\t// The i4 value in HeadingPairs tells us how many of the parts are worksheets\n\t\t\tconst i4match = hpMatch[1].match(/<vt:i4>(\\d+)<\\/vt:i4>/);\n\t\t\tif (i4match) {\n\t\t\t\t(props as any).Worksheets = parseInt(i4match[1], 10);\n\t\t\t\t(props as any).SheetNames = parts.slice(0, (props as any).Worksheets);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn props;\n}\n\n/**\n * Serialize OPC extended properties to XML.\n * Produces the Properties element with application metadata and sheet information.\n * @param cp - record of property values (may be undefined; defaults are applied)\n * @returns the complete XML string for the extended properties part\n */\nexport function writeExtendedProperties(cp: Record<string, any> | undefined): string {\n\tconst lines: string[] = [];\n\tconst writeElement = writeXmlElement;\n\tif (!cp) {\n\t\tcp = {};\n\t}\n\tcp.Application = \"xlsx-format\";\n\n\tlines.push(XML_HEADER);\n\tlines.push(\n\t\twriteXmlElement(\"Properties\", null, {\n\t\t\txmlns: XMLNS.EXT_PROPS,\n\t\t\t\"xmlns:vt\": XMLNS.vt,\n\t\t}),\n\t);\n\n\t// Write simple scalar properties (strings and booleans)\n\tfor (const propDef of EXT_PROPS) {\n\t\tif (cp[propDef[1]] === undefined) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet propValue: string | undefined;\n\t\tswitch (propDef[2]) {\n\t\t\tcase \"string\":\n\t\t\t\tpropValue = escapeXml(String(cp[propDef[1]]));\n\t\t\t\tbreak;\n\t\t\tcase \"bool\":\n\t\t\t\tpropValue = cp[propDef[1]] ? \"true\" : \"false\";\n\t\t\t\tbreak;\n\t\t}\n\t\tif (propValue !== undefined) {\n\t\t\tlines.push(writeElement(propDef[0], propValue));\n\t\t}\n\t}\n\n\t// HeadingPairs: a vt:vector of variant pairs (label, count) describing part categories.\n\t// For spreadsheets this is always [\"Worksheets\", <count>].\n\tlines.push(\n\t\twriteElement(\n\t\t\t\"HeadingPairs\",\n\t\t\twriteElement(\n\t\t\t\t\"vt:vector\",\n\t\t\t\twriteElement(\"vt:variant\", \"<vt:lpstr>Worksheets</vt:lpstr>\") +\n\t\t\t\t\twriteElement(\"vt:variant\", writeElement(\"vt:i4\", String(cp.Worksheets))),\n\t\t\t\t{ size: \"2\", baseType: \"variant\" },\n\t\t\t),\n\t\t),\n\t);\n\n\t// TitlesOfParts: a vt:vector listing all sheet names as vt:lpstr elements\n\tlines.push(\n\t\twriteElement(\n\t\t\t\"TitlesOfParts\",\n\t\t\twriteElement(\n\t\t\t\t\"vt:vector\",\n\t\t\t\t(cp.SheetNames as string[])\n\t\t\t\t\t.map((sheetName: string) => \"<vt:lpstr>\" + escapeXml(sheetName) + \"</vt:lpstr>\")\n\t\t\t\t\t.join(\"\"),\n\t\t\t\t{ size: String(cp.Worksheets), baseType: \"lpstr\" },\n\t\t\t),\n\t\t),\n\t);\n\n\t// Only close the root element if child elements were added\n\tif (lines.length > 2) {\n\t\tlines.push(\"</Properties>\");\n\t\t// Convert the self-closing root tag to an opening tag\n\t\tlines[1] = lines[1].replace(\"/>\", \">\");\n\t}\n\treturn lines.join(\"\");\n}\n","import { XML_HEADER, parseXmlTag, parseXmlBoolean, stripNamespace } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml } from \"../xml/escape.js\";\nimport { writeXmlElement, writeVariantType } from \"../xml/writer.js\";\nimport { XMLNS } from \"../xml/namespaces.js\";\n\n// Matches sequences of: an XML tag followed by optional non-tag text content\nconst custregex = /<[^<>]+>[^<]*/g;\n\n/**\n * Parse OPC custom properties XML into a key-value record.\n * Custom properties are user-defined metadata stored as typed vt: variant elements\n * (strings, booleans, integers, floats, dates, etc.).\n * @param data - raw XML string of the custom properties part\n * @param opts - optional settings: WTF enables console warnings for unknown types\n * @returns a record mapping property names to their parsed values\n */\nexport function parseCustomProperties(data: string, opts?: { WTF?: boolean }): Record<string, any> {\n\tconst p: Record<string, any> = {};\n\tlet name = \"\";\n\tconst matches = data.match(custregex);\n\tif (matches) {\n\t\tfor (let i = 0; i < matches.length; ++i) {\n\t\t\tconst tagStr = matches[i];\n\t\t\tconst parsedTag = parseXmlTag(tagStr);\n\t\t\tswitch (stripNamespace(parsedTag[0])) {\n\t\t\t\tcase \"<?xml\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<Properties\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<property\":\n\t\t\t\t\tname = unescapeXml(parsedTag.name);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</property>\":\n\t\t\t\t\tname = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif (tagStr.indexOf(\"<vt:\") === 0) {\n\t\t\t\t\t\t// Parse the vt: (variant type) element: split on \">\" to get type and text\n\t\t\t\t\t\tconst tokens = tagStr.split(\">\");\n\t\t\t\t\t\tconst type = tokens[0].slice(4); // strip \"<vt:\" prefix\n\t\t\t\t\t\tconst text = tokens[1];\n\t\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\t\t// String types\n\t\t\t\t\t\t\tcase \"lpstr\":\n\t\t\t\t\t\t\tcase \"bstr\":\n\t\t\t\t\t\t\tcase \"lpwstr\":\n\t\t\t\t\t\t\t\tp[name] = unescapeXml(text);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase \"bool\":\n\t\t\t\t\t\t\t\tp[name] = parseXmlBoolean(text);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t// Integer types (various widths)\n\t\t\t\t\t\t\tcase \"i1\":\n\t\t\t\t\t\t\tcase \"i2\":\n\t\t\t\t\t\t\tcase \"i4\":\n\t\t\t\t\t\t\tcase \"i8\":\n\t\t\t\t\t\t\tcase \"int\":\n\t\t\t\t\t\t\tcase \"uint\":\n\t\t\t\t\t\t\t\tp[name] = parseInt(text, 10);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t// Floating-point types\n\t\t\t\t\t\t\tcase \"r4\":\n\t\t\t\t\t\t\tcase \"r8\":\n\t\t\t\t\t\t\tcase \"decimal\":\n\t\t\t\t\t\t\t\tp[name] = parseFloat(text);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t// Date/time types\n\t\t\t\t\t\t\tcase \"filetime\":\n\t\t\t\t\t\t\tcase \"date\":\n\t\t\t\t\t\t\t\tp[name] = new Date(text);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t// Passthrough types (kept as strings)\n\t\t\t\t\t\t\tcase \"cy\":\n\t\t\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\t\t\tp[name] = unescapeXml(text);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t// Self-closing tags (e.g., <vt:empty/>) end with \"/\"\n\t\t\t\t\t\t\t\tif (type.slice(-1) === \"/\") {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (opts?.WTF && typeof console !== \"undefined\") {\n\t\t\t\t\t\t\t\t\tconsole.warn(\"Unexpected\", tagStr, type, tokens);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn p;\n}\n\n/**\n * Serialize custom properties to OPC custom properties XML.\n * Each property is wrapped in a `<property>` element with a unique pid (property ID)\n * and the well-known fmtid GUID for custom properties.\n * @param cp - record of property name-value pairs (may be undefined)\n * @returns the complete XML string for the custom properties part\n */\nexport function writeCustomProperties(cp: Record<string, any> | undefined): string {\n\tconst lines: string[] = [\n\t\tXML_HEADER,\n\t\twriteXmlElement(\"Properties\", null, {\n\t\t\txmlns: XMLNS.CUST_PROPS,\n\t\t\t\"xmlns:vt\": XMLNS.vt,\n\t\t}),\n\t];\n\tif (!cp) {\n\t\treturn lines.join(\"\");\n\t}\n\t// Property IDs (pid) start at 2 per the OPC specification (pid=1 is reserved)\n\tlet pid = 1;\n\tfor (const propName of Object.keys(cp)) {\n\t\t++pid;\n\t\tlines.push(\n\t\t\twriteXmlElement(\"property\", writeVariantType(cp[propName], true), {\n\t\t\t\tfmtid: \"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}\", // Standard GUID for custom property sets\n\t\t\t\tpid: String(pid),\n\t\t\t\tname: escapeXml(propName),\n\t\t\t}),\n\t\t);\n\t}\n\t// Only close the root element if child elements were added\n\tif (lines.length > 2) {\n\t\tlines.push(\"</Properties>\");\n\t\t// Convert the self-closing root tag to an opening tag\n\t\tlines[1] = lines[1].replace(\"/>\", \">\");\n\t}\n\treturn lines.join(\"\");\n}\n","import { XlsxError } from \"../errors.js\";\nimport { parseXmlTag, XML_TAG_REGEX, XML_HEADER } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml, escapeHtml } from \"../xml/escape.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS_main } from \"../xml/namespaces.js\";\nimport type { XmlLimitOptions } from \"../xml/limits.js\";\nimport {\n\tassertXmlCountWithinLimit,\n\tassertXmlPartLimits,\n\tDEFAULT_MAX_SHARED_STRING_ITEMS,\n\txmlOptionLimit,\n} from \"../xml/limits.js\";\n\ntype SstParseOptions = XmlLimitOptions & { cellHTML?: boolean };\n\n/** A single string entry from the shared string table */\nexport interface XLString {\n\t/** Plain text content */\n\tt: string;\n\t/** Raw rich-text XML */\n\tr?: string;\n\t/** HTML representation */\n\th?: string;\n\t/** Style/font properties for rich text */\n\ts?: any;\n}\n\n/** Shared String Table - an array of XLString entries with total/unique counts */\nexport interface SST extends Array<XLString> {\n\tCount?: number;\n\tUnique?: number;\n}\n\n/** Parse rich-text run properties (<rPr>) into a font descriptor object */\nfunction parseRunProperties(rpr: string, opts?: SstParseOptions): Record<string, any> {\n\tconst font: Record<string, any> = {};\n\tconst matches = rpr.match(XML_TAG_REGEX);\n\tlet pass = false;\n\tif (matches) {\n\t\tfor (let i = 0; i < matches.length; ++i) {\n\t\t\tconst parsedTag = parseXmlTag(matches[i], undefined, undefined, opts);\n\t\t\tswitch ((parsedTag[0] as string).replace(/<\\w*:/g, \"<\")) {\n\t\t\t\tcase \"<condense\":\n\t\t\t\tcase \"<extend\":\n\t\t\t\t\tbreak;\n\t\t\t\t// Note: intentional fall-through from <shadow with no val to <shadow/>\n\t\t\t\tcase \"<shadow\":\n\t\t\t\t\tif (!parsedTag.val) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase \"<shadow>\":\n\t\t\t\tcase \"<shadow/>\":\n\t\t\t\t\tfont.shadow = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</shadow>\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<rFont\":\n\t\t\t\t\tfont.name = parsedTag.val;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<sz\":\n\t\t\t\t\tfont.sz = parsedTag.val;\n\t\t\t\t\tbreak;\n\t\t\t\t// Note: intentional fall-through from <strike with no val to <strike/>\n\t\t\t\tcase \"<strike\":\n\t\t\t\t\tif (!parsedTag.val) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase \"<strike>\":\n\t\t\t\tcase \"<strike/>\":\n\t\t\t\t\tfont.strike = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</strike>\":\n\t\t\t\t\tbreak;\n\t\t\t\t// Underline: various styles (double, singleAccounting, doubleAccounting)\n\t\t\t\tcase \"<u\":\n\t\t\t\t\tif (!parsedTag.val) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (parsedTag.val) {\n\t\t\t\t\t\tcase \"double\":\n\t\t\t\t\t\t\tfont.uval = \"double\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"singleAccounting\":\n\t\t\t\t\t\t\tfont.uval = \"single-accounting\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"doubleAccounting\":\n\t\t\t\t\t\t\tfont.uval = \"double-accounting\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t// Intentional fall-through: set underline flag\n\t\t\t\tcase \"<u>\":\n\t\t\t\tcase \"<u/>\":\n\t\t\t\t\tfont.u = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</u>\":\n\t\t\t\t\tbreak;\n\t\t\t\t// Bold: val=\"0\" means explicitly not bold\n\t\t\t\tcase \"<b\":\n\t\t\t\t\tif (parsedTag.val === \"0\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase \"<b>\":\n\t\t\t\tcase \"<b/>\":\n\t\t\t\t\tfont.b = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</b>\":\n\t\t\t\t\tbreak;\n\t\t\t\t// Italic: val=\"0\" means explicitly not italic\n\t\t\t\tcase \"<i\":\n\t\t\t\t\tif (parsedTag.val === \"0\") {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase \"<i>\":\n\t\t\t\tcase \"<i/>\":\n\t\t\t\t\tfont.i = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</i>\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<color\":\n\t\t\t\t\tif (parsedTag.rgb) {\n\t\t\t\t\t\t// Strip the alpha channel prefix (first 2 hex chars) from ARGB\n\t\t\t\t\t\tfont.color = parsedTag.rgb.slice(2, 8);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<color>\":\n\t\t\t\tcase \"<color/>\":\n\t\t\t\tcase \"</color>\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<family\":\n\t\t\t\t\tfont.family = parsedTag.val;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<vertAlign\":\n\t\t\t\t\tfont.valign = parsedTag.val;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<scheme\":\n\t\t\t\t\tbreak;\n\t\t\t\t// Skip extension lists\n\t\t\t\tcase \"<extLst\":\n\t\t\t\tcase \"<extLst>\":\n\t\t\t\tcase \"</extLst>\":\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<ext\":\n\t\t\t\t\tpass = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</ext>\":\n\t\t\t\t\tpass = false;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t// charCodeAt(1) !== 47 means it's not a closing tag (not '/')\n\t\t\t\t\tif ((parsedTag[0] as string).charCodeAt(1) !== 47 && !pass) {\n\t\t\t\t\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unrecognized rich format \" + parsedTag[0]);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn font;\n}\n\n/** Regex to match opening <r> tags (rich-text run boundaries) */\nconst rregex = /<(?:\\w+:)?r>/g;\n/** Regex to match closing </r> tags */\nconst rend = /<\\/(?:\\w+:)?r>/;\n\n/**\n * Find the first occurrence of a namespace-agnostic XML tag and return its\n * full outer content and inner content as a tuple.\n */\nfunction str_match_xml_ns_local(str: string, tag: string): [string, string] | null {\n\tconst re = new RegExp(\"<(?:\\\\w+:)?\" + tag + \"\\\\b[^<>]*>\", \"g\");\n\tconst reEnd = new RegExp(\"<\\\\/(?:\\\\w+:)?\" + tag + \">\", \"g\");\n\tconst openMatch = re.exec(str);\n\tif (!openMatch) {\n\t\treturn null;\n\t}\n\tconst startIdx = openMatch.index;\n\tconst contentStart = re.lastIndex;\n\treEnd.lastIndex = re.lastIndex;\n\tconst closeMatch = reEnd.exec(str);\n\tif (!closeMatch) {\n\t\treturn null;\n\t}\n\tconst endIdx = closeMatch.index;\n\tconst contentEnd = reEnd.lastIndex;\n\t// [0] = full outer XML (open tag through close tag), [1] = inner content only\n\treturn [str.slice(startIdx, contentEnd), str.slice(contentStart, endIdx)];\n}\n\n/**\n * Remove all occurrences of a namespace-agnostic XML element (including content)\n * from the string. Used to strip <rPh> (phonetic run) elements.\n */\nfunction str_remove_xml_ns_g_local(str: string, tag: string): string {\n\tconst re = new RegExp(\"<(?:\\\\w+:)?\" + tag + \"\\\\b[^<>]*>\", \"g\");\n\tconst reEnd = new RegExp(\"<\\\\/(?:\\\\w+:)?\" + tag + \">\", \"g\");\n\tconst out: string[] = [];\n\tlet lastEnd = 0;\n\tlet openMatch;\n\twhile ((openMatch = re.exec(str))) {\n\t\tout.push(str.slice(lastEnd, openMatch.index));\n\t\treEnd.lastIndex = re.lastIndex;\n\t\tconst closeMatch = reEnd.exec(str);\n\t\tif (!closeMatch) {\n\t\t\tbreak;\n\t\t}\n\t\tlastEnd = reEnd.lastIndex;\n\t\tre.lastIndex = reEnd.lastIndex;\n\t}\n\tout.push(str.slice(lastEnd));\n\treturn out.join(\"\");\n}\n\n/** Parse a single rich-text run (<r>) element, extracting text and optional style */\nfunction parseRichTextRun(r: string, opts?: SstParseOptions): { t: string; v: string; s?: any } {\n\tconst textMatch = str_match_xml_ns_local(r, \"t\");\n\tif (!textMatch) {\n\t\treturn { t: \"s\", v: \"\" };\n\t}\n\tconst runObj: any = { t: \"s\", v: unescapeXml(textMatch[1]) };\n\t// Parse run properties (font/style) if present\n\tconst rpr = str_match_xml_ns_local(r, \"rPr\");\n\tif (rpr) {\n\t\trunObj.s = parseRunProperties(rpr[1], opts);\n\t}\n\treturn runObj;\n}\n\n/** Split rich-text XML into individual runs and parse each one */\nfunction parseRichTextRuns(rs: string, opts?: SstParseOptions): { t: string; v: string; s?: any }[] {\n\treturn rs\n\t\t.replace(rregex, \"\")\n\t\t.split(rend)\n\t\t.map((r) => parseRichTextRun(r, opts))\n\t\t.filter((r) => r.v);\n}\n\n/** Convert an array of parsed rich-text runs into an HTML string */\nfunction richTextToHtml(rs: { t: string; v: string; s?: any }[]): string {\n\treturn rs\n\t\t.map((r) => {\n\t\t\tif (!r.v) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tconst intro: string[] = [];\n\t\t\tconst outro: string[] = [];\n\t\t\tif (r.s) {\n\t\t\t\tconst font = r.s;\n\t\t\t\tconst style: string[] = [];\n\t\t\t\tif (font.u) {\n\t\t\t\t\tstyle.push(\"text-decoration: underline;\");\n\t\t\t\t}\n\t\t\t\tif (font.uval) {\n\t\t\t\t\tstyle.push(\"text-underline-style:\" + font.uval + \";\");\n\t\t\t\t}\n\t\t\t\tconst fontSize = Number(font.sz);\n\t\t\t\tif (Number.isFinite(fontSize) && fontSize > 0) {\n\t\t\t\t\tstyle.push(\"font-size:\" + fontSize + \"pt;\");\n\t\t\t\t}\n\t\t\t\tif (font.outline) {\n\t\t\t\t\tstyle.push(\"text-effect: outline;\");\n\t\t\t\t}\n\t\t\t\tif (font.shadow) {\n\t\t\t\t\tstyle.push(\"text-shadow: auto;\");\n\t\t\t\t}\n\t\t\t\tintro.push('<span style=\"' + style.join(\"\") + '\">');\n\t\t\t\tif (font.b) {\n\t\t\t\t\tintro.push(\"<b>\");\n\t\t\t\t\toutro.unshift(\"</b>\");\n\t\t\t\t}\n\t\t\t\tif (font.i) {\n\t\t\t\t\tintro.push(\"<i>\");\n\t\t\t\t\toutro.unshift(\"</i>\");\n\t\t\t\t}\n\t\t\t\tif (font.strike) {\n\t\t\t\t\tintro.push(\"<s>\");\n\t\t\t\t\toutro.unshift(\"</s>\");\n\t\t\t\t}\n\t\t\t\t// Map OOXML vertical alignment names to HTML elements\n\t\t\t\tlet align = \"\";\n\t\t\t\tif (font.valign === \"superscript\" || font.valign === \"super\") {\n\t\t\t\t\talign = \"sup\";\n\t\t\t\t} else if (font.valign === \"subscript\") {\n\t\t\t\t\talign = \"sub\";\n\t\t\t\t}\n\t\t\t\tif (align) {\n\t\t\t\t\tintro.push(\"<\" + align + \">\");\n\t\t\t\t\toutro.unshift(\"</\" + align + \">\");\n\t\t\t\t}\n\t\t\t\toutro.push(\"</span>\");\n\t\t\t}\n\t\t\treturn intro.join(\"\") + escapeHtml(r.v) + outro.join(\"\");\n\t\t})\n\t\t.join(\"\");\n}\n\n/** Regex to extract text from <t> elements */\nconst sitregex = /<(?:\\w+:)?t\\b[^<>]*>([^<]*)<\\/(?:\\w+:)?t>/g;\n/** Regex to detect if a string item contains rich-text runs (<r>) */\nconst sirregex = /<(?:\\w+:)?r\\b[^<>]*>/;\n\nconst richTextMainElements = new Set([\n\t\"r\",\n\t\"rPr\",\n\t\"t\",\n\t\"rPh\",\n\t\"phoneticPr\",\n\t\"condense\",\n\t\"extend\",\n\t\"shadow\",\n\t\"rFont\",\n\t\"sz\",\n\t\"strike\",\n\t\"u\",\n\t\"b\",\n\t\"i\",\n\t\"color\",\n\t\"family\",\n\t\"vertAlign\",\n\t\"scheme\",\n\t\"extLst\",\n\t\"ext\",\n]);\n\n/** Remove prefixes from known SpreadsheetML rich-text elements before moving a fragment to a new XML part. */\nexport function normalizeRichTextXml(x: string): string {\n\treturn x.replace(/<(\\/?)\\w+:([\\w.-]+)(?=[\\s/>])/g, (tag, closing: string, localName: string) =>\n\t\trichTextMainElements.has(localName) ? \"<\" + closing + localName : tag,\n\t);\n}\n\n/**\n * Parse a single string item (<si>) from the shared string table.\n * Handles both plain text (<t>) and rich text (<r>) formats.\n */\nexport function parseStringItem(x: string, opts?: SstParseOptions): XLString {\n\tconst html = opts ? opts.cellHTML !== false : true;\n\tconst result: any = {};\n\tif (!x) {\n\t\treturn { t: \"\" };\n\t}\n\n\tif (x.match(/^\\s*<(?:\\w+:)?t[^>]*>/)) {\n\t\t// Plain text: extract content between <t> and </t>\n\t\tresult.t = unescapeXml(x.slice(x.indexOf(\">\") + 1).split(/<\\/(?:\\w+:)?t>/)[0] || \"\", true);\n\t\tresult.r = x;\n\t\tif (html) {\n\t\t\tresult.h = escapeHtml(result.t);\n\t\t}\n\t} else if (x.match(sirregex)) {\n\t\t// Rich text: concatenate text from all runs\n\t\tresult.r = x;\n\t\t// Strip phonetic run (<rPh>) elements before extracting text\n\t\tconst stripped = str_remove_xml_ns_g_local(x, \"rPh\");\n\t\tsitregex.lastIndex = 0;\n\t\tconst matches = stripped.match(sitregex) || [];\n\t\t// Join all <t> content and strip tags to get plain text\n\t\tresult.t = unescapeXml(matches.join(\"\").replace(XML_TAG_REGEX, \"\"), true);\n\t\tif (html) {\n\t\t\tresult.h = richTextToHtml(parseRichTextRuns(stripped, opts));\n\t\t}\n\t}\n\treturn result;\n}\n\n/** Regex to extract complete <si> or <sstItem> elements, including self-closing entries. */\nconst sstr =\n\t/<(?:\\w+:)?(?:si|sstItem)\\b[^>]*\\/>|<(?:\\w+:)?(?:si|sstItem)\\b[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?(?:si|sstItem)\\s*>/g;\n\n/**\n * Parse the Shared String Table (SST) XML into an array of string entries.\n *\n * The SST is a deduplicated table of all string values used across the workbook.\n * Each cell with type \"s\" references an index into this table.\n *\n * @param data - Raw XML string of sharedStrings.xml\n * @param opts - Options controlling HTML generation (cellHTML)\n * @returns Array of parsed string entries with Count and Unique metadata\n */\nexport function parseSstXml(data: string, opts?: SstParseOptions): SST {\n\tconst strings: SST = [];\n\tif (!data) {\n\t\treturn strings;\n\t}\n\tassertXmlPartLimits(\"sharedStrings.xml\", data, opts);\n\n\tconst sst = str_match_xml_ns_local(data, \"sst\");\n\tif (sst) {\n\t\t// Preserve one array slot per SST element so later cell indexes do not shift.\n\t\tsstr.lastIndex = 0;\n\t\tconst stringItems = Array.from(sst[1].matchAll(sstr), (match) => match[1] ?? \"\");\n\t\tconst maxSharedStringItems = xmlOptionLimit(\n\t\t\topts?.maxSharedStringItems,\n\t\t\tDEFAULT_MAX_SHARED_STRING_ITEMS,\n\t\t\t\"maxSharedStringItems\",\n\t\t);\n\t\tassertXmlCountWithinLimit(\"shared string item\", stringItems.length, maxSharedStringItems);\n\t\tfor (let i = 0; i < stringItems.length; ++i) {\n\t\t\tconst parsedItem = parseStringItem(stringItems[i].trim(), opts);\n\t\t\tif (parsedItem != null) {\n\t\t\t\tstrings[strings.length] = parsedItem;\n\t\t\t}\n\t\t}\n\t\t// Extract count/uniqueCount attributes from the <sst> opening tag\n\t\tconst tag = parseXmlTag(sst[0].slice(0, sst[0].indexOf(\">\")), undefined, undefined, opts);\n\t\tstrings.Count = tag.count;\n\t\tstrings.Unique = tag.uniquecount;\n\t}\n\treturn strings;\n}\n\n/** Matches strings with leading/trailing whitespace or internal whitespace chars that need xml:space=\"preserve\" */\nconst straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\n\n/**\n * Write the Shared String Table (SST) as XML.\n *\n * @param sst - Array of string entries to serialize\n * @param opts - Options; bookSST must be true to produce output\n * @returns Complete sharedStrings.xml string, or empty string if bookSST is false\n */\nexport function writeSstXml(sst: SST, opts: { bookSST?: boolean }): string {\n\tif (!opts.bookSST) {\n\t\treturn \"\";\n\t}\n\tconst lines: string[] = [XML_HEADER];\n\tlines.push(\n\t\twriteXmlElement(\"sst\", null, {\n\t\t\txmlns: XMLNS_main[0],\n\t\t\tcount: String(sst.Count),\n\t\t\tuniqueCount: String(sst.Unique),\n\t\t}),\n\t);\n\tfor (let i = 0; i !== sst.length; ++i) {\n\t\tif (sst[i] == null) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst entry = sst[i];\n\t\tlet sitag = \"<si>\";\n\t\tif (entry.r) {\n\t\t\t// Preserve original rich-text XML\n\t\t\tsitag += normalizeRichTextXml(entry.r);\n\t\t} else {\n\t\t\tsitag += \"<t\";\n\t\t\tif (!entry.t) {\n\t\t\t\tentry.t = \"\";\n\t\t\t}\n\t\t\tif (typeof entry.t !== \"string\") {\n\t\t\t\tentry.t = String(entry.t);\n\t\t\t}\n\t\t\t// Add xml:space=\"preserve\" for strings with significant whitespace\n\t\t\tif (entry.t.match(straywsregex)) {\n\t\t\t\tsitag += ' xml:space=\"preserve\"';\n\t\t\t}\n\t\t\tsitag += \">\" + escapeXml(entry.t) + \"</t>\";\n\t\t}\n\t\tsitag += \"</si>\";\n\t\tlines.push(sitag);\n\t}\n\tif (lines.length > 2) {\n\t\tlines.push(\"</sst>\");\n\t\t// Convert self-closing <sst .../> to opening tag <sst ...>\n\t\tlines[1] = lines[1].replace(\"/>\", \">\");\n\t}\n\treturn lines.join(\"\");\n}\n","/**\n * Initialize the built-in Excel number format table.\n *\n * Populates the standard format IDs (0-49 plus 56) defined in ECMA-376.\n * Format IDs 5-8 and 23-36 are locale-dependent and intentionally omitted\n * from the base table (they are mapped via {@link DEFAULT_FORMAT_MAP}).\n *\n * @param t - Optional existing table to populate; a new object is created if omitted\n * @returns The populated format table\n */\nexport function initFormatTable(t?: Record<number, string>): Record<number, string> {\n\tif (!t) {\n\t\tt = {};\n\t}\n\tt[0] = \"General\";\n\tt[1] = \"0\";\n\tt[2] = \"0.00\";\n\tt[3] = \"#,##0\";\n\tt[4] = \"#,##0.00\";\n\tt[9] = \"0%\";\n\tt[10] = \"0.00%\";\n\tt[11] = \"0.00E+00\";\n\tt[12] = \"# ?/?\";\n\tt[13] = \"# ??/??\";\n\tt[14] = \"m/d/yy\";\n\tt[15] = \"d-mmm-yy\";\n\tt[16] = \"d-mmm\";\n\tt[17] = \"mmm-yy\";\n\tt[18] = \"h:mm AM/PM\";\n\tt[19] = \"h:mm:ss AM/PM\";\n\tt[20] = \"h:mm\";\n\tt[21] = \"h:mm:ss\";\n\tt[22] = \"m/d/yy h:mm\";\n\tt[37] = \"#,##0 ;(#,##0)\";\n\tt[38] = \"#,##0 ;[Red](#,##0)\";\n\tt[39] = \"#,##0.00;(#,##0.00)\";\n\tt[40] = \"#,##0.00;[Red](#,##0.00)\";\n\tt[45] = \"mm:ss\";\n\tt[46] = \"[h]:mm:ss\";\n\tt[47] = \"mmss.0\";\n\tt[48] = \"##0.0E+0\";\n\tt[49] = \"@\";\n\t// Format 56: Chinese time format (Simplified Chinese AM/PM with hour/minute/second)\n\tt[56] = '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"';\n\treturn t;\n}\n\n/** Default number format table, initialized with standard Excel formats */\nexport let formatTable: Record<number, string> = initFormatTable();\n\n/**\n * Mapping from locale-dependent format IDs to their base-table equivalents.\n *\n * When a format ID is not found in the main table, this map provides a fallback\n * by redirecting to a standard format ID. For example, format 27 (a locale-specific\n * date format) falls back to format 14 (\"m/d/yy\").\n *\n * Defaults were determined by systematically testing in Excel 2019.\n */\nexport const DEFAULT_FORMAT_MAP: Record<number, number> = {\n\t// Accounting formats 5-8 map to the parenthesized number formats 37-40\n\t5: 37,\n\t6: 38,\n\t7: 39,\n\t8: 40,\n\t// CJK locale formats 23-26 map to General (0)\n\t23: 0,\n\t24: 0,\n\t25: 0,\n\t26: 0,\n\t// CJK/locale date formats 27-31, 50-58 map to short date (14)\n\t27: 14,\n\t28: 14,\n\t29: 14,\n\t30: 14,\n\t31: 14,\n\t50: 14,\n\t51: 14,\n\t52: 14,\n\t53: 14,\n\t54: 14,\n\t55: 14,\n\t56: 14,\n\t57: 14,\n\t58: 14,\n\t// CJK number formats\n\t59: 1,\n\t60: 2,\n\t61: 3,\n\t62: 4,\n\t// CJK percentage/fraction formats\n\t67: 9,\n\t68: 10,\n\t69: 12,\n\t70: 13,\n\t// CJK date/time formats\n\t71: 14,\n\t72: 14,\n\t73: 15,\n\t74: 16,\n\t75: 17,\n\t76: 20,\n\t77: 21,\n\t78: 22,\n\t79: 45,\n\t80: 46,\n\t81: 47,\n\t82: 0,\n};\n\n/**\n * Accounting format strings for IDs that have no direct equivalent in the base table.\n *\n * These use literal \"$\" currency symbols and special alignment characters\n * (_  for padding, \\( and \\) for literal parentheses).\n */\nexport const DEFAULT_FORMAT_STRINGS: Record<number, string> = {\n\t5: '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t63: '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t6: '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t64: '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t7: '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t65: '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t8: '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t66: '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t41: '_(* #,##0_);_(* \\\\(#,##0\\\\);_(* \"-\"_);_(@_)',\n\t42: '_(\"$\"* #,##0_);_(\"$\"* \\\\(#,##0\\\\);_(\"$\"* \"-\"_);_(@_)',\n\t43: '_(* #,##0.00_);_(* \\\\(#,##0.00\\\\);_(* \"-\"??_);_(@_)',\n\t44: '_(\"$\"* #,##0.00_);_(\"$\"* \\\\(#,##0.00\\\\);_(\"$\"* \"-\"??_);_(@_)',\n};\n\n/**\n * Register a custom number format string in the format table.\n *\n * If no index is provided, searches for an existing match or the first empty slot\n * in the valid range (0-0x0187). If no slot is found, uses 0x0187 as a last resort.\n *\n * @param fmt - The format string to register (e.g. \"#,##0.00\")\n * @param idx - Optional explicit format index to assign\n * @returns The format index where the string was registered\n */\nexport function loadFormat(fmt: string, idx?: number): number {\n\tif (typeof idx !== \"number\") {\n\t\tidx = Number(idx) || -1;\n\t\t// 0x0188 = 392, the maximum number of format entries\n\t\tfor (let i = 0; i < 0x0188; ++i) {\n\t\t\tif (formatTable[i] === undefined) {\n\t\t\t\tif (idx < 0) {\n\t\t\t\t\tidx = i;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (formatTable[i] === fmt) {\n\t\t\t\tidx = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (idx < 0) {\n\t\t\tidx = 0x187;\n\t\t}\n\t}\n\tformatTable[idx] = fmt;\n\treturn idx;\n}\n\n/**\n * Bulk-load a table of number format strings, overwriting existing entries.\n * @param tbl - Map of format index to format string\n */\nexport function loadFormatTable(tbl: Record<number, string>): void {\n\tfor (let i = 0; i < 0x0188; ++i) {\n\t\tif (tbl[i] !== undefined) {\n\t\t\tloadFormat(tbl[i], i);\n\t\t}\n\t}\n}\n\n/**\n * Reset the format table back to the built-in Excel defaults.\n *\n * Called before read/write operations to ensure a clean state.\n */\nexport function resetFormatTable(): void {\n\tformatTable = initFormatTable();\n}\n","import type {\n\tWorkBook,\n\tWorkSheet,\n\tCellObject,\n\tCellStyle,\n\tStyleColor,\n\tCellFont,\n\tCellFill,\n\tCellBorder,\n\tCellBorderSide,\n\tCellAlignment,\n} from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { parseXmlTag, XML_TAG_REGEX, XML_HEADER } from \"../xml/parser.js\";\nimport { escapeXml, unescapeXml } from \"../xml/escape.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS_main } from \"../xml/namespaces.js\";\nimport { formatTable, loadFormat } from \"../ssf/table.js\";\n\n/** Parsed style information from styles.xml */\nexport interface StylesData {\n\tNumberFmt: Record<number, string>;\n\tCellXf: CellXfEntry[];\n\tFonts: CellFont[];\n\tFills: CellFill[];\n\tBorders: CellBorder[];\n}\n\n/** A single cell format (xf) entry from the cellXfs collection */\nexport interface CellXfEntry {\n\tnumFmtId: number;\n\tfontId?: number;\n\tfillId?: number;\n\tborderId?: number;\n\txfId?: number;\n\tapplyNumberFormat?: boolean;\n\tapplyFont?: boolean;\n\tapplyFill?: boolean;\n\tapplyBorder?: boolean;\n\tapplyAlignment?: boolean;\n\talignment?: CellAlignment;\n}\n\ninterface NormalizedCellStyle {\n\tfont?: CellFont;\n\tfill?: CellFill;\n\tborder?: CellBorder;\n\talignment?: CellAlignment;\n\tnumFmt?: string | number;\n}\n\ninterface StyleXf {\n\tnumFmtId: number;\n\tfontId: number;\n\tfillId: number;\n\tborderId: number;\n\talignment?: CellAlignment;\n\tapplyNumberFormat?: boolean;\n\tapplyFont?: boolean;\n\tapplyFill?: boolean;\n\tapplyBorder?: boolean;\n\tapplyAlignment?: boolean;\n}\n\nexport interface StyleRegistry {\n\tcellStyleIds: WeakMap<CellObject, number>;\n\tnumFmts: Map<number, string>;\n\tfonts: CellFont[];\n\tfills: CellFill[];\n\tborders: CellBorder[];\n\tcellXfs: StyleXf[];\n\thasStyles: boolean;\n}\n\nconst DEFAULT_FONT: CellFont = { name: \"Calibri\", size: 11 };\nconst DEFAULT_FILL: CellFill = {};\nconst GRAY125_FILL: CellFill = { patternType: \"solid\" };\nconst DEFAULT_BORDER: CellBorder = {};\n\nfunction styleKey(value: unknown): string {\n\tif (value == null) {\n\t\treturn \"\";\n\t}\n\tif (typeof value !== \"object\") {\n\t\treturn JSON.stringify(value);\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn \"[\" + value.map(styleKey).join(\",\") + \"]\";\n\t}\n\tconst record = value as Record<string, unknown>;\n\treturn (\n\t\t\"{\" +\n\t\tObject.keys(record)\n\t\t\t.sort()\n\t\t\t.filter((key) => record[key] !== undefined)\n\t\t\t.map((key) => JSON.stringify(key) + \":\" + styleKey(record[key]))\n\t\t\t.join(\",\") +\n\t\t\"}\"\n\t);\n}\n\nfunction normalizeColor(color?: StyleColor, opts?: any): StyleColor | undefined {\n\tconst raw = color?.argb || color?.rgb;\n\tif (!raw) {\n\t\treturn undefined;\n\t}\n\tconst normalized = raw.replace(/^#/, \"\").toUpperCase();\n\tlet rgb = \"\";\n\tif (/^[0-9A-F]{6}$/.test(normalized)) {\n\t\trgb = \"FF\" + normalized;\n\t} else if (/^[0-9A-F]{8}$/.test(normalized)) {\n\t\trgb = normalized;\n\t} else {\n\t\tif (opts?.WTF) {\n\t\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported style color: \" + raw);\n\t\t}\n\t\treturn undefined;\n\t}\n\treturn { rgb };\n}\n\nfunction normalizeFont(font?: CellFont, opts?: any): CellFont | undefined {\n\tif (!font) {\n\t\treturn undefined;\n\t}\n\tconst out: CellFont = {};\n\tif (font.name) {\n\t\tout.name = font.name;\n\t}\n\tif (typeof font.size === \"number\") {\n\t\tout.size = font.size;\n\t}\n\tif (font.bold) {\n\t\tout.bold = true;\n\t}\n\tconst color = normalizeColor(font.color, opts);\n\tif (color) {\n\t\tout.color = color;\n\t}\n\treturn Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeFill(fill?: CellFill, opts?: any): CellFill | undefined {\n\tif (!fill) {\n\t\treturn undefined;\n\t}\n\tif (fill.patternType && fill.patternType !== \"solid\") {\n\t\tif (opts?.WTF) {\n\t\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported fill pattern: \" + fill.patternType);\n\t\t}\n\t\treturn undefined;\n\t}\n\tconst color = normalizeColor(fill.fgColor, opts);\n\tif (!color) {\n\t\treturn undefined;\n\t}\n\treturn { patternType: \"solid\", fgColor: color };\n}\n\nfunction normalizeBorder(border?: CellBorder, opts?: any): CellBorder | undefined {\n\tif (!border) {\n\t\treturn undefined;\n\t}\n\tconst out: CellBorder = {};\n\tfor (const side of [\"top\", \"right\", \"bottom\", \"left\"] as const) {\n\t\tconst input = border[side];\n\t\tif (!input) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (input.style !== \"thin\" && input.style !== \"medium\") {\n\t\t\tif (opts?.WTF) {\n\t\t\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported border style: \" + input.style);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tconst color = normalizeColor(input.color, opts);\n\t\tout[side] = color ? { style: input.style, color } : { style: input.style };\n\t}\n\treturn Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeAlignment(alignment?: CellAlignment, opts?: any): CellAlignment | undefined {\n\tif (!alignment) {\n\t\treturn undefined;\n\t}\n\tconst out: CellAlignment = {};\n\tif (alignment.horizontal === \"left\" || alignment.horizontal === \"center\" || alignment.horizontal === \"right\") {\n\t\tout.horizontal = alignment.horizontal;\n\t} else if (alignment.horizontal && opts?.WTF) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported horizontal alignment: \" + alignment.horizontal);\n\t}\n\tif (alignment.vertical === \"top\" || alignment.vertical === \"middle\" || alignment.vertical === \"bottom\") {\n\t\tout.vertical = alignment.vertical;\n\t} else if (alignment.vertical && opts?.WTF) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported vertical alignment: \" + alignment.vertical);\n\t}\n\tif (alignment.wrapText) {\n\t\tout.wrapText = true;\n\t}\n\treturn Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction normalizeCellStyle(cell: CellObject, opts?: any): NormalizedCellStyle | undefined {\n\tconst style = cell.s;\n\tconst out: NormalizedCellStyle = {};\n\tif (style) {\n\t\tout.font = normalizeFont(style.font, opts);\n\t\tout.fill = normalizeFill(style.fill, opts);\n\t\tout.border = normalizeBorder(style.border, opts);\n\t\tout.alignment = normalizeAlignment(style.alignment, opts);\n\t\tif (style.numFmt != null) {\n\t\t\tout.numFmt = style.numFmt;\n\t\t}\n\t}\n\tif (out.numFmt == null && cell.z != null) {\n\t\tout.numFmt = cell.z;\n\t}\n\tif (out.numFmt == null && cell.XF?.numFmt != null) {\n\t\tout.numFmt = cell.XF.numFmt;\n\t}\n\treturn Object.keys(out).some((key) => (out as any)[key] !== undefined) ? out : undefined;\n}\n\nfunction getOrAdd<T>(items: T[], seen: Map<string, number>, value: T): number {\n\tconst key = styleKey(value);\n\tconst existing = seen.get(key);\n\tif (existing != null) {\n\t\treturn existing;\n\t}\n\tconst id = items.length;\n\titems.push(value);\n\tseen.set(key, id);\n\treturn id;\n}\n\nfunction getBuiltinNumFmtId(format: string): number | undefined {\n\tfor (const key of Object.keys(formatTable)) {\n\t\tif (formatTable[+key] === format) {\n\t\t\treturn +key;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction getNumFmtId(\n\tnumFmt: string | number | undefined,\n\tcustomNumFmts: Map<string, number>,\n\tnumFmts: Map<number, string>,\n): number {\n\tif (numFmt == null) {\n\t\treturn 0;\n\t}\n\tif (typeof numFmt === \"number\") {\n\t\treturn numFmt;\n\t}\n\tconst builtin = getBuiltinNumFmtId(numFmt);\n\tif (builtin != null) {\n\t\treturn builtin;\n\t}\n\tconst existing = customNumFmts.get(numFmt);\n\tif (existing != null) {\n\t\treturn existing;\n\t}\n\tlet id = 164;\n\twhile (numFmts.has(id) || formatTable[id]) {\n\t\tid++;\n\t}\n\tcustomNumFmts.set(numFmt, id);\n\tnumFmts.set(id, numFmt);\n\treturn id;\n}\n\nfunction eachWorksheetCell(ws: WorkSheet, callback: (cell: CellObject) => void): void {\n\tif (ws[\"!data\"]) {\n\t\tfor (const row of ws[\"!data\"]) {\n\t\t\tif (!row) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const cell of row) {\n\t\t\t\tif (cell) {\n\t\t\t\t\tcallback(cell);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\tfor (const key of Object.keys(ws)) {\n\t\tif (key.charAt(0) === \"!\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst cell = ws[key] as CellObject | undefined;\n\t\tif (cell) {\n\t\t\tcallback(cell);\n\t\t}\n\t}\n}\n\nexport function buildStyleRegistry(wb: WorkBook, opts?: any): StyleRegistry {\n\tconst registry: StyleRegistry = {\n\t\tcellStyleIds: new WeakMap(),\n\t\tnumFmts: new Map(),\n\t\tfonts: [DEFAULT_FONT],\n\t\tfills: [DEFAULT_FILL, GRAY125_FILL],\n\t\tborders: [DEFAULT_BORDER],\n\t\tcellXfs: [{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0 }],\n\t\thasStyles: false,\n\t};\n\tconst fontIds = new Map<string, number>([[styleKey(DEFAULT_FONT), 0]]);\n\tconst fillIds = new Map<string, number>([\n\t\t[styleKey(DEFAULT_FILL), 0],\n\t\t[styleKey(GRAY125_FILL), 1],\n\t]);\n\tconst borderIds = new Map<string, number>([[styleKey(DEFAULT_BORDER), 0]]);\n\tconst xfIds = new Map<string, number>([[styleKey(registry.cellXfs[0]), 0]]);\n\tconst customNumFmts = new Map<string, number>();\n\n\tfor (const sheetName of wb.SheetNames) {\n\t\tconst ws = wb.Sheets[sheetName];\n\t\tif (!ws) {\n\t\t\tcontinue;\n\t\t}\n\t\teachWorksheetCell(ws, (cell) => {\n\t\t\tconst normalized = normalizeCellStyle(cell, opts);\n\t\t\tif (!normalized) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst fontId = normalized.font ? getOrAdd(registry.fonts, fontIds, normalized.font) : 0;\n\t\t\tconst fillId = normalized.fill ? getOrAdd(registry.fills, fillIds, normalized.fill) : 0;\n\t\t\tconst borderId = normalized.border ? getOrAdd(registry.borders, borderIds, normalized.border) : 0;\n\t\t\tconst numFmtId = getNumFmtId(normalized.numFmt, customNumFmts, registry.numFmts);\n\t\t\tconst xf: StyleXf = { numFmtId, fontId, fillId, borderId };\n\t\t\tif (numFmtId !== 0) {\n\t\t\t\txf.applyNumberFormat = true;\n\t\t\t}\n\t\t\tif (fontId !== 0) {\n\t\t\t\txf.applyFont = true;\n\t\t\t}\n\t\t\tif (fillId !== 0) {\n\t\t\t\txf.applyFill = true;\n\t\t\t}\n\t\t\tif (borderId !== 0) {\n\t\t\t\txf.applyBorder = true;\n\t\t\t}\n\t\t\tif (normalized.alignment) {\n\t\t\t\txf.alignment = normalized.alignment;\n\t\t\t\txf.applyAlignment = true;\n\t\t\t}\n\t\t\tconst styleId = getOrAdd(registry.cellXfs, xfIds, xf);\n\t\t\tregistry.cellStyleIds.set(cell, styleId);\n\t\t\tif (styleId !== 0) {\n\t\t\t\tregistry.hasStyles = true;\n\t\t\t}\n\t\t});\n\t}\n\treturn registry;\n}\n\nexport function getCellStyleIndex(opts: any, cell: CellObject): number | undefined {\n\treturn opts?.styleRegistry?.cellStyleIds?.get(cell);\n}\n\n/**\n * Parse <numFmts> section, registering custom number formats into the styles object\n * and the global SSF format table.\n */\nfunction parseNumberFormats(t: string, styles: StylesData, _opts: any): void {\n\tconst matches = t.match(XML_TAG_REGEX);\n\tif (!matches) {\n\t\treturn;\n\t}\n\tfor (let i = 0; i < matches.length; ++i) {\n\t\tconst parsedTag = parseXmlTag(matches[i]);\n\t\tswitch (stripTagNamespace(parsedTag[0])) {\n\t\t\tcase \"<numFmt\": {\n\t\t\t\tconst formatCode = unescapeXml(parsedTag.formatCode);\n\t\t\t\tconst fmtId = parseInt(parsedTag.numFmtId, 10);\n\t\t\t\tstyles.NumberFmt[fmtId] = formatCode;\n\t\t\t\tif (fmtId > 0) {\n\t\t\t\t\tif (fmtId > 0x188) {\n\t\t\t\t\t\t// Format IDs above 0x188 (392) are beyond the standard reserved range\n\t\t\t\t\t}\n\t\t\t\t\tloadFormat(formatCode, fmtId);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parseColor(tag: Record<string, any>): StyleColor | undefined {\n\tif (tag.rgb) {\n\t\treturn { rgb: String(tag.rgb).toUpperCase() };\n\t}\n\treturn undefined;\n}\n\nfunction parseFonts(t: string, styles: StylesData): void {\n\tconst fonts = t.match(/<(?:\\w+:)?font\\b[^>]*>[\\s\\S]*?<\\/(?:\\w+:)?font>|<(?:\\w+:)?font\\b[^>]*\\/>/g);\n\tif (!fonts) {\n\t\treturn;\n\t}\n\tfor (const fontXml of fonts) {\n\t\tconst font: CellFont = {};\n\t\tconst name = fontXml.match(/<(?:\\w+:)?name\\b[^>]*\\/>/);\n\t\tif (name) {\n\t\t\tconst tag = parseXmlTag(name[0]);\n\t\t\tif (tag.val) {\n\t\t\t\tfont.name = tag.val;\n\t\t\t}\n\t\t}\n\t\tconst size = fontXml.match(/<(?:\\w+:)?sz\\b[^>]*\\/>/);\n\t\tif (size) {\n\t\t\tconst tag = parseXmlTag(size[0]);\n\t\t\tif (tag.val) {\n\t\t\t\tfont.size = parseFloat(tag.val);\n\t\t\t}\n\t\t}\n\t\tif (/<(?:\\w+:)?b\\b[^>]*\\/>/.test(fontXml)) {\n\t\t\tfont.bold = true;\n\t\t}\n\t\tconst color = fontXml.match(/<(?:\\w+:)?color\\b[^>]*\\/>/);\n\t\tif (color) {\n\t\t\tconst parsed = parseColor(parseXmlTag(color[0]));\n\t\t\tif (parsed) {\n\t\t\t\tfont.color = parsed;\n\t\t\t}\n\t\t}\n\t\tstyles.Fonts.push(font);\n\t}\n}\n\nfunction parseFills(t: string, styles: StylesData): void {\n\tconst fills = t.match(/<(?:\\w+:)?fill\\b[^>]*>[\\s\\S]*?<\\/(?:\\w+:)?fill>|<(?:\\w+:)?fill\\b[^>]*\\/>/g);\n\tif (!fills) {\n\t\treturn;\n\t}\n\tfor (const fillXml of fills) {\n\t\tconst pattern = fillXml.match(/<(?:\\w+:)?patternFill\\b[^>]*>/);\n\t\tconst fill: CellFill = {};\n\t\tif (pattern) {\n\t\t\tconst patternTag = parseXmlTag(pattern[0]);\n\t\t\tif (patternTag.patternType === \"solid\") {\n\t\t\t\tfill.patternType = \"solid\";\n\t\t\t\tconst fg = fillXml.match(/<(?:\\w+:)?fgColor\\b[^>]*\\/>/);\n\t\t\t\tif (fg) {\n\t\t\t\t\tconst parsed = parseColor(parseXmlTag(fg[0]));\n\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\tfill.fgColor = parsed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tstyles.Fills.push(fill);\n\t}\n}\n\nfunction parseBorderSide(borderXml: string, side: \"top\" | \"right\" | \"bottom\" | \"left\"): CellBorderSide | undefined {\n\tconst match = borderXml.match(\n\t\tnew RegExp(\"<(?:\\\\w+:)?\" + side + \"\\\\b[^>]*(?:/>|>[\\\\s\\\\S]*?</(?:\\\\w+:)?\" + side + \">)\"),\n\t);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\tconst open = match[0].match(/<[^>]*>/);\n\tif (!open) {\n\t\treturn undefined;\n\t}\n\tconst tag = parseXmlTag(open[0]);\n\tif (tag.style !== \"thin\" && tag.style !== \"medium\") {\n\t\treturn undefined;\n\t}\n\tconst color = match[0].match(/<(?:\\w+:)?color\\b[^>]*\\/>/);\n\tconst parsedColor = color ? parseColor(parseXmlTag(color[0])) : undefined;\n\treturn parsedColor ? { style: tag.style, color: parsedColor } : { style: tag.style };\n}\n\nfunction parseBorders(t: string, styles: StylesData): void {\n\tconst borders = t.match(/<(?:\\w+:)?border\\b[^>]*>[\\s\\S]*?<\\/(?:\\w+:)?border>|<(?:\\w+:)?border\\b[^>]*\\/>/g);\n\tif (!borders) {\n\t\treturn;\n\t}\n\tfor (const borderXml of borders) {\n\t\tconst border: CellBorder = {};\n\t\tfor (const side of [\"top\", \"right\", \"bottom\", \"left\"] as const) {\n\t\t\tconst parsed = parseBorderSide(borderXml, side);\n\t\t\tif (parsed) {\n\t\t\t\tborder[side] = parsed;\n\t\t\t}\n\t\t}\n\t\tstyles.Borders.push(border);\n\t}\n}\n\n/**\n * Parse <cellXfs> section, extracting cell format entries that map style indices\n * to number format, font, fill, and border IDs.\n */\nfunction parseCellFormats(t: string, styles: StylesData): void {\n\tconst matches = t.match(XML_TAG_REGEX);\n\tif (!matches) {\n\t\treturn;\n\t}\n\tlet xf: CellXfEntry | null = null;\n\tfor (let i = 0; i < matches.length; ++i) {\n\t\tconst parsedTag = parseXmlTag(matches[i]);\n\t\tswitch (stripTagNamespace(parsedTag[0])) {\n\t\t\tcase \"<xf\":\n\t\t\t\txf = {\n\t\t\t\t\tnumFmtId: parseInt(parsedTag.numFmtId, 10) || 0,\n\t\t\t\t\tfontId: parseInt(parsedTag.fontId, 10) || 0,\n\t\t\t\t\tfillId: parseInt(parsedTag.fillId, 10) || 0,\n\t\t\t\t\tborderId: parseInt(parsedTag.borderId, 10) || 0,\n\t\t\t\t\txfId: parseInt(parsedTag.xfId, 10) || 0,\n\t\t\t\t};\n\t\t\t\tif (parsedTag.applyNumberFormat) {\n\t\t\t\t\txf.applyNumberFormat = parsedTag.applyNumberFormat === \"1\";\n\t\t\t\t}\n\t\t\t\tif (parsedTag.applyFont) {\n\t\t\t\t\txf.applyFont = parsedTag.applyFont === \"1\";\n\t\t\t\t}\n\t\t\t\tif (parsedTag.applyFill) {\n\t\t\t\t\txf.applyFill = parsedTag.applyFill === \"1\";\n\t\t\t\t}\n\t\t\t\tif (parsedTag.applyBorder) {\n\t\t\t\t\txf.applyBorder = parsedTag.applyBorder === \"1\";\n\t\t\t\t}\n\t\t\t\tif (parsedTag.applyAlignment) {\n\t\t\t\t\txf.applyAlignment = parsedTag.applyAlignment === \"1\";\n\t\t\t\t}\n\t\t\t\tstyles.CellXf.push(xf);\n\t\t\t\tbreak;\n\t\t\tcase \"<alignment\":\n\t\t\t\tif (xf) {\n\t\t\t\t\tconst alignment: CellAlignment = {};\n\t\t\t\t\tif (\n\t\t\t\t\t\tparsedTag.horizontal === \"left\" ||\n\t\t\t\t\t\tparsedTag.horizontal === \"center\" ||\n\t\t\t\t\t\tparsedTag.horizontal === \"right\"\n\t\t\t\t\t) {\n\t\t\t\t\t\talignment.horizontal = parsedTag.horizontal;\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tparsedTag.vertical === \"top\" ||\n\t\t\t\t\t\tparsedTag.vertical === \"center\" ||\n\t\t\t\t\t\tparsedTag.vertical === \"bottom\"\n\t\t\t\t\t) {\n\t\t\t\t\t\talignment.vertical = parsedTag.vertical === \"center\" ? \"middle\" : parsedTag.vertical;\n\t\t\t\t\t}\n\t\t\t\t\tif (parsedTag.wrapText === \"1\") {\n\t\t\t\t\t\talignment.wrapText = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(alignment).length > 0) {\n\t\t\t\t\t\txf.alignment = alignment;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n\nexport function getStyleFromXf(styles: StylesData, styleIndex: number): CellStyle | undefined {\n\tconst xf = styles.CellXf[styleIndex];\n\tif (!xf) {\n\t\treturn undefined;\n\t}\n\tconst style: CellStyle = {};\n\tconst font = styles.Fonts[xf.fontId || 0];\n\tif (font && Object.keys(font).length > 0) {\n\t\tstyle.font = font;\n\t}\n\tconst fill = styles.Fills[xf.fillId || 0];\n\tif (fill && fill.patternType === \"solid\" && fill.fgColor) {\n\t\tstyle.fill = fill;\n\t}\n\tconst border = styles.Borders[xf.borderId || 0];\n\tif (border && Object.keys(border).length > 0) {\n\t\tstyle.border = border;\n\t}\n\tif (xf.alignment) {\n\t\tstyle.alignment = xf.alignment;\n\t}\n\tif (xf.numFmtId) {\n\t\tstyle.numFmt = styles.NumberFmt[xf.numFmtId] || formatTable[xf.numFmtId] || xf.numFmtId;\n\t}\n\treturn Object.keys(style).length > 0 ? style : undefined;\n}\n\n/** Strip XML namespace prefix from a tag name (e.g. \"<x:numFmt\" -> \"<numFmt\") */\nfunction stripTagNamespace(tag: string): string {\n\treturn tag.replace(/<\\w+:/, \"<\");\n}\n\n/**\n * Parse a styles.xml file into a StylesData structure.\n *\n * Extracts custom number formats and cell format (xf) entries. Fonts, fills,\n * and borders arrays are initialized but not fully parsed in this implementation.\n *\n * @param data - Raw XML string of the styles.xml file\n * @param _themes - Parsed theme data (reserved for theme-based color resolution)\n * @param opts - Parsing options\n * @returns Parsed style data containing number formats and cell format entries\n */\nexport function parseStylesXml(data: string, _themes?: any, opts?: any): StylesData {\n\tconst styles: StylesData = {\n\t\tNumberFmt: {},\n\t\tCellXf: [],\n\t\tFonts: [],\n\t\tFills: [],\n\t\tBorders: [],\n\t};\n\n\tif (!data) {\n\t\treturn styles;\n\t}\n\n\t/* numFmts - custom number format definitions */\n\tconst numFmts = data.match(/<(?:\\w+:)?numFmts[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?numFmts>/);\n\tif (numFmts) {\n\t\tparseNumberFormats(numFmts[1], styles, opts);\n\t}\n\n\tconst fonts = data.match(/<(?:\\w+:)?fonts[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?fonts>/);\n\tif (fonts) {\n\t\tparseFonts(fonts[1], styles);\n\t}\n\n\tconst fills = data.match(/<(?:\\w+:)?fills[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?fills>/);\n\tif (fills) {\n\t\tparseFills(fills[1], styles);\n\t}\n\n\tconst borders = data.match(/<(?:\\w+:)?borders[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?borders>/);\n\tif (borders) {\n\t\tparseBorders(borders[1], styles);\n\t}\n\n\t/* cellXfs - cell format entries (style index -> format/font/fill/border IDs) */\n\tconst cellXfs = data.match(/<(?:\\w+:)?cellXfs[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?cellXfs>/);\n\tif (cellXfs) {\n\t\tparseCellFormats(cellXfs[1], styles);\n\t}\n\n\treturn styles;\n}\n\n/**\n * Write a minimal styles.xml with default formatting.\n *\n * Produces a stylesheet with one \"General\" number format, one Calibri font,\n * two standard fills (none + gray125), one empty border, and two cell formats.\n * This is the minimum required for a valid XLSX file.\n *\n * @param _wb - WorkBook (reserved for future style extraction)\n * @param _opts - Write options\n * @returns Complete styles.xml string\n */\nexport function writeStylesXml(_wb: any, _opts: any): string {\n\tconst lines: string[] = [XML_HEADER];\n\tconst registry = _opts?.styleRegistry as StyleRegistry | undefined;\n\tlines.push(\n\t\twriteXmlElement(\"styleSheet\", null, {\n\t\t\txmlns: XMLNS_main[0],\n\t\t\t\"xmlns:vt\": \"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\",\n\t\t}),\n\t);\n\n\tconst numFmts = registry?.numFmts || new Map<number, string>();\n\tif (numFmts.size > 0) {\n\t\tlines.push(\n\t\t\t'<numFmts count=\"' +\n\t\t\t\tnumFmts.size +\n\t\t\t\t'\">' +\n\t\t\t\tArray.from(numFmts.entries())\n\t\t\t\t\t.sort((a, b) => a[0] - b[0])\n\t\t\t\t\t.map(([id, code]) => '<numFmt numFmtId=\"' + id + '\" formatCode=\"' + escapeXml(code) + '\"/>')\n\t\t\t\t\t.join(\"\") +\n\t\t\t\t\"</numFmts>\",\n\t\t);\n\t}\n\n\tconst fonts = registry?.fonts || [DEFAULT_FONT];\n\tlines.push('<fonts count=\"' + fonts.length + '\">' + fonts.map(writeFont).join(\"\") + \"</fonts>\");\n\n\tconst fills = registry?.fills || [DEFAULT_FILL, GRAY125_FILL];\n\tlines.push('<fills count=\"' + fills.length + '\">' + fills.map(writeFill).join(\"\") + \"</fills>\");\n\n\tconst borders = registry?.borders || [DEFAULT_BORDER];\n\tlines.push('<borders count=\"' + borders.length + '\">' + borders.map(writeBorder).join(\"\") + \"</borders>\");\n\n\t// Cell Style Xfs - base format for the \"Normal\" style\n\tlines.push('<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>');\n\n\tconst cellXfs = registry?.cellXfs || [\n\t\t{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0 },\n\t\t{ numFmtId: 0, fontId: 0, fillId: 0, borderId: 0 },\n\t];\n\tlines.push('<cellXfs count=\"' + cellXfs.length + '\">' + cellXfs.map(writeCellXf).join(\"\") + \"</cellXfs>\");\n\n\t// Cell Styles - the built-in \"Normal\" style\n\tlines.push('<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>');\n\n\tlines.push(\"</styleSheet>\");\n\t// Convert self-closing <styleSheet .../> to opening tag <styleSheet ...>\n\tlines[1] = lines[1].replace(\"/>\", \">\");\n\treturn lines.join(\"\");\n}\n\nfunction writeFont(font: CellFont): string {\n\tconst parts: string[] = [];\n\tparts.push('<sz val=\"' + (font.size || 11) + '\"/>');\n\tif (font.color?.rgb) {\n\t\tparts.push('<color rgb=\"' + font.color.rgb + '\"/>');\n\t} else {\n\t\tparts.push('<color theme=\"1\"/>');\n\t}\n\tparts.push('<name val=\"' + escapeXml(font.name || \"Calibri\") + '\"/>');\n\tparts.push('<family val=\"2\"/>');\n\tif (font.bold) {\n\t\tparts.push(\"<b/>\");\n\t}\n\treturn \"<font>\" + parts.join(\"\") + \"</font>\";\n}\n\nfunction writeFill(fill: CellFill): string {\n\tif (fill.patternType === \"solid\" && fill.fgColor?.rgb) {\n\t\treturn (\n\t\t\t'<fill><patternFill patternType=\"solid\"><fgColor rgb=\"' +\n\t\t\tfill.fgColor.rgb +\n\t\t\t'\"/><bgColor indexed=\"64\"/></patternFill></fill>'\n\t\t);\n\t}\n\tif (fill.patternType === \"solid\") {\n\t\treturn '<fill><patternFill patternType=\"gray125\"/></fill>';\n\t}\n\treturn '<fill><patternFill patternType=\"none\"/></fill>';\n}\n\nfunction writeBorder(border: CellBorder): string {\n\tconst sides = [\"left\", \"right\", \"top\", \"bottom\"] as const;\n\tconst out = sides.map((side) => writeBorderSide(side, border[side])).join(\"\");\n\treturn \"<border>\" + out + \"<diagonal/></border>\";\n}\n\nfunction writeBorderSide(side: string, border?: { style: \"thin\" | \"medium\"; color?: StyleColor }): string {\n\tif (!border) {\n\t\treturn \"<\" + side + \"/>\";\n\t}\n\tconst color = border.color?.rgb ? '<color rgb=\"' + border.color.rgb + '\"/>' : \"\";\n\treturn \"<\" + side + ' style=\"' + border.style + '\">' + color + \"</\" + side + \">\";\n}\n\nfunction writeCellXf(xf: StyleXf): string {\n\tconst attrs: Record<string, string> = {\n\t\tnumFmtId: String(xf.numFmtId),\n\t\tfontId: String(xf.fontId),\n\t\tfillId: String(xf.fillId),\n\t\tborderId: String(xf.borderId),\n\t\txfId: \"0\",\n\t};\n\tif (xf.applyNumberFormat) {\n\t\tattrs.applyNumberFormat = \"1\";\n\t}\n\tif (xf.applyFont) {\n\t\tattrs.applyFont = \"1\";\n\t}\n\tif (xf.applyFill) {\n\t\tattrs.applyFill = \"1\";\n\t}\n\tif (xf.applyBorder) {\n\t\tattrs.applyBorder = \"1\";\n\t}\n\tif (xf.applyAlignment) {\n\t\tattrs.applyAlignment = \"1\";\n\t}\n\tif (!xf.alignment) {\n\t\treturn writeXmlElement(\"xf\", null, attrs);\n\t}\n\tconst alignmentAttrs: Record<string, string> = {};\n\tif (xf.alignment.horizontal) {\n\t\talignmentAttrs.horizontal = xf.alignment.horizontal;\n\t}\n\tif (xf.alignment.vertical) {\n\t\talignmentAttrs.vertical = xf.alignment.vertical === \"middle\" ? \"center\" : xf.alignment.vertical;\n\t}\n\tif (xf.alignment.wrapText) {\n\t\talignmentAttrs.wrapText = \"1\";\n\t}\n\treturn writeXmlElement(\"xf\", writeXmlElement(\"alignment\", null, alignmentAttrs), attrs);\n}\n","/**\n * Parse a theme XML file, extracting the color scheme.\n *\n * The color scheme defines the 12 standard theme colors used by Excel:\n * dk1, lt1, dk2, lt2, accent1-6, hlink, folHlink. Colors are extracted\n * from either <a:sysClr> (system colors with lastClr) or <a:srgbClr> elements.\n *\n * @param data - Raw XML string of the theme file (e.g. theme1.xml)\n * @returns Parsed theme data with color scheme array\n */\nexport function parse_theme_xml(data: string): ThemeData {\n\tconst theme: ThemeData = { themeElements: { clrScheme: [] } };\n\n\t// Extract color values from the <a:clrScheme> section\n\tconst colors: string[] = [];\n\tconst clrMatch = data.match(/<a:clrScheme[^>]*>([\\s\\S]*?)<\\/a:clrScheme>/);\n\tif (clrMatch) {\n\t\t// Match both sysClr (val/lastClr) and srgbClr (val) elements, extracting the 6-digit hex color\n\t\tconst valRegex = /<a:(?:sysClr|srgbClr)[^>]*(?:val|lastClr)=\"([0-9A-Fa-f]{6})\"/g;\n\t\tlet m: RegExpExecArray | null;\n\t\twhile ((m = valRegex.exec(clrMatch[1]))) {\n\t\t\tcolors.push(m[1]);\n\t\t}\n\t}\n\ttheme.themeElements.clrScheme = colors;\n\n\treturn theme;\n}\n\n/** Parsed theme data structure */\nexport interface ThemeData {\n\tthemeElements: {\n\t\t/** Array of 6-digit hex color strings from the theme color scheme */\n\t\tclrScheme: string[];\n\t};\n}\n\n/**\n * Write a default XLSX theme XML based on the Office default theme.\n *\n * Includes the standard Office color scheme, Calibri/Calibri Light fonts,\n * and minimal format/fill/line/effect style definitions.\n *\n * @returns Complete theme1.xml string\n */\nexport function write_theme_xml(): string {\n\t// Minimal theme - based on Office default\n\treturn `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\">\n<a:themeElements>\n<a:clrScheme name=\"Office\">\n<a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n<a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n<a:dk2><a:srgbClr val=\"44546A\"/></a:dk2>\n<a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2>\n<a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1>\n<a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2>\n<a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3>\n<a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4>\n<a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5>\n<a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6>\n<a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink>\n<a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink>\n</a:clrScheme>\n<a:fontScheme name=\"Office\">\n<a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont>\n<a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont>\n</a:fontScheme>\n<a:fmtScheme name=\"Office\">\n<a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:fillStyleLst>\n<a:lnStyleLst><a:ln w=\"6350\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln><a:ln w=\"6350\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln><a:ln w=\"6350\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln></a:lnStyleLst>\n<a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle></a:effectStyleLst>\n<a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:bgFillStyleLst>\n</a:fmtScheme>\n</a:themeElements>\n</a:theme>`;\n}\n","import { XlsxError } from \"../errors.js\";\nimport { parseXmlTag, XML_TAG_REGEX, XML_HEADER, stripNamespace, parseXmlBoolean } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml } from \"../xml/escape.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS_main, XMLNS } from \"../xml/namespaces.js\";\nimport type { WorkBook } from \"../types.js\";\n\n/** Parsed workbook.xml structure */\nexport interface WorkbookFile {\n\tAppVersion: Record<string, any>;\n\tWBProps: Record<string, any>;\n\tWBView: Record<string, any>[];\n\tSheets: SheetEntry[];\n\tCalcPr: Record<string, any>;\n\tNames: DefinedNameEntry[];\n\txmlns: string;\n}\n\n/** A sheet entry from the <sheets> element in workbook.xml */\nexport interface SheetEntry {\n\tname: string;\n\tsheetId: string;\n\t/** 0 = visible, 1 = hidden, 2 = veryHidden */\n\tHidden?: number;\n\t[key: string]: any;\n}\n\n/** A defined name entry from the <definedNames> element */\nexport interface DefinedNameEntry {\n\tName: string;\n\tRef?: string;\n\t/** Local sheet index (undefined = workbook-scoped) */\n\tSheet?: number;\n\tComment?: string;\n\tHidden?: boolean;\n}\n\n/** Default values and types for workbook properties (workbookPr) */\nconst WBPropsDef: [string, any, string?][] = [\n\t[\"allowRefreshQuery\", false, \"bool\"],\n\t[\"autoCompressPictures\", true, \"bool\"],\n\t[\"backupFile\", false, \"bool\"],\n\t[\"checkCompatibility\", false, \"bool\"],\n\t[\"CodeName\", \"\"],\n\t[\"date1904\", false, \"bool\"],\n\t[\"defaultThemeVersion\", 0, \"int\"],\n\t[\"filterPrivacy\", false, \"bool\"],\n\t[\"hidePivotFieldList\", false, \"bool\"],\n\t[\"promptedSolutions\", false, \"bool\"],\n\t[\"publishItems\", false, \"bool\"],\n\t[\"refreshAllConnections\", false, \"bool\"],\n\t[\"saveExternalLinkValues\", true, \"bool\"],\n\t[\"showBorderUnselectedTables\", true, \"bool\"],\n\t[\"showInkAnnotation\", true, \"bool\"],\n\t[\"showObjects\", \"all\"],\n\t[\"showPivotChartFilter\", false, \"bool\"],\n\t[\"updateLinks\", \"userSet\"],\n];\n\n/** Default values and types for workbook view properties (workbookView) */\nconst WBViewDef: [string, any, string?][] = [\n\t[\"activeTab\", 0, \"int\"],\n\t[\"autoFilterDateGrouping\", true, \"bool\"],\n\t[\"firstSheet\", 0, \"int\"],\n\t[\"minimized\", false, \"bool\"],\n\t[\"showHorizontalScroll\", true, \"bool\"],\n\t[\"showSheetTabs\", true, \"bool\"],\n\t[\"showVerticalScroll\", true, \"bool\"],\n\t[\"tabRatio\", 600, \"int\"],\n\t[\"visibility\", \"visible\"],\n];\n\n/** Default values for sheet entries (currently empty, extensible) */\nconst SheetDef: [string, any, string?][] = [];\n\n/** Default values and types for calculation properties (calcPr) */\nconst CalcPrDef: [string, any, string?][] = [\n\t[\"calcCompleted\", \"true\"],\n\t[\"calcMode\", \"auto\"],\n\t[\"calcOnSave\", \"true\"],\n\t[\"concurrentCalc\", \"true\"],\n\t[\"fullCalcOnLoad\", \"false\"],\n\t[\"fullPrecision\", \"true\"],\n\t[\"iterate\", \"false\"],\n\t[\"iterateCount\", \"100\"],\n\t[\"iterateDelta\", \"0.001\"],\n\t[\"refMode\", \"A1\"],\n];\n\n/**\n * Apply default values to each entry in an array of objects.\n * Coerces string values to bool/int based on the type hint in the defaults definition.\n */\nfunction applyDefaultsToArray(target: any[], defaults: [string, any, string?][]): void {\n\tfor (let j = 0; j < target.length; ++j) {\n\t\tconst entry = target[j];\n\t\tfor (let i = 0; i < defaults.length; ++i) {\n\t\t\tconst defaultDef = defaults[i];\n\t\t\tif (entry[defaultDef[0]] == null) {\n\t\t\t\tentry[defaultDef[0]] = defaultDef[1];\n\t\t\t} else {\n\t\t\t\tswitch (defaultDef[2]) {\n\t\t\t\t\tcase \"bool\":\n\t\t\t\t\t\tif (typeof entry[defaultDef[0]] === \"string\") {\n\t\t\t\t\t\t\tentry[defaultDef[0]] = parseXmlBoolean(entry[defaultDef[0]]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"int\":\n\t\t\t\t\t\tif (typeof entry[defaultDef[0]] === \"string\") {\n\t\t\t\t\t\t\tentry[defaultDef[0]] = parseInt(entry[defaultDef[0]], 10);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Apply default values to a single object.\n * Coerces string values to bool/int based on the type hint in the defaults definition.\n */\nfunction applyDefaults(target: Record<string, any>, defaults: [string, any, string?][]): void {\n\tfor (let i = 0; i < defaults.length; ++i) {\n\t\tconst defaultDef = defaults[i];\n\t\tif (target[defaultDef[0]] == null) {\n\t\t\ttarget[defaultDef[0]] = defaultDef[1];\n\t\t} else {\n\t\t\tswitch (defaultDef[2]) {\n\t\t\t\tcase \"bool\":\n\t\t\t\t\tif (typeof target[defaultDef[0]] === \"string\") {\n\t\t\t\t\t\ttarget[defaultDef[0]] = parseXmlBoolean(target[defaultDef[0]]);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"int\":\n\t\t\t\t\tif (typeof target[defaultDef[0]] === \"string\") {\n\t\t\t\t\t\ttarget[defaultDef[0]] = parseInt(target[defaultDef[0]], 10);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Apply default values to all sections of a parsed workbook file.\n *\n * @param wb - Parsed workbook file to fill with defaults\n */\nexport function parse_wb_defaults(wb: WorkbookFile): void {\n\tapplyDefaults(wb.WBProps, WBPropsDef);\n\tapplyDefaults(wb.CalcPr, CalcPrDef);\n\tapplyDefaultsToArray(wb.WBView, WBViewDef);\n\tapplyDefaultsToArray(wb.Sheets, SheetDef);\n}\n\n/**\n * Determine whether the workbook uses the 1904 date system (Mac Excel legacy).\n *\n * @param wb - WorkBook to inspect\n * @returns \"true\" if 1904 date system is active, \"false\" otherwise\n */\nexport function is1904DateSystem(wb: WorkBook): string {\n\tif (!wb.Workbook) {\n\t\treturn \"false\";\n\t}\n\tif (!wb.Workbook.WBProps) {\n\t\treturn \"false\";\n\t}\n\treturn parseXmlBoolean(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\";\n}\n\n/** Characters forbidden in Excel sheet names */\nconst badchars = Array.from(\":][*?/\\\\\");\n\n/**\n * Validate a sheet name against Excel naming rules.\n *\n * @param n - Sheet name to validate\n * @param safe - If true, return false on invalid names instead of throwing\n * @returns true if valid\n * @throws XlsxError describing the validation failure (unless safe=true)\n */\nexport function validateSheetName(n: string, safe?: boolean): boolean {\n\ttry {\n\t\tif (n === \"\") {\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Sheet name cannot be blank\");\n\t\t}\n\t\tif (n.length > 31) {\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Sheet name cannot exceed 31 chars\");\n\t\t}\n\t\t// 0x27 = apostrophe (')\n\t\tif (n.charCodeAt(0) === 0x27 || n.charCodeAt(n.length - 1) === 0x27) {\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Sheet name cannot start or end with apostrophe (')\");\n\t\t}\n\t\tif (n.toLowerCase() === \"history\") {\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Sheet name cannot be 'History'\");\n\t\t}\n\t\tfor (const c of badchars) {\n\t\t\tif (n.indexOf(c) !== -1) {\n\t\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Sheet name cannot contain : \\\\ / ? * [ ]\");\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tif (safe) {\n\t\t\treturn false;\n\t\t}\n\t\tthrow error;\n\t}\n\treturn true;\n}\n\n/**\n * Validate all sheet names in a workbook for correctness and uniqueness.\n *\n * @param sheetNames - Array of sheet names to validate\n * @param sheetEntries - Optional sheet entry metadata (reserved for future use)\n * @throws XlsxError if any name is invalid or duplicated\n */\nexport function validateWorkbookNames(sheetNames: string[], _sheetEntries?: any[]): void {\n\tfor (let i = 0; i < sheetNames.length; ++i) {\n\t\tvalidateSheetName(sheetNames[i]);\n\t\tfor (let j = 0; j < i; ++j) {\n\t\t\tif (sheetNames[i] === sheetNames[j]) {\n\t\t\t\tthrow new XlsxError(\"DUPLICATE\", \"Duplicate Sheet Name: \" + sheetNames[i]);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Validate that a WorkBook object has the required structure.\n *\n * @param wb - WorkBook to validate\n * @throws XlsxError if the workbook is missing required fields or has invalid sheet names\n */\nexport function validateWorkbook(wb: WorkBook): void {\n\tif (!wb || !wb.SheetNames || !wb.Sheets) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Invalid Workbook\");\n\t}\n\tif (!wb.SheetNames.length) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Workbook is empty\");\n\t}\n\tconst Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];\n\tvalidateWorkbookNames(wb.SheetNames, Sheets);\n}\n\n/** Detects whether the workbook XML uses a namespace prefix (e.g. <x:workbook>) */\nconst wbnsregex = /<\\w+:workbook/;\n\n/**\n * Parse a workbook.xml file into a WorkbookFile structure.\n *\n * Extracts file version, workbook properties, views, sheet list, defined names,\n * and calculation properties from the XML.\n *\n * @param data - Raw XML string of workbook.xml\n * @param opts - Parsing options\n * @returns Parsed workbook file structure\n * @throws XlsxError if data is empty or the namespace is unrecognized\n */\nexport function parseWorkbookXml(data: string, _opts?: any): WorkbookFile {\n\tif (!data) {\n\t\tthrow new XlsxError(\"NOT_FOUND\", \"Could not find file\");\n\t}\n\tconst workbook: WorkbookFile = {\n\t\tAppVersion: {},\n\t\tWBProps: {},\n\t\tWBView: [],\n\t\tSheets: [],\n\t\tCalcPr: {},\n\t\tNames: [],\n\t\txmlns: \"\",\n\t};\n\tlet xmlns = \"xmlns\";\n\tlet dname: any = {};\n\t// Track the character offset where the defined name content starts\n\tlet dnstart = 0;\n\n\tconst ignoredTags = new Set([\n\t\t\"<?xml\",\n\t\t\"</workbook>\",\n\t\t\"<fileVersion/>\",\n\t\t\"</fileVersion>\",\n\t\t\"<fileSharing\",\n\t\t\"<fileSharing/>\",\n\t\t\"</workbookPr>\",\n\t\t\"<workbookProtection\",\n\t\t\"<workbookProtection/>\",\n\t\t\"<bookViews\",\n\t\t\"<bookViews>\",\n\t\t\"</bookViews>\",\n\t\t\"</workbookView>\",\n\t\t\"<sheets\",\n\t\t\"<sheets>\",\n\t\t\"</sheets>\",\n\t\t\"</sheet>\",\n\t\t\"<functionGroups\",\n\t\t\"<functionGroups/>\",\n\t\t\"<functionGroup\",\n\t\t\"<externalReferences\",\n\t\t\"</externalReferences>\",\n\t\t\"<externalReferences>\",\n\t\t\"<externalReference\",\n\t\t\"<definedNames/>\",\n\t\t\"<definedNames>\",\n\t\t\"<definedNames\",\n\t\t\"</definedNames>\",\n\t\t\"<definedName/>\",\n\t\t\"</calcPr>\",\n\t\t\"<oleSize\",\n\t\t\"<customWorkbookViews>\",\n\t\t\"</customWorkbookViews>\",\n\t\t\"<customWorkbookViews\",\n\t\t\"<customWorkbookView\",\n\t\t\"</customWorkbookView>\",\n\t\t\"<pivotCaches>\",\n\t\t\"</pivotCaches>\",\n\t\t\"<pivotCaches\",\n\t\t\"<pivotCache\",\n\t\t\"<smartTagPr\",\n\t\t\"<smartTagPr/>\",\n\t\t\"<smartTagTypes\",\n\t\t\"<smartTagTypes>\",\n\t\t\"</smartTagTypes>\",\n\t\t\"<smartTagType\",\n\t\t\"<webPublishing\",\n\t\t\"<webPublishing/>\",\n\t\t\"<fileRecoveryPr\",\n\t\t\"<fileRecoveryPr/>\",\n\t\t\"<webPublishObjects>\",\n\t\t\"<webPublishObjects\",\n\t\t\"</webPublishObjects>\",\n\t\t\"<webPublishObject\",\n\t\t\"<extLst\",\n\t\t\"<extLst>\",\n\t\t\"</extLst>\",\n\t\t\"<extLst/>\",\n\t\t\"<ext\",\n\t\t\"</ext>\",\n\t\t\"<ArchID\",\n\t\t\"<AlternateContent\",\n\t\t\"<AlternateContent>\",\n\t\t\"</AlternateContent>\",\n\t\t\"<revisionPtr\",\n\t]);\n\n\tdata.replace(XML_TAG_REGEX, function xml_wb(xmlTag: string, idx: number): string {\n\t\tconst parsedTag: any = parseXmlTag(xmlTag);\n\t\tconst tag = stripNamespace(parsedTag[0]);\n\t\tif (ignoredTags.has(tag)) {\n\t\t\treturn xmlTag;\n\t\t}\n\t\tswitch (tag) {\n\t\t\tcase \"<workbook\":\n\t\t\t\t// Detect namespace prefix (e.g. <x:workbook -> xmlns:x)\n\t\t\t\tif (xmlTag.match(wbnsregex)) {\n\t\t\t\t\txmlns = \"xmlns\" + xmlTag.match(/<(\\w+):/)?.[1];\n\t\t\t\t}\n\t\t\t\tworkbook.xmlns = parsedTag[xmlns];\n\t\t\t\tbreak;\n\n\t\t\tcase \"<fileVersion\":\n\t\t\t\tdelete parsedTag[0];\n\t\t\t\tworkbook.AppVersion = parsedTag;\n\t\t\t\tbreak;\n\n\t\t\tcase \"<workbookPr\":\n\t\t\tcase \"<workbookPr/>\":\n\t\t\t\tWBPropsDef.forEach((propDef) => {\n\t\t\t\t\tif (parsedTag[propDef[0]] == null) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tswitch (propDef[2]) {\n\t\t\t\t\t\tcase \"bool\":\n\t\t\t\t\t\t\tworkbook.WBProps[propDef[0]] = parseXmlBoolean(parsedTag[propDef[0]]);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"int\":\n\t\t\t\t\t\t\tworkbook.WBProps[propDef[0]] = parseInt(parsedTag[propDef[0]], 10);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tworkbook.WBProps[propDef[0]] = parsedTag[propDef[0]];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (parsedTag.codeName) {\n\t\t\t\t\tworkbook.WBProps.CodeName = parsedTag.codeName;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"<workbookView\":\n\t\t\tcase \"<workbookView/>\":\n\t\t\t\tdelete parsedTag[0];\n\t\t\t\tworkbook.WBView.push(parsedTag);\n\t\t\t\tbreak;\n\n\t\t\tcase \"<sheet\":\n\t\t\t\t// Map state attribute to numeric Hidden value\n\t\t\t\tswitch (parsedTag.state) {\n\t\t\t\t\tcase \"hidden\":\n\t\t\t\t\t\tparsedTag.Hidden = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"veryHidden\":\n\t\t\t\t\t\tparsedTag.Hidden = 2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedTag.Hidden = 0;\n\t\t\t\t}\n\t\t\t\tdelete parsedTag.state;\n\t\t\t\tparsedTag.name = unescapeXml(parsedTag.name);\n\t\t\t\tdelete parsedTag[0];\n\t\t\t\tworkbook.Sheets.push(parsedTag);\n\t\t\t\tbreak;\n\n\t\t\tcase \"<definedName\": {\n\t\t\t\tdname = {};\n\t\t\t\tdname.Name = parsedTag.name;\n\t\t\t\tif (parsedTag.comment) {\n\t\t\t\t\tdname.Comment = parsedTag.comment;\n\t\t\t\t}\n\t\t\t\tif (parsedTag.localSheetId) {\n\t\t\t\t\tdname.Sheet = +parsedTag.localSheetId;\n\t\t\t\t}\n\t\t\t\tif (parseXmlBoolean(parsedTag.hidden || \"0\")) {\n\t\t\t\t\tdname.Hidden = true;\n\t\t\t\t}\n\t\t\t\t// Record position after the opening tag to extract the Ref content later\n\t\t\t\tdnstart = idx + xmlTag.length;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"</definedName>\": {\n\t\t\t\t// Extract the defined name reference formula from between open/close tags\n\t\t\t\tdname.Ref = unescapeXml(data.slice(dnstart, idx));\n\t\t\t\tworkbook.Names.push(dname);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"<calcPr\":\n\t\t\tcase \"<calcPr/>\":\n\t\t\t\tdelete parsedTag[0];\n\t\t\t\tworkbook.CalcPr = parsedTag;\n\t\t\t\tbreak;\n\t\t}\n\t\treturn xmlTag;\n\t});\n\n\tif (XMLNS_main.indexOf(workbook.xmlns) === -1) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unknown Namespace: \" + workbook.xmlns);\n\t}\n\n\tparse_wb_defaults(workbook);\n\n\treturn workbook;\n}\n\n/**\n * Write the workbook.xml containing the sheet list, defined names, and properties.\n *\n * @param wb - WorkBook to serialize\n * @returns Complete workbook.xml string\n */\nexport function writeWorkbookXml(wb: WorkBook): string {\n\tconst lines: string[] = [XML_HEADER];\n\tlines.push(\n\t\twriteXmlElement(\"workbook\", null, {\n\t\t\txmlns: XMLNS_main[0],\n\t\t\t\"xmlns:r\": XMLNS.r,\n\t\t}),\n\t);\n\n\tconst write_names = !!(wb.Workbook && (wb.Workbook.Names || []).length > 0);\n\n\tconst workbookPr: any = { codeName: \"ThisWorkbook\" };\n\tif (wb.Workbook && wb.Workbook.WBProps) {\n\t\t// Only write properties that differ from defaults\n\t\tWBPropsDef.forEach((x) => {\n\t\t\tif (!wb.Workbook || !wb.Workbook.WBProps) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst wbp = wb.Workbook.WBProps as any;\n\t\t\tif (wbp[x[0]] == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (wbp[x[0]] === x[1]) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tworkbookPr[x[0]] = wbp[x[0]];\n\t\t});\n\t\tif (wb.Workbook.WBProps.CodeName) {\n\t\t\tworkbookPr.codeName = wb.Workbook.WBProps.CodeName;\n\t\t\tdelete workbookPr.CodeName;\n\t\t}\n\t}\n\tlines.push(writeXmlElement(\"workbookPr\", null, workbookPr));\n\n\tconst sheets = (wb.Workbook && wb.Workbook.Sheets) || [];\n\n\t/* bookViews: only written if the first worksheet is hidden, to set activeTab to first visible sheet */\n\tif (sheets[0] && !!sheets[0].Hidden) {\n\t\tlines.push(\"<bookViews>\");\n\t\tlet i = 0;\n\t\tfor (i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tif (!sheets[i]) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!sheets[i].Hidden) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (i === wb.SheetNames.length) {\n\t\t\ti = 0;\n\t\t}\n\t\tlines.push('<workbookView firstSheet=\"' + i + '\" activeTab=\"' + i + '\"/>');\n\t\tlines.push(\"</bookViews>\");\n\t}\n\n\t// Sheet list\n\tlines.push(\"<sheets>\");\n\tfor (let i = 0; i < wb.SheetNames.length; ++i) {\n\t\tconst sht: any = { name: escapeXml(wb.SheetNames[i].slice(0, 31)) };\n\t\t// sheetId is 1-based\n\t\tsht.sheetId = \"\" + (i + 1);\n\t\tsht[\"r:id\"] = \"rId\" + (i + 1);\n\t\tif (sheets[i]) {\n\t\t\tswitch (sheets[i].Hidden) {\n\t\t\t\tcase 1:\n\t\t\t\t\tsht.state = \"hidden\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tsht.state = \"veryHidden\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tlines.push(writeXmlElement(\"sheet\", null, sht));\n\t}\n\tlines.push(\"</sheets>\");\n\n\t// Defined names\n\tif (write_names) {\n\t\tlines.push(\"<definedNames>\");\n\t\tif (wb.Workbook && wb.Workbook.Names) {\n\t\t\twb.Workbook.Names.forEach((n) => {\n\t\t\t\tconst d: any = { name: n.Name };\n\t\t\t\tif (n.Comment) {\n\t\t\t\t\td.comment = n.Comment;\n\t\t\t\t}\n\t\t\t\tif (n.Sheet != null) {\n\t\t\t\t\td.localSheetId = \"\" + n.Sheet;\n\t\t\t\t}\n\t\t\t\tif (n.Hidden) {\n\t\t\t\t\td.hidden = \"1\";\n\t\t\t\t}\n\t\t\t\tif (!n.Ref) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlines.push(writeXmlElement(\"definedName\", escapeXml(n.Ref), d));\n\t\t\t});\n\t\t}\n\t\tlines.push(\"</definedNames>\");\n\t}\n\n\tif (lines.length > 2) {\n\t\tlines.push(\"</workbook>\");\n\t\t// Convert self-closing <workbook .../> to opening tag <workbook ...>\n\t\tlines[1] = lines[1].replace(\"/>\", \">\");\n\t}\n\treturn lines.join(\"\");\n}\n","/** Number Format (either a format string like \"#,##0.00\" or an index into the format table) */\nexport type NumberFormat = string | number;\n\n/** Basic file properties from the OPC Core Properties part */\nexport interface Properties {\n\t/** Document title */\n\tTitle?: string;\n\t/** Document subject/description */\n\tSubject?: string;\n\t/** Primary author */\n\tAuthor?: string;\n\t/** Manager name */\n\tManager?: string;\n\t/** Company or organization */\n\tCompany?: string;\n\t/** Category for grouping */\n\tCategory?: string;\n\t/** Keywords / tags for search */\n\tKeywords?: string;\n\t/** Free-form comments or description */\n\tComments?: string;\n\t/** Most recent editor */\n\tLastAuthor?: string;\n\t/** Date the document was created */\n\tCreatedDate?: Date;\n}\n\n/** Extended file properties (combines Core Properties with App-specific metadata) */\nexport interface FullProperties extends Properties {\n\t/** Date the document was last modified */\n\tModifiedDate?: Date;\n\t/** Application that created the document (e.g. \"Microsoft Excel\") */\n\tApplication?: string;\n\t/** Version of the creating application */\n\tAppVersion?: string;\n\t/** Document security level (as a string code) */\n\tDocSecurity?: string;\n\t/** Whether hyperlinks were changed outside the document */\n\tHyperlinksChanged?: boolean;\n\t/** Whether this is a shared document */\n\tSharedDoc?: boolean;\n\t/** Whether links are up to date */\n\tLinksUpToDate?: boolean;\n\t/** Whether the thumbnail should be cropped to fit */\n\tScaleCrop?: boolean;\n\t/** Number of worksheets in the workbook */\n\tWorksheets?: number;\n\t/** List of worksheet names */\n\tSheetNames?: string[];\n\t/** Content status (e.g. \"Draft\", \"Final\") */\n\tContentStatus?: string;\n\t/** Date the document was last printed */\n\tLastPrinted?: string;\n\t/** Revision number */\n\tRevision?: string | number;\n\t/** Version string */\n\tVersion?: string;\n\t/** Unique document identifier */\n\tIdentifier?: string;\n\t/** Document language (e.g. \"en-US\") */\n\tLanguage?: string;\n}\n\n/** Options common to both reading and writing operations */\nexport interface CommonOptions {\n\t/** If true, throw errors on unexpected situations instead of silently recovering */\n\tWTF?: boolean;\n\t/** Reserved compatibility option. A true value is unsupported and throws XlsxError (\"UNSUPPORTED\"). */\n\tbookVBA?: boolean;\n\t/** If true, store dates as Date objects instead of serial numbers */\n\tcellDates?: boolean;\n\t/** If true, include stub cells for empty cells within the used range */\n\tsheetStubs?: boolean;\n\t/** If true, include style/theme information on cells */\n\tcellStyles?: boolean;\n\t/** Password for encrypted workbooks; non-empty values are unsupported and throw XlsxError (\"UNSUPPORTED\") */\n\tpassword?: string;\n}\n\n/** Cumulative worksheet work limit shared by import and export APIs. */\nexport interface WorksheetCellBudgetOptions {\n\t/**\n\t * Maximum cumulative cell work per sheet. This counts explicit cells plus\n\t * generated column, hyperlink, span, and export positions. XLSX reads default\n\t * to 10,000,000; exports default to 1,000,000.\n\t */\n\tmaxWorksheetCells?: number;\n}\n\n/** Options for reading/parsing workbook files */\nexport interface ReadOptions extends CommonOptions, WorksheetCellBudgetOptions {\n\t/** Input data type: \"base64\" for base64 string, \"buffer\" for Node Buffer, \"array\" for Uint8Array, \"string\" for plain text (CSV/HTML) */\n\ttype?: \"base64\" | \"buffer\" | \"array\" | \"string\";\n\t/** If true, parse and store cell formulas */\n\tcellFormula?: boolean;\n\t/** If true, generate HTML representation of rich text */\n\tcellHTML?: boolean;\n\t/** If true, store the number format string on each cell */\n\tcellNF?: boolean;\n\t/** If true, generate formatted text for each cell */\n\tcellText?: boolean;\n\t/** Override date format string (replaces default \"m/d/yy\" for format 14) */\n\tdateNF?: string;\n\t/** Maximum row position to retain per sheet (0 = all rows) */\n\tsheetRows?: number;\n\t/** Reserved compatibility option. A true value is unsupported and throws XlsxError (\"UNSUPPORTED\"). */\n\tbookDeps?: boolean;\n\t/** Reserved compatibility option. A true value is unsupported and throws XlsxError (\"UNSUPPORTED\"). */\n\tbookFiles?: boolean;\n\t/** If true, only parse workbook properties (skip sheet data) */\n\tbookProps?: boolean;\n\t/** If true, only parse sheet names (skip sheet data) */\n\tbookSheets?: boolean;\n\t/** Restrict parsing to specific sheets by index or name */\n\tsheets?: number | string | Array<number | string>;\n\t/** If true, ignore the stored worksheet dimension and recalculate the range from parsed cells, anchored at A1 */\n\tnodim?: boolean;\n\t/** Reserved compatibility option. A true value is unsupported and throws XlsxError (\"UNSUPPORTED\"). */\n\txlfn?: boolean;\n\t/** Field separator for plain-text input with type \"string\" (default: \",\"; use \"\\t\" for TSV) */\n\tFS?: string;\n\t/** If true, use dense (2D array) storage mode instead of sparse (object) mode */\n\tdense?: boolean;\n\t/** If true, all dates are interpreted as UTC (no timezone adjustment) */\n\tUTC?: boolean;\n\t/** Maximum number of ZIP central-directory entries to parse */\n\tmaxZipEntries?: number;\n\t/** Maximum total uncompressed ZIP payload size across file entries */\n\tmaxTotalUncompressedBytes?: number;\n\t/** Maximum uncompressed ZIP payload size for a single file entry */\n\tmaxEntryUncompressedBytes?: number;\n\t/** Maximum decoded XML part size */\n\tmaxXmlPartBytes?: number;\n\t/** Maximum number of raw XML tags in a single XML part */\n\tmaxXmlTags?: number;\n\t/** Maximum XML element nesting depth in a single XML part */\n\tmaxXmlNestingDepth?: number;\n\t/** Maximum number of characters in a single XML tag */\n\tmaxXmlTagLength?: number;\n\t/** Maximum number of attributes in a single XML tag */\n\tmaxXmlAttributesPerTag?: number;\n\t/** Maximum number of shared string entries to parse */\n\tmaxSharedStringItems?: number;\n\t/** Maximum number of worksheet row elements or text records to scan */\n\tmaxWorksheetRows?: number;\n}\n\n/** Options for writing/serializing workbook files */\nexport interface WriteOptions extends CommonOptions, Sheet2CSVOpts, Sheet2HTMLOpts {\n\t/** Output data type: \"base64\" for base64 string, \"buffer\" for Node Buffer, \"array\" for Uint8Array, \"string\" for plain text */\n\ttype?: \"base64\" | \"buffer\" | \"array\" | \"string\";\n\t/** Output file format (default: \"xlsx\") */\n\tbookType?: \"xlsx\" | \"xlsm\" | \"csv\" | \"tsv\" | \"html\";\n\t/** If true, generate a Shared Strings Table for string deduplication */\n\tbookSST?: boolean;\n\t/** If true, compress (deflate) ZIP entries */\n\tcompression?: boolean;\n\t/** Reserved compatibility option. A non-empty value is unsupported and throws XlsxError (\"UNSUPPORTED\"). */\n\tthemeXLSX?: string;\n\t/** If true, skip error-checking in the output */\n\tignoreEC?: boolean;\n\t/** File properties to embed in the output */\n\tProps?: Properties;\n}\n\n/**\n * Excel data type codes for cell values.\n * - \"b\": Boolean\n * - \"n\": Number\n * - \"e\": Error\n * - \"s\": String\n * - \"d\": Date\n * - \"z\": Empty/stub cell\n */\nexport type ExcelDataType = \"b\" | \"n\" | \"e\" | \"s\" | \"d\" | \"z\";\n\n/** A single comment entry within a cell's comment thread */\nexport interface Comment {\n\t/** Author of the comment */\n\ta?: string;\n\t/** Comment text content */\n\tt: string;\n\t/** If true, the comment is a threaded reply (Excel 365+) */\n\tT?: boolean;\n}\n\n/** Array of comments attached to a cell, with optional visibility flag */\nexport interface Comments extends Array<Comment> {\n\t/** If true, the comment indicator is hidden */\n\thidden?: boolean;\n}\n\n/** Hyperlink target and optional tooltip */\nexport interface Hyperlink {\n\t/** URL or cell reference target */\n\tTarget: string;\n\t/** Hover tooltip text */\n\tTooltip?: string;\n}\n\n/** RGB/ARGB color descriptor used in cell styles */\nexport interface StyleColor {\n\t/** 6-digit RGB color or 8-digit ARGB color */\n\trgb?: string;\n\t/** 8-digit ARGB color, ExcelJS-compatible */\n\targb?: string;\n}\n\n/** Font style properties for a cell */\nexport interface CellFont {\n\t/** Font family name */\n\tname?: string;\n\t/** Font size in points */\n\tsize?: number;\n\t/** If true, use bold weight */\n\tbold?: boolean;\n\t/** Font color */\n\tcolor?: StyleColor;\n}\n\n/** Fill style properties for a cell */\nexport interface CellFill {\n\t/** Pattern fill type. Only \"solid\" is currently written. */\n\tpatternType?: \"solid\";\n\t/** Foreground fill color */\n\tfgColor?: StyleColor;\n}\n\n/** Supported cell border line styles */\nexport type CellBorderStyle = \"thin\" | \"medium\";\n\n/** Border side descriptor */\nexport interface CellBorderSide {\n\t/** Border line style */\n\tstyle: CellBorderStyle;\n\t/** Border line color */\n\tcolor?: StyleColor;\n}\n\n/** Border style properties for a cell */\nexport interface CellBorder {\n\ttop?: CellBorderSide;\n\tright?: CellBorderSide;\n\tbottom?: CellBorderSide;\n\tleft?: CellBorderSide;\n}\n\n/** Cell alignment properties */\nexport interface CellAlignment {\n\thorizontal?: \"left\" | \"center\" | \"right\";\n\tvertical?: \"top\" | \"middle\" | \"bottom\";\n\twrapText?: boolean;\n}\n\n/** Serializable XLSX cell style */\nexport interface CellStyle {\n\tfont?: CellFont;\n\tfill?: CellFill;\n\tborder?: CellBorder;\n\talignment?: CellAlignment;\n\t/** Number format string or built-in format ID */\n\tnumFmt?: NumberFormat;\n}\n\n/** Worksheet Cell Object containing value, format, formula, and metadata */\nexport interface CellObject {\n\t/** Raw cell value (string, number, boolean, or Date) */\n\tv?: string | number | boolean | Date;\n\t/** Formatted text representation of the cell value */\n\tw?: string;\n\t/** Cell data type code */\n\tt: ExcelDataType;\n\t/** Cell formula string (without leading \"=\") */\n\tf?: string;\n\t/** Range of a shared/array formula (e.g. \"A1:B2\") */\n\tF?: string;\n\t/** If true, the formula is a dynamic array formula */\n\tD?: boolean;\n\t/** Rich text / XML representation */\n\tr?: any;\n\t/** HTML rendering of the cell (when cellHTML option is enabled) */\n\th?: string;\n\t/** Comments attached to this cell */\n\tc?: Comments;\n\t/** Number format string or index */\n\tz?: NumberFormat;\n\t/** Hyperlink on this cell */\n\tl?: Hyperlink;\n\t/** Style object (when cellStyles option is enabled) */\n\ts?: CellStyle;\n\t/** Raw XF (extended format) record data */\n\tXF?: {\n\t\tnumFmtId?: number;\n\t\t/** Resolved number format retained from the source workbook */\n\t\tnumFmt?: NumberFormat;\n\t};\n}\n\n/** Zero-based cell address with column (c) and row (r) indices */\nexport interface CellAddress {\n\t/** Zero-based column index */\n\tc: number;\n\t/** Zero-based row index */\n\tr: number;\n}\n\n/** Range defined by start (s) and end (e) cell addresses */\nexport interface Range {\n\t/** Start (top-left) cell address */\n\ts: CellAddress;\n\t/** End (bottom-right) cell address */\n\te: CellAddress;\n}\n\n/** Column properties for worksheet column metadata */\nexport interface ColInfo {\n\t/** If true, column is hidden */\n\thidden?: boolean;\n\t/** Column width in \"Max Digit Width\" units (Excel internal) */\n\twidth?: number;\n\t/** Column width in pixels */\n\twpx?: number;\n\t/** Column width in characters */\n\twch?: number;\n\t/** Outline / grouping level (0-7) */\n\tlevel?: number;\n\t/** Maximum Digit Width in pixels (used for width calculations) */\n\tMDW?: number;\n}\n\n/** Row properties for worksheet row metadata */\nexport interface RowInfo {\n\t/** If true, row is hidden */\n\thidden?: boolean;\n\t/** Row height in pixels */\n\thpx?: number;\n\t/** Row height in points */\n\thpt?: number;\n\t/** Outline / grouping level (0-7) */\n\tlevel?: number;\n}\n\n/** Sheet protection settings controlling what users can do on a protected sheet */\nexport interface ProtectInfo {\n\t/** Password hash for sheet protection */\n\tpassword?: string;\n\t/** If true, users can select locked cells */\n\tselectLockedCells?: boolean;\n\t/** If true, users can select unlocked cells */\n\tselectUnlockedCells?: boolean;\n\t/** If true, users can format cells */\n\tformatCells?: boolean;\n\t/** If true, users can format columns */\n\tformatColumns?: boolean;\n\t/** If true, users can format rows */\n\tformatRows?: boolean;\n\t/** If true, users can insert columns */\n\tinsertColumns?: boolean;\n\t/** If true, users can insert rows */\n\tinsertRows?: boolean;\n\t/** If true, users can insert hyperlinks */\n\tinsertHyperlinks?: boolean;\n\t/** If true, users can delete columns */\n\tdeleteColumns?: boolean;\n\t/** If true, users can delete rows */\n\tdeleteRows?: boolean;\n\t/** If true, users can sort */\n\tsort?: boolean;\n\t/** If true, users can use autofilter */\n\tautoFilter?: boolean;\n\t/** If true, users can use pivot tables */\n\tpivotTables?: boolean;\n\t/** If true, users can edit objects (charts, shapes, etc.) */\n\tobjects?: boolean;\n\t/** If true, users can edit scenarios */\n\tscenarios?: boolean;\n}\n\n/** Page margin settings in inches */\nexport interface MarginInfo {\n\t/** Left margin */\n\tleft?: number;\n\t/** Right margin */\n\tright?: number;\n\t/** Top margin */\n\ttop?: number;\n\t/** Bottom margin */\n\tbottom?: number;\n\t/** Header margin (distance from top of page) */\n\theader?: number;\n\t/** Footer margin (distance from bottom of page) */\n\tfooter?: number;\n}\n\n/** AutoFilter definition for a worksheet */\nexport interface AutoFilterInfo {\n\t/** Range reference for the autofilter area (e.g. \"A1:D10\") */\n\tref: string;\n}\n\n/** Frozen pane / sheet view metadata */\nexport interface SheetView {\n\t/** Sheet view state. Only \"frozen\" is currently written. */\n\tstate?: \"frozen\";\n\t/** Number of columns frozen from the left */\n\txSplit?: number;\n\t/** Number of rows frozen from the top */\n\tySplit?: number;\n\t/** Top-left visible cell in the scrollable pane */\n\ttopLeftCell?: string;\n\t/** Active pane name */\n\tactivePane?: \"topRight\" | \"bottomLeft\" | \"bottomRight\";\n}\n\n/** Dense (2D array) storage for worksheet data: rows of columns of optional cells */\nexport type DenseSheetData = ((CellObject | undefined)[] | undefined)[];\n\n/**\n * Base sheet object supporting both sparse and dense storage modes.\n *\n * In sparse mode, cells are stored as properties keyed by A1 references (e.g. sheet[\"A1\"]).\n * In dense mode, cells are stored in the \"!data\" 2D array.\n */\nexport interface Sheet {\n\t/** Sparse cell storage: cells keyed by A1-style references */\n\t[cell: string]: any;\n\t/** Dense cell storage: 2D array indexed by [row][col] */\n\t\"!data\"?: DenseSheetData;\n\t/** Sheet type: \"sheet\" for worksheets, \"chart\" for chart sheets */\n\t\"!type\"?: \"sheet\" | \"chart\";\n\t/** Used range reference (e.g. \"A1:D10\") */\n\t\"!ref\"?: string;\n\t/** Page margin settings */\n\t\"!margins\"?: MarginInfo;\n}\n\n/** Worksheet object with column, row, merge, protection, and filter metadata */\nexport interface WorkSheet extends Sheet {\n\t/** Column properties array (index corresponds to column index) */\n\t\"!cols\"?: ColInfo[];\n\t/** Row properties array (index corresponds to row index) */\n\t\"!rows\"?: RowInfo[];\n\t/** Array of merged cell ranges */\n\t\"!merges\"?: Range[];\n\t/** Sheet view definitions such as frozen panes */\n\t\"!views\"?: SheetView[];\n\t/** Sheet protection settings */\n\t\"!protect\"?: ProtectInfo;\n\t/** AutoFilter definition */\n\t\"!autofilter\"?: AutoFilterInfo;\n}\n\n/** Properties of a single sheet within the workbook */\nexport interface SheetProps {\n\t/** Sheet tab name */\n\tname?: string;\n\t/** Visibility: 0 = visible, 1 = hidden, 2 = very hidden (only accessible via VBA) */\n\tHidden?: 0 | 1 | 2;\n\t/** VBA codename for the sheet module */\n\tCodeName?: string;\n}\n\n/** Defined Name (named range or named formula) */\nexport interface DefinedName {\n\t/** Name identifier (e.g. \"MyRange\") */\n\tName: string;\n\t/** Reference formula (e.g. \"Sheet1!$A$1:$B$10\") */\n\tRef: string;\n\t/** Sheet index this name is scoped to (undefined = workbook-scoped) */\n\tSheet?: number;\n\t/** Descriptive comment */\n\tComment?: string;\n\t/** If true, name is hidden from the UI */\n\tHidden?: boolean;\n}\n\n/** Workbook view settings */\nexport interface WBView {\n\t/** If true, the workbook uses right-to-left layout */\n\tRTL?: boolean;\n}\n\n/** Workbook-level calculation and date system properties */\nexport interface WorkbookProperties {\n\t/** If true, use the 1904 date system (common in Mac Excel). Default is 1900 system. */\n\tdate1904?: boolean;\n\t/** If true, personal information is stripped on save */\n\tfilterPrivacy?: boolean;\n\t/** VBA codename for the workbook module */\n\tCodeName?: string;\n}\n\n/** Workbook-level attributes (sheets, names, views, properties) */\nexport interface WBProps {\n\t/** Sheet metadata array */\n\tSheets?: SheetProps[];\n\t/** Defined names (named ranges, named formulas) */\n\tNames?: DefinedName[];\n\t/** Workbook view configurations */\n\tViews?: WBView[];\n\t/** Workbook-level properties (date system, etc.) */\n\tWBProps?: WorkbookProperties;\n}\n\n/** Top-level Workbook object containing all sheets, properties, and metadata */\nexport interface WorkBook {\n\t/** Map of sheet names to WorkSheet objects */\n\tSheets: Record<string, WorkSheet>;\n\t/** Ordered list of sheet names (determines tab order) */\n\tSheetNames: string[];\n\t/** File and document properties */\n\tProps?: FullProperties;\n\t/** Custom document properties (arbitrary key-value pairs) */\n\tCustprops?: Record<string, any>;\n\t/** Workbook-level attributes (names, views, sheet props) */\n\tWorkbook?: WBProps;\n\t/** Reserved compatibility field. Writing a non-empty VBA payload throws XlsxError (\"UNSUPPORTED\"). */\n\tvbaraw?: any;\n\t/** File format type identifier */\n\tbookType?: string;\n}\n\n/** Result returned when read() is called with bookSheets enabled. */\nexport interface BookSheetsResult {\n\t/** Ordered worksheet names. XLSX worksheet data is skipped; plain-text input is parsed before projection. */\n\tSheetNames: string[];\n}\n\n/** Result returned when read() is called with bookProps enabled. */\nexport interface BookPropsResult {\n\t/** File and document properties. */\n\tProps: FullProperties;\n\t/** Custom document properties. */\n\tCustprops: Record<string, unknown>;\n}\n\n/** Result returned when read() requests both sheet names and properties. */\nexport interface BookSheetsAndPropsResult extends BookSheetsResult, BookPropsResult {}\n\n/** All runtime result shapes available from read(). Exact option literals narrow this union. */\nexport type ReadResult = WorkBook | BookSheetsResult | BookPropsResult | BookSheetsAndPropsResult;\n\n/** Portable output from write(). Node.js Buffer values are represented by their Uint8Array base type. */\nexport type WriteResult = string | Uint8Array;\n\n/** Options for converting a worksheet to CSV */\nexport interface Sheet2CSVOpts extends WorksheetCellBudgetOptions {\n\t/** Field separator (default: \",\") */\n\tFS?: string;\n\t/** Record separator / row delimiter (default: \"\\n\") */\n\tRS?: string;\n\t/** If true, strip trailing field separators from each row */\n\tstrip?: boolean;\n\t/** If true, include blank rows (default: true) */\n\tblankrows?: boolean;\n\t/** If true, skip hidden rows and columns */\n\tskipHidden?: boolean;\n\t/** If true, wrap all fields in quotes */\n\tforceQuotes?: boolean;\n\t/** If true, emit raw numeric values instead of formatted text */\n\trawNumbers?: boolean;\n\t/** If not false, prefix formula-like text fields with a single quote */\n\tescapeFormulae?: boolean;\n\t/** Override date format for date cells */\n\tdateNF?: NumberFormat;\n\t/** If \"iso\", emit date/datetime cells as machine-readable ISO-like strings */\n\tdateOutput?: \"iso\";\n\t/** If true, interpret dates as UTC */\n\tUTC?: boolean;\n\t/** If true, use 1904 date system for date serial numbers */\n\tdate1904?: boolean;\n}\n\n/** Options for converting a worksheet to an HTML table string */\nexport interface Sheet2HTMLOpts extends WorksheetCellBudgetOptions {\n\t/** HTML id attribute for the table element */\n\tid?: string;\n\t/** If true, add contenteditable attribute to cells */\n\teditable?: boolean;\n\t/** HTML to prepend before the table */\n\theader?: string;\n\t/** HTML to append after the table */\n\tfooter?: string;\n\t/** If not false, sanitize hyperlink targets to prevent XSS */\n\tsanitizeLinks?: boolean;\n}\n\n/** Options for converting a worksheet to an array of JSON objects */\nexport interface Sheet2JSONOpts extends WorksheetCellBudgetOptions {\n\t/** \"A\" for column-letter keys, number for 1-indexed row keys, string[] for custom headers */\n\theader?: \"A\" | number | string[];\n\t/** Restrict output to a specific range (Range object, A1 string, or row number) */\n\trange?: any;\n\t/** If true, include blank rows in output */\n\tblankrows?: boolean;\n\t/** Default value for missing cells */\n\tdefval?: any;\n\t/** If true, use raw values (v) instead of formatted text (w) */\n\traw?: boolean;\n\t/** If true, skip hidden rows and columns */\n\tskipHidden?: boolean;\n\t/** If true, emit raw numeric values for non-date number cells */\n\trawNumbers?: boolean;\n\t/** If true, interpret dates as UTC */\n\tUTC?: boolean;\n\t/** Override date format for date cells */\n\tdateNF?: NumberFormat;\n\t/** If \"iso\", emit date/datetime cells as machine-readable ISO-like strings */\n\tdateOutput?: \"iso\";\n\t/** If true, use 1904 date system for date serial numbers */\n\tdate1904?: boolean;\n}\n\n/** Options for parsing CSV text into a worksheet. */\nexport interface CSV2SheetOpts extends WorksheetCellBudgetOptions {\n\t/** Field separator (default: \",\") */\n\tFS?: string;\n\t/** Maximum row position to retain (0 = all rows) */\n\tsheetRows?: number;\n\t/** Maximum number of CSV records to scan */\n\tmaxWorksheetRows?: number;\n}\n\n/** Options for parsing an HTML table into a worksheet. */\nexport interface HTML2SheetOpts extends WorksheetCellBudgetOptions {\n\t/** Maximum row position to retain (0 = all rows) */\n\tsheetRows?: number;\n\t/** Maximum number of HTML table rows to scan */\n\tmaxWorksheetRows?: number;\n}\n\n/** Options for extracting formulas from a worksheet. */\nexport type Sheet2FormulaeOpts = WorksheetCellBudgetOptions;\n\n/** Options for creating a worksheet from a 2D array (Array of Arrays) */\nexport interface AOA2SheetOpts extends CommonOptions {\n\t/** If true, use dense (2D array) storage mode */\n\tdense?: boolean;\n\t/** If true, include stub cells for null/undefined values */\n\tsheetStubs?: boolean;\n\t/** Date format string for date cells */\n\tdateNF?: NumberFormat;\n\t/** If true, store dates as Date objects instead of serial numbers */\n\tcellDates?: boolean;\n\t/** If true, interpret dates as UTC */\n\tUTC?: boolean;\n\t/** If true, use 1904 date system for date serial numbers */\n\tdate1904?: boolean;\n\t/** Starting cell for data: row number, A1 reference, or CellAddress */\n\torigin?: number | string | CellAddress;\n\t/** If true, convert null values to #NULL! error cells */\n\tnullError?: boolean;\n}\n\n/** Options for creating a worksheet from an array of JSON objects */\nexport interface JSON2SheetOpts extends CommonOptions {\n\t/** Explicit header row keys (overrides object key order) */\n\theader?: string[];\n\t/** If true, do not emit a header row */\n\tskipHeader?: boolean;\n\t/** If true, use dense (2D array) storage mode */\n\tdense?: boolean;\n\t/** Date format string for date cells */\n\tdateNF?: NumberFormat;\n\t/** If true, store dates as Date objects instead of serial numbers */\n\tcellDates?: boolean;\n\t/** If true, interpret dates as UTC */\n\tUTC?: boolean;\n\t/** If true, use 1904 date system for date serial numbers */\n\tdate1904?: boolean;\n\t/** Starting cell for data: row number, A1 reference, or CellAddress */\n\torigin?: number | string | CellAddress;\n\t/** If true, convert null values to #NULL! error cells */\n\tnullError?: boolean;\n}\n\n/**\n * Map of Excel error codes to their display strings.\n * Keys are the numeric error codes stored in XLSX files.\n */\nexport const BErr: Record<number, string> = {\n\t0x00: \"#NULL!\",\n\t0x07: \"#DIV/0!\",\n\t0x0f: \"#VALUE!\",\n\t0x17: \"#REF!\",\n\t0x1d: \"#NAME?\",\n\t0x24: \"#NUM!\",\n\t0x2a: \"#N/A\",\n\t0x2b: \"#GETTING_DATA\",\n};\n\n/** Reverse map from error display strings to numeric error codes */\nexport const RBErr: Record<string, number> = {};\nfor (const [k, v] of Object.entries(BErr)) {\n\tRBErr[v] = +k;\n}\n","import type { CellAddress, CellObject, Range, WorkSheet } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\n\n/**\n * Decode a row string (1-based) to a zero-based row index.\n * @param rowstr - Row string, possibly with a \"$\" absolute marker (e.g. \"5\" or \"$5\")\n * @returns Zero-based row index\n */\nexport function decodeRow(rowstr: string): number {\n\treturn parseInt(removeRowAbsolute(rowstr), 10) - 1;\n}\n\n/**\n * Encode a zero-based row index to a 1-based row string.\n * @param row - Zero-based row index\n * @returns 1-based row string (e.g. \"1\" for row index 0)\n */\nexport function encodeRow(row: number): string {\n\treturn \"\" + (row + 1);\n}\n\n/**\n * Make the row portion of a cell reference absolute by prefixing \"$\".\n * @param cstr - Cell reference string (e.g. \"A5\")\n * @returns Cell reference with absolute row (e.g. \"A$5\")\n */\nexport function makeRowAbsolute(cstr: string): string {\n\treturn cstr.replace(/([A-Z]|^)(\\d+)$/, \"$1$$$2\");\n}\n\n/**\n * Remove the \"$\" absolute marker from the row portion of a cell reference.\n * @param cstr - Cell reference string (e.g. \"A$5\")\n * @returns Cell reference with relative row (e.g. \"A5\")\n */\nexport function removeRowAbsolute(cstr: string): string {\n\treturn cstr.replace(/\\$(\\d+)$/, \"$1\");\n}\n\n/**\n * Decode a column label (e.g. \"A\", \"AA\") to a zero-based column index.\n *\n * Treats column letters as a base-26 number where A=1, B=2, ..., Z=26.\n *\n * @param colstr - Column label string, possibly with \"$\" prefix\n * @returns Zero-based column index (A=0, B=1, ..., Z=25, AA=26, ...)\n */\nexport function decodeCol(colstr: string): number {\n\tconst c = removeColAbsolute(colstr);\n\tlet d = 0;\n\tfor (let i = 0; i < c.length; ++i) {\n\t\t// 'A' is charCode 65; subtract 64 so A=1, B=2, ..., Z=26\n\t\td = 26 * d + c.charCodeAt(i) - 64;\n\t}\n\treturn d - 1;\n}\n\n/**\n * Encode a zero-based column index to an Excel column label (A, B, ..., Z, AA, AB, ...).\n *\n * Uses bijective base-26 numeration: col 0 = \"A\", col 25 = \"Z\", col 26 = \"AA\".\n *\n * @param col - Zero-based column index\n * @returns Column label string\n * @throws XlsxError if col is negative\n */\nexport function encodeCol(col: number): string {\n\tif (col < 0) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"invalid column \" + col);\n\t}\n\tlet result = \"\";\n\t// Convert to 1-based, then repeatedly extract bijective base-26 digits\n\tfor (++col; col; col = Math.floor((col - 1) / 26)) {\n\t\t// 65 = 'A'; ((col - 1) % 26) gives 0-25 for A-Z\n\t\tresult = String.fromCharCode(((col - 1) % 26) + 65) + result;\n\t}\n\treturn result;\n}\n\n/**\n * Make the column portion of a cell reference absolute by prefixing \"$\".\n * @param cstr - Cell reference string (e.g. \"A5\")\n * @returns Cell reference with absolute column (e.g. \"$A5\")\n */\nexport function makeColAbsolute(cstr: string): string {\n\treturn cstr.replace(/^([A-Z])/, \"$$$1\");\n}\n\n/**\n * Remove the \"$\" absolute marker from the column portion of a cell reference.\n * @param cstr - Cell reference string (e.g. \"$A5\")\n * @returns Cell reference with relative column (e.g. \"A5\")\n */\nexport function removeColAbsolute(cstr: string): string {\n\treturn cstr.replace(/^\\$([A-Z])/, \"$1\");\n}\n\n/**\n * Split a cell reference into its column and row parts.\n * @param cstr - Cell reference string (e.g. \"A1\", \"$B$2\")\n * @returns Two-element array: [column part, row part]\n */\nexport function splitCellReference(cstr: string): string[] {\n\treturn cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/, \"$1,$2\").split(\",\");\n}\n\n/**\n * Decode an A1-style cell reference to a numeric {c, r} address (zero-based).\n *\n * Hand-optimized parser that processes characters by charCode for performance:\n * digits (48-57) accumulate into the row, uppercase letters (65-90) into the column.\n *\n * @param cstr - Cell reference string (e.g. \"A1\", \"AB12\")\n * @returns Zero-based cell address {c: column, r: row}\n */\nexport function decodeCell(cstr: string): CellAddress {\n\tlet R = 0,\n\t\tC = 0;\n\tfor (let i = 0; i < cstr.length; ++i) {\n\t\tconst charCode = cstr.charCodeAt(i);\n\t\tif (charCode >= 48 && charCode <= 57) {\n\t\t\t// '0'-'9': accumulate row number\n\t\t\tR = 10 * R + (charCode - 48);\n\t\t} else if (charCode >= 65 && charCode <= 90) {\n\t\t\t// 'A'-'Z': accumulate column in base-26 (A=1)\n\t\t\tC = 26 * C + (charCode - 64);\n\t\t}\n\t}\n\t// Convert from 1-based to 0-based\n\treturn { c: C - 1, r: R - 1 };\n}\n\n/**\n * Encode a zero-based {c, r} cell address to an A1-style reference string.\n * @param cell - Zero-based cell address\n * @returns A1-style cell reference (e.g. \"A1\" for {c:0, r:0})\n */\nexport function encodeCell(cell: CellAddress): string {\n\tlet col = cell.c + 1;\n\tlet result = \"\";\n\t// Bijective base-26 conversion; `| 0` is a fast Math.floor for positive numbers\n\tfor (; col; col = ((col - 1) / 26) | 0) {\n\t\tresult = String.fromCharCode(((col - 1) % 26) + 65) + result;\n\t}\n\treturn result + (cell.r + 1);\n}\n\n/**\n * Decode a range string (e.g. \"A1:B2\") to a Range object with start and end addresses.\n *\n * If no colon is present, the range is a single cell (start equals end).\n *\n * @param range - Range string in A1 notation\n * @returns Range object with start (s) and end (e) addresses\n */\nexport function decodeRange(range: string): Range {\n\tconst idx = range.indexOf(\":\");\n\tif (idx === -1) {\n\t\treturn { s: decodeCell(range), e: decodeCell(range) };\n\t}\n\treturn { s: decodeCell(range.slice(0, idx)), e: decodeCell(range.slice(idx + 1)) };\n}\n\n/**\n * Encode a Range or pair of CellAddresses to an A1:B2 range string.\n *\n * Can be called as:\n * - `encodeRange(range)` with a Range object\n * - `encodeRange(start, end)` with two CellAddress objects\n *\n * If start and end are the same cell, returns a single cell reference (no colon).\n *\n * @param cs - A Range object, or the start CellAddress\n * @param ce - Optional end CellAddress (when cs is a CellAddress)\n * @returns Range string in A1 notation (e.g. \"A1:B2\" or \"A1\")\n */\nexport function encodeRange(cs: CellAddress | Range, ce?: CellAddress): string {\n\tif (ce === undefined || typeof ce === \"number\") {\n\t\treturn encodeRange((cs as Range).s, (cs as Range).e);\n\t}\n\tconst s = typeof cs === \"string\" ? cs : encodeCell(cs as CellAddress);\n\tconst e = typeof ce === \"string\" ? ce : encodeCell(ce);\n\treturn s === e ? s : s + \":\" + e;\n}\n\n/**\n * Performance-optimized range decoder that parses directly by charCode.\n *\n * Unlike {@link decodeRange}, this avoids creating intermediate strings/objects.\n * Used on hot paths where many ranges must be parsed quickly.\n *\n * @param range - Range string in A1 notation (e.g. \"A1:B2\")\n * @returns Range object with start (s) and end (e) addresses (zero-based)\n */\nexport function safeDecodeRange(range: string): Range {\n\tconst result = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };\n\tlet idx = 0,\n\t\ti = 0,\n\t\tcharCode = 0;\n\tconst len = range.length;\n\n\t// Parse start column letters (A-Z are charCodes 65-90, subtract 64 for base-26)\n\tfor (idx = 0; i < len; ++i) {\n\t\tif ((charCode = range.charCodeAt(i) - 64) < 1 || charCode > 26) {\n\t\t\tbreak;\n\t\t}\n\t\tidx = 26 * idx + charCode;\n\t}\n\tresult.s.c = --idx;\n\n\t// Parse start row digits (0-9 are charCodes 48-57, subtract 48)\n\tfor (idx = 0; i < len; ++i) {\n\t\tif ((charCode = range.charCodeAt(i) - 48) < 0 || charCode > 9) {\n\t\t\tbreak;\n\t\t}\n\t\tidx = 10 * idx + charCode;\n\t}\n\tresult.s.r = --idx;\n\n\t// charCode 10 corresponds to ':' - 48 = 10 (i.e. ':' has charCode 58)\n\tif (i === len || charCode !== 10) {\n\t\tresult.e.c = result.s.c;\n\t\tresult.e.r = result.s.r;\n\t\treturn result;\n\t}\n\t++i;\n\n\t// Parse end column letters\n\tfor (idx = 0; i !== len; ++i) {\n\t\tif ((charCode = range.charCodeAt(i) - 64) < 1 || charCode > 26) {\n\t\t\tbreak;\n\t\t}\n\t\tidx = 26 * idx + charCode;\n\t}\n\tresult.e.c = --idx;\n\n\t// Parse end row digits\n\tfor (idx = 0; i !== len; ++i) {\n\t\tif ((charCode = range.charCodeAt(i) - 48) < 0 || charCode > 9) {\n\t\t\tbreak;\n\t\t}\n\t\tidx = 10 * idx + charCode;\n\t}\n\tresult.e.r = --idx;\n\treturn result;\n}\n\n/** Retrieve a cell from a worksheet, handling both dense (array) and sparse (object) storage. */\nexport function getCell(sheet: WorkSheet, row: number, col: number): CellObject | undefined {\n\tconst data = sheet[\"!data\"];\n\tif (data != null) {\n\t\treturn data[row]?.[col];\n\t}\n\treturn sheet[encodeCol(col) + encodeRow(row)] as CellObject | undefined;\n}\n\n/** Store a cell in a worksheet, handling both dense and sparse storage. */\nexport function setCell(sheet: WorkSheet, row: number, col: number, cell: CellObject): CellObject {\n\tconst data = sheet[\"!data\"];\n\tif (data != null) {\n\t\tif (!data[row]) {\n\t\t\tdata[row] = [];\n\t\t}\n\t\tdata[row][col] = cell;\n\t\treturn cell;\n\t}\n\tsheet[encodeCell({ r: row, c: col })] = cell;\n\treturn cell;\n}\n\n/** Retrieve a cell or create a blank stub cell at the requested position. */\nexport function getOrCreateCell(sheet: WorkSheet, row: number, col: number): CellObject {\n\treturn getCell(sheet, row, col) || setCell(sheet, row, col, { t: \"z\" });\n}\n\n/**\n * Quote a sheet name for safe use in formulas (e.g. \"'Sheet 1'!A1\").\n *\n * Wraps the name in single quotes if it contains characters outside\n * word characters, CJK unified ideographs, or Japanese Hiragana/Katakana.\n * Single quotes within the name are escaped by doubling ('').\n *\n * @param sname - Sheet name to quote\n * @returns Quoted sheet name safe for formula references\n * @throws XlsxError if the sheet name is empty\n */\nexport function quoteSheetName(sname: string): string {\n\tif (!sname) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"empty sheet name\");\n\t}\n\t// Match any character not in: word chars, CJK Unified Ideographs (4E00-9FFF), Hiragana/Katakana (3040-30FF)\n\tif (/[^\\w\\u4E00-\\u9FFF\\u3040-\\u30FF]/.test(sname)) {\n\t\treturn \"'\" + sname.replace(/'/g, \"''\") + \"'\";\n\t}\n\treturn sname;\n}\n","/**\n * Convert a JavaScript Date to an Excel serial date number.\n *\n * Excel serial dates in the 1900 date system can be mapped to real JavaScript\n * dates with the 1899-12-30 epoch. This preserves modern Excel serials such as\n * 45292 -> 2024-01-01 while avoiding a representational value for Excel's\n * fictitious 1900-02-29.\n *\n * @param v - JavaScript Date to convert\n * @param date1904 - If true, use the 1904 date system (Mac Excel default), which shifts the epoch by 1462 days\n * @returns Excel serial date number\n */\nexport function dateToSerialNumber(v: Date, date1904?: boolean): number {\n\tconst epoch = v.getTime();\n\tif (date1904) {\n\t\tconst date1904Epoch = Date.UTC(1904, 0, 1, 0, 0, 0);\n\t\treturn (epoch - date1904Epoch) / (24 * 60 * 60 * 1000);\n\t}\n\t// Excel epoch: 1899-12-30T00:00:00Z (Dec 30, 1899)\n\tconst dnthresh = Date.UTC(1899, 11, 30, 0, 0, 0);\n\treturn (epoch - dnthresh) / (24 * 60 * 60 * 1000);\n}\n\n/**\n * Convert an Excel serial date number to a JavaScript Date.\n *\n * Reverses the conversion done by {@link dateToSerialNumber}. The SSF display\n * formatter represents Excel's fictitious serial 60 separately; this helper\n * returns real JavaScript Dates for machine-readable conversion paths.\n *\n * @param v - Excel serial date number\n * @param date1904 - If true, use the 1904 date system (adds 1462 days)\n * @returns JavaScript Date corresponding to the serial number\n */\nexport function serialNumberToDate(v: number, date1904?: boolean): Date {\n\tif (date1904) {\n\t\tconst date1904Epoch = Date.UTC(1904, 0, 1, 0, 0, 0);\n\t\treturn new Date(date1904Epoch + v * 24 * 60 * 60 * 1000);\n\t}\n\t// Excel epoch: 1899-12-30T00:00:00Z\n\tconst dnthresh = Date.UTC(1899, 11, 30, 0, 0, 0);\n\treturn new Date(dnthresh + v * 24 * 60 * 60 * 1000);\n}\n\n/**\n * Shift a local Date to UTC by adding the timezone offset.\n *\n * Useful when a Date was constructed from local-time components but\n * needs to be treated as a UTC timestamp.\n *\n * @param d - Date in local time\n * @returns New Date shifted to represent the same wall-clock time in UTC\n */\nexport function localToUtc(d: Date): Date {\n\tconst off = d.getTimezoneOffset();\n\treturn new Date(d.getTime() + off * 60 * 1000);\n}\n\n/**\n * Shift a UTC Date to local time by subtracting the timezone offset.\n *\n * The inverse of {@link localToUtc}.\n *\n * @param d - Date in UTC\n * @returns New Date shifted to represent the same wall-clock time in local time\n */\nexport function utcToLocal(d: Date): Date {\n\tconst off = d.getTimezoneOffset();\n\treturn new Date(d.getTime() - off * 60 * 1000);\n}\n","/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* Ported to TypeScript for xlsx-format. 1:1 faithful port. */\n\n/*\n * SSF (SpreadSheet Format) engine — formats numeric values according to\n * Excel's custom number format codes (ECMA-376 Section 18.8.31).\n *\n * Excel number formats can contain up to 4 semicolon-separated sections:\n *   positive ; negative ; zero ; text\n * Each section is a mix of literal text, date/time placeholders (y, m, d, h, s),\n * number placeholders (0, #, ?), and special directives ([Red], [$-locale], etc.).\n *\n * Key concepts:\n * - The \"1900 leap year bug\": Excel (inheriting from Lotus 1-2-3) treats\n *   serial number 60 as Feb 29, 1900, which never existed. All serial numbers\n *   > 60 are off by one day compared to the true date.\n * - The 1904 date system: Mac Excel counts from Jan 1, 1904 instead of Jan 1, 1900.\n *   Serial numbers are offset by 1462 days.\n * - The \"General\" format auto-selects integer, decimal, or scientific notation.\n */\n\nimport { XlsxError } from \"../errors.js\";\nimport { dateToSerialNumber } from \"../utils/date.js\";\nimport { formatTable, DEFAULT_FORMAT_MAP, DEFAULT_FORMAT_STRINGS } from \"./table.js\";\n\n/** Reverse a string character-by-character */\nconst reverseString = (x: string): string => x.split(\"\").reverse().join(\"\");\n/** Left-pad a value with zeros to a given width */\nconst padWithZeros = (value: any, width: number): string => (\"\" + value).padStart(width, \"0\");\n/** Left-pad a value with spaces to a given width */\nconst padWithSpaces = (value: any, width: number): string => (\"\" + value).padStart(width, \" \");\n/** Right-pad a value with spaces to a given width */\nconst rightPadWithSpaces = (value: any, width: number): string => (\"\" + value).padEnd(width, \" \");\n/** Left-pad a rounded value with zeros to a given width */\nconst padRoundedZeros = (value: any, width: number): string => (\"\" + Math.round(value)).padStart(width, \"0\");\n\n/**\n * Check if a format string starts with \"General\" (case-insensitive) at position i.\n *\n * Uses charCode checks with `| 32` to do case-insensitive ASCII comparison:\n * 103='g', 101='e', 110='n', 101='e', 114='r', 97='a', 108='l'\n */\nfunction isGeneralFormat(s: string, i?: number): boolean {\n\ti = i || 0;\n\treturn (\n\t\ts.length >= 7 + i &&\n\t\t(s.charCodeAt(i) | 32) === 103 && // g/G\n\t\t(s.charCodeAt(i + 1) | 32) === 101 && // e/E\n\t\t(s.charCodeAt(i + 2) | 32) === 110 && // n/N\n\t\t(s.charCodeAt(i + 3) | 32) === 101 && // e/E\n\t\t(s.charCodeAt(i + 4) | 32) === 114 && // r/R\n\t\t(s.charCodeAt(i + 5) | 32) === 97 && // a/A\n\t\t(s.charCodeAt(i + 6) | 32) === 108 // l/L\n\t);\n}\n\n// Pre-compute day and month names using Intl for locale correctness\nconst days: string[][] = Array.from({ length: 7 }, (_, i) => {\n\tconst d = new Date(2017, 0, i + 1); // 2017-01-01 is a Sunday\n\treturn [\n\t\tnew Intl.DateTimeFormat(\"en-US\", { weekday: \"short\" }).format(d),\n\t\tnew Intl.DateTimeFormat(\"en-US\", { weekday: \"long\" }).format(d),\n\t];\n});\nconst months: string[][] = Array.from({ length: 12 }, (_, i) => {\n\tconst d = new Date(2000, i, 1);\n\tconst short = new Intl.DateTimeFormat(\"en-US\", { month: \"short\" }).format(d);\n\tconst long = new Intl.DateTimeFormat(\"en-US\", { month: \"long\" }).format(d);\n\t// [0] = first letter (e.g. \"J\"), [1] = short (e.g. \"Jan\"), [2] = long (e.g. \"January\")\n\treturn [short[0], short, long];\n});\n\n/** Parsed components of an Excel serial date, used internally by the formatter */\ninterface SSFDateVal {\n\tdaySerial: number;\n\ttimeSeconds: number;\n\tsubSeconds: number;\n\tyear: number;\n\tmonth: number;\n\tday: number;\n\thours: number;\n\tminutes: number;\n\tseconds: number;\n\tdayOfWeek: number;\n}\n\n/**\n * Normalize a floating-point number to match Excel's 15-significant-digit precision.\n *\n * Excel internally stores numbers as IEEE 754 doubles but displays only 15 significant digits.\n * This function truncates or rounds the value to match that behavior.\n */\nfunction normalizeExcelNumber(value: number): number {\n\tconst precStr = value.toPrecision(16);\n\tif (precStr.indexOf(\"e\") > -1) {\n\t\tconst mantissa = precStr.slice(0, precStr.indexOf(\"e\"));\n\t\tconst ml =\n\t\t\tmantissa.indexOf(\".\") > -1\n\t\t\t\t? mantissa.slice(0, mantissa.slice(0, 2) === \"0.\" ? 17 : 16)\n\t\t\t\t: mantissa.slice(0, 15) + \"0\".repeat(mantissa.length - 15);\n\t\treturn +ml + +(\"1\" + precStr.slice(precStr.indexOf(\"e\"))) - 1 || +precStr;\n\t}\n\tconst normalizedStr =\n\t\tprecStr.indexOf(\".\") > -1\n\t\t\t? precStr.slice(0, precStr.slice(0, 2) === \"0.\" ? 17 : 16)\n\t\t\t: precStr.slice(0, 15) + \"0\".repeat(precStr.length - 15);\n\treturn Number(normalizedStr);\n}\n\n/** Adjust date components for the Hijri (Islamic) calendar and compute day of week */\nfunction SSF_fix_hijri(_date: Date, o: number[]): number {\n\t// Shift year by 581 to approximate Hijri year\n\to[0] -= 581;\n\tconst dow = _date.getDay();\n\t// Threshold: dates before ~1900-03-01 need day-of-week adjustment\n\tif (_date.getTime() < -2203891200000) {\n\t\treturn (dow + 6) % 7;\n\t}\n\treturn dow;\n}\n\n/**\n * Parse an Excel serial date number into its date/time components.\n *\n * This is the core date decoder for the SSF engine. It handles:\n * - The 1900 date system with the Lotus 1-2-3 leap year bug (serial 60 = Feb 29, 1900)\n * - The 1904 date system (opts.date1904)\n * - Hijri (Islamic) calendar mode\n * - Sub-second precision rounding\n *\n * Valid serial range: 0 to 2958465 (Dec 31, 9999).\n *\n * @param value - Excel serial date number\n * @param opts - Options object; opts.date1904 enables 1904 date system\n * @param hijriMode - If true, convert to Hijri calendar dates\n * @returns Parsed date components, or null if out of range\n */\nexport function parseExcelDateCode(value: number, opts?: any, hijriMode?: boolean): SSFDateVal | null {\n\t// 2958465 = Dec 31, 9999 in the 1900 date system\n\tif (value > 2958465 || value < 0) {\n\t\treturn null;\n\t}\n\tvalue = normalizeExcelNumber(value);\n\tlet date = value | 0;\n\tlet time = Math.floor(86400 * (value - date));\n\tconst out: SSFDateVal = {\n\t\tdaySerial: date,\n\t\ttimeSeconds: time,\n\t\tsubSeconds: 86400 * (value - date) - time,\n\t\tyear: 0,\n\t\tmonth: 0,\n\t\tday: 0,\n\t\thours: 0,\n\t\tminutes: 0,\n\t\tseconds: 0,\n\t\tdayOfWeek: 0,\n\t};\n\tif (Math.abs(out.subSeconds) < 1e-6) {\n\t\tout.subSeconds = 0;\n\t}\n\tif (opts && opts.date1904) {\n\t\t// 1904 date system: shift by 1462 days (difference between 1900 and 1904 epochs)\n\t\tdate += 1462;\n\t}\n\t// Handle sub-second overflow (rounding up to next second/day)\n\tif (out.subSeconds > 0.9999) {\n\t\tout.subSeconds = 0;\n\t\tif (++time === 86400) {\n\t\t\tout.timeSeconds = time = 0;\n\t\t\t++date;\n\t\t\t++out.daySerial;\n\t\t}\n\t}\n\tlet dout: number[];\n\tlet dow = 0;\n\tif (date === 60) {\n\t\t// Serial 60: the phantom Feb 29, 1900 (Lotus 1-2-3 bug)\n\t\tdout = hijriMode ? [1317, 10, 29] : [1900, 2, 29];\n\t\tdow = 3; // Wednesday\n\t} else if (date === 0) {\n\t\t// Serial 0: Jan 0, 1900 (Excel quirk — displayed as Jan 0)\n\t\tdout = hijriMode ? [1317, 8, 29] : [1900, 1, 0];\n\t\tdow = 6; // Saturday\n\t} else {\n\t\t// For serial > 60, subtract 1 to skip the phantom Feb 29, 1900\n\t\tif (date > 60) {\n\t\t\t--date;\n\t\t}\n\t\tconst baseDate = new Date(1900, 0, 1);\n\t\tbaseDate.setDate(baseDate.getDate() + date - 1);\n\t\tdout = [baseDate.getFullYear(), baseDate.getMonth() + 1, baseDate.getDate()];\n\t\tdow = baseDate.getDay();\n\t\t// For serial < 60, adjust day-of-week (pre-leap-year-bug dates)\n\t\tif (date < 60) {\n\t\t\tdow = (dow + 6) % 7;\n\t\t}\n\t\tif (hijriMode) {\n\t\t\tdow = SSF_fix_hijri(baseDate, dout);\n\t\t}\n\t}\n\tout.year = dout[0];\n\tout.month = dout[1];\n\tout.day = dout[2];\n\t// Decompose seconds into h:m:s\n\tout.seconds = time % 60;\n\ttime = Math.floor(time / 60);\n\tout.minutes = time % 60;\n\ttime = Math.floor(time / 60);\n\tout.hours = time;\n\tout.dayOfWeek = dow;\n\treturn out;\n}\n\n/** Strip trailing zeros after the decimal point (e.g. \"1.200\" -> \"1.2\", \"3.0\" -> \"3\") */\nfunction SSF_strip_decimal(o: string): string {\n\treturn o.indexOf(\".\") === -1 ? o : o.replace(/(?:\\.0*|(\\.\\d*[1-9])0+)$/, \"$1\");\n}\n\n/** Normalize scientific notation: strip trailing decimal zeros and ensure 2-digit exponent */\nfunction SSF_normalize_exp(o: string): string {\n\tif (o.indexOf(\"E\") === -1) {\n\t\treturn o;\n\t}\n\treturn o.replace(/(?:\\.0*|(\\.\\d*[1-9])0+)[Ee]/, \"$1E\").replace(/(E[+-])(\\d)$/, \"$10$2\");\n}\n\n/** Format a \"small\" number (magnitude <= 10^9) in the most compact representation */\nfunction SSF_small_exp(v: number): string {\n\tconst w = v < 0 ? 12 : 11;\n\tlet o = SSF_strip_decimal(v.toFixed(12));\n\tif (o.length <= w) {\n\t\treturn o;\n\t}\n\to = v.toPrecision(10);\n\tif (o.length <= w) {\n\t\treturn o;\n\t}\n\treturn v.toExponential(5);\n}\n\n/** Format a \"large\" number (magnitude > 10^9) in the most compact representation */\nfunction SSF_large_exp(v: number): string {\n\tconst o = SSF_strip_decimal(v.toFixed(11));\n\treturn o.length > (v < 0 ? 12 : 11) || o === \"0\" || o === \"-0\" ? v.toPrecision(6) : o;\n}\n\n/**\n * Format a number using Excel's \"General\" numeric format.\n *\n * General format selects the most compact representation:\n * integers are shown as-is, floats use up to 11 characters\n * (or 12 for negative), switching to scientific notation for very\n * large or very small values.\n */\nfunction SSF_general_num(v: number): string {\n\tif (!isFinite(v)) {\n\t\treturn isNaN(v) ? \"#NUM!\" : \"#DIV/0!\";\n\t}\n\t// V = floor(log10(|v|)) = order of magnitude\n\tconst V = Math.floor(Math.log(Math.abs(v)) * Math.LOG10E);\n\tlet o: string;\n\n\tif (V >= -4 && V <= -1) {\n\t\to = v.toPrecision(10 + V);\n\t} else if (Math.abs(V) <= 9) {\n\t\to = SSF_small_exp(v);\n\t} else if (V === 10) {\n\t\to = v.toFixed(10).substring(0, 12);\n\t} else {\n\t\to = SSF_large_exp(v);\n\t}\n\n\treturn SSF_strip_decimal(SSF_normalize_exp(o.toUpperCase()));\n}\n\n/**\n * Format any value using Excel's \"General\" format.\n *\n * Dispatches by type: strings pass through, booleans become \"TRUE\"/\"FALSE\",\n * integers use toString(10), floats use SSF_general_num, and Dates are\n * converted to serial numbers then formatted with format 14 (short date).\n */\nfunction SSF_general(v: any, opts: any): string {\n\tswitch (typeof v) {\n\t\tcase \"string\":\n\t\t\treturn v;\n\t\tcase \"boolean\":\n\t\t\treturn v ? \"TRUE\" : \"FALSE\";\n\t\tcase \"number\":\n\t\t\treturn (v | 0) === v ? v.toString(10) : SSF_general_num(v);\n\t\tcase \"undefined\":\n\t\t\treturn \"\";\n\t\tcase \"object\":\n\t\t\tif (v == null) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tif (v instanceof Date) {\n\t\t\t\treturn formatNumber(14, dateToSerialNumber(v, opts && opts.date1904), opts);\n\t\t\t}\n\t}\n\tthrow new XlsxError(\"UNSUPPORTED\", \"unsupported value in General format: \" + v);\n}\n\n/**\n * Format a date/time component according to its type code and format token.\n *\n * Type codes correspond to ASCII codes of format letters:\n *   98='b' (Buddhist year), 121='y' (year), 109='m' (month), 100='d' (day),\n *   104='h' (12-hour), 72='H' (24-hour), 77='M' (minutes), 115='s' (seconds),\n *   90='Z' (absolute/elapsed time), 101='e' (era year)\n *\n * @param type - ASCII code of the date/time component type\n * @param fmt - The format token string (e.g. \"yyyy\", \"mm\", \"hh\")\n * @param val - Parsed date/time components\n * @param ss0 - Number of sub-second decimal digits (for \"s\" format)\n * @returns Formatted date/time string for this component\n */\nfunction SSF_write_date(type: number, fmt: string, val: SSFDateVal, ss0?: number): string {\n\tlet result = \"\";\n\tlet scaledSeconds = 0;\n\tlet scaleFactor = 0;\n\tlet year = val.year;\n\tlet numericOut: number = 0;\n\tlet outputLength = 0;\n\tswitch (type) {\n\t\tcase 98 /* 'b' buddhist year */:\n\t\t\tyear = val.year + 543;\n\t\t/* falls through */\n\t\tcase 121 /* 'y' year */:\n\t\t\tswitch (fmt.length) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tnumericOut = year % 100;\n\t\t\t\t\toutputLength = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tnumericOut = year % 10000;\n\t\t\t\t\toutputLength = 4;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 109 /* 'm' month */:\n\t\t\tswitch (fmt.length) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tnumericOut = val.month;\n\t\t\t\t\toutputLength = fmt.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn months[val.month - 1][1]; // Short name (e.g. \"Jan\")\n\t\t\t\tcase 5:\n\t\t\t\t\treturn months[val.month - 1][0]; // Single letter (e.g. \"J\")\n\t\t\t\tdefault:\n\t\t\t\t\treturn months[val.month - 1][2]; // Full name (e.g. \"January\")\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 100 /* 'd' day */:\n\t\t\tswitch (fmt.length) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tnumericOut = val.day;\n\t\t\t\t\toutputLength = fmt.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\treturn days[val.dayOfWeek][0]; // Short name (e.g. \"Mon\")\n\t\t\t\tdefault:\n\t\t\t\t\treturn days[val.dayOfWeek][1]; // Full name (e.g. \"Monday\")\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 104 /* 'h' 12-hour clock */:\n\t\t\tswitch (fmt.length) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\t// Convert 24-hour to 12-hour: 0->12, 1->1, ..., 12->12, 13->1, ...\n\t\t\t\t\tnumericOut = 1 + ((val.hours + 11) % 12);\n\t\t\t\t\toutputLength = fmt.length;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"bad hour format: \" + fmt);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 72 /* 'H' 24-hour clock */:\n\t\t\tswitch (fmt.length) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tnumericOut = val.hours;\n\t\t\t\t\toutputLength = fmt.length;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"bad hour format: \" + fmt);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 77 /* 'M' minutes */:\n\t\t\tswitch (fmt.length) {\n\t\t\t\tcase 1:\n\t\t\t\tcase 2:\n\t\t\t\t\tnumericOut = val.minutes;\n\t\t\t\t\toutputLength = fmt.length;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"bad minute format: \" + fmt);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 115 /* 's' seconds */:\n\t\t\tif (fmt !== \"s\" && fmt !== \"ss\" && fmt !== \".0\" && fmt !== \".00\" && fmt !== \".000\") {\n\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"bad second format: \" + fmt);\n\t\t\t}\n\t\t\tif (val.subSeconds === 0 && (fmt === \"s\" || fmt === \"ss\")) {\n\t\t\t\treturn padWithZeros(val.seconds, fmt.length);\n\t\t\t}\n\t\t\t// Scale factor for sub-second precision: .0 = 10, .00 = 100, .000 = 1000\n\t\t\tif (ss0! >= 2) {\n\t\t\t\tscaleFactor = ss0 === 3 ? 1000 : 100;\n\t\t\t} else {\n\t\t\t\tscaleFactor = ss0 === 1 ? 10 : 1;\n\t\t\t}\n\t\t\tscaledSeconds = Math.round(scaleFactor * (val.seconds + val.subSeconds));\n\t\t\tif (scaledSeconds >= 60 * scaleFactor) {\n\t\t\t\tscaledSeconds = 0;\n\t\t\t}\n\t\t\tif (fmt === \"s\") {\n\t\t\t\treturn scaledSeconds === 0 ? \"0\" : \"\" + scaledSeconds / scaleFactor;\n\t\t\t}\n\t\t\tresult = padWithZeros(scaledSeconds, 2 + ss0!);\n\t\t\tif (fmt === \"ss\") {\n\t\t\t\treturn result.substring(0, 2);\n\t\t\t}\n\t\t\t// Return sub-second fractional digits (e.g. \".123\")\n\t\t\treturn \".\" + result.substring(2, fmt.length - 1);\n\t\tcase 90 /* 'Z' absolute/elapsed time (e.g. [h], [mm], [ss]) */:\n\t\t\tswitch (fmt) {\n\t\t\t\tcase \"[h]\":\n\t\t\t\tcase \"[hh]\":\n\t\t\t\t\t// Total elapsed hours (can exceed 24)\n\t\t\t\t\tnumericOut = val.daySerial * 24 + val.hours;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[m]\":\n\t\t\t\tcase \"[mm]\":\n\t\t\t\t\t// Total elapsed minutes\n\t\t\t\t\tnumericOut = (val.daySerial * 24 + val.hours) * 60 + val.minutes;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[s]\":\n\t\t\t\tcase \"[ss]\":\n\t\t\t\t\t// Total elapsed seconds\n\t\t\t\t\tnumericOut =\n\t\t\t\t\t\t((val.daySerial * 24 + val.hours) * 60 + val.minutes) * 60 +\n\t\t\t\t\t\t(ss0 === 0 ? Math.round(val.seconds + val.subSeconds) : val.seconds);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"bad abstime format: \" + fmt);\n\t\t\t}\n\t\t\toutputLength = fmt.length === 3 ? 1 : 2;\n\t\t\tbreak;\n\t\tcase 101 /* 'e' era year */:\n\t\t\tnumericOut = year;\n\t\t\toutputLength = 1;\n\t\t\tbreak;\n\t}\n\treturn outputLength > 0 ? padWithZeros(numericOut, outputLength) : \"\";\n}\n\n/** Insert thousands separators into a numeric string (e.g. \"1234567\" -> \"1,234,567\") */\nfunction commaify(str: string): string {\n\treturn str.replace(/\\B(?=(\\d{3})+$)/g, \",\");\n}\n\nconst pct1 = /%/g;\n/** Format a number with percentage: multiply by 100^(count of %) and append \"%\" symbols */\nfunction write_num_pct(type: string, fmt: string, val: number): string {\n\tconst sfmt = fmt.replace(pct1, \"\");\n\tconst mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + \"%\".repeat(mul);\n}\n\n/**\n * Format a number with trailing comma scaling.\n * Each trailing comma divides the value by 1000 (Excel convention for thousands/millions).\n */\nfunction write_num_cm(type: string, fmt: string, val: number): string {\n\tlet idx = fmt.length - 1;\n\t// Count trailing commas (charCode 44 = ',')\n\twhile (fmt.charCodeAt(idx - 1) === 44) {\n\t\t--idx;\n\t}\n\treturn write_num(type, fmt.substring(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));\n}\n\n/** Format a number in scientific/engineering notation (E+00 format) */\nfunction write_num_exp(fmt: string, val: number): string {\n\tlet o: string;\n\tconst idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif (fmt.match(/^#+0.0E\\+0$/)) {\n\t\tif (val === 0) {\n\t\t\treturn \"0.0E+0\";\n\t\t}\n\t\tif (val < 0) {\n\t\t\treturn \"-\" + write_num_exp(fmt, -val);\n\t\t}\n\t\tconst period = fmt.indexOf(\".\");\n\t\tconst ee =\n\t\t\tMath.floor(Math.log(val) * Math.LOG10E) % period < 0\n\t\t\t\t? (Math.floor(Math.log(val) * Math.LOG10E) % period) + period\n\t\t\t\t: Math.floor(Math.log(val) * Math.LOG10E) % period;\n\t\to = (val / Math.pow(10, ee)).toPrecision(idx + 1 + ((period + ee) % period));\n\t\tif (o.indexOf(\"e\") === -1) {\n\t\t\tconst fakee = Math.floor(Math.log(val) * Math.LOG10E);\n\t\t\tif (o.indexOf(\".\") === -1) {\n\t\t\t\to = o.charAt(0) + \".\" + o.substring(1) + \"E+\" + (fakee - o.length + ee);\n\t\t\t} else {\n\t\t\t\to += \"E+\" + (fakee - ee);\n\t\t\t}\n\t\t\twhile (o.substring(0, 2) === \"0.\") {\n\t\t\t\to = o.charAt(0) + o.substring(2, period) + \".\" + o.substring(2 + period);\n\t\t\t\to = o.replace(/^0+([1-9])/, \"$1\").replace(/^0+\\./, \"0.\");\n\t\t\t}\n\t\t\to = o.replace(/\\+-/, \"-\");\n\t\t}\n\t\to = o.replace(\n\t\t\t/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,\n\t\t\t($$, $1, $2, $3) => $1 + $2 + $3.substring(0, (period + ee) % period) + \".\" + $3.substring(ee) + \"E\",\n\t\t);\n\t} else {\n\t\to = val.toExponential(idx);\n\t}\n\t// Ensure 2-digit exponent if format uses E+00\n\tif (fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) {\n\t\to = o.substring(0, o.length - 1) + \"0\" + o.charAt(o.length - 1);\n\t}\n\t// If format uses E- (no explicit +), strip the \"+\" from positive exponents\n\tif (fmt.match(/E-/) && o.match(/e\\+/)) {\n\t\to = o.replace(/e\\+/, \"e\");\n\t}\n\treturn o.replace(\"e\", \"E\");\n}\n\n/**\n * Compute the best rational (fraction) approximation of a number using\n * the Stern-Brocot / continued fraction algorithm.\n *\n * The algorithm iteratively builds the best fraction p/q where q <= maxDenominator,\n * using the mediant property of the Stern-Brocot tree. It stops when the\n * approximation error is below ~5e-8 or the denominator exceeds the limit.\n *\n * @param value - Number to approximate as a fraction\n * @param maxDenominator - Maximum allowed denominator\n * @param mixed - If true, return [wholePart, numerator, denominator]; otherwise [0, numerator, denominator]\n * @returns [wholePart, numerator, denominator] triple\n */\nfunction SSF_frac(value: number, maxDenominator: number, mixed?: boolean): number[] {\n\tconst sgn = value < 0 ? -1 : 1;\n\tlet absValue = value * sgn;\n\t// Stern-Brocot convergents: prevPrev (p_{n-2}) and prev (p_{n-1})\n\tlet prevPrevNumer = 0,\n\t\tprevNumer = 1,\n\t\tnumerator = 0;\n\tlet prevPrevDenom = 1,\n\t\tprevDenom = 0,\n\t\tdenominator = 0;\n\tlet intPart = Math.floor(absValue);\n\twhile (prevDenom < maxDenominator) {\n\t\tintPart = Math.floor(absValue);\n\t\t// Standard continued fraction recurrence: p_n = a_n * p_{n-1} + p_{n-2}\n\t\tnumerator = intPart * prevNumer + prevPrevNumer;\n\t\tdenominator = intPart * prevDenom + prevPrevDenom;\n\t\t// Convergence threshold: stop when the fractional remainder is negligible\n\t\tif (absValue - intPart < 0.00000005) {\n\t\t\tbreak;\n\t\t}\n\t\t// Take the reciprocal of the fractional remainder for the next iteration\n\t\tabsValue = 1 / (absValue - intPart);\n\t\tprevPrevNumer = prevNumer;\n\t\tprevNumer = numerator;\n\t\tprevPrevDenom = prevDenom;\n\t\tprevDenom = denominator;\n\t}\n\t// If denominator exceeded the limit, fall back to the previous convergent\n\tif (denominator > maxDenominator) {\n\t\tif (prevDenom > maxDenominator) {\n\t\t\tdenominator = prevPrevDenom;\n\t\t\tnumerator = prevPrevNumer;\n\t\t} else {\n\t\t\tdenominator = prevDenom;\n\t\t\tnumerator = prevNumer;\n\t\t}\n\t}\n\tif (!mixed) {\n\t\treturn [0, sgn * numerator, denominator];\n\t}\n\tconst wholePart = Math.floor((sgn * numerator) / denominator);\n\treturn [wholePart, sgn * numerator - wholePart * denominator, denominator];\n}\n\n// Regex for \"# ?/?/n\" fraction format with fixed denominator\nconst frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\n\n/** Format a fraction with a fixed denominator (e.g. \"# ??/16\") */\nfunction write_num_f1(r: string[], aval: number, sign: string): string {\n\tconst den = parseInt(r[4], 10);\n\tconst rr = Math.round(aval * den);\n\tconst base = Math.floor(rr / den);\n\tconst myn = rr - base * den;\n\tconst myd = den;\n\treturn (\n\t\tsign +\n\t\t(base === 0 ? \"\" : \"\" + base) +\n\t\t\" \" +\n\t\t(myn === 0\n\t\t\t? \" \".repeat(r[1].length + 1 + r[4].length)\n\t\t\t: padWithSpaces(myn, r[1].length) + r[2] + \"/\" + r[3] + padWithZeros(myd, r[4].length))\n\t);\n}\n\n/** Format an integer as a fraction with a fixed denominator (shows just the whole part) */\nfunction write_num_f2(r: string[], aval: number, sign: string): string {\n\treturn sign + (aval === 0 ? \"\" : \"\" + aval) + \" \".repeat(r[1].length + 2 + r[4].length);\n}\n\n// Regex to extract decimal places from a format like \"0.00\" or \"#.###\"\nconst dec1 = /^#*0*\\.([0#]+)/;\n// Regex to detect closing paren followed by number placeholders (e.g. \")0#\")\nconst closeparen = /\\)[^)]*[0#]/;\n// Regex for US phone number format \"(###) ###-####\"\nconst phone = /\\(###\\) ###\\\\?-####/;\n\n/**\n * Replace format placeholders with their \"empty\" representations:\n * '#' -> nothing, '?' -> space, '0' -> '0', others pass through.\n * Used to generate padding for unfilled format positions.\n */\nfunction hashq(str: string): string {\n\tlet o = \"\";\n\tfor (let i = 0; i !== str.length; ++i) {\n\t\tconst cc = str.charCodeAt(i);\n\t\tswitch (cc) {\n\t\t\tcase 35: // '#' -> nothing (suppress leading zeros)\n\t\t\t\tbreak;\n\t\t\tcase 63: // '?' -> space (fixed-width alignment)\n\t\t\t\to += \" \";\n\t\t\t\tbreak;\n\t\t\tcase 48: // '0' -> '0' (force display of digit)\n\t\t\t\to += \"0\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\to += String.fromCharCode(cc);\n\t\t}\n\t}\n\treturn o;\n}\n\n/** Round a number to d decimal places, preserving sign */\nfunction rnd(val: number, d: number): string {\n\tconst sgn = val < 0 ? -1 : 1;\n\tconst dd = Math.pow(10, d);\n\treturn \"\" + sgn * (Math.round(sgn * val * dd) / dd);\n}\n\n/** Extract fractional part, rounded to d decimal places; returns 0 if rounding carries into integer part */\nfunction dec(val: number, d: number): number {\n\tconst _frac = val - Math.floor(val);\n\tconst dd = Math.pow(10, d);\n\tif (d < (\"\" + Math.round(_frac * dd)).length) {\n\t\treturn 0;\n\t}\n\treturn Math.round(_frac * dd);\n}\n\n/** Check if rounding the fractional part to d digits causes a carry into the integer part */\nfunction carry(val: number, d: number): number {\n\tif (d < (\"\" + Math.round((val - Math.floor(val)) * Math.pow(10, d))).length) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n/** Floor a number, using bitwise OR for 32-bit-safe values (faster than Math.floor) */\nfunction flr(val: number): string {\n\t// Bitwise OR only works for values within 32-bit signed integer range\n\tif (val < 2147483647 && val > -2147483648) {\n\t\treturn \"\" + (val >= 0 ? val | 0 : (val - 1) | 0);\n\t}\n\treturn \"\" + Math.floor(val);\n}\n\n/**\n * Core number formatter for floating-point values.\n *\n * Handles all Excel numeric format patterns including:\n * - Fixed decimals (\"0.00\"), leading zeros (\"00\"), digit suppression (\"#\")\n * - Thousands separators (\"#,##0\"), trailing comma scaling\n * - Percentage (\"%\"), scientific notation (\"0.00E+00\")\n * - Fractions (\"# ?/?\", \"# ??/??\")\n * - Parenthesized negatives (\"(#,##0)\")\n * - Phone number format\n * - Dash-separated patterns (like SSN: \"000-00-0000\")\n */\nfunction write_num_flt(type: string, fmt: string, val: number): string {\n\t// Check for parenthesized negative format (type starts with '(')\n\tif (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tconst ffmt = fmt.replace(/\\( */, \"\").replace(/ \\)/, \"\").replace(/\\)/, \"\");\n\t\tif (val >= 0) {\n\t\t\treturn write_num_flt(\"n\", ffmt, val);\n\t\t}\n\t\treturn \"(\" + write_num_flt(\"n\", ffmt, -val) + \")\";\n\t}\n\t// Trailing comma: each comma divides by 1000 (charCode 44 = ',')\n\tif (fmt.charCodeAt(fmt.length - 1) === 44) {\n\t\treturn write_num_cm(type, fmt, val);\n\t}\n\tif (fmt.indexOf(\"%\") !== -1) {\n\t\treturn write_num_pct(type, fmt, val);\n\t}\n\tif (fmt.indexOf(\"E\") !== -1) {\n\t\treturn write_num_exp(fmt, val);\n\t}\n\t// Leading '$' (charCode 36)\n\tif (fmt.charCodeAt(0) === 36) {\n\t\treturn \"$\" + write_num_flt(type, fmt.substring(fmt.charAt(1) === \" \" ? 2 : 1), val);\n\t}\n\tlet o: string;\n\tlet r: RegExpMatchArray | null;\n\tlet ri: number;\n\tlet ff: number[];\n\tconst aval = Math.abs(val);\n\tconst sign = val < 0 ? \"-\" : \"\";\n\tif (fmt.match(/^00+$/)) {\n\t\treturn sign + padRoundedZeros(aval, fmt.length);\n\t}\n\tif (fmt.match(/^[#?]+$/)) {\n\t\to = padRoundedZeros(val, 0);\n\t\tif (o === \"0\") {\n\t\t\to = \"\";\n\t\t}\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substring(0, fmt.length - o.length)) + o;\n\t}\n\tif ((r = fmt.match(frac1))) {\n\t\treturn write_num_f1(r, aval, sign);\n\t}\n\tif (fmt.match(/^#+0+$/)) {\n\t\treturn sign + padRoundedZeros(aval, fmt.length - fmt.indexOf(\"0\"));\n\t}\n\tif ((r = fmt.match(dec1))) {\n\t\to = rnd(val, r[1].length)\n\t\t\t.replace(/^([^.]+)$/, \"$1.\" + hashq(r[1]))\n\t\t\t.replace(/\\.$/, \".\" + hashq(r[1]))\n\t\t\t.replace(/\\.(\\d*)$/, ($$, $1) => \".\" + $1 + \"0\".repeat(hashq(r![1]).length - $1.length));\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./, \".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif ((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn (\n\t\t\tsign +\n\t\t\trnd(aval, r[2].length)\n\t\t\t\t.replace(/\\.(\\d*[1-9])0*$/, \".$1\")\n\t\t\t\t.replace(/^(-?\\d*)$/, \"$1.\")\n\t\t\t\t.replace(/^0\\./, r[1].length ? \"0.\" : \".\")\n\t\t);\n\t}\n\tif (fmt.match(/^#{1,3},##0(\\.?)$/)) {\n\t\treturn sign + commaify(padRoundedZeros(aval, 0));\n\t}\n\tif ((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0\n\t\t\t? \"-\" + write_num_flt(type, fmt, -val)\n\t\t\t: commaify(\"\" + (Math.floor(val) + carry(val, r[1].length))) +\n\t\t\t\t\t\".\" +\n\t\t\t\t\tpadWithZeros(dec(val, r[1].length), r[1].length);\n\t}\n\tif ((r = fmt.match(/^#,#*,#0/))) {\n\t\treturn write_num_flt(type, fmt.replace(/^#,#*,/, \"\"), val);\n\t}\n\t// Dash-separated format (e.g. SSN \"000-00-0000\"): format without dashes, then reinsert\n\tif ((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = reverseString(write_num_flt(type, fmt.replace(/[\\\\-]/g, \"\"), val));\n\t\tri = 0;\n\t\treturn reverseString(\n\t\t\treverseString(fmt.replace(/\\\\/g, \"\")).replace(/[0#]/g, (x) => {\n\t\t\t\treturn ri < o.length ? o.charAt(ri++) : x === \"0\" ? \"0\" : \"\";\n\t\t\t}),\n\t\t);\n\t}\n\tif (fmt.match(phone)) {\n\t\to = write_num_flt(type, \"##########\", val);\n\t\treturn \"(\" + o.substring(0, 3) + \") \" + o.substring(3, 6) + \"-\" + o.substring(6);\n\t}\n\t// Fraction format without whole part: \"?/?\" or \"??/??\"\n\tlet oa = \"\";\n\tif ((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\n\t\tri = Math.min(r[4].length, 7);\n\t\tff = SSF_frac(aval, Math.pow(10, ri) - 1, false);\n\t\to = sign;\n\t\toa = write_num(\"n\", r[1], ff[1]);\n\t\tif (oa.charAt(oa.length - 1) === \" \") {\n\t\t\toa = oa.substring(0, oa.length - 1) + \"0\";\n\t\t}\n\t\to += oa + r[2] + \"/\" + r[3];\n\t\toa = rightPadWithSpaces(ff[2], ri);\n\t\tif (oa.length < r[4].length) {\n\t\t\toa = hashq(r[4].substring(r[4].length - oa.length)) + oa;\n\t\t}\n\t\to += oa;\n\t\treturn o;\n\t}\n\t// Mixed fraction format with whole part: \"# ?/?\" or \"# ??/??\"\n\tif ((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\n\t\tri = Math.min(Math.max(r[1].length, r[4].length), 7);\n\t\tff = SSF_frac(aval, Math.pow(10, ri) - 1, true);\n\t\treturn (\n\t\t\tsign +\n\t\t\t(ff[0] || (ff[1] ? \"\" : \"0\")) +\n\t\t\t\" \" +\n\t\t\t(ff[1]\n\t\t\t\t? padWithSpaces(ff[1], ri) + r[2] + \"/\" + r[3] + rightPadWithSpaces(ff[2], ri)\n\t\t\t\t: \" \".repeat(2 * ri + 1 + r[2].length + r[3].length))\n\t\t);\n\t}\n\tif ((r = fmt.match(/^[#0?]+$/))) {\n\t\to = padRoundedZeros(val, 0);\n\t\tif (fmt.length <= o.length) {\n\t\t\treturn o;\n\t\t}\n\t\treturn hashq(fmt.substring(0, fmt.length - o.length)) + o;\n\t}\n\tif ((r = fmt.match(/^([#0?]+)\\.([#0]+)$/))) {\n\t\to = val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, \"$1\");\n\t\tri = o.indexOf(\".\");\n\t\tconst lres = fmt.indexOf(\".\") - ri;\n\t\tconst rres = fmt.length - o.length - lres;\n\t\treturn hashq(fmt.substring(0, lres) + o + fmt.substring(fmt.length - rres));\n\t}\n\tif ((r = fmt.match(/^00,000\\.([#0]*0)$/))) {\n\t\tri = dec(val, r[1].length);\n\t\treturn val < 0\n\t\t\t? \"-\" + write_num_flt(type, fmt, -val)\n\t\t\t: commaify(flr(val))\n\t\t\t\t\t.replace(/^\\d,\\d{3}$/, \"0$&\")\n\t\t\t\t\t.replace(/^\\d*$/, ($$) => \"00,\" + ($$.length < 3 ? padWithZeros(0, 3 - $$.length) : \"\") + $$) +\n\t\t\t\t\t\".\" +\n\t\t\t\t\tpadWithZeros(ri, r[1].length);\n\t}\n\tswitch (fmt) {\n\t\tcase \"###,##0.00\":\n\t\t\treturn write_num_flt(type, \"#,##0.00\", val);\n\t\tcase \"###,###\":\n\t\tcase \"##,###\":\n\t\tcase \"#,###\": {\n\t\t\tconst x = commaify(padRoundedZeros(aval, 0));\n\t\t\treturn x !== \"0\" ? sign + x : \"\";\n\t\t}\n\t\tcase \"###,###.00\":\n\t\t\treturn write_num_flt(type, \"###,##0.00\", val).replace(/^0\\./, \".\");\n\t\tcase \"#,###.00\":\n\t\t\treturn write_num_flt(type, \"#,##0.00\", val).replace(/^0\\./, \".\");\n\t}\n\tthrow new XlsxError(\"UNSUPPORTED\", \"unsupported format |\" + fmt + \"|\");\n}\n\n/**\n * Core number formatter for integer values.\n *\n * Mirrors write_num_flt but optimized for values where (val | 0) === val.\n * Avoids floating-point rounding operations where possible.\n */\nfunction write_num_int(type: string, fmt: string, val: number): string {\n\t// Parenthesized negative format (charCode 40 = '(')\n\tif (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tconst ffmt = fmt.replace(/\\( */, \"\").replace(/ \\)/, \"\").replace(/\\)/, \"\");\n\t\tif (val >= 0) {\n\t\t\treturn write_num_int(\"n\", ffmt, val);\n\t\t}\n\t\treturn \"(\" + write_num_int(\"n\", ffmt, -val) + \")\";\n\t}\n\t// Trailing comma scaling (charCode 44 = ',')\n\tif (fmt.charCodeAt(fmt.length - 1) === 44) {\n\t\treturn write_num_cm(type, fmt, val);\n\t}\n\tif (fmt.indexOf(\"%\") !== -1) {\n\t\treturn write_num_pct(type, fmt, val);\n\t}\n\tif (fmt.indexOf(\"E\") !== -1) {\n\t\treturn write_num_exp(fmt, val);\n\t}\n\t// Leading '$' (charCode 36)\n\tif (fmt.charCodeAt(0) === 36) {\n\t\treturn \"$\" + write_num_int(type, fmt.substring(fmt.charAt(1) === \" \" ? 2 : 1), val);\n\t}\n\tlet o: string;\n\tlet r: RegExpMatchArray | null;\n\tlet ri: number;\n\tlet ff: number[];\n\tconst aval = Math.abs(val);\n\tconst sign = val < 0 ? \"-\" : \"\";\n\tif (fmt.match(/^00+$/)) {\n\t\treturn sign + padWithZeros(aval, fmt.length);\n\t}\n\tif (fmt.match(/^[#?]+$/)) {\n\t\to = \"\" + val;\n\t\tif (val === 0) {\n\t\t\to = \"\";\n\t\t}\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substring(0, fmt.length - o.length)) + o;\n\t}\n\tif ((r = fmt.match(frac1))) {\n\t\treturn write_num_f2(r, aval, sign);\n\t}\n\tif (fmt.match(/^#+0+$/)) {\n\t\treturn sign + padWithZeros(aval, fmt.length - fmt.indexOf(\"0\"));\n\t}\n\tif ((r = fmt.match(dec1))) {\n\t\to = (\"\" + val).replace(/^([^.]+)$/, \"$1.\" + hashq(r[1])).replace(/\\.$/, \".\" + hashq(r[1]));\n\t\to = o.replace(/\\.(\\d*)$/, ($$, $1) => \".\" + $1 + \"0\".repeat(hashq(r![1]).length - $1.length));\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./, \".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif ((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn (\n\t\t\tsign +\n\t\t\t(\"\" + aval)\n\t\t\t\t.replace(/\\.(\\d*[1-9])0*$/, \".$1\")\n\t\t\t\t.replace(/^(-?\\d*)$/, \"$1.\")\n\t\t\t\t.replace(/^0\\./, r[1].length ? \"0.\" : \".\")\n\t\t);\n\t}\n\tif (fmt.match(/^#{1,3},##0(\\.?)$/)) {\n\t\treturn sign + commaify(\"\" + aval);\n\t}\n\tif ((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify(\"\" + val) + \".\" + \"0\".repeat(r[1].length);\n\t}\n\tif ((r = fmt.match(/^#,#*,#0/))) {\n\t\treturn write_num_int(type, fmt.replace(/^#,#*,/, \"\"), val);\n\t}\n\t// Dash-separated format (e.g. SSN)\n\tif ((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = reverseString(write_num_int(type, fmt.replace(/[\\\\-]/g, \"\"), val));\n\t\tri = 0;\n\t\treturn reverseString(\n\t\t\treverseString(fmt.replace(/\\\\/g, \"\")).replace(/[0#]/g, (x) => {\n\t\t\t\treturn ri < o.length ? o.charAt(ri++) : x === \"0\" ? \"0\" : \"\";\n\t\t\t}),\n\t\t);\n\t}\n\tif (fmt.match(phone)) {\n\t\to = write_num_int(type, \"##########\", val);\n\t\treturn \"(\" + o.substring(0, 3) + \") \" + o.substring(3, 6) + \"-\" + o.substring(6);\n\t}\n\t// Fraction format without whole part\n\tlet oa = \"\";\n\tif ((r = fmt.match(/^([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\n\t\tri = Math.min(r[4].length, 7);\n\t\tff = SSF_frac(aval, Math.pow(10, ri) - 1, false);\n\t\to = sign;\n\t\toa = write_num(\"n\", r[1], ff[1]);\n\t\tif (oa.charAt(oa.length - 1) === \" \") {\n\t\t\toa = oa.substring(0, oa.length - 1) + \"0\";\n\t\t}\n\t\to += oa + r[2] + \"/\" + r[3];\n\t\toa = rightPadWithSpaces(ff[2], ri);\n\t\tif (oa.length < r[4].length) {\n\t\t\toa = hashq(r[4].substring(r[4].length - oa.length)) + oa;\n\t\t}\n\t\to += oa;\n\t\treturn o;\n\t}\n\t// Mixed fraction format with whole part\n\tif ((r = fmt.match(/^# ([#0?]+)( ?)\\/( ?)([#0?]+)/))) {\n\t\tri = Math.min(Math.max(r[1].length, r[4].length), 7);\n\t\tff = SSF_frac(aval, Math.pow(10, ri) - 1, true);\n\t\treturn (\n\t\t\tsign +\n\t\t\t(ff[0] || (ff[1] ? \"\" : \"0\")) +\n\t\t\t\" \" +\n\t\t\t(ff[1]\n\t\t\t\t? padWithSpaces(ff[1], ri) + r[2] + \"/\" + r[3] + rightPadWithSpaces(ff[2], ri)\n\t\t\t\t: \" \".repeat(2 * ri + 1 + r[2].length + r[3].length))\n\t\t);\n\t}\n\tif ((r = fmt.match(/^[#0?]+$/))) {\n\t\to = \"\" + val;\n\t\tif (fmt.length <= o.length) {\n\t\t\treturn o;\n\t\t}\n\t\treturn hashq(fmt.substring(0, fmt.length - o.length)) + o;\n\t}\n\tif ((r = fmt.match(/^([#0]+)\\.([#0]+)$/))) {\n\t\to = val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, \"$1\");\n\t\tri = o.indexOf(\".\");\n\t\tconst lres = fmt.indexOf(\".\") - ri;\n\t\tconst rres = fmt.length - o.length - lres;\n\t\treturn hashq(fmt.substring(0, lres) + o + fmt.substring(fmt.length - rres));\n\t}\n\tif ((r = fmt.match(/^00,000\\.([#0]*0)$/))) {\n\t\treturn val < 0\n\t\t\t? \"-\" + write_num_int(type, fmt, -val)\n\t\t\t: commaify(\"\" + val)\n\t\t\t\t\t.replace(/^\\d,\\d{3}$/, \"0$&\")\n\t\t\t\t\t.replace(/^\\d*$/, ($$) => \"00,\" + ($$.length < 3 ? padWithZeros(0, 3 - $$.length) : \"\") + $$) +\n\t\t\t\t\t\".\" +\n\t\t\t\t\tpadWithZeros(0, r[1].length);\n\t}\n\tswitch (fmt) {\n\t\tcase \"###,###\":\n\t\tcase \"##,###\":\n\t\tcase \"#,###\": {\n\t\t\tconst x = commaify(\"\" + aval);\n\t\t\treturn x !== \"0\" ? sign + x : \"\";\n\t\t}\n\t\tdefault:\n\t\t\tif (fmt.match(/\\.[0#?]*$/)) {\n\t\t\t\treturn (\n\t\t\t\t\twrite_num_int(type, fmt.slice(0, fmt.lastIndexOf(\".\")), val) +\n\t\t\t\t\thashq(fmt.slice(fmt.lastIndexOf(\".\")))\n\t\t\t\t);\n\t\t\t}\n\t}\n\tthrow new XlsxError(\"UNSUPPORTED\", \"unsupported format |\" + fmt + \"|\");\n}\n\n/** Dispatch to integer or float formatter based on whether the value is an integer */\nfunction write_num(type: string, fmt: string, val: number): string {\n\treturn (val | 0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);\n}\n\n/**\n * Split a format string into semicolon-delimited sections.\n *\n * Respects quoted strings (between double quotes) and escaped characters\n * (preceded by backslash, underscore, or asterisk) so that semicolons\n * inside those contexts are not treated as section separators.\n *\n * Excel format strings can have up to 4 sections:\n *   section1 ; section2 ; section3 ; section4\n *   positive ; negative ; zero     ; text\n */\nfunction SSF_split_fmt(fmt: string): string[] {\n\tconst out: string[] = [];\n\tlet in_str = false;\n\tlet j = 0;\n\tfor (let i = 0; i < fmt.length; ++i) {\n\t\tswitch (fmt.charCodeAt(i)) {\n\t\t\tcase 34 /* '\"' — toggle string literal mode */:\n\t\t\t\tin_str = !in_str;\n\t\t\t\tbreak;\n\t\t\tcase 95:\n\t\t\tcase 42:\n\t\t\tcase 92 /* '_' '*' '\\\\' — skip next character (escape) */:\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase 59 /* ';' — section separator */:\n\t\t\t\tout[out.length] = fmt.substring(j, i);\n\t\t\t\tj = i + 1;\n\t\t}\n\t}\n\tout[out.length] = fmt.substring(j);\n\tif (in_str) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Format |\" + fmt + \"| unterminated string \");\n\t}\n\treturn out;\n}\n\n/** Regex to detect absolute time tokens like [h], [mm], [ss] (including Thai equivalents) */\nconst SSF_abstime = /\\[[HhMmSs\\u0E0A\\u0E19\\u0E17]*\\]/;\n\n/** Classification for Excel number formats that include date/time tokens. */\nexport type DateTimeFormatKind = \"none\" | \"date\" | \"time\" | \"datetime\";\n\nfunction classifyDateTimeTokens(hasDate: boolean, hasTime: boolean, hasMonth: boolean): DateTimeFormatKind {\n\tif (hasDate) {\n\t\treturn hasTime ? \"datetime\" : \"date\";\n\t}\n\tif (hasTime) {\n\t\treturn \"time\";\n\t}\n\treturn hasMonth ? \"date\" : \"none\";\n}\n\n/**\n * Classify date/time tokens in a format string.\n *\n * Scans the format string for date/time tokens (y, m, d, h, s, etc.) while\n * skipping over quoted strings, escaped characters, numeric placeholders,\n * and color/condition blocks.\n *\n * @param fmt - Excel number format string\n * @returns a classification of the date/time tokens in the format\n */\nexport function getDateTimeFormatKind(fmt: string): DateTimeFormatKind {\n\tlet i = 0;\n\tlet c = \"\";\n\tlet o = \"\";\n\tlet hasDate = false;\n\tlet hasTime = false;\n\tlet hasMonth = false;\n\twhile (i < fmt.length) {\n\t\tswitch ((c = fmt.charAt(i))) {\n\t\t\tcase \"G\":\n\t\t\t\tif (isGeneralFormat(fmt, i)) {\n\t\t\t\t\ti += 6;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\t// Skip quoted string literal (everything between double quotes)\n\t\t\t\tfor (; fmt.charCodeAt(++i) !== 34 && i < fmt.length;) {\n\t\t\t\t\t/* empty */\n\t\t\t\t}\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\":\n\t\t\t\ti += 2; // Skip escaped character\n\t\t\t\tbreak;\n\t\t\tcase \"_\":\n\t\t\t\ti += 2; // Skip padding character\n\t\t\t\tbreak;\n\t\t\tcase \"@\":\n\t\t\t\t++i; // Text placeholder, not a date token\n\t\t\t\tbreak;\n\t\t\tcase \"B\":\n\t\t\tcase \"b\":\n\t\t\t\t// \"B1\" or \"B2\" = Buddhist/Hijri calendar modifier => date format\n\t\t\t\tif (fmt.charAt(i + 1) === \"1\" || fmt.charAt(i + 1) === \"2\") {\n\t\t\t\t\thasDate = true;\n\t\t\t\t\ti += 2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t/* falls through */\n\t\t\tcase \"D\":\n\t\t\tcase \"Y\":\n\t\t\tcase \"E\":\n\t\t\tcase \"d\":\n\t\t\tcase \"y\":\n\t\t\tcase \"e\":\n\t\t\tcase \"g\":\n\t\t\t\thasDate = true;\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"M\":\n\t\t\tcase \"m\":\n\t\t\t\thasMonth = true;\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"H\":\n\t\t\tcase \"S\":\n\t\t\tcase \"h\":\n\t\t\tcase \"s\":\n\t\t\t\thasTime = true;\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"A\":\n\t\t\tcase \"a\":\n\t\t\tcase \"\\u4E0A\": // Chinese \"上\" (used in AM/PM: 上午/下午)\n\t\t\t\tif (fmt.substring(i, i + 3).toUpperCase() === \"A/P\") {\n\t\t\t\t\thasTime = true;\n\t\t\t\t\ti += 3;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (fmt.substring(i, i + 5).toUpperCase() === \"AM/PM\") {\n\t\t\t\t\thasTime = true;\n\t\t\t\t\ti += 5;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (fmt.substring(i, i + 5).toUpperCase() === \"\\u4E0A\\u5348/\\u4E0B\\u5348\") {\n\t\t\t\t\thasTime = true; // Chinese AM/PM: 上午/下午\n\t\t\t\t\ti += 5;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"[\":\n\t\t\t\t// Scan bracket block for absolute time tokens\n\t\t\t\to = c;\n\t\t\t\twhile (fmt.charAt(i++) !== \"]\" && i < fmt.length) {\n\t\t\t\t\to += fmt.charAt(i);\n\t\t\t\t}\n\t\t\t\tif (o.match(SSF_abstime)) {\n\t\t\t\t\thasTime = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \".\":\n\t\t\tcase \"0\":\n\t\t\tcase \"#\":\n\t\t\t\t// Skip numeric format tokens and their modifiers\n\t\t\t\twhile (\n\t\t\t\t\ti < fmt.length &&\n\t\t\t\t\t(\"0#?.,E+-%\".indexOf((c = fmt.charAt(++i))) > -1 ||\n\t\t\t\t\t\t(c === \"\\\\\" && fmt.charAt(i + 1) === \"-\" && \"0#\".indexOf(fmt.charAt(i + 2)) > -1))\n\t\t\t\t) {\n\t\t\t\t\t/* empty */\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"?\":\n\t\t\t\twhile (fmt.charAt(++i) === c) {\n\t\t\t\t\t/* empty */\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"*\":\n\t\t\t\t++i;\n\t\t\t\tif (fmt.charAt(i) === \" \" || fmt.charAt(i) === \"*\") {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"(\":\n\t\t\tcase \")\":\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"1\":\n\t\t\tcase \"2\":\n\t\t\tcase \"3\":\n\t\t\tcase \"4\":\n\t\t\tcase \"5\":\n\t\t\tcase \"6\":\n\t\t\tcase \"7\":\n\t\t\tcase \"8\":\n\t\t\tcase \"9\":\n\t\t\t\twhile (i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) {\n\t\t\t\t\t/* empty */\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \" \":\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn classifyDateTimeTokens(hasDate, hasTime, hasMonth);\n}\n\n/**\n * Determine if a format string represents a date/time format.\n *\n * Scans the format string for date/time tokens while skipping quoted strings,\n * escaped characters, numeric placeholders, and color/condition blocks.\n *\n * @param fmt - Excel number format string\n * @returns true if the format contains date/time formatting tokens\n */\nexport function isDateFormat(fmt: string): boolean {\n\treturn getDateTimeFormatKind(fmt) !== \"none\";\n}\n\n/** Token produced by the format string tokenizer */\ninterface FmtToken {\n\t/** Token type: 't'=text, 'n'=number, 'G'=General, date letters, etc. */\n\ttype: string;\n\t/** Token content/value */\n\tvalue: string;\n}\n\n/**\n * Tokenize and evaluate an Excel format string against a value.\n *\n * This is the heart of the SSF engine. It works in 4 phases:\n *\n * 1. **Tokenize**: Walk the format string character by character, producing\n *    an array of typed tokens (text literals, date placeholders, number\n *    placeholders, AM/PM markers, etc.). During tokenization, date tokens\n *    trigger lazy parsing of the value as a serial date number.\n *\n * 2. **Resolve ambiguous 'm'**: In Excel, \"m\" means month when adjacent to\n *    day/year tokens, but minutes when adjacent to h/s tokens. A backward\n *    scan resolves this by checking the preceding/following token types.\n *\n * 3. **Time rounding**: Round the parsed date/time to the appropriate\n *    precision based on whether seconds, minutes, or hours are displayed.\n *\n * 4. **Render**: Replace date/time tokens with formatted values, coalesce\n *    number format tokens, and produce the final output string.\n *\n * @param fmt - A single format section (no semicolons)\n * @param value - The cell value to format\n * @param opts - Formatting options (date1904, dateNF, etc.)\n * @param flen - Number of format sections in the original format string (affects sign handling)\n * @returns Formatted string\n */\nfunction eval_fmt(fmt: string, value: any, opts: any, flen: number): string {\n\tconst out: (FmtToken | null)[] = [];\n\tlet tokenStr = \"\";\n\tlet i = 0;\n\tlet char = \"\";\n\tlet lastTokenType = \"t\";\n\tlet dateVal: SSFDateVal | null = null;\n\tlet scanIdx: number;\n\tlet charCode: number;\n\t// hourFormat tracks whether 'h' means 12-hour ('h') or 24-hour ('H').\n\t// It starts as 'H' (24-hour) and switches to 'h' (12-hour) when AM/PM is found.\n\tlet hourFormat = \"H\";\n\n\t/* Phase 1: Tokenize the format string */\n\twhile (i < fmt.length) {\n\t\tswitch ((char = fmt.charAt(i))) {\n\t\t\tcase \"G\":\n\t\t\t\tif (!isGeneralFormat(fmt, i)) {\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"unrecognized character \" + char + \" in \" + fmt);\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: \"G\", value: \"General\" };\n\t\t\t\ti += 7;\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\t// Quoted string literal: collect everything until the closing quote (charCode 34)\n\t\t\t\tfor (tokenStr = \"\"; (charCode = fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) {\n\t\t\t\t\ttokenStr += String.fromCharCode(charCode);\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: \"t\", value: tokenStr };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"\\\\\": {\n\t\t\t\t// Escaped single character\n\t\t\t\tconst nextChar = fmt.charAt(++i);\n\t\t\t\tconst t2 = nextChar === \"(\" || nextChar === \")\" ? nextChar : \"t\";\n\t\t\t\tout[out.length] = { type: t2, value: nextChar };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"_\":\n\t\t\t\t// Padding character: skip the next char and output a space\n\t\t\t\tout[out.length] = { type: \"t\", value: \" \" };\n\t\t\t\ti += 2;\n\t\t\t\tbreak;\n\t\t\tcase \"@\":\n\t\t\t\t// Text placeholder: replaced with the cell's text value\n\t\t\t\tout[out.length] = { type: \"T\", value: value };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"B\":\n\t\t\tcase \"b\":\n\t\t\t\t// \"B1\" = Buddhist calendar, \"B2\" = Hijri calendar\n\t\t\t\tif (fmt.charAt(i + 1) === \"1\" || fmt.charAt(i + 1) === \"2\") {\n\t\t\t\t\tif (dateVal == null) {\n\t\t\t\t\t\tdateVal = parseExcelDateCode(value, opts, fmt.charAt(i + 1) === \"2\");\n\t\t\t\t\t\tif (dateVal == null) {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tout[out.length] = { type: \"X\", value: fmt.substring(i, i + 2) };\n\t\t\t\t\tlastTokenType = char;\n\t\t\t\t\ti += 2;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t/* falls through */\n\t\t\tcase \"M\":\n\t\t\tcase \"D\":\n\t\t\tcase \"Y\":\n\t\t\tcase \"H\":\n\t\t\tcase \"S\":\n\t\t\tcase \"E\":\n\t\t\t\t// Uppercase date/time letters are normalized to lowercase\n\t\t\t\tchar = char.toLowerCase();\n\t\t\t/* falls through */\n\t\t\tcase \"m\":\n\t\t\tcase \"d\":\n\t\t\tcase \"y\":\n\t\t\tcase \"h\":\n\t\t\tcase \"s\":\n\t\t\tcase \"e\":\n\t\t\tcase \"g\":\n\t\t\t\t// Date/time tokens: negative values cannot be formatted as dates\n\t\t\t\tif (value < 0) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tif (dateVal == null) {\n\t\t\t\t\tdateVal = parseExcelDateCode(value, opts);\n\t\t\t\t\tif (dateVal == null) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Collect consecutive identical date/time letters (e.g. \"yyyy\", \"mm\", \"hh\")\n\t\t\t\ttokenStr = char;\n\t\t\t\twhile (++i < fmt.length && fmt.charAt(i).toLowerCase() === char) {\n\t\t\t\t\ttokenStr += char;\n\t\t\t\t}\n\t\t\t\t// Ambiguous 'm': after 'h', 'm' means Minutes (not Month)\n\t\t\t\tif (char === \"m\" && lastTokenType.toLowerCase() === \"h\") {\n\t\t\t\t\tchar = \"M\";\n\t\t\t\t}\n\t\t\t\t// Apply hour format (12h vs 24h)\n\t\t\t\tif (char === \"h\") {\n\t\t\t\t\tchar = hourFormat;\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: char, value: tokenStr };\n\t\t\t\tlastTokenType = char;\n\t\t\t\tbreak;\n\t\t\tcase \"A\":\n\t\t\tcase \"a\":\n\t\t\tcase \"\\u4E0A\": {\n\t\t\t\t// AM/PM indicator: \"A/P\", \"AM/PM\", or Chinese 上午/下午\n\t\t\t\tconst ampmToken: FmtToken = { type: char, value: char };\n\t\t\t\tif (dateVal == null) {\n\t\t\t\t\tdateVal = parseExcelDateCode(value, opts);\n\t\t\t\t}\n\t\t\t\tif (fmt.substring(i, i + 3).toUpperCase() === \"A/P\") {\n\t\t\t\t\tif (dateVal != null) {\n\t\t\t\t\t\tampmToken.value = dateVal.hours >= 12 ? fmt.charAt(i + 2) : char;\n\t\t\t\t\t}\n\t\t\t\t\tampmToken.type = \"T\";\n\t\t\t\t\thourFormat = \"h\"; // Switch to 12-hour format\n\t\t\t\t\ti += 3;\n\t\t\t\t} else if (fmt.substring(i, i + 5).toUpperCase() === \"AM/PM\") {\n\t\t\t\t\tif (dateVal != null) {\n\t\t\t\t\t\tampmToken.value = dateVal.hours >= 12 ? \"PM\" : \"AM\";\n\t\t\t\t\t}\n\t\t\t\t\tampmToken.type = \"T\";\n\t\t\t\t\ti += 5;\n\t\t\t\t\thourFormat = \"h\"; // Switch to 12-hour format\n\t\t\t\t} else if (fmt.substring(i, i + 5).toUpperCase() === \"\\u4E0A\\u5348/\\u4E0B\\u5348\") {\n\t\t\t\t\t// Chinese AM/PM: 上午/下午\n\t\t\t\t\tif (dateVal != null) {\n\t\t\t\t\t\tampmToken.value = dateVal.hours >= 12 ? \"\\u4E0B\\u5348\" : \"\\u4E0A\\u5348\";\n\t\t\t\t\t}\n\t\t\t\t\tampmToken.type = \"T\";\n\t\t\t\t\ti += 5;\n\t\t\t\t\thourFormat = \"h\"; // Switch to 12-hour format\n\t\t\t\t} else {\n\t\t\t\t\tampmToken.type = \"t\";\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t\tif (dateVal == null && ampmToken.type === \"T\") {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tout[out.length] = ampmToken;\n\t\t\t\tlastTokenType = char;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"[\":\n\t\t\t\t// Bracket block: could be [Red], [$-locale], or absolute time [h]/[mm]/[ss]\n\t\t\t\ttokenStr = char;\n\t\t\t\twhile (fmt.charAt(i++) !== \"]\" && i < fmt.length) {\n\t\t\t\t\ttokenStr += fmt.charAt(i);\n\t\t\t\t}\n\t\t\t\tif (tokenStr.slice(-1) !== \"]\") {\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", 'unterminated \"[\" block: |' + tokenStr + \"|\");\n\t\t\t\t}\n\t\t\t\tif (tokenStr.match(SSF_abstime)) {\n\t\t\t\t\t// Absolute/elapsed time token (e.g. [h], [mm], [ss])\n\t\t\t\t\tif (dateVal == null) {\n\t\t\t\t\t\tdateVal = parseExcelDateCode(value, opts);\n\t\t\t\t\t\tif (dateVal == null) {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tout[out.length] = { type: \"Z\", value: tokenStr.toLowerCase() };\n\t\t\t\t\tlastTokenType = tokenStr.charAt(1);\n\t\t\t\t} else if (tokenStr.indexOf(\"$\") > -1) {\n\t\t\t\t\t// Currency/locale block like [$USD-409]: extract the currency symbol\n\t\t\t\t\ttokenStr = (tokenStr.match(/\\$([^-[\\]]*)/) || [])[1] || \"$\";\n\t\t\t\t\tif (!isDateFormat(fmt)) {\n\t\t\t\t\t\tout[out.length] = { type: \"t\", value: tokenStr };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \".\":\n\t\t\t\tif (dateVal != null) {\n\t\t\t\t\t// In date context, \".\" followed by zeros = sub-second precision\n\t\t\t\t\ttokenStr = char;\n\t\t\t\t\twhile (++i < fmt.length && (char = fmt.charAt(i)) === \"0\") {\n\t\t\t\t\t\ttokenStr += char;\n\t\t\t\t\t}\n\t\t\t\t\tout[out.length] = { type: \"s\", value: tokenStr };\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t/* falls through */\n\t\t\tcase \"0\":\n\t\t\tcase \"#\":\n\t\t\t\t// Numeric format tokens: collect the full number pattern\n\t\t\t\ttokenStr = char;\n\t\t\t\twhile (++i < fmt.length && \"0#?.,E+-%\".indexOf((char = fmt.charAt(i))) > -1) {\n\t\t\t\t\ttokenStr += char;\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: \"n\", value: tokenStr };\n\t\t\t\tbreak;\n\t\t\tcase \"?\":\n\t\t\t\t// Fixed-width digit placeholder (displays as space if no digit)\n\t\t\t\ttokenStr = char;\n\t\t\t\twhile (fmt.charAt(++i) === char) {\n\t\t\t\t\ttokenStr += char;\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: char, value: tokenStr };\n\t\t\t\tlastTokenType = char;\n\t\t\t\tbreak;\n\t\t\tcase \"*\":\n\t\t\t\t// Repeat character (fill): skip the repeat indicator and its character\n\t\t\t\t++i;\n\t\t\t\tif (fmt.charAt(i) === \" \" || fmt.charAt(i) === \"*\") {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"(\":\n\t\t\tcase \")\":\n\t\t\t\tout[out.length] = { type: flen === 1 ? \"t\" : char, value: char };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"1\":\n\t\t\tcase \"2\":\n\t\t\tcase \"3\":\n\t\t\tcase \"4\":\n\t\t\tcase \"5\":\n\t\t\tcase \"6\":\n\t\t\tcase \"7\":\n\t\t\tcase \"8\":\n\t\t\tcase \"9\":\n\t\t\t\t// Literal digit sequence (e.g. denominator in a fraction format)\n\t\t\t\ttokenStr = char;\n\t\t\t\twhile (i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) {\n\t\t\t\t\ttokenStr += fmt.charAt(i);\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: \"D\", value: tokenStr };\n\t\t\t\tbreak;\n\t\t\tcase \" \":\n\t\t\t\tout[out.length] = { type: char, value: char };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tcase \"$\":\n\t\t\t\tout[out.length] = { type: \"t\", value: \"$\" };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Characters known to be safe as text: currency, punctuation, misc letters\n\t\t\t\tif (\",$-+/():!^&'~{}<>=\\u20ACacfijklopqrtuvwxzP\".indexOf(char) === -1) {\n\t\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"unrecognized character \" + char + \" in \" + fmt);\n\t\t\t\t}\n\t\t\t\tout[out.length] = { type: \"t\", value: char };\n\t\t\t\t++i;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/*\n\t * Phase 2: Resolve ambiguous 'm' tokens and determine time precision.\n\t *\n\t * In Excel, 'm' is ambiguous: it means \"month\" in date contexts but\n\t * \"minutes\" in time contexts. The resolution rule is:\n\t * - 'm' immediately after 'h' or 'H' -> minutes ('M')\n\t * - 'm' immediately before 's' -> minutes ('M')\n\t * - Otherwise -> month ('m')\n\t *\n\t * This backward scan also tracks the time precision (dateTimePrecision):\n\t *   0 = no time, 1 = hours, 2 = minutes, 3 = seconds, 4 = sub-seconds\n\t */\n\tlet dateTimePrecision = 0;\n\tlet subSecondDigits = 0;\n\tlet ssm: RegExpMatchArray | null;\n\tfor (i = out.length - 1, lastTokenType = \"t\"; i >= 0; --i) {\n\t\tif (!out[i]) {\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (out[i]!.type) {\n\t\t\tcase \"h\":\n\t\t\tcase \"H\":\n\t\t\t\tout[i]!.type = hourFormat;\n\t\t\t\tlastTokenType = \"h\";\n\t\t\t\tif (dateTimePrecision < 1) {\n\t\t\t\t\tdateTimePrecision = 1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"s\":\n\t\t\t\tif ((ssm = out[i]!.value.match(/\\.0+$/))) {\n\t\t\t\t\tsubSecondDigits = Math.max(subSecondDigits, ssm[0].length - 1);\n\t\t\t\t\tdateTimePrecision = 4; // sub-second precision\n\t\t\t\t}\n\t\t\t\tif (dateTimePrecision < 3) {\n\t\t\t\t\tdateTimePrecision = 3;\n\t\t\t\t}\n\t\t\t/* falls through */\n\t\t\tcase \"d\":\n\t\t\tcase \"y\":\n\t\t\tcase \"e\":\n\t\t\t\tlastTokenType = out[i]!.type;\n\t\t\t\tbreak;\n\t\t\tcase \"M\":\n\t\t\t\tlastTokenType = out[i]!.type;\n\t\t\t\tif (dateTimePrecision < 2) {\n\t\t\t\t\tdateTimePrecision = 2;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"m\":\n\t\t\t\t// If the next time-related token (scanning backward) is 's', this 'm' means minutes\n\t\t\t\tif (lastTokenType === \"s\") {\n\t\t\t\t\tout[i]!.type = \"M\";\n\t\t\t\t\tif (dateTimePrecision < 2) {\n\t\t\t\t\t\tdateTimePrecision = 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"X\":\n\t\t\t\tbreak;\n\t\t\tcase \"Z\":\n\t\t\t\tif (dateTimePrecision < 1 && out[i]!.value.match(/[Hh]/)) {\n\t\t\t\t\tdateTimePrecision = 1;\n\t\t\t\t}\n\t\t\t\tif (dateTimePrecision < 2 && out[i]!.value.match(/[Mm]/)) {\n\t\t\t\t\tdateTimePrecision = 2;\n\t\t\t\t}\n\t\t\t\tif (dateTimePrecision < 3 && out[i]!.value.match(/[Ss]/)) {\n\t\t\t\t\tdateTimePrecision = 3;\n\t\t\t\t}\n\t\t}\n\t}\n\n\t/*\n\t * Phase 3: Time rounding.\n\t *\n\t * Round the date/time value to the displayed precision to avoid\n\t * showing e.g. \"59.999\" seconds as \"59\" when it should round to \"00\"\n\t * and increment the minutes.\n\t */\n\tif (dateVal) {\n\t\tlet _dt: SSFDateVal | null;\n\t\tswitch (dateTimePrecision) {\n\t\t\tcase 0:\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\tcase 2:\n\t\t\tcase 3:\n\t\t\t\t// Round to whole seconds, then propagate carry through min/hr/day\n\t\t\t\tif (dateVal.subSeconds >= 0.5) {\n\t\t\t\t\tdateVal.subSeconds = 0;\n\t\t\t\t\t++dateVal.seconds;\n\t\t\t\t}\n\t\t\t\tif (dateVal.seconds >= 60) {\n\t\t\t\t\tdateVal.seconds = 0;\n\t\t\t\t\t++dateVal.minutes;\n\t\t\t\t}\n\t\t\t\tif (dateVal.minutes >= 60) {\n\t\t\t\t\tdateVal.minutes = 0;\n\t\t\t\t\t++dateVal.hours;\n\t\t\t\t}\n\t\t\t\tif (dateVal.hours >= 24) {\n\t\t\t\t\tdateVal.hours = 0;\n\t\t\t\t\t++dateVal.daySerial;\n\t\t\t\t\t_dt = parseExcelDateCode(dateVal.daySerial);\n\t\t\t\t\tif (_dt) {\n\t\t\t\t\t\t_dt.subSeconds = dateVal.subSeconds;\n\t\t\t\t\t\t_dt.seconds = dateVal.seconds;\n\t\t\t\t\t\t_dt.minutes = dateVal.minutes;\n\t\t\t\t\t\t_dt.hours = dateVal.hours;\n\t\t\t\t\t\tdateVal = _dt;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\t// Sub-second precision: round to the displayed number of decimal places\n\t\t\t\tswitch (subSecondDigits) {\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tdateVal.subSeconds = Math.round(dateVal.subSeconds * 10) / 10;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tdateVal.subSeconds = Math.round(dateVal.subSeconds * 100) / 100;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tdateVal.subSeconds = Math.round(dateVal.subSeconds * 1000) / 1000;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (dateVal.subSeconds >= 1) {\n\t\t\t\t\tdateVal.subSeconds = 0;\n\t\t\t\t\t++dateVal.seconds;\n\t\t\t\t}\n\t\t\t\tif (dateVal.seconds >= 60) {\n\t\t\t\t\tdateVal.seconds = 0;\n\t\t\t\t\t++dateVal.minutes;\n\t\t\t\t}\n\t\t\t\tif (dateVal.minutes >= 60) {\n\t\t\t\t\tdateVal.minutes = 0;\n\t\t\t\t\t++dateVal.hours;\n\t\t\t\t}\n\t\t\t\tif (dateVal.hours >= 24) {\n\t\t\t\t\tdateVal.hours = 0;\n\t\t\t\t\t++dateVal.daySerial;\n\t\t\t\t\t_dt = parseExcelDateCode(dateVal.daySerial);\n\t\t\t\t\tif (_dt) {\n\t\t\t\t\t\t_dt.subSeconds = dateVal.subSeconds;\n\t\t\t\t\t\t_dt.seconds = dateVal.seconds;\n\t\t\t\t\t\t_dt.minutes = dateVal.minutes;\n\t\t\t\t\t\t_dt.hours = dateVal.hours;\n\t\t\t\t\t\tdateVal = _dt;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/*\n\t * Phase 4: Render — replace tokens with formatted values.\n\t *\n\t * - Date/time tokens are rendered via SSF_write_date\n\t * - Number tokens are coalesced into a single format string\n\t * - \"General\" tokens are rendered via SSF_general\n\t * - Text and literal tokens pass through\n\t */\n\tlet numberFmtStr = \"\";\n\tlet numFmtIdx: number;\n\tfor (i = 0; i < out.length; ++i) {\n\t\tif (!out[i]) {\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (out[i]!.type) {\n\t\t\tcase \"t\":\n\t\t\tcase \"T\":\n\t\t\tcase \" \":\n\t\t\tcase \"D\":\n\t\t\t\tbreak;\n\t\t\tcase \"X\":\n\t\t\t\t// Calendar modifier (B1/B2): already handled, clear it\n\t\t\t\tout[i]!.value = \"\";\n\t\t\t\tout[i]!.type = \";\";\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\tcase \"m\":\n\t\t\tcase \"y\":\n\t\t\tcase \"h\":\n\t\t\tcase \"H\":\n\t\t\tcase \"M\":\n\t\t\tcase \"s\":\n\t\t\tcase \"e\":\n\t\t\tcase \"b\":\n\t\t\tcase \"Z\":\n\t\t\t\tout[i]!.value = SSF_write_date(out[i]!.type.charCodeAt(0), out[i]!.value, dateVal!, subSecondDigits);\n\t\t\t\tout[i]!.type = \"t\";\n\t\t\t\tbreak;\n\t\t\tcase \"n\":\n\t\t\tcase \"?\":\n\t\t\t\t// Coalesce adjacent number-related tokens into a single format string\n\t\t\t\tnumFmtIdx = i + 1;\n\t\t\t\twhile (\n\t\t\t\t\tout[numFmtIdx] != null &&\n\t\t\t\t\t((char = out[numFmtIdx]!.type) === \"?\" ||\n\t\t\t\t\t\tchar === \"D\" ||\n\t\t\t\t\t\t((char === \" \" || char === \"t\") &&\n\t\t\t\t\t\t\tout[numFmtIdx + 1] != null &&\n\t\t\t\t\t\t\t(out[numFmtIdx + 1]!.type === \"?\" ||\n\t\t\t\t\t\t\t\t(out[numFmtIdx + 1]!.type === \"t\" && out[numFmtIdx + 1]!.value === \"/\"))) ||\n\t\t\t\t\t\t(out[i]!.type === \"(\" && (char === \" \" || char === \"n\" || char === \")\")) ||\n\t\t\t\t\t\t(char === \"t\" &&\n\t\t\t\t\t\t\t(out[numFmtIdx]!.value === \"/\" ||\n\t\t\t\t\t\t\t\t(out[numFmtIdx]!.value === \" \" &&\n\t\t\t\t\t\t\t\t\tout[numFmtIdx + 1] != null &&\n\t\t\t\t\t\t\t\t\tout[numFmtIdx + 1]!.type === \"?\"))))\n\t\t\t\t) {\n\t\t\t\t\tout[i]!.value += out[numFmtIdx]!.value;\n\t\t\t\t\tout[numFmtIdx] = { value: \"\", type: \";\" };\n\t\t\t\t\t++numFmtIdx;\n\t\t\t\t}\n\t\t\t\tnumberFmtStr += out[i]!.value;\n\t\t\t\ti = numFmtIdx - 1;\n\t\t\t\tbreak;\n\t\t\tcase \"G\":\n\t\t\t\tout[i]!.type = \"t\";\n\t\t\t\tout[i]!.value = SSF_general(value, opts);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Format the coalesced number format string and distribute the result back into tokens\n\tlet partialValue = \"\";\n\tlet adjustedValue: number;\n\tlet formattedNumber: string;\n\tif (numberFmtStr.length > 0) {\n\t\tif (numberFmtStr.charCodeAt(0) === 40) {\n\t\t\t// Format starts with '(' — parenthesized negative format\n\t\t\tadjustedValue = value < 0 && numberFmtStr.charCodeAt(0) === 45 ? -value : value;\n\t\t\tformattedNumber = write_num(\"n\", numberFmtStr, adjustedValue);\n\t\t} else {\n\t\t\t// For multi-section formats (flen > 1), the negative sign is handled by section selection\n\t\t\tadjustedValue = value < 0 && flen > 1 ? -value : value;\n\t\t\tformattedNumber = write_num(\"n\", numberFmtStr, adjustedValue);\n\t\t\t// If the value is negative and there's a leading text token, prepend the minus there\n\t\t\tif (adjustedValue < 0 && out[0] && out[0].type === \"t\") {\n\t\t\t\tformattedNumber = formattedNumber.substring(1);\n\t\t\t\tout[0].value = \"-\" + out[0].value;\n\t\t\t}\n\t\t}\n\t\t// Distribute the formatted number string back across the placeholder tokens\n\t\tnumFmtIdx = formattedNumber.length - 1;\n\t\tlet decpt = out.length;\n\t\t// Find the token containing the decimal point\n\t\tfor (i = 0; i < out.length; ++i) {\n\t\t\tif (out[i] != null && out[i]!.type !== \"t\" && out[i]!.value.indexOf(\".\") > -1) {\n\t\t\t\tdecpt = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tlet lasti = out.length;\n\t\tif (decpt === out.length && formattedNumber.indexOf(\"E\") === -1) {\n\t\t\t// No decimal point: fill tokens right-to-left\n\t\t\tfor (i = out.length - 1; i >= 0; --i) {\n\t\t\t\tif (out[i] == null || \"n?\".indexOf(out[i]!.type) === -1) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (numFmtIdx >= out[i]!.value.length - 1) {\n\t\t\t\t\tnumFmtIdx -= out[i]!.value.length;\n\t\t\t\t\tout[i]!.value = formattedNumber.substring(numFmtIdx + 1, numFmtIdx + 1 + out[i]!.value.length);\n\t\t\t\t} else if (numFmtIdx < 0) {\n\t\t\t\t\tout[i]!.value = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tout[i]!.value = formattedNumber.substring(0, numFmtIdx + 1);\n\t\t\t\t\tnumFmtIdx = -1;\n\t\t\t\t}\n\t\t\t\tout[i]!.type = \"t\";\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif (numFmtIdx >= 0 && lasti < out.length) {\n\t\t\t\tout[lasti]!.value = formattedNumber.substring(0, numFmtIdx + 1) + out[lasti]!.value;\n\t\t\t}\n\t\t} else if (decpt !== out.length && formattedNumber.indexOf(\"E\") === -1) {\n\t\t\t// Has decimal point: fill integer part right-to-left, fractional part left-to-right\n\t\t\tnumFmtIdx = formattedNumber.indexOf(\".\") - 1;\n\t\t\tfor (i = decpt; i >= 0; --i) {\n\t\t\t\tif (out[i] == null || \"n?\".indexOf(out[i]!.type) === -1) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tscanIdx =\n\t\t\t\t\tout[i]!.value.indexOf(\".\") > -1 && i === decpt\n\t\t\t\t\t\t? out[i]!.value.indexOf(\".\") - 1\n\t\t\t\t\t\t: out[i]!.value.length - 1;\n\t\t\t\tpartialValue = out[i]!.value.substring(scanIdx + 1);\n\t\t\t\tfor (; scanIdx >= 0; --scanIdx) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnumFmtIdx >= 0 &&\n\t\t\t\t\t\t(out[i]!.value.charAt(scanIdx) === \"0\" || out[i]!.value.charAt(scanIdx) === \"#\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tpartialValue = formattedNumber.charAt(numFmtIdx--) + partialValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tout[i]!.value = partialValue;\n\t\t\t\tout[i]!.type = \"t\";\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif (numFmtIdx >= 0 && lasti < out.length) {\n\t\t\t\tout[lasti]!.value = formattedNumber.substring(0, numFmtIdx + 1) + out[lasti]!.value;\n\t\t\t}\n\t\t\t// Fill fractional part left-to-right from the decimal point\n\t\t\tnumFmtIdx = formattedNumber.indexOf(\".\") + 1;\n\t\t\tfor (i = decpt; i < out.length; ++i) {\n\t\t\t\tif (out[i] == null || (\"n?(\".indexOf(out[i]!.type) === -1 && i !== decpt)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tscanIdx = out[i]!.value.indexOf(\".\") > -1 && i === decpt ? out[i]!.value.indexOf(\".\") + 1 : 0;\n\t\t\t\tpartialValue = out[i]!.value.substring(0, scanIdx);\n\t\t\t\tfor (; scanIdx < out[i]!.value.length; ++scanIdx) {\n\t\t\t\t\tif (numFmtIdx < formattedNumber.length) {\n\t\t\t\t\t\tpartialValue += formattedNumber.charAt(numFmtIdx++);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tout[i]!.value = partialValue;\n\t\t\t\tout[i]!.type = \"t\";\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t}\n\t}\n\t// Handle any remaining unprocessed number/? tokens\n\tfor (i = 0; i < out.length; ++i) {\n\t\tif (out[i] != null && \"n?\".indexOf(out[i]!.type) > -1) {\n\t\t\tadjustedValue = flen > 1 && value < 0 && i > 0 && out[i - 1]!.value === \"-\" ? -value : value;\n\t\t\tout[i]!.value = write_num(out[i]!.type, out[i]!.value, adjustedValue);\n\t\t\tout[i]!.type = \"t\";\n\t\t}\n\t}\n\t// Concatenate all token values into the final result\n\tlet retval = \"\";\n\tfor (i = 0; i !== out.length; ++i) {\n\t\tif (out[i] != null) {\n\t\t\tretval += out[i]!.value;\n\t\t}\n\t}\n\treturn retval;\n}\n\n/** Regex to parse conditional format expressions like [>=100] or [<0] */\nconst cfregex2 = /\\[(=|>[=]?|<[>=]?)(-?\\d+(?:\\.\\d*)?)\\]/;\n\n/** Evaluate a conditional format expression against a numeric value */\nfunction chkcond(v: number, rr: RegExpMatchArray | null): boolean {\n\tif (rr == null) {\n\t\treturn false;\n\t}\n\tconst thresh = parseFloat(rr[2]);\n\tswitch (rr[1]) {\n\t\tcase \"=\":\n\t\t\tif (v == thresh) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \">\":\n\t\t\tif (v > thresh) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"<\":\n\t\t\tif (v < thresh) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"<>\":\n\t\t\tif (v != thresh) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \">=\":\n\t\t\tif (v >= thresh) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"<=\":\n\t\t\tif (v <= thresh) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tbreak;\n\t}\n\treturn false;\n}\n\n/**\n * Select the appropriate format section for a given value.\n *\n * Excel format strings can have up to 4 semicolon-separated sections:\n *   1 section:  applies to all values\n *   2 sections: positive/zero ; negative\n *   3 sections: positive ; negative ; zero\n *   4 sections: positive ; negative ; zero ; text\n *\n * If a section contains \"@\", it's a text section and is moved to position 4.\n * If sections contain conditional expressions like [>=100], those are evaluated\n * to determine which section applies.\n *\n * @param fmtStr - Full format string (may contain semicolons)\n * @param value - Cell value to format\n * @returns [sectionCount, selectedFormatSection] tuple\n */\nfunction choose_fmt(fmtStr: string, value: any): [number, string] {\n\tlet fmt = SSF_split_fmt(fmtStr);\n\tconst sectionCount = fmt.length;\n\tconst lat = fmt[sectionCount - 1].indexOf(\"@\"); // check if last section has text placeholder\n\tlet ll = sectionCount;\n\tif (sectionCount < 4 && lat > -1) {\n\t\t--ll;\n\t}\n\tif (fmt.length > 4) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"cannot find right format for |\" + fmt.join(\"|\") + \"|\");\n\t}\n\t// Non-numeric values use the text section (section 4) or \"@\"\n\tif (typeof value !== \"number\") {\n\t\treturn [4, fmt.length === 4 || lat > -1 ? fmt[fmt.length - 1] : \"@\"];\n\t}\n\tif (typeof value === \"number\" && !isFinite(value)) {\n\t\tvalue = 0;\n\t}\n\t// Normalize to 4 sections based on how many were provided\n\tswitch (fmt.length) {\n\t\tcase 1:\n\t\t\tfmt = lat > -1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"];\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tfmt = lat > -1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"];\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tfmt = lat > -1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"];\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tbreak;\n\t}\n\t// Default selection: positive -> [0], negative -> [1], zero -> [2]\n\tconst selectedFmt = value > 0 ? fmt[0] : value < 0 ? fmt[1] : fmt[2];\n\t// If no conditional expressions, use the default selection\n\tif (fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) {\n\t\treturn [ll, selectedFmt];\n\t}\n\t// Check for conditional format expressions like [>=100] or [<0]\n\tif (fmt[0].match(/\\[[=<>]/) != null || fmt[1].match(/\\[[=<>]/) != null) {\n\t\tconst m1 = fmt[0].match(cfregex2);\n\t\tconst m2 = fmt[1].match(cfregex2);\n\t\treturn chkcond(value, m1)\n\t\t\t? [ll, fmt[0]]\n\t\t\t: chkcond(value, m2)\n\t\t\t\t? [ll, fmt[1]]\n\t\t\t\t: [ll, fmt[m1 != null && m2 != null ? 2 : 1]];\n\t}\n\treturn [ll, selectedFmt];\n}\n\n/**\n * Format a numeric value using an Excel number format string or format index.\n *\n * This is the main entry point for the SSF engine. It resolves the format string\n * (from index or direct string), selects the appropriate section for the value's\n * sign, and delegates to the tokenizer/renderer ({@link eval_fmt}).\n *\n * @param fmt - Format string (e.g. \"#,##0.00\") or format index (e.g. 14 for \"m/d/yy\")\n * @param value - The value to format (number, string, boolean, Date, etc.)\n * @param options - Formatting options: date1904, dateNF (date format override), table (custom format table)\n * @returns Formatted string representation\n */\nexport function formatNumber(fmt: string | number, value: any, options?: any): string {\n\tif (options == null) {\n\t\toptions = {};\n\t}\n\tlet sfmt = \"\";\n\tswitch (typeof fmt) {\n\t\tcase \"string\":\n\t\t\t// Format 14 (\"m/d/yy\") can be overridden by opts.dateNF\n\t\t\tif (fmt === \"m/d/yy\" && options.dateNF) {\n\t\t\t\tsfmt = options.dateNF;\n\t\t\t} else {\n\t\t\t\tsfmt = fmt;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tif (fmt === 14 && options.dateNF) {\n\t\t\t\tsfmt = options.dateNF;\n\t\t\t} else {\n\t\t\t\t// Look up format string from the table (custom table or global)\n\t\t\t\tsfmt = (options.table != null ? options.table : formatTable)[fmt];\n\t\t\t}\n\t\t\t// Fallback chain: custom table -> DEFAULT_FORMAT_MAP -> DEFAULT_FORMAT_STRINGS -> \"General\"\n\t\t\tif (sfmt == null) {\n\t\t\t\tsfmt =\n\t\t\t\t\t(options.table && options.table[DEFAULT_FORMAT_MAP[fmt]]) || formatTable[DEFAULT_FORMAT_MAP[fmt]];\n\t\t\t}\n\t\t\tif (sfmt == null) {\n\t\t\t\tsfmt = DEFAULT_FORMAT_STRINGS[fmt] || \"General\";\n\t\t\t}\n\t\t\tbreak;\n\t}\n\tif (isGeneralFormat(sfmt, 0)) {\n\t\treturn SSF_general(value, options);\n\t}\n\t// Convert Date objects to serial numbers before formatting\n\tif (value instanceof Date) {\n\t\tconst dateValue = options.UTC\n\t\t\t? value\n\t\t\t: new Date(\n\t\t\t\t\tDate.UTC(\n\t\t\t\t\t\tvalue.getFullYear(),\n\t\t\t\t\t\tvalue.getMonth(),\n\t\t\t\t\t\tvalue.getDate(),\n\t\t\t\t\t\tvalue.getHours(),\n\t\t\t\t\t\tvalue.getMinutes(),\n\t\t\t\t\t\tvalue.getSeconds(),\n\t\t\t\t\t\tvalue.getMilliseconds(),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\tvalue = dateToSerialNumber(dateValue, options.date1904);\n\t}\n\t// Select the appropriate format section (positive/negative/zero/text)\n\tconst chosenFmt = choose_fmt(sfmt, value);\n\tif (isGeneralFormat(chosenFmt[1])) {\n\t\treturn SSF_general(value, options);\n\t}\n\tif (value === true) {\n\t\tvalue = \"TRUE\";\n\t} else if (value === false) {\n\t\tvalue = \"FALSE\";\n\t} else if (value === \"\" || value == null) {\n\t\treturn \"\";\n\t} else if (isNaN(value) && chosenFmt[1].indexOf(\"0\") > -1) {\n\t\treturn \"#NUM!\";\n\t} else if (!isFinite(value) && chosenFmt[1].indexOf(\"0\") > -1) {\n\t\treturn \"#DIV/0!\";\n\t}\n\treturn eval_fmt(chosenFmt[1], value, options, chosenFmt[0]);\n}\n","import { XlsxError } from \"../errors.js\";\n\nexport const XLSX_MAX_ROWS = 1_048_576;\nexport const XLSX_MAX_COLUMNS = 16_384;\nexport const DEFAULT_MAX_EXPORT_CELLS = 1_000_000;\nexport const DEFAULT_MAX_IMPORT_CELLS = 10_000_000;\n\nexport function worksheetOptionLimit(value: number | undefined, fallback: number, name: string): number {\n\tif (value == null) {\n\t\treturn fallback;\n\t}\n\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `${name} must be a non-negative safe integer`);\n\t}\n\treturn value;\n}\n\n/** Cumulative per-sheet budget for explicit and derived worksheet cell work. */\nexport class WorksheetCellBudget {\n\treadonly limit: number;\n\tprivate used = 0;\n\n\tconstructor(value: number | undefined, fallback: number) {\n\t\tthis.limit = worksheetOptionLimit(value, fallback, \"maxWorksheetCells\");\n\t}\n\n\tcharge(kind: string, count: number): void {\n\t\tif (!Number.isSafeInteger(count) || count < 0) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", `Invalid ${kind} count ${count}`);\n\t\t}\n\t\tif (count > this.limit - this.used) {\n\t\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", `${kind} count ${this.used + count} exceeds limit ${this.limit}`);\n\t\t}\n\t\tthis.used += count;\n\t}\n}\n","import type { Range, WorkSheet } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { decodeCell } from \"./cell.js\";\nimport { DEFAULT_MAX_EXPORT_CELLS, WorksheetCellBudget, XLSX_MAX_COLUMNS, XLSX_MAX_ROWS } from \"./worksheet-budget.js\";\n\nconst CELL_REF_RE = /^[A-Z]+[1-9]\\d*$/;\nexport function rangeCellCount(range: Range, kind = \"worksheet range\"): number {\n\tfor (const [name, value] of [\n\t\t[\"start row\", range.s.r],\n\t\t[\"start column\", range.s.c],\n\t\t[\"end row\", range.e.r],\n\t\t[\"end column\", range.e.c],\n\t] as const) {\n\t\tif (!Number.isSafeInteger(value) || value < 0) {\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `Invalid ${kind}: ${name} must be a non-negative safe integer`);\n\t\t}\n\t}\n\tif (range.e.r < range.s.r || range.e.c < range.s.c) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `Invalid ${kind}: end must not precede start`);\n\t}\n\tif (range.e.r >= XLSX_MAX_ROWS || range.e.c >= XLSX_MAX_COLUMNS) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `Invalid ${kind}: range exceeds XLSX worksheet bounds`);\n\t}\n\tconst rows = range.e.r - range.s.r + 1;\n\tconst cols = range.e.c - range.s.c + 1;\n\treturn rows * cols;\n}\n\nfunction occupiedRangeEnd(sheet: WorkSheet, range: Range): { r: number; c: number } | null {\n\tlet maxRow = -1;\n\tlet maxCol = -1;\n\tconst data = (sheet as any)[\"!data\"];\n\tif (data != null) {\n\t\tfor (const rowKey of Object.keys(data)) {\n\t\t\tconst rowIdx = Number(rowKey);\n\t\t\tif (!Number.isInteger(rowIdx) || rowIdx < range.s.r || rowIdx > range.e.r) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst row = data[rowIdx];\n\t\t\tif (!row) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const colKey of Object.keys(row)) {\n\t\t\t\tconst colIdx = Number(colKey);\n\t\t\t\tif (!Number.isInteger(colIdx) || colIdx < range.s.c || colIdx > range.e.c || row[colIdx] == null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (rowIdx > maxRow) {\n\t\t\t\t\tmaxRow = rowIdx;\n\t\t\t\t}\n\t\t\t\tif (colIdx > maxCol) {\n\t\t\t\t\tmaxCol = colIdx;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const ref of Object.keys(sheet)) {\n\t\t\tif (!CELL_REF_RE.test(ref) || (sheet as any)[ref] == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cell = decodeCell(ref);\n\t\t\tif (cell.r < range.s.r || cell.r > range.e.r || cell.c < range.s.c || cell.c > range.e.c) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (cell.r > maxRow) {\n\t\t\t\tmaxRow = cell.r;\n\t\t\t}\n\t\t\tif (cell.c > maxCol) {\n\t\t\t\tmaxCol = cell.c;\n\t\t\t}\n\t\t}\n\t}\n\treturn maxRow === -1 ? null : { r: maxRow, c: maxCol };\n}\n\nexport function clampLargeExportRange(\n\tsheet: WorkSheet,\n\trange: Range,\n\tbudget = new WorksheetCellBudget(undefined, DEFAULT_MAX_EXPORT_CELLS),\n\tclampToOccupied = true,\n): Range | null {\n\tlet count = rangeCellCount(range, \"worksheet export range\");\n\tif (count <= budget.limit) {\n\t\tbudget.charge(\"worksheet export cell\", count);\n\t\treturn range;\n\t}\n\tif (!clampToOccupied) {\n\t\tbudget.charge(\"worksheet export cell\", count);\n\t\treturn range;\n\t}\n\tconst end = occupiedRangeEnd(sheet, range);\n\tif (!end) {\n\t\treturn null;\n\t}\n\tconst clamped = {\n\t\ts: { r: range.s.r, c: range.s.c },\n\t\te: {\n\t\t\tr: Math.max(range.s.r, Math.min(range.e.r, end.r)),\n\t\t\tc: Math.max(range.s.c, Math.min(range.e.c, end.c)),\n\t\t},\n\t};\n\tcount = rangeCellCount(clamped, \"worksheet export range\");\n\tbudget.charge(\"worksheet export cell\", count);\n\treturn clamped;\n}\n","import { decodeRow, encodeRow, decodeCol, encodeCol, decodeRange, decodeCell } from \"../utils/cell.js\";\nimport type { CellAddress } from \"../types.js\";\n\n/**\n * Regex to match R1C1-style cell references in formulas.\n *\n * Matches patterns like R1C1 (absolute), R[1]C[1] (relative), RC (current cell).\n * The negative lookbehind prevents matching inside identifiers. The three capture\n * groups are: $1 = prefix char, $2 = row part, $3 = column part.\n */\nconst rcregex = /(^|[^A-Za-z_])R(\\[?-?\\d+\\]|[1-9]\\d*)?C(\\[?-?\\d+\\]|[1-9]\\d*)?(?!\\w)/g;\n\n/**\n * Convert R1C1-style formula references to A1-style.\n *\n * R1C1 references can be absolute (R1C1) or relative (R[1]C[1]).\n * Relative references use brackets and are offset from the base cell.\n *\n * @param fstr - Formula string containing R1C1 references\n * @param base - Base cell address for resolving relative references\n * @returns Formula string with A1-style references\n */\nexport function rcToA1(fstr: string, base: CellAddress): string {\n\treturn fstr.replace(rcregex, (_match, prefix, rowPart = \"\", colPart = \"\") => {\n\t\tlet row = rowPart;\n\t\tlet col = colPart;\n\t\tlet cRel = false,\n\t\t\trRel = false;\n\n\t\t// Empty row/col part means relative offset of 0 (e.g. \"RC\" = current row/col)\n\t\tif (row.length === 0) {\n\t\t\trRel = true;\n\t\t} else if (row.charAt(0) === \"[\") {\n\t\t\trRel = true;\n\t\t\trow = row.slice(1, -1); // Strip brackets\n\t\t}\n\n\t\tif (col.length === 0) {\n\t\t\tcRel = true;\n\t\t} else if (col.charAt(0) === \"[\") {\n\t\t\tcRel = true;\n\t\t\tcol = col.slice(1, -1); // Strip brackets\n\t\t}\n\n\t\tconst R = row.length > 0 ? parseInt(row, 10) | 0 : 0;\n\t\tconst C = col.length > 0 ? parseInt(col, 10) | 0 : 0;\n\n\t\t// Relative: offset from base; Absolute: R1C1 is 1-based so subtract 1\n\t\tconst cFinal = cRel ? C + base.c : C - 1;\n\t\tconst rFinal = rRel ? R + base.r : R - 1;\n\n\t\t// Absolute references get a \"$\" prefix in A1 notation\n\t\treturn prefix + (cRel ? \"\" : \"$\") + encodeCol(cFinal) + (rRel ? \"\" : \"$\") + encodeRow(rFinal);\n\t});\n}\n\n/**\n * Regex to match A1-style cell references in formulas.\n *\n * Matches column letters (A-XFD), optional $ anchors, and row numbers (1-1048576).\n * The lookbehind and lookahead prevent matching inside identifiers or function names.\n */\nconst crefregex =\n\t/(^|[^.\\w])(\\$?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])(\\$?)(10[0-3]\\d{4}|104[0-7]\\d{3}|1048[0-4]\\d{2}|10485[0-6]\\d|104857[0-6]|[1-9]\\d{0,5})(?![\\w.(![])/g;\n\nconst wholeColumnRegex =\n\t/(^|[^.\\w])(\\$?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D]):(\\$?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])(?![\\w.(![])/g;\nconst wholeRowRegex =\n\t/(^|[^.\\w])(\\$?)(10[0-3]\\d{4}|104[0-7]\\d{3}|1048[0-4]\\d{2}|10485[0-6]\\d|104857[0-6]|[1-9]\\d{0,5}):(\\$?)(10[0-3]\\d{4}|104[0-7]\\d{3}|1048[0-4]\\d{2}|10485[0-6]\\d|104857[0-6]|[1-9]\\d{0,5})(?![\\w.(![])/g;\nconst protectedFormulaTokenRegex = /(\"(?:[^\"]|\"\")*\"|'(?:[^']|'')*'!|[A-Za-z_][\\w.]*(?::[A-Za-z_][\\w.]*)?!|\\[[^\\]]*\\])/g;\n\n/**\n * Convert A1-style formula references to R1C1-style.\n *\n * @param fstr - Formula string containing A1 references\n * @param base - Base cell address for computing relative offsets\n * @returns Formula string with R1C1-style references\n */\nexport function a1ToRc(fstr: string, base: CellAddress): string {\n\treturn fstr.replace(crefregex, ($0, $1, $2, $3, $4, $5) => {\n\t\tconst c = decodeCol($3) - ($2 ? 0 : base.c);\n\t\tconst r = decodeRow($5) - ($4 ? 0 : base.r);\n\t\t// Absolute ($): use 1-based index; Relative: use [offset] or empty for 0\n\t\tconst R = $4 === \"$\" ? r + 1 : r === 0 ? \"\" : \"[\" + r + \"]\";\n\t\tconst C = $2 === \"$\" ? c + 1 : c === 0 ? \"\" : \"[\" + c + \"]\";\n\t\treturn $1 + \"R\" + R + \"C\" + C;\n\t});\n}\n\n/**\n * Shift all cell references in a formula string by a given row/column delta.\n *\n * Absolute references (prefixed with $) are left unchanged.\n *\n * @param f - Formula string to transform\n * @param delta - Row and column offsets to apply\n * @returns Formula string with shifted references\n */\nexport function shiftFormulaStr(f: string, delta: CellAddress): string {\n\tconst shiftColumn = (anchor: string, column: string): string | undefined => {\n\t\tconst shifted = decodeCol(column) + (anchor ? 0 : delta.c);\n\t\treturn shifted < 0 || shifted >= 16_384 ? undefined : anchor + encodeCol(shifted);\n\t};\n\tconst shiftRow = (anchor: string, row: string): string | undefined => {\n\t\tconst shifted = decodeRow(row) + (anchor ? 0 : delta.r);\n\t\treturn shifted < 0 || shifted >= 1_048_576 ? undefined : anchor + encodeRow(shifted);\n\t};\n\tconst shiftReferences = (segment: string): string =>\n\t\tsegment\n\t\t\t.replace(wholeColumnRegex, ($0, prefix, startAnchor, startColumn, endAnchor, endColumn) => {\n\t\t\t\tconst start = shiftColumn(startAnchor, startColumn);\n\t\t\t\tconst end = shiftColumn(endAnchor, endColumn);\n\t\t\t\treturn prefix + (start && end ? start + \":\" + end : \"#REF!\");\n\t\t\t})\n\t\t\t.replace(wholeRowRegex, ($0, prefix, startAnchor, startRow, endAnchor, endRow) => {\n\t\t\t\tconst start = shiftRow(startAnchor, startRow);\n\t\t\t\tconst end = shiftRow(endAnchor, endRow);\n\t\t\t\treturn prefix + (start && end ? start + \":\" + end : \"#REF!\");\n\t\t\t})\n\t\t\t.replace(crefregex, ($0, prefix, columnAnchor, column, rowAnchor, row) => {\n\t\t\t\tconst shiftedColumn = shiftColumn(columnAnchor, column);\n\t\t\t\tconst shiftedRow = shiftRow(rowAnchor, row);\n\t\t\t\treturn prefix + (shiftedColumn && shiftedRow ? shiftedColumn + shiftedRow : \"#REF!\");\n\t\t\t});\n\n\treturn f\n\t\t.split(protectedFormulaTokenRegex)\n\t\t.map((segment, index) => (index % 2 === 0 ? shiftReferences(segment) : segment))\n\t\t.join(\"\");\n}\n\n/**\n * Shift a shared formula from its master cell to a target cell.\n *\n * Computes the delta between the shared formula's origin (start of range)\n * and the target cell, then applies that shift to all references.\n *\n * @param f - The shared formula string (from the master cell)\n * @param range - The shared formula range (e.g. \"A1:C5\")\n * @param cell - The target cell address (e.g. \"B3\")\n * @returns Formula string adjusted for the target cell\n */\nexport function shiftFormulaXlsx(f: string, range: string, cell: string): string {\n\tconst r = decodeRange(range);\n\tconst s = r.s;\n\tconst c = decodeCell(cell);\n\tconst delta = { r: c.r - s.r, c: c.c - s.c };\n\treturn shiftFormulaStr(f, delta);\n}\n\n/**\n * Heuristic check: is this string likely a formula?\n *\n * Single-character strings are not treated as formulas (e.g. \"=\" alone).\n *\n * @param f - String to test\n * @returns true if the string looks like it could be a formula\n */\nexport function isFuzzyFormula(f: string): boolean {\n\treturn f.length !== 1;\n}\n\n/**\n * Strip the _xlfn. prefix from Excel function names.\n *\n * Excel uses _xlfn. to prefix newer function names for backward compatibility\n * (e.g. _xlfn.CONCAT becomes CONCAT).\n *\n * @param f - Formula string potentially containing _xlfn. prefixes\n * @returns Formula string with prefixes removed\n */\nexport function stripXlFunctionPrefix(f: string): string {\n\treturn f.replace(/_xlfn\\./g, \"\");\n}\n","import {\n\tBErr,\n\tRBErr,\n\ttype WorkSheet,\n\ttype CellObject,\n\ttype Range,\n\ttype ColInfo,\n\ttype MarginInfo,\n\ttype SheetView,\n} from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { parseXmlTag, XML_HEADER } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml } from \"../xml/escape.js\";\nimport { writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS_main, RELS as RELTYPE } from \"../xml/namespaces.js\";\nimport { assertXmlCountWithinLimit, assertXmlPartLimits, DEFAULT_MAX_WORKSHEET_ROWS } from \"../xml/limits.js\";\nimport { safeDecodeRange, encodeRange, encodeCell, decodeCell } from \"../utils/cell.js\";\nimport { formatNumber, getDateTimeFormatKind } from \"../ssf/format.js\";\nimport { formatTable } from \"../ssf/table.js\";\nimport { dateToSerialNumber, serialNumberToDate } from \"../utils/date.js\";\nimport { normalizeRichTextXml, parseStringItem, type SST, type XLString } from \"./shared-strings.js\";\nimport type { StylesData } from \"./styles.js\";\nimport { getCellStyleIndex, getStyleFromXf } from \"./styles.js\";\nimport type { Relationships } from \"../opc/relationships.js\";\nimport { clampLargeExportRange } from \"../utils/export-range.js\";\nimport {\n\tDEFAULT_MAX_EXPORT_CELLS,\n\tDEFAULT_MAX_IMPORT_CELLS,\n\tWorksheetCellBudget,\n\tworksheetOptionLimit,\n\tXLSX_MAX_COLUMNS,\n\tXLSX_MAX_ROWS,\n} from \"../utils/worksheet-budget.js\";\nimport { shiftFormulaStr } from \"./formula.js\";\n\n/** Regex patterns for extracting various worksheet XML elements */\nconst mergecregex = /<(?:\\w+:)?mergeCell ref=[\"'][A-Z0-9:]+['\"]\\s*[/]?>/g;\nconst hlinkregex = /<(?:\\w+:)?hyperlink [^<>]*>/gm;\nconst dimregex = /\"(\\w*:\\w*)\"/;\nconst colregex = /<(?:\\w+:)?col\\b[^<>]*[/]?>/g;\nconst afregex = /<(?:\\w:)?autoFilter[^>]*([/]|>([\\s\\S]*)<\\/(?:\\w:)?autoFilter)>/g;\nconst marginregex = /<(?:\\w+:)?pageMargins[^<>]*\\/>/g;\nconst sheetViewRegex = /<(?:\\w+:)?sheetView\\b[^>]*(?:\\/>|>[\\s\\S]*?<\\/(?:\\w+:)?sheetView>)/;\n\n/** Parse the <dimension> element to set the sheet reference range */\nfunction parseWorksheetXml_dim(ws: WorkSheet, s: string): void {\n\tconst d = safeDecodeRange(s);\n\tif (d.s.r <= d.e.r && d.s.c <= d.e.c && d.s.r >= 0 && d.s.c >= 0) {\n\t\tws[\"!ref\"] = encodeRange(d);\n\t}\n}\n\n/** Parse <pageMargins> attributes with defaults matching Excel's standard margins */\nfunction parseWorksheetXml_margins(tag: Record<string, any>): MarginInfo {\n\tconst margin = (value: unknown, fallback: number): number => {\n\t\tconst parsed = typeof value === \"string\" ? parseFloat(value) : Number(value);\n\t\treturn Number.isFinite(parsed) ? parsed : fallback;\n\t};\n\treturn {\n\t\tleft: margin(tag.left, 0.7),\n\t\tright: margin(tag.right, 0.7),\n\t\ttop: margin(tag.top, 0.75),\n\t\tbottom: margin(tag.bottom, 0.75),\n\t\theader: margin(tag.header, 0.3),\n\t\tfooter: margin(tag.footer, 0.3),\n\t};\n}\n\nfunction parseWorksheetXml_error(value: string | null): string | number {\n\tif (value === null) {\n\t\treturn \"\";\n\t}\n\tconst token = unescapeXml(value);\n\treturn Object.hasOwn(RBErr, token) ? RBErr[token] : token;\n}\n\nfunction serializeWorksheetXml_error(value: unknown): string {\n\tif (typeof value === \"number\") {\n\t\treturn BErr[value] ?? String(value);\n\t}\n\treturn typeof value === \"string\" ? value : \"\";\n}\n\n/** Parse <autoFilter> element extracting the filter reference range */\nfunction parseWorksheetXml_autofilter(data: string, opts?: any): { ref: string } {\n\tconst tag = parseXmlTag(data.match(/<[^>]*>/)?.[0] || \"\", undefined, undefined, opts);\n\treturn { ref: tag.ref || \"\" };\n}\n\n/** Parse <col> elements to populate column width and hidden state */\nfunction parseWorksheetXml_cols(columns: ColInfo[], cols: string[], budget: WorksheetCellBudget, opts?: any): void {\n\tfor (let i = 0; i < cols.length; ++i) {\n\t\tconst tag = parseXmlTag(cols[i], undefined, undefined, opts);\n\t\tif (!tag.min || !tag.max) {\n\t\t\tcontinue;\n\t\t}\n\t\t// min/max are 1-based column indices in the XML\n\t\tif (!/^[1-9]\\d*$/.test(tag.min) || !/^[1-9]\\d*$/.test(tag.max)) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet column range: min and max must be positive integers\");\n\t\t}\n\t\tconst min = Number(tag.min) - 1;\n\t\tconst max = Number(tag.max) - 1;\n\t\tif (!Number.isSafeInteger(min) || !Number.isSafeInteger(max) || max < min || max >= XLSX_MAX_COLUMNS) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet column range: range exceeds XLSX worksheet bounds\");\n\t\t}\n\t\tbudget.charge(\"worksheet cell\", max - min + 1);\n\t\tconst width = tag.width ? parseFloat(tag.width) : undefined;\n\t\tconst hidden = tag.hidden === \"1\";\n\t\tfor (let j = min; j <= max; ++j) {\n\t\t\tif (!columns[j]) {\n\t\t\t\tcolumns[j] = {};\n\t\t\t}\n\t\t\tif (width !== undefined) {\n\t\t\t\tcolumns[j].width = width;\n\t\t\t}\n\t\t\tif (hidden) {\n\t\t\t\tcolumns[j].hidden = true;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parseWorksheetXml_views(data: string, opts?: any): SheetView[] | undefined {\n\tconst match = data.match(sheetViewRegex);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\tconst pane = match[0].match(/<(?:\\w+:)?pane\\b[^>]*\\/>/);\n\tif (!pane) {\n\t\treturn undefined;\n\t}\n\tconst tag = parseXmlTag(pane[0], undefined, undefined, opts);\n\tif (tag.state !== \"frozen\") {\n\t\treturn undefined;\n\t}\n\tconst view: SheetView = { state: \"frozen\" };\n\tif (tag.xSplit) {\n\t\tview.xSplit = parseFloat(tag.xSplit);\n\t}\n\tif (tag.ySplit) {\n\t\tview.ySplit = parseFloat(tag.ySplit);\n\t}\n\tif (tag.topLeftCell) {\n\t\tview.topLeftCell = tag.topLeftCell;\n\t}\n\tif (tag.activePane === \"topRight\" || tag.activePane === \"bottomLeft\" || tag.activePane === \"bottomRight\") {\n\t\tview.activePane = tag.activePane;\n\t}\n\treturn [view];\n}\n\n/** Parse <hyperlink> elements and attach link objects to the corresponding cells */\nfunction parseWorksheetXml_hlinks(\n\ts: WorkSheet,\n\thlinks: string[],\n\trels: Relationships,\n\tbudget: WorksheetCellBudget,\n\topts?: any,\n): void {\n\tfor (let i = 0; i < hlinks.length; ++i) {\n\t\tconst tag = parseXmlTag(hlinks[i], undefined, undefined, opts);\n\t\tif (!tag.ref) {\n\t\t\tcontinue;\n\t\t}\n\t\t// Hyperlinks can span a range of cells\n\t\tif (!/^[A-Z]+[1-9]\\d*(?::[A-Z]+[1-9]\\d*)?$/.test(tag.ref)) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet hyperlink range\");\n\t\t}\n\t\tconst rng = safeDecodeRange(tag.ref);\n\t\tif (\n\t\t\trng.s.r < 0 ||\n\t\t\trng.s.c < 0 ||\n\t\t\trng.e.r < rng.s.r ||\n\t\t\trng.e.c < rng.s.c ||\n\t\t\trng.e.r >= XLSX_MAX_ROWS ||\n\t\t\trng.e.c >= XLSX_MAX_COLUMNS\n\t\t) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet hyperlink range: range exceeds XLSX worksheet bounds\");\n\t\t}\n\t\tif (opts.sheetRows > 0 && rng.s.r >= opts.sheetRows) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst endRow = opts.sheetRows > 0 ? Math.min(rng.e.r, opts.sheetRows - 1) : rng.e.r;\n\t\tbudget.charge(\"worksheet cell\", (endRow - rng.s.r + 1) * (rng.e.c - rng.s.c + 1));\n\t\tfor (let R = rng.s.r; R <= endRow; ++R) {\n\t\t\tfor (let C = rng.s.c; C <= rng.e.c; ++C) {\n\t\t\t\tconst addr = encodeCell({ r: R, c: C });\n\t\t\t\tconst dense = s[\"!data\"] != null;\n\t\t\t\tlet cell: CellObject | undefined;\n\t\t\t\tif (dense) {\n\t\t\t\t\tif (!s[\"!data\"]![R]) {\n\t\t\t\t\t\ts[\"!data\"]![R] = [];\n\t\t\t\t\t}\n\t\t\t\t\tcell = s[\"!data\"]![R]![C];\n\t\t\t\t} else {\n\t\t\t\t\tcell = s[addr] as CellObject | undefined;\n\t\t\t\t}\n\t\t\t\tif (!cell) {\n\t\t\t\t\tcell = { t: \"z\", v: undefined } as any;\n\t\t\t\t\tif (dense) {\n\t\t\t\t\t\ts[\"!data\"]![R]![C] = cell;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts[addr] = cell;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Resolve the hyperlink target from the relationship by r:id\n\t\t\t\tlet target = \"\";\n\t\t\t\tif (tag.id) {\n\t\t\t\t\tconst rel = rels[\"!id\"]?.[tag.id];\n\t\t\t\t\tif (rel) {\n\t\t\t\t\t\ttarget = rel.Target;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (tag.location) {\n\t\t\t\t\ttarget += \"#\" + tag.location;\n\t\t\t\t}\n\t\t\t\tcell!.l = { Target: target };\n\t\t\t\tif (tag.tooltip) {\n\t\t\t\t\tcell!.l.Tooltip = tag.tooltip;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Regex to match <c> (cell) elements, capturing inner content */\nconst cellregex = /<(?:\\w+:)?c\\b[^>]*?(?:\\/>|>([\\s\\S]*?)<\\/(?:\\w+:)?c>)/g;\nconst cellReferenceRegex = /^([A-Z]+)([1-9]\\d*)$/;\n\nfunction parseWorksheetCellColumn(ref: string, expectedRow: number): number {\n\tconst match = cellReferenceRegex.exec(ref);\n\tif (!match) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet cell reference\");\n\t}\n\tconst row = Number(match[2]) - 1;\n\tif (!Number.isSafeInteger(row) || row < 0 || row >= XLSX_MAX_ROWS) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet cell row: value exceeds XLSX worksheet bounds\");\n\t}\n\tif (row !== expectedRow) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet cell reference: row does not match containing row\");\n\t}\n\tlet column = 0;\n\tfor (const letter of match[1]) {\n\t\tcolumn = 26 * column + (letter.charCodeAt(0) - 64);\n\t}\n\tcolumn -= 1;\n\tif (!Number.isSafeInteger(column) || column < 0 || column >= XLSX_MAX_COLUMNS) {\n\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet cell column: value exceeds XLSX worksheet bounds\");\n\t}\n\treturn column;\n}\n\n/**\n * Parse the <sheetData> XML into cell objects within the worksheet.\n * Processes rows and cells, handling all cell types (string, number, boolean, etc.).\n */\nfunction parseSheetData(\n\tsdata: string,\n\ts: WorkSheet,\n\topts: any,\n\trefguess: Range,\n\t_themes: any,\n\tstyles: StylesData | undefined,\n\twb: any,\n\tbudget: WorksheetCellBudget,\n\tmaxWorksheetRows: number,\n): void {\n\tconst dense = s[\"!data\"] != null;\n\tconst date1904 = wb?.WBProps?.date1904;\n\tlet rowCount = 0;\n\tconst sharedFormulas = new Map<string, { formula: string; origin: string }>();\n\tconst pendingSharedFormulas: { cell: CellObject; ref: string; si: string }[] = [];\n\tconst unresolvedSharedFormulaIds = new Set<string>();\n\n\t// Split by </row> boundaries to isolate each row's content\n\tconst rows = sdata.split(/<\\/(?:\\w+:)?row>/);\n\n\tfor (let ri = 0; ri < rows.length; ++ri) {\n\t\tconst rowStr = rows[ri];\n\t\tif (!rowStr) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Find the <row> tag to get the row number\n\t\tconst rowTagMatch = rowStr.match(/<(?:\\w+:)?row\\b[^>]*>/);\n\t\tif (!rowTagMatch) {\n\t\t\tcontinue;\n\t\t}\n\t\tassertXmlCountWithinLimit(\"worksheet row\", ++rowCount, maxWorksheetRows);\n\t\tconst rowTag = parseXmlTag(rowTagMatch[0], undefined, undefined, opts);\n\t\t// Row numbers in XML are 1-based\n\t\tconst R = parseInt(rowTag.r, 10) - 1;\n\t\tif (!Number.isSafeInteger(R) || R < 0 || R >= XLSX_MAX_ROWS) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid worksheet row index: value exceeds XLSX worksheet bounds\");\n\t\t}\n\n\t\tconst rowIsWithinLimit = !opts.sheetRows || R < opts.sheetRows;\n\t\t// Extract row properties (height, hidden) only for retained rows.\n\t\tif (rowIsWithinLimit && (rowTag.ht !== undefined || rowTag.hidden !== undefined)) {\n\t\t\tif (!s[\"!rows\"]) {\n\t\t\t\ts[\"!rows\"] = [];\n\t\t\t}\n\t\t\tif (!s[\"!rows\"][R]) {\n\t\t\t\ts[\"!rows\"][R] = {};\n\t\t\t}\n\t\t\tif (rowTag.ht !== undefined) {\n\t\t\t\tconst hpt = parseFloat(rowTag.ht);\n\t\t\t\tif (Number.isFinite(hpt)) {\n\t\t\t\t\ts[\"!rows\"][R].hpt = hpt;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (rowTag.hidden === \"1\") {\n\t\t\t\ts[\"!rows\"][R].hidden = true;\n\t\t\t}\n\t\t}\n\n\t\t// Skipped rows are not materialized. If a retained cell references a\n\t\t// shared-formula master later in the sheet, scan only until those masters\n\t\t// are found and count every inspected cell against the safety limit.\n\t\tif (!rowIsWithinLimit) {\n\t\t\tif (opts.cellFormula !== false && unresolvedSharedFormulaIds.size > 0) {\n\t\t\t\tcellregex.lastIndex = 0;\n\t\t\t\tlet skippedCellMatch;\n\t\t\t\twhile ((skippedCellMatch = cellregex.exec(rowStr))) {\n\t\t\t\t\tbudget.charge(\"worksheet cell\", 1);\n\t\t\t\t\tconst skippedCellTag = parseXmlTag(\n\t\t\t\t\t\tskippedCellMatch[0].match(/<(?:\\w+:)?c\\b[^>]*/)?.[0] + \">\" || \"\",\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\topts,\n\t\t\t\t\t);\n\t\t\t\t\tconst skippedRef = skippedCellTag.r;\n\t\t\t\t\tconst skippedCellValue = skippedCellMatch[1] || \"\";\n\t\t\t\t\tconst skippedFormulaTagMatch = skippedCellValue.match(/<(?:\\w+:)?f\\b[^>]*>/);\n\t\t\t\t\tconst skippedFormulaMatch = skippedCellValue.match(/<(?:\\w+:)?f\\b[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?f>/);\n\t\t\t\t\tif (!skippedRef || !skippedFormulaTagMatch || !skippedFormulaMatch?.[1]) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tparseWorksheetCellColumn(skippedRef, R);\n\t\t\t\t\tconst skippedFormulaTag = parseXmlTag(skippedFormulaTagMatch[0], undefined, undefined, opts);\n\t\t\t\t\tif (skippedFormulaTag.t !== \"shared\" || skippedFormulaTag.si == null) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst si = String(skippedFormulaTag.si);\n\t\t\t\t\tif (!unresolvedSharedFormulaIds.has(si)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tsharedFormulas.set(si, {\n\t\t\t\t\t\tformula: unescapeXml(skippedFormulaMatch[1]),\n\t\t\t\t\t\torigin: skippedRef,\n\t\t\t\t\t});\n\t\t\t\t\tunresolvedSharedFormulaIds.delete(si);\n\t\t\t\t\tif (unresolvedSharedFormulaIds.size === 0) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parse cells in this row\n\t\tcellregex.lastIndex = 0;\n\t\tlet cellMatch;\n\t\twhile ((cellMatch = cellregex.exec(rowStr))) {\n\t\t\tbudget.charge(\"worksheet cell\", 1);\n\t\t\tconst cellTag = parseXmlTag(\n\t\t\t\tcellMatch[0].match(/<(?:\\w+:)?c\\b[^>]*/)?.[0] + \">\" || \"\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\topts,\n\t\t\t);\n\t\t\tconst ref = cellTag.r;\n\t\t\tif (!ref) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst C = parseWorksheetCellColumn(ref, R);\n\n\t\t\t// Expand the guessed range to include this cell\n\t\t\tif (R < refguess.s.r) {\n\t\t\t\trefguess.s.r = R;\n\t\t\t}\n\t\t\tif (R > refguess.e.r) {\n\t\t\t\trefguess.e.r = R;\n\t\t\t}\n\t\t\tif (C < refguess.s.c) {\n\t\t\t\trefguess.s.c = C;\n\t\t\t}\n\t\t\tif (C > refguess.e.c) {\n\t\t\t\trefguess.e.c = C;\n\t\t\t}\n\n\t\t\t// t = cell type attribute: s(shared string), str(formula string), inlineStr, b(boolean), e(error), d(date), n(number/default)\n\t\t\tconst cellType = cellTag.t || \"n\";\n\t\t\t// s = style index\n\t\t\tconst cellStyle = cellTag.s ? parseInt(cellTag.s, 10) : 0;\n\t\t\tconst cellValue = cellMatch[1] || \"\";\n\n\t\t\tlet cell: CellObject;\n\n\t\t\t// Extract <v> (value), <f> (formula), and <is> (inline string) sub-elements\n\t\t\tconst vMatch = cellValue.match(/<(?:\\w+:)?v>([\\s\\S]*?)<\\/(?:\\w+:)?v>/);\n\t\t\tconst fTagMatch = cellValue.match(/<(?:\\w+:)?f\\b[^>]*>/);\n\t\t\tconst fMatch = cellValue.match(/<(?:\\w+:)?f\\b[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?f>/);\n\t\t\tconst isMatch = cellValue.match(/<(?:\\w+:)?is\\b[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?is\\s*>/);\n\t\t\tconst preserveFormula = fTagMatch != null && opts.cellFormula !== false;\n\n\t\t\tconst v = vMatch ? vMatch[1] : null;\n\n\t\t\tswitch (cellType) {\n\t\t\t\tcase \"s\": // shared string - value is an index into the SST\n\t\t\t\t\tif (v !== null) {\n\t\t\t\t\t\tconst idx = parseInt(v, 10);\n\t\t\t\t\t\tcell = { t: \"s\", v: \"\" };\n\t\t\t\t\t\t// Store SST index for later resolution via resolveSharedStrings()\n\t\t\t\t\t\t(cell as any)._sstIdx = idx;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcell = { t: \"z\" };\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"str\": // formula result that is a string\n\t\t\t\t\tcell = { t: \"s\", v: v ? unescapeXml(v) : \"\" };\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"inlineStr\":\n\t\t\t\t\tif (isMatch) {\n\t\t\t\t\t\tconst inlineString = parseStringItem(isMatch[1], opts);\n\t\t\t\t\t\tcell = { t: \"s\", v: inlineString.t };\n\t\t\t\t\t\tif (inlineString.r !== undefined) {\n\t\t\t\t\t\t\tcell.r = inlineString.r;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (inlineString.h !== undefined) {\n\t\t\t\t\t\t\tcell.h = inlineString.h;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcell = { t: \"s\", v: \"\" };\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"b\": // boolean\n\t\t\t\t\tcell = { t: \"b\", v: v === \"1\" };\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"e\": // error\n\t\t\t\t\tcell = { t: \"e\", v: parseWorksheetXml_error(v) };\n\t\t\t\t\t(cell as any).w = v === null ? \"\" : unescapeXml(v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\": // ISO 8601 date string\n\t\t\t\t\tif (v) {\n\t\t\t\t\t\tcell = { t: \"d\", v: new Date(v) };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcell = { t: \"z\" };\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: // \"n\" (number) or unrecognized\n\t\t\t\t\tif (v !== null) {\n\t\t\t\t\t\tcell = { t: \"n\", v: parseFloat(v) };\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!preserveFormula && !opts.sheetStubs) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcell = preserveFormula ? { t: \"n\" } : { t: \"z\" };\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Apply style reference from the cellXf table\n\t\t\tif (styles) {\n\t\t\t\tconst xf = styles.CellXf[cellStyle];\n\t\t\t\tif (xf) {\n\t\t\t\t\tconst numberFormat = styles.NumberFmt[xf.numFmtId] || formatTable[xf.numFmtId];\n\t\t\t\t\tif (cellStyle > 0 || xf.numFmtId !== 0) {\n\t\t\t\t\t\tcell.XF = { numFmtId: xf.numFmtId, numFmt: numberFormat };\n\t\t\t\t\t}\n\t\t\t\t\tif (opts.cellStyles) {\n\t\t\t\t\t\tconst style = getStyleFromXf(styles, cellStyle);\n\t\t\t\t\t\tif (style) {\n\t\t\t\t\t\t\tcell.s = style;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (opts.cellNF) {\n\t\t\t\t\t\tif (numberFormat) {\n\t\t\t\t\t\t\tcell.z = numberFormat;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Extract formula\n\t\t\tif (fTagMatch && opts.cellFormula !== false) {\n\t\t\t\tconst fTag = parseXmlTag(fTagMatch[0], undefined, undefined, opts);\n\t\t\t\tconst formula = fMatch ? unescapeXml(fMatch[1]) : undefined;\n\t\t\t\tif (fTag.t === \"shared\" && fTag.si != null) {\n\t\t\t\t\tconst si = String(fTag.si);\n\t\t\t\t\tif (formula) {\n\t\t\t\t\t\tcell.f = formula;\n\t\t\t\t\t\tsharedFormulas.set(si, { formula, origin: ref });\n\t\t\t\t\t\tunresolvedSharedFormulaIds.delete(si);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst master = sharedFormulas.get(si);\n\t\t\t\t\t\tif (master) {\n\t\t\t\t\t\t\tconst origin = decodeCell(master.origin);\n\t\t\t\t\t\t\tconst target = decodeCell(ref);\n\t\t\t\t\t\t\tcell.f = shiftFormulaStr(master.formula, {\n\t\t\t\t\t\t\t\tr: target.r - origin.r,\n\t\t\t\t\t\t\t\tc: target.c - origin.c,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpendingSharedFormulas.push({ cell, ref, si });\n\t\t\t\t\t\t\tunresolvedSharedFormulaIds.add(si);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (formula !== undefined) {\n\t\t\t\t\tcell.f = formula;\n\t\t\t\t}\n\t\t\t\tif (fTag.t === \"array\" && fTag.ref) {\n\t\t\t\t\tcell.F = fTag.ref; // Array formula range\n\t\t\t\t\tconst cellMetadata = cellTag.cm ? opts.xlmeta?.Cell?.[Number(cellTag.cm) - 1] : undefined;\n\t\t\t\t\tcell.D = fTag.dt === \"1\" || cellMetadata?.type === \"XLDAPR\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Format the cell value as display text\n\t\t\tif (cell.t === \"n\") {\n\t\t\t\tconst numFmtId = cell.XF?.numFmtId ?? 0;\n\t\t\t\tconst nfmt = cell.z || cell.XF?.numFmt || styles?.NumberFmt[numFmtId] || formatTable[numFmtId];\n\t\t\t\tif (opts.cellText !== false && typeof cell.v === \"number\") {\n\t\t\t\t\tif (nfmt) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcell.w = formatNumber(nfmt, cell.v, { date1904, dateNF: opts.dateNF });\n\t\t\t\t\t\t} catch {}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Date typing is independent from display-text generation.\n\t\t\t\tif (opts.cellDates && cell.XF) {\n\t\t\t\t\tconst fmtKind = typeof nfmt === \"string\" ? getDateTimeFormatKind(nfmt) : \"none\";\n\t\t\t\t\tif (fmtKind !== \"none\" && fmtKind !== \"time\" && typeof cell.v === \"number\") {\n\t\t\t\t\t\tcell.t = \"d\";\n\t\t\t\t\t\tcell.v = serialNumberToDate(cell.v, date1904);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Store cell in dense or sparse mode\n\t\t\tif (dense) {\n\t\t\t\tif (!s[\"!data\"]![R]) {\n\t\t\t\t\ts[\"!data\"]![R] = [];\n\t\t\t\t}\n\t\t\t\ts[\"!data\"]![R][C] = cell;\n\t\t\t} else {\n\t\t\t\ts[ref] = cell;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const pending of pendingSharedFormulas) {\n\t\tconst master = sharedFormulas.get(pending.si);\n\t\tif (!master) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst origin = decodeCell(master.origin);\n\t\tconst target = decodeCell(pending.ref);\n\t\tpending.cell.f = shiftFormulaStr(master.formula, {\n\t\t\tr: target.r - origin.r,\n\t\t\tc: target.c - origin.c,\n\t\t});\n\t}\n}\n\n/**\n * Resolve shared string references in a worksheet by replacing SST index\n * placeholders with actual string values from the shared string table.\n *\n * @param s - Worksheet whose cells may contain _sstIdx placeholders\n * @param sst - Parsed Shared String Table\n * @param opts - Options controlling HTML output (cellHTML)\n */\nexport function resolveSharedStrings(s: WorkSheet, sst: SST, opts: any): void {\n\tconst resolveCell = (cell: CellObject | undefined): void => {\n\t\tif (!cell || (cell as any)._sstIdx === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst idx = (cell as any)._sstIdx;\n\t\tdelete (cell as any)._sstIdx;\n\t\tif (sst[idx]) {\n\t\t\tcell.v = sst[idx].t;\n\t\t\tif (opts.cellHTML !== false && sst[idx].h) {\n\t\t\t\tcell.h = sst[idx].h;\n\t\t\t}\n\t\t\tif (sst[idx].r) {\n\t\t\t\tcell.r = sst[idx].r;\n\t\t\t}\n\t\t}\n\t};\n\tconst dense = s[\"!data\"] != null;\n\tif (dense) {\n\t\tconst data = s[\"!data\"]!;\n\t\tfor (const rowKey of Object.keys(data)) {\n\t\t\tconst R = Number(rowKey);\n\t\t\tif (!Number.isSafeInteger(R) || R < 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst row = data[R];\n\t\t\tif (!row) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const columnKey of Object.keys(row)) {\n\t\t\t\tconst C = Number(columnKey);\n\t\t\t\tif (!Number.isSafeInteger(C) || C < 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresolveCell(row[C]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const ref of Object.keys(s)) {\n\t\t\t// Skip special keys (e.g. !ref, !merges, !data)\n\t\t\tif (ref.charAt(0) === \"!\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresolveCell(s[ref] as CellObject);\n\t\t}\n\t}\n}\n\n/**\n * Parse a worksheet XML file into a WorkSheet object.\n *\n * Extracts dimensions, columns, cell data, merges, hyperlinks, autofilter,\n * margins, and legacy drawing references from the sheet XML.\n *\n * @param data - Raw XML string of the sheet file (e.g. sheet1.xml)\n * @param opts - Parsing options (dense, sheetRows, cellHTML, cellDates, etc.)\n * @param _idx - Sheet index (unused, reserved)\n * @param rels - Relationships for resolving hyperlink targets\n * @param wb - Parsed workbook properties (for date1904 flag)\n * @param _themes - Theme data (reserved for theme color resolution)\n * @param styles - Parsed styles data for number format resolution\n * @returns Parsed WorkSheet object\n */\nexport function parseWorksheetXml(\n\tdata: string,\n\topts?: any,\n\t_idx?: number,\n\trels?: Relationships,\n\twb?: any,\n\t_themes?: any,\n\tstyles?: StylesData,\n): WorkSheet {\n\tif (!data) {\n\t\treturn {};\n\t}\n\tif (!opts) {\n\t\topts = {};\n\t}\n\topts.sheetRows = worksheetOptionLimit(opts.sheetRows, 0, \"sheetRows\");\n\tconst maxWorksheetRows = worksheetOptionLimit(\n\t\topts.maxWorksheetRows,\n\t\tDEFAULT_MAX_WORKSHEET_ROWS,\n\t\t\"maxWorksheetRows\",\n\t);\n\tassertXmlPartLimits(\"worksheet.xml\", data, opts);\n\tif (!rels) {\n\t\trels = { \"!id\": {} };\n\t}\n\n\tconst s: WorkSheet = opts.dense ? { \"!data\": [] } : {};\n\tconst budget = new WorksheetCellBudget(opts.maxWorksheetCells, DEFAULT_MAX_IMPORT_CELLS);\n\t// Start with an inverted range that will be narrowed as cells are found\n\tconst refguess: Range = { s: { r: 2000000, c: 2000000 }, e: { r: 0, c: 0 } };\n\n\t// Split the XML at the <sheetData> section for efficient parsing\n\tlet data1 = \"\";\n\tlet data2 = \"\";\n\tconst sdMatch = data.match(/<(?:\\w+:)?sheetData[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?sheetData>/);\n\tif (sdMatch) {\n\t\tdata1 = data.slice(0, sdMatch.index); // Content before sheetData\n\t\tdata2 = data.slice(sdMatch.index! + sdMatch[0].length); // Content after sheetData\n\t} else {\n\t\tdata1 = data2 = data;\n\t}\n\n\t// Dimension\n\tconst ridx = (data1.match(/<(?:\\w*:)?dimension/) || ({ index: -1 } as any)).index;\n\tif (ridx > 0) {\n\t\tconst ref = data1.slice(ridx, ridx + 50).match(dimregex);\n\t\tif (ref && !opts.nodim) {\n\t\t\tparseWorksheetXml_dim(s, ref[1]);\n\t\t}\n\t}\n\n\t// Columns\n\tconst columns: ColInfo[] = [];\n\tif (opts.cellStyles) {\n\t\tconst cols = data1.match(colregex);\n\t\tif (cols) {\n\t\t\tparseWorksheetXml_cols(columns, cols, budget, opts);\n\t\t}\n\t\tconst views = parseWorksheetXml_views(data1, opts);\n\t\tif (views) {\n\t\t\ts[\"!views\"] = views;\n\t\t}\n\t}\n\n\t// SheetData (cells)\n\tif (sdMatch) {\n\t\tparseSheetData(sdMatch[1], s, opts, refguess, _themes, styles, wb, budget, maxWorksheetRows);\n\t}\n\n\t// AutoFilter\n\tconst afilter = data2.match(afregex);\n\tif (afilter) {\n\t\ts[\"!autofilter\"] = parseWorksheetXml_autofilter(afilter[0], opts);\n\t}\n\n\t// Merged cells\n\tconst merges: Range[] = [];\n\tconst _merge = data2.match(mergecregex);\n\tif (_merge) {\n\t\tfor (let i = 0; i < _merge.length; ++i) {\n\t\t\t// Extract the ref attribute value after the '=' and opening quote\n\t\t\tmerges[i] = safeDecodeRange(_merge[i].slice(_merge[i].indexOf(\"=\") + 2));\n\t\t}\n\t}\n\n\t// Hyperlinks\n\tconst hlink = data2.match(hlinkregex);\n\tif (hlink) {\n\t\tparseWorksheetXml_hlinks(s, hlink, rels, budget, opts);\n\t}\n\n\t// Page margins\n\tconst margins = data2.match(marginregex);\n\tif (margins) {\n\t\ts[\"!margins\"] = parseWorksheetXml_margins(parseXmlTag(margins[0], undefined, undefined, opts));\n\t}\n\n\t// Legacy drawing reference (for VML comment shapes)\n\tconst legm = data2.match(/legacyDrawing r:id=\"(.*?)\"/);\n\tif (legm) {\n\t\t(s as any)[\"!legrel\"] = legm[1];\n\t}\n\n\t// If nodim mode, start range from (0,0)\n\tif (opts.nodim) {\n\t\trefguess.s.c = refguess.s.r = 0;\n\t}\n\t// Set !ref from the guessed range if not already set by <dimension>\n\tif (!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) {\n\t\ts[\"!ref\"] = encodeRange(refguess);\n\t}\n\t// Clamp to sheetRows limit\n\tif (opts.sheetRows > 0 && s[\"!ref\"]) {\n\t\tconst tmpref = safeDecodeRange(s[\"!ref\"]);\n\t\tif (opts.sheetRows <= tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif (tmpref.e.r > refguess.e.r) {\n\t\t\t\ttmpref.e.r = refguess.e.r;\n\t\t\t}\n\t\t\tif (tmpref.e.r < tmpref.s.r) {\n\t\t\t\ttmpref.s.r = tmpref.e.r;\n\t\t\t}\n\t\t\tif (tmpref.e.c > refguess.e.c) {\n\t\t\t\ttmpref.e.c = refguess.e.c;\n\t\t\t}\n\t\t\tif (tmpref.e.c < tmpref.s.c) {\n\t\t\t\ttmpref.s.c = tmpref.e.c;\n\t\t\t}\n\t\t\t// Save original full range before clamping\n\t\t\t(s as any)[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encodeRange(tmpref);\n\t\t}\n\t}\n\tif (columns.length > 0) {\n\t\ts[\"!cols\"] = columns;\n\t}\n\tif (merges.length > 0) {\n\t\ts[\"!merges\"] = merges;\n\t}\n\n\treturn s;\n}\n\n/** Generate <mergeCells> XML from an array of merge ranges */\nfunction writeWorksheetXml_merges(merges: Range[]): string {\n\tif (merges.length === 0) {\n\t\treturn \"\";\n\t}\n\tconst lines = ['<mergeCells count=\"' + merges.length + '\">'];\n\tfor (let i = 0; i < merges.length; ++i) {\n\t\tlines.push('<mergeCell ref=\"' + encodeRange(merges[i]) + '\"/>');\n\t}\n\tlines.push(\"</mergeCells>\");\n\treturn lines.join(\"\");\n}\n\nfunction getFrozenPaneTopLeftCell(view: SheetView): string | undefined {\n\tif (view.topLeftCell) {\n\t\treturn view.topLeftCell;\n\t}\n\tconst xSplit = view.xSplit || 0;\n\tconst ySplit = view.ySplit || 0;\n\tif (xSplit <= 0 && ySplit <= 0) {\n\t\treturn undefined;\n\t}\n\treturn encodeCell({ r: ySplit, c: xSplit });\n}\n\nfunction getFrozenPaneActivePane(view: SheetView): \"topRight\" | \"bottomLeft\" | \"bottomRight\" {\n\tif (view.activePane) {\n\t\treturn view.activePane;\n\t}\n\tif (view.xSplit && view.ySplit) {\n\t\treturn \"bottomRight\";\n\t}\n\treturn view.xSplit ? \"topRight\" : \"bottomLeft\";\n}\n\nfunction writeWorksheetXml_sheetViews(ws: WorkSheet, idx: number): string {\n\tconst view = ws[\"!views\"]?.find(\n\t\t(item) => item?.state === \"frozen\" && ((item.xSplit || 0) > 0 || (item.ySplit || 0) > 0),\n\t);\n\tconst attrs = idx === 0 ? ' tabSelected=\"1\"' : \"\";\n\tif (!view) {\n\t\treturn '<sheetViews><sheetView workbookViewId=\"0\"' + attrs + \"/></sheetViews>\";\n\t}\n\tconst paneAttrs: Record<string, string> = { state: \"frozen\", activePane: getFrozenPaneActivePane(view) };\n\tif (view.xSplit) {\n\t\tpaneAttrs.xSplit = String(view.xSplit);\n\t}\n\tif (view.ySplit) {\n\t\tpaneAttrs.ySplit = String(view.ySplit);\n\t}\n\tconst topLeftCell = getFrozenPaneTopLeftCell(view);\n\tif (topLeftCell) {\n\t\tpaneAttrs.topLeftCell = topLeftCell;\n\t}\n\tconst pane = writeXmlElement(\"pane\", null, paneAttrs);\n\tconst selection = writeXmlElement(\"selection\", null, { pane: paneAttrs.activePane });\n\treturn '<sheetViews><sheetView workbookViewId=\"0\"' + attrs + \">\" + pane + selection + \"</sheetView></sheetViews>\";\n}\n\n/** Return reusable rich-text XML only when it still represents the cell's current value. */\nfunction getCellRichText(cell: CellObject): string | undefined {\n\tconst text = String(cell.v);\n\tif (typeof cell.r !== \"string\" || cell.r.length === 0) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tif (parseStringItem(cell.r, { cellHTML: false }).t === text) {\n\t\t\treturn normalizeRichTextXml(cell.r);\n\t\t}\n\t} catch {}\n\treturn undefined;\n}\n\n/** Add a string cell to the workbook-wide shared string table and return its index. */\nfunction addSharedString(\n\tcell: CellObject,\n\trichText: string | undefined,\n\topts: { Strings: SST; revStrings: Map<string, number> },\n): number {\n\tconst text = String(cell.v);\n\tconst key = richText === undefined ? \"t\\0\" + text : \"r\\0\" + richText;\n\tconst existing = opts.revStrings.get(key);\n\topts.Strings.Count = (opts.Strings.Count || 0) + 1;\n\tif (existing !== undefined) {\n\t\treturn existing;\n\t}\n\n\tconst entry: XLString = { t: text };\n\tif (richText !== undefined) {\n\t\tentry.r = richText;\n\t}\n\tconst index = opts.Strings.length;\n\topts.Strings.push(entry);\n\topts.Strings.Unique = (opts.Strings.Unique || 0) + 1;\n\topts.revStrings.set(key, index);\n\treturn index;\n}\n\n/**\n * Write a worksheet as XML.\n *\n * Serializes cell data, row properties, column definitions, merged cells,\n * autofilter, and page margins into a complete sheet XML document.\n *\n * @param ws - WorkSheet to serialize\n * @param opts - Write options (cellDates, etc.)\n * @param _idx - Sheet index (0-based), used to set tabSelected on the first sheet\n * @param _rels - Relationships object (reserved for hyperlink writing)\n * @param _wb - WorkBook reference (reserved)\n * @returns Complete worksheet XML string\n */\nexport function writeWorksheetXml(ws: WorkSheet, opts: any, _idx: number, _rels: Relationships, _wb: any): string {\n\tconst budget = new WorksheetCellBudget(opts.maxWorksheetCells, DEFAULT_MAX_EXPORT_CELLS);\n\tconst lines: string[] = [XML_HEADER];\n\tlines.push(\n\t\twriteXmlElement(\"worksheet\", null, {\n\t\t\txmlns: XMLNS_main[0],\n\t\t\t\"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n\t\t}),\n\t);\n\n\tconst ref = ws[\"!ref\"] || \"A1\";\n\tconst range = ws[\"!ref\"] ? clampLargeExportRange(ws, safeDecodeRange(ref), budget) : null;\n\tconst effectiveRef = range ? encodeRange(range) : \"A1\";\n\tlines.push('<dimension ref=\"' + effectiveRef + '\"/>');\n\n\tlines.push(writeWorksheetXml_sheetViews(ws, _idx));\n\n\tlines.push('<sheetFormatPr defaultRowHeight=\"15\"/>');\n\n\t// Column definitions\n\tif (ws[\"!cols\"]) {\n\t\tconst columnIndexes = Object.keys(ws[\"!cols\"])\n\t\t\t.map(Number)\n\t\t\t.filter((index) => Number.isSafeInteger(index) && index >= 0 && ws[\"!cols\"]![index])\n\t\t\t.sort((a, b) => a - b);\n\t\tif (columnIndexes.some((index) => index >= XLSX_MAX_COLUMNS)) {\n\t\t\tthrow new XlsxError(\n\t\t\t\t\"INVALID_ARGUMENT\",\n\t\t\t\t`Worksheet column metadata exceeds XLSX column limit ${XLSX_MAX_COLUMNS}`,\n\t\t\t);\n\t\t}\n\t\tbudget.charge(\"worksheet column metadata\", columnIndexes.length);\n\t\tlines.push(\"<cols>\");\n\t\tfor (const i of columnIndexes) {\n\t\t\tconst col = ws[\"!cols\"][i];\n\t\t\tconst attrs: Record<string, string> = {\n\t\t\t\tmin: String(i + 1), // 1-based\n\t\t\t\tmax: String(i + 1),\n\t\t\t};\n\t\t\tif (col.width) {\n\t\t\t\tattrs.width = String(col.width);\n\t\t\t} else {\n\t\t\t\tattrs.width = \"9.140625\"; // Excel default column width\n\t\t\t}\n\t\t\tif (col.hidden) {\n\t\t\t\tattrs.hidden = \"1\";\n\t\t\t}\n\t\t\tattrs.customWidth = \"1\";\n\t\t\tlines.push(writeXmlElement(\"col\", null, attrs));\n\t\t}\n\t\tlines.push(\"</cols>\");\n\t}\n\n\tlines.push(\"<sheetData>\");\n\n\tconst dense = ws[\"!data\"] != null;\n\tconst firstRow = range?.s.r ?? 1;\n\tconst lastRow = range?.e.r ?? 0;\n\tconst firstColumn = range?.s.c ?? 0;\n\tconst lastColumn = range?.e.c ?? -1;\n\tconst appendRow = (rowIdx: number, rowCells: string[]): void => {\n\t\tconst rowInfo = ws[\"!rows\"]?.[rowIdx];\n\t\tconst hasFiniteHeight = rowInfo != null && Number.isFinite(rowInfo.hpt);\n\t\tconst hasMetadata = hasFiniteHeight || rowInfo?.hidden === true;\n\t\tif (rowCells.length === 0 && !hasMetadata) {\n\t\t\treturn;\n\t\t}\n\t\tlet rowTag = '<row r=\"' + (rowIdx + 1) + '\"'; // 1-based row number\n\t\tif (rowInfo) {\n\t\t\tif (hasFiniteHeight) {\n\t\t\t\trowTag += ' ht=\"' + rowInfo.hpt + '\" customHeight=\"1\"';\n\t\t\t}\n\t\t\tif (rowInfo.hidden === true) {\n\t\t\t\trowTag += ' hidden=\"1\"';\n\t\t\t}\n\t\t}\n\t\trowTag += \">\";\n\t\tlines.push(rowTag);\n\t\tlines.push(rowCells.join(\"\"));\n\t\tlines.push(\"</row>\");\n\t};\n\tconst rowMetadataIndexes = Object.keys(ws[\"!rows\"] ?? {})\n\t\t.map(Number)\n\t\t.filter((rowIdx) => Number.isSafeInteger(rowIdx) && rowIdx >= 0 && ws[\"!rows\"]?.[rowIdx])\n\t\t.sort((a, b) => a - b);\n\tif (rowMetadataIndexes.some((rowIdx) => rowIdx >= XLSX_MAX_ROWS)) {\n\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", `Worksheet row metadata exceeds XLSX row limit ${XLSX_MAX_ROWS}`);\n\t}\n\tbudget.charge(\"worksheet row metadata\", rowMetadataIndexes.length);\n\tconst extraRows = rowMetadataIndexes.filter((rowIdx) => range == null || rowIdx < range.s.r || rowIdx > range.e.r);\n\tfor (const rowIdx of extraRows) {\n\t\tif (range == null || rowIdx < range.s.r) {\n\t\t\tappendRow(rowIdx, []);\n\t\t}\n\t}\n\n\tfor (let rowIdx = firstRow; rowIdx <= lastRow; ++rowIdx) {\n\t\tconst row_cells: string[] = [];\n\t\tfor (let colIdx = firstColumn; colIdx <= lastColumn; ++colIdx) {\n\t\t\tlet cell: CellObject | undefined;\n\t\t\tif (dense) {\n\t\t\t\tcell = ws[\"!data\"]?.[rowIdx]?.[colIdx];\n\t\t\t} else {\n\t\t\t\tconst addr = encodeCell({ r: rowIdx, c: colIdx });\n\t\t\t\tcell = ws[addr] as CellObject | undefined;\n\t\t\t}\n\t\t\tconst styleIndex = cell ? getCellStyleIndex(opts, cell) : undefined;\n\t\t\t// Skip empty and unstyled \"z\" (stub) cells\n\t\t\tif (!cell || (cell.t === \"z\" && styleIndex == null)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst addr = encodeCell({ r: rowIdx, c: colIdx });\n\t\t\tlet cellValueStr = \"\";\n\t\t\tlet cellTypeAttr = \"\";\n\t\t\tlet cellValueTag = \"v\";\n\t\t\tconst richText = cell.t === \"s\" ? getCellRichText(cell) : undefined;\n\n\t\t\tswitch (cell.t) {\n\t\t\t\tcase \"b\":\n\t\t\t\t\tcellValueStr = cell.v ? \"1\" : \"0\";\n\t\t\t\t\tcellTypeAttr = \"b\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"n\":\n\t\t\t\t\tif (cell.v != null) {\n\t\t\t\t\t\tcellValueStr = String(cell.v);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"e\":\n\t\t\t\t\tcellValueStr = escapeXml(serializeWorksheetXml_error(cell.v));\n\t\t\t\t\tcellTypeAttr = \"e\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"d\":\n\t\t\t\t\tif (opts.cellDates) {\n\t\t\t\t\t\tcellValueStr = (cell.v as Date).toISOString();\n\t\t\t\t\t\tcellTypeAttr = \"d\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Convert date to serial number for non-cellDates mode\n\t\t\t\t\t\tcellValueStr = String(dateToSerialNumber(cell.v as Date, _wb?.Workbook?.WBProps?.date1904));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"s\":\n\t\t\t\t\tif (!cell.f && opts.bookSST) {\n\t\t\t\t\t\tcellValueStr = String(addSharedString(cell, richText, opts));\n\t\t\t\t\t\tcellTypeAttr = \"s\";\n\t\t\t\t\t} else if (!cell.f && richText !== undefined) {\n\t\t\t\t\t\tcellValueStr = richText;\n\t\t\t\t\t\tcellTypeAttr = \"inlineStr\";\n\t\t\t\t\t\tcellValueTag = \"is\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcellValueStr = escapeXml(String(cell.v));\n\t\t\t\t\t\tcellTypeAttr = \"str\"; // Formula result or plain inline value\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tlet cellXml = '<c r=\"' + addr + '\"';\n\t\t\tif (cellTypeAttr) {\n\t\t\t\tcellXml += ' t=\"' + cellTypeAttr + '\"';\n\t\t\t}\n\t\t\tif (styleIndex != null && styleIndex > 0) {\n\t\t\t\tcellXml += ' s=\"' + styleIndex + '\"';\n\t\t\t}\n\t\t\tif (cell.D) {\n\t\t\t\tcellXml += ' cm=\"1\"';\n\t\t\t}\n\t\t\tif (!cell.f && cellValueStr === \"\") {\n\t\t\t\tcellXml += \"/>\";\n\t\t\t\trow_cells.push(cellXml);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcellXml += \">\";\n\t\t\tif (cell.f) {\n\t\t\t\tcellXml += \"<f\";\n\t\t\t\tif (cell.F) {\n\t\t\t\t\t// Array formula with reference range\n\t\t\t\t\tcellXml += ' ref=\"' + cell.F + '\" t=\"array\"';\n\t\t\t\t}\n\t\t\t\tcellXml += \">\" + escapeXml(cell.f) + \"</f>\";\n\t\t\t}\n\t\t\tif (cellValueStr !== \"\") {\n\t\t\t\tcellXml += \"<\" + cellValueTag + \">\" + cellValueStr + \"</\" + cellValueTag + \">\";\n\t\t\t}\n\t\t\tcellXml += \"</c>\";\n\t\t\trow_cells.push(cellXml);\n\t\t}\n\t\tappendRow(rowIdx, row_cells);\n\t}\n\n\t// A worksheet's data range does not necessarily include rows with only layout metadata.\n\t// Iterate the existing sparse metadata keys so a distant row cannot cause a huge scan.\n\tfor (const rowIdx of extraRows) {\n\t\tif (range && rowIdx > range.e.r) {\n\t\t\tappendRow(rowIdx, []);\n\t\t}\n\t}\n\n\tlines.push(\"</sheetData>\");\n\n\t// Merged cells\n\tif (ws[\"!merges\"] && ws[\"!merges\"].length > 0) {\n\t\tlines.push(writeWorksheetXml_merges(ws[\"!merges\"]));\n\t}\n\n\t// AutoFilter\n\tif (ws[\"!autofilter\"]) {\n\t\tlines.push('<autoFilter ref=\"' + ws[\"!autofilter\"].ref + '\"/>');\n\t}\n\n\t// Page margins\n\tif (ws[\"!margins\"]) {\n\t\tconst margins = ws[\"!margins\"];\n\t\tlines.push(\n\t\t\twriteXmlElement(\"pageMargins\", null, {\n\t\t\t\tleft: String(margins.left ?? 0.7),\n\t\t\t\tright: String(margins.right ?? 0.7),\n\t\t\t\ttop: String(margins.top ?? 0.75),\n\t\t\t\tbottom: String(margins.bottom ?? 0.75),\n\t\t\t\theader: String(margins.header ?? 0.3),\n\t\t\t\tfooter: String(margins.footer ?? 0.3),\n\t\t\t}),\n\t\t);\n\t}\n\n\tconst legacyDrawing = Object.values(_rels?.[\"!id\"] || {}).find((relationship) => relationship.Type === RELTYPE.VML);\n\tif (legacyDrawing) {\n\t\tlines.push(writeXmlElement(\"legacyDrawing\", null, { \"r:id\": legacyDrawing.Id }));\n\t}\n\n\tlines.push(\"</worksheet>\");\n\t// Convert self-closing <worksheet .../> to opening tag <worksheet ...>\n\tlines[1] = lines[1].replace(\"/>\", \">\");\n\treturn lines.join(\"\");\n}\n","/**\n * Find all occurrences of an XML tag in a string, ignoring namespace prefixes.\n *\n * Builds a regex that matches `<tag>...</tag>` or `<ns:tag>...</ns:tag>`\n * and returns all matches. Handles attributes and nested content via [\\s\\S]*?.\n *\n * @param xmlString - The XML string to search\n * @param tag - The local tag name (without namespace prefix)\n * @returns Array of matched tag strings, or null if no matches\n */\nexport function matchXmlTagGlobal(xmlString: string, tag: string): string[] | null {\n\tconst re = new RegExp(\"<(?:\\\\w+:)?\" + tag + \"[\\\\s>][\\\\s\\\\S]*?<\\\\/(?:\\\\w+:)?\" + tag + \">\", \"g\");\n\treturn xmlString.match(re);\n}\n\n/**\n * Find the first occurrence of an XML tag in a string, ignoring namespace prefixes.\n *\n * Convenience wrapper around {@link matchXmlTagGlobal} that returns only the first match.\n *\n * @param xmlString - The XML string to search\n * @param tag - The local tag name (without namespace prefix)\n * @returns The first matched tag string, or null if not found\n */\nexport function matchXmlTagFirst(xmlString: string, tag: string): string | null {\n\tconst m = matchXmlTagGlobal(xmlString, tag);\n\treturn m ? m[0] : null;\n}\n","import { parseXmlTag, XML_TAG_REGEX, XML_HEADER, stripNamespace } from \"../xml/parser.js\";\nimport { unescapeXml, escapeXml } from \"../xml/escape.js\";\nimport { writeXmlTag, writeXmlElement } from \"../xml/writer.js\";\nimport { XMLNS_main, XMLNS } from \"../xml/namespaces.js\";\nimport { decodeCell, encodeCell, encodeRange, safeDecodeRange } from \"../utils/cell.js\";\nimport { matchXmlTagFirst } from \"../utils/helpers.js\";\nimport type { WorkSheet } from \"../types.js\";\n\n/**\n * Collect cell comments for serialization without mutating the worksheet.\n *\n * Iterating the materialized cells avoids expanding a large worksheet range merely\n * to discover comments.  The copied comment arrays also isolate the public `cell.c`\n * objects from the IDs assigned while writing threaded comments.\n */\nexport function collectCellComments(sheet: WorkSheet): [string, any[]][] {\n\tconst out: [string, any[]][] = [];\n\tconst add = (ref: string, cell: any): void => {\n\t\tif (!Array.isArray(cell?.c) || cell.c.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst comments = cell.c.map((comment: any) => ({ ...comment }));\n\t\tif (cell.c.hidden != null) {\n\t\t\tcomments.hidden = cell.c.hidden;\n\t\t}\n\t\tout.push([ref, comments]);\n\t};\n\n\tif ((sheet as any)[\"!data\"] != null) {\n\t\tconst rows = (sheet as any)[\"!data\"] as any[];\n\t\tfor (const rowKey of Object.keys(rows)) {\n\t\t\tconst rowIndex = Number(rowKey);\n\t\t\tconst row = rows[rowIndex];\n\t\t\tif (!Number.isSafeInteger(rowIndex) || rowIndex < 0 || rowIndex > 1_048_575 || !Array.isArray(row)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (const columnKey of Object.keys(row)) {\n\t\t\t\tconst columnIndex = Number(columnKey);\n\t\t\t\tif (!Number.isSafeInteger(columnIndex) || columnIndex < 0 || columnIndex > 16_383) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tadd(encodeCell({ r: rowIndex, c: columnIndex }), row[columnIndex]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor (const ref of Object.keys(sheet)) {\n\t\t\tif (!/^[A-Z]{1,3}[1-9]\\d*$/.test(ref)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst address = decodeCell(ref);\n\t\t\tif (address.r <= 1_048_575 && address.c <= 16_383 && encodeCell(address) === ref) {\n\t\t\t\tadd(ref, (sheet as any)[ref]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n\n/** A parsed comment entry with cell reference, author, and text content */\nexport interface RawComment {\n\tref: string;\n\tauthor: string;\n\tt: string;\n\t/** Raw rich-text XML */\n\tr?: string;\n\t/** HTML representation */\n\th?: string;\n\t/** GUID for threaded comments */\n\tguid?: string;\n\t/** Whether this is a threaded comment (1 = threaded) */\n\tT?: number;\n}\n\n/**\n * Insert parsed comments into a worksheet, attaching them to the appropriate cells.\n *\n * Creates empty cells if needed and expands the sheet range to include comment cells.\n * When inserting threaded comments, any existing legacy comments on the same cell are removed.\n *\n * @param sheet - Target worksheet\n * @param comments - Array of parsed comment entries\n * @param threaded - Whether these are threaded (modern) comments\n * @param people - Optional people list for resolving threaded comment author IDs to display names\n */\nexport function insertCommentsIntoSheet(\n\tsheet: WorkSheet,\n\tcomments: RawComment[],\n\tthreaded: boolean,\n\tpeople?: { name: string; id: string }[],\n): void {\n\tconst dense = (sheet as any)[\"!data\"] != null;\n\tfor (const comment of comments) {\n\t\tconst r = decodeCell(comment.ref);\n\t\tif (r.r < 0 || r.c < 0) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet cell: any;\n\t\tif (dense) {\n\t\t\tif (!(sheet as any)[\"!data\"][r.r]) {\n\t\t\t\t(sheet as any)[\"!data\"][r.r] = [];\n\t\t\t}\n\t\t\tcell = (sheet as any)[\"!data\"][r.r][r.c];\n\t\t} else {\n\t\t\tcell = (sheet as any)[comment.ref];\n\t\t}\n\n\t\tif (!cell) {\n\t\t\tcell = { t: \"z\" };\n\t\t\tif (dense) {\n\t\t\t\t(sheet as any)[\"!data\"][r.r][r.c] = cell;\n\t\t\t} else {\n\t\t\t\t(sheet as any)[comment.ref] = cell;\n\t\t\t}\n\t\t\t// Expand sheet range to include the cell with the comment\n\t\t\t// \"BDWGO1000001:A1\" is a sentinel range that decodes to a maximally inverted range\n\t\t\tconst range = safeDecodeRange(sheet[\"!ref\"] || \"BDWGO1000001:A1\");\n\t\t\tif (range.s.r > r.r) {\n\t\t\t\trange.s.r = r.r;\n\t\t\t}\n\t\t\tif (range.e.r < r.r) {\n\t\t\t\trange.e.r = r.r;\n\t\t\t}\n\t\t\tif (range.s.c > r.c) {\n\t\t\t\trange.s.c = r.c;\n\t\t\t}\n\t\t\tif (range.e.c < r.c) {\n\t\t\t\trange.e.c = r.c;\n\t\t\t}\n\t\t\tsheet[\"!ref\"] = encodeRange(range);\n\t\t}\n\n\t\tif (!cell.c) {\n\t\t\tcell.c = [];\n\t\t}\n\t\tconst o: any = { a: comment.author, t: comment.t, r: comment.r, T: threaded };\n\t\tif (comment.h) {\n\t\t\to.h = comment.h;\n\t\t}\n\n\t\t/* Threaded comments always override legacy comments on the same cell */\n\t\tfor (let i = cell.c.length - 1; i >= 0; --i) {\n\t\t\tif (!threaded && cell.c[i].T) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (threaded && !cell.c[i].T) {\n\t\t\t\tcell.c.splice(i, 1);\n\t\t\t}\n\t\t}\n\t\t// Resolve threaded comment author IDs to display names\n\t\tif (threaded && people) {\n\t\t\tfor (let i = 0; i < people.length; ++i) {\n\t\t\t\tif (o.a === people[i].id) {\n\t\t\t\t\to.a = people[i].name || o.a;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcell.c.push(o);\n\t}\n}\n\n/** Parse a simple inline string item for comment text content */\nfunction parse_si_simple(x: string): { t: string; r: string; h: string } {\n\tif (!x) {\n\t\treturn { t: \"\", r: \"\", h: \"\" };\n\t}\n\tconst tMatch = x.match(/<(?:\\w+:)?t[^>]*>([^<]*)<\\/(?:\\w+:)?t>/);\n\tconst t = tMatch ? unescapeXml(tMatch[1]) : \"\";\n\treturn { t, r: x, h: t };\n}\n\n/**\n * Parse comments XML (ECMA-376 18.7 Comments).\n *\n * Extracts the author list and comment entries from a comments.xml part.\n *\n * @param data - Raw XML string of the comments file\n * @param opts - Parsing options (sheetRows, cellHTML)\n * @returns Array of parsed comment entries\n */\nexport function parseCommentsXml(data: string, opts?: any): RawComment[] {\n\t// Handle empty/self-closing <comments/>\n\tif (data.match(/<(?:\\w+:)?comments\\s*\\/>/)) {\n\t\treturn [];\n\t}\n\tconst authors: string[] = [];\n\tconst commentList: RawComment[] = [];\n\n\t// Parse <authors> section\n\tconst authtag = matchXmlTagFirst(data, \"authors\");\n\tif (authtag) {\n\t\tauthtag.split(/<\\/\\w*:?author>/).forEach((x) => {\n\t\t\tif (x === \"\" || x.trim() === \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst a = x.match(/<(?:\\w+:)?author\\b[^<>]*>(.*)/);\n\t\t\tif (a) {\n\t\t\t\tauthors.push(unescapeXml(a[1]));\n\t\t\t}\n\t\t});\n\t}\n\n\t// Parse <commentList> section\n\tconst cmnttag = matchXmlTagFirst(data, \"commentList\");\n\tif (cmnttag) {\n\t\tcmnttag.split(/<\\/\\w*:?comment>/).forEach((x) => {\n\t\t\tif (x === \"\" || x.trim() === \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst cm = x.match(/<(?:\\w+:)?comment\\b[^<>]*>/);\n\t\t\tif (!cm) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst y = parseXmlTag(cm[0]);\n\t\t\tconst comment: RawComment = {\n\t\t\t\tauthor: (y.authorId && authors[y.authorId]) || \"sheetjsghost\",\n\t\t\t\tref: y.ref,\n\t\t\t\tguid: y.guid,\n\t\t\t\tt: \"\",\n\t\t\t};\n\t\t\tconst cell = decodeCell(y.ref);\n\t\t\t// Respect the sheetRows limit\n\t\t\tif (opts && opts.sheetRows && opts.sheetRows <= cell.r) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst textMatch = matchXmlTagFirst(x, \"text\");\n\t\t\tconst rt = textMatch ? parse_si_simple(textMatch) : { r: \"\", t: \"\", h: \"\" };\n\t\t\tcomment.r = rt.r;\n\t\t\tif (rt.r === \"<t></t>\") {\n\t\t\t\trt.t = \"\";\n\t\t\t\trt.h = \"\";\n\t\t\t}\n\t\t\t// Normalize line endings to Unix style\n\t\t\tcomment.t = (rt.t || \"\").replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\t\tif (opts && opts.cellHTML) {\n\t\t\t\tcomment.h = rt.h;\n\t\t\t}\n\t\t\tcommentList.push(comment);\n\t\t});\n\t}\n\treturn commentList;\n}\n\n/**\n * Write comments XML (ECMA-376 18.7).\n *\n * Serializes comment data into the legacy comments.xml format. For threaded comments,\n * the text is flattened into \"Comment:/Reply:\" format for backward compatibility.\n *\n * @param data - Array of [cell_ref, comments_array] tuples\n * @returns Complete comments.xml string\n */\nexport function writeCommentsXml(data: [string, any[]][]): string {\n\tconst o: string[] = [XML_HEADER, writeXmlElement(\"comments\", null, { xmlns: XMLNS_main[0] })];\n\n\t// Build unique author list\n\tconst iauthor: string[] = [];\n\to.push(\"<authors>\");\n\tdata.forEach((x) => {\n\t\tx[1].forEach((w: any) => {\n\t\t\tconst a = escapeXml(w.a);\n\t\t\tif (iauthor.indexOf(a) === -1) {\n\t\t\t\tiauthor.push(a);\n\t\t\t\to.push(\"<author>\" + a + \"</author>\");\n\t\t\t}\n\t\t\t// For threaded comments, add a \"tc=<ID>\" pseudo-author for the root comment\n\t\t\tif (w.T && w.ID && iauthor.indexOf(\"tc=\" + w.ID) === -1) {\n\t\t\t\tiauthor.push(\"tc=\" + w.ID);\n\t\t\t\to.push(\"<author>tc=\" + w.ID + \"</author>\");\n\t\t\t}\n\t\t});\n\t});\n\tif (iauthor.length === 0) {\n\t\tiauthor.push(\"SheetJ5\");\n\t\to.push(\"<author>SheetJ5</author>\");\n\t}\n\to.push(\"</authors>\");\n\to.push(\"<commentList>\");\n\n\tdata.forEach((d) => {\n\t\tlet lastauthor = 0;\n\t\tconst ts: string[] = [];\n\t\tlet tcnt = 0;\n\t\tif (d[1][0] && d[1][0].T && d[1][0].ID) {\n\t\t\tlastauthor = iauthor.indexOf(\"tc=\" + d[1][0].ID);\n\t\t}\n\t\td[1].forEach((c: any) => {\n\t\t\tif (c.a) {\n\t\t\t\tlastauthor = iauthor.indexOf(escapeXml(c.a));\n\t\t\t}\n\t\t\tif (c.T) {\n\t\t\t\t++tcnt;\n\t\t\t}\n\t\t\tts.push(c.t == null ? \"\" : String(c.t));\n\t\t});\n\t\tif (tcnt === 0) {\n\t\t\t// Non-threaded: each comment gets its own <comment> element\n\t\t\td[1].forEach((c: any) => {\n\t\t\t\to.push('<comment ref=\"' + d[0] + '\" authorId=\"' + iauthor.indexOf(escapeXml(c.a)) + '\"><text>');\n\t\t\t\to.push(writeXmlTag(\"t\", c.t == null ? \"\" : escapeXml(c.t)));\n\t\t\t\to.push(\"</text></comment>\");\n\t\t\t});\n\t\t} else {\n\t\t\t// Threaded: merge all replies into a single <comment> with formatted text\n\t\t\tif (d[1][0] && d[1][0].T && d[1][0].ID) {\n\t\t\t\tlastauthor = iauthor.indexOf(\"tc=\" + d[1][0].ID);\n\t\t\t}\n\t\t\to.push('<comment ref=\"' + d[0] + '\" authorId=\"' + lastauthor + '\"><text>');\n\t\t\tlet t = \"Comment:\\n    \" + ts[0] + \"\\n\";\n\t\t\tfor (let i = 1; i < ts.length; ++i) {\n\t\t\t\tt += \"Reply:\\n    \" + ts[i] + \"\\n\";\n\t\t\t}\n\t\t\to.push(writeXmlTag(\"t\", escapeXml(t)));\n\t\t\to.push(\"</text></comment>\");\n\t\t}\n\t});\n\to.push(\"</commentList>\");\n\tif (o.length > 2) {\n\t\to.push(\"</comments>\");\n\t\t// Convert self-closing <comments .../> to opening tag\n\t\to[1] = o[1].replace(\"/>\", \">\");\n\t}\n\treturn o.join(\"\");\n}\n\n/**\n * Parse threaded comments XML (MS-XLSX 2.1.17).\n *\n * Threaded comments are a modern Excel feature that supports reply chains.\n * Each comment has a personId (author), optional parentId (reply), and text.\n *\n * @param data - Raw XML string of the threadedComment file\n * @param opts - Parsing options\n * @returns Array of parsed threaded comment entries\n */\nexport function parseTcmntXml(data: string, _opts?: any): RawComment[] {\n\tconst out: RawComment[] = [];\n\tlet comment: any = {};\n\t// Track the character offset where the <text> content starts\n\tlet tidx = 0;\n\n\tconst ignoredTags = new Set([\n\t\t\"<?xml\",\n\t\t\"<ThreadedComments\",\n\t\t\"</ThreadedComments>\",\n\t\t\"<mentions\",\n\t\t\"<mentions>\",\n\t\t\"</mentions>\",\n\t\t\"<extLst\",\n\t\t\"<extLst>\",\n\t\t\"</extLst>\",\n\t\t\"<extLst/>\",\n\t\t\"<ext\",\n\t\t\"</ext>\",\n\t]);\n\n\tdata.replace(XML_TAG_REGEX, function xml_tcmnt(x: string, idx: number): string {\n\t\tconst y: any = parseXmlTag(x);\n\t\tconst tag = stripNamespace(y[0]);\n\t\tif (ignoredTags.has(tag)) {\n\t\t\treturn x;\n\t\t}\n\t\tswitch (tag) {\n\t\t\tcase \"<threadedComment\":\n\t\t\t\tcomment = { author: y.personId, guid: y.id, ref: y.ref, T: 1 };\n\t\t\t\tbreak;\n\t\t\tcase \"</threadedComment>\":\n\t\t\t\tif (comment.t != null) {\n\t\t\t\t\tout.push(comment);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"<text>\":\n\t\t\tcase \"<text\":\n\t\t\t\ttidx = idx + x.length;\n\t\t\t\tbreak;\n\t\t\tcase \"</text>\":\n\t\t\t\t// Normalize line endings\n\t\t\t\tcomment.t = unescapeXml(data.slice(tidx, idx)).replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\t\t\tbreak;\n\t\t}\n\t\treturn x;\n\t});\n\treturn out;\n}\n\n/**\n * Write threaded comments XML (MS-XLSX 2.1.17).\n *\n * Generates GUIDs for each threaded comment using a deterministic counter.\n * The first comment in a chain is the root; subsequent comments reference it via parentId.\n *\n * @param comments - Array of [cell_ref, comments_array] tuples\n * @param people - Mutable people list (new authors are appended)\n * @param opts - Options with tcid counter for generating unique GUIDs\n * @returns Complete threadedComment XML string\n */\nexport function writeTcmntXml(comments: [string, any[]][], people: string[], opts: { tcid: number }): string {\n\tconst o: string[] = [\n\t\tXML_HEADER,\n\t\twriteXmlElement(\"ThreadedComments\", null, { xmlns: XMLNS.TCMNT }).replace(/\\/>/, \">\"),\n\t];\n\tcomments.forEach((carr) => {\n\t\tlet rootid = \"\";\n\t\t(carr[1] || []).forEach((c: any, idx: number) => {\n\t\t\tif (!c.T) {\n\t\t\t\tdelete c.ID;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (c.a && people.indexOf(c.a) === -1) {\n\t\t\t\tpeople.push(c.a);\n\t\t\t}\n\t\t\t// Generate a deterministic GUID using the tcid counter (zero-padded to 12 digits)\n\t\t\tconst tcopts: any = {\n\t\t\t\tref: carr[0],\n\t\t\t\tid: \"{54EE7951-7262-4200-6969-\" + (\"000000000000\" + opts.tcid++).slice(-12) + \"}\",\n\t\t\t};\n\t\t\tif (idx === 0) {\n\t\t\t\trootid = tcopts.id; // First comment is the root of the thread\n\t\t\t} else {\n\t\t\t\ttcopts.parentId = rootid; // Replies reference the root\n\t\t\t}\n\t\t\tc.ID = tcopts.id;\n\t\t\tif (c.a) {\n\t\t\t\t// Person GUID uses a different prefix than comment GUID\n\t\t\t\ttcopts.personId = \"{54EE7950-7262-4200-6969-\" + (\"000000000000\" + people.indexOf(c.a)).slice(-12) + \"}\";\n\t\t\t}\n\t\t\to.push(\n\t\t\t\twriteXmlElement(\n\t\t\t\t\t\"threadedComment\",\n\t\t\t\t\twriteXmlTag(\"text\", escapeXml(c.t == null ? \"\" : String(c.t))),\n\t\t\t\t\ttcopts,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t});\n\to.push(\"</ThreadedComments>\");\n\treturn o.join(\"\");\n}\n\n/**\n * Parse people XML (MS-XLSX 2.1.18).\n *\n * The people list maps person GUIDs to display names for threaded comment authorship.\n *\n * @param data - Raw XML string of the person.xml file\n * @returns Array of person entries with name and id\n */\nexport function parsePeopleXml(data: string): { name: string; id: string }[] {\n\tconst out: { name: string; id: string }[] = [];\n\tconst ignoredTags = new Set([\n\t\t\"<?xml\",\n\t\t\"<personList\",\n\t\t\"</personList>\",\n\t\t\"</person>\",\n\t\t\"<extLst\",\n\t\t\"<extLst>\",\n\t\t\"</extLst>\",\n\t\t\"<extLst/>\",\n\t\t\"<ext\",\n\t\t\"</ext>\",\n\t]);\n\n\tdata.replace(XML_TAG_REGEX, function xml_people(x: string): string {\n\t\tconst y: any = parseXmlTag(x);\n\t\tconst tag = stripNamespace(y[0]);\n\t\tif (ignoredTags.has(tag)) {\n\t\t\treturn x;\n\t\t}\n\t\tswitch (tag) {\n\t\t\tcase \"<person\":\n\t\t\t\tout.push({ name: unescapeXml(y.displayname), id: y.id });\n\t\t\t\tbreak;\n\t\t}\n\t\treturn x;\n\t});\n\treturn out;\n}\n\n/**\n * Write people XML for threaded comments authorship.\n *\n * @param people - Array of author display names\n * @returns Complete person.xml string\n */\nexport function writePeopleXml(people: string[]): string {\n\tconst o: string[] = [\n\t\tXML_HEADER,\n\t\twriteXmlElement(\"personList\", null, {\n\t\t\txmlns: XMLNS.TCMNT,\n\t\t\t\"xmlns:x\": XMLNS_main[0],\n\t\t}).replace(/\\/>/, \">\"),\n\t];\n\tpeople.forEach((person, idx) => {\n\t\to.push(\n\t\t\twriteXmlElement(\"person\", null, {\n\t\t\t\tdisplayName: escapeXml(person),\n\t\t\t\t// Deterministic GUID based on index\n\t\t\t\tid: \"{54EE7950-7262-4200-6969-\" + (\"000000000000\" + idx).slice(-12) + \"}\",\n\t\t\t\tuserId: escapeXml(person),\n\t\t\t\tproviderId: \"None\",\n\t\t\t}),\n\t\t);\n\t});\n\to.push(\"</personList>\");\n\treturn o.join(\"\");\n}\n","import { parseXmlTag, XML_TAG_REGEX, stripNamespace } from \"../xml/parser.js\";\nimport { writeXmlTag, writeXmlElement } from \"../xml/writer.js\";\nimport { decodeCell, encodeCell } from \"../utils/cell.js\";\nimport { matchXmlTagGlobal } from \"../utils/helpers.js\";\nimport type { WorkSheet } from \"../types.js\";\n\n/** VML XML namespace declarations for Microsoft Office drawing elements */\nconst XLMLNS: Record<string, string> = {\n\tv: \"urn:schemas-microsoft-com:vml\",\n\to: \"urn:schemas-microsoft-com:office:office\",\n\tx: \"urn:schemas-microsoft-com:office:excel\",\n\tmv: \"http://macVmlSchemaUri\",\n};\n\n/**\n * Parse VML drawings to extract comment visibility and position.\n *\n * VML (Vector Markup Language) is the legacy drawing format used by Excel to\n * define comment box shapes. Each <v:shape> with ObjectType=\"Note\" corresponds\n * to a comment, and its <Visible> element determines if the comment is shown.\n *\n * @param data - Raw VML XML string\n * @param sheet - Worksheet to update with comment visibility\n * @param comments - Array of comment references for fallback positioning\n */\nexport function parseVml(data: string, sheet: WorkSheet, comments: any[]): void {\n\tlet cidx = 0;\n\t(matchXmlTagGlobal(data, \"(?:shape|rect)\") || []).forEach((m) => {\n\t\tlet type = \"\";\n\t\tlet hidden = true;\n\t\tlet aidx = -1;\n\t\tlet R = -1,\n\t\t\tC = -1;\n\n\t\tm.replace(XML_TAG_REGEX, function (x: string, idx: number): string {\n\t\t\tconst y = parseXmlTag(x);\n\t\t\tswitch (stripNamespace(y[0])) {\n\t\t\t\tcase \"<ClientData\":\n\t\t\t\t\tif (y.ObjectType) {\n\t\t\t\t\t\ttype = y.ObjectType;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<Visible\":\n\t\t\t\tcase \"<Visible/>\":\n\t\t\t\t\thidden = false;\n\t\t\t\t\tbreak;\n\t\t\t\t// <Row> and <Column> contain the 0-based cell coordinates as text content\n\t\t\t\tcase \"<Row\":\n\t\t\t\tcase \"<Row>\":\n\t\t\t\t\taidx = idx + x.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</Row>\":\n\t\t\t\t\tR = +m.slice(aidx, idx).trim();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<Column\":\n\t\t\t\tcase \"<Column>\":\n\t\t\t\t\taidx = idx + x.length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"</Column>\":\n\t\t\t\t\tC = +m.slice(aidx, idx).trim();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t});\n\n\t\tswitch (type) {\n\t\t\tcase \"Note\": {\n\t\t\t\t// Use parsed row/column if available, otherwise fall back to comment list order\n\t\t\t\tconst ref = R >= 0 && C >= 0 ? encodeCell({ r: R, c: C }) : comments[cidx]?.ref;\n\t\t\t\tconst dense = (sheet as any)[\"!data\"] != null;\n\t\t\t\tlet cell: any;\n\t\t\t\tif (dense) {\n\t\t\t\t\tconst address = ref ? decodeCell(ref) : null;\n\t\t\t\t\tconst rows = (sheet as any)[\"!data\"];\n\t\t\t\t\tcell = address ? rows?.[address.r]?.[address.c] : undefined;\n\t\t\t\t} else {\n\t\t\t\t\tcell = (sheet as any)[ref];\n\t\t\t\t}\n\t\t\t\tif (cell && cell.c) {\n\t\t\t\t\tcell.c.hidden = hidden;\n\t\t\t\t}\n\t\t\t\t++cidx;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n}\n\n/** Format an object of attributes as XML attribute string (e.g. ' key=\"value\"') */\nfunction formatXmlAttributes(h: Record<string, string>): string {\n\treturn Object.keys(h)\n\t\t.map((k) => \" \" + k + '=\"' + h[k] + '\"')\n\t\t.join(\"\");\n}\n\n/** Generate VML XML for a single comment shape */\nfunction writeVmlComment(x: [string, any], _shapeid: number): string {\n\tconst c = decodeCell(x[0]);\n\t// Gradient fill styling for the comment box\n\tconst fillopts: any = { color2: \"#BEFF82\", type: \"gradient\" };\n\tif (fillopts.type === \"gradient\") {\n\t\tfillopts.angle = \"-180\";\n\t}\n\tconst fillparm =\n\t\tfillopts.type === \"gradient\"\n\t\t\t? writeXmlElement(\"o:fill\", null, { type: \"gradientUnscaled\", \"v:ext\": \"view\" })\n\t\t\t: null;\n\tconst fillxml = writeXmlElement(\"v:fill\", fillparm, fillopts);\n\tconst shadata: any = { on: \"t\", obscured: \"t\" };\n\n\treturn [\n\t\t\"<v:shape\" +\n\t\t\tformatXmlAttributes({\n\t\t\t\tid: \"_x0000_s\" + _shapeid,\n\t\t\t\ttype: \"#_x0000_t202\", // TextBox shape type\n\t\t\t\tstyle:\n\t\t\t\t\t\"position:absolute; margin-left:80pt;margin-top:5pt;width:104pt;height:64pt;z-index:10\" +\n\t\t\t\t\t(x[1].hidden ? \";visibility:hidden\" : \"\"),\n\t\t\t\tfillcolor: \"#ECFAD4\",\n\t\t\t\tstrokecolor: \"#edeaa1\",\n\t\t\t}) +\n\t\t\t\">\",\n\t\tfillxml,\n\t\twriteXmlElement(\"v:shadow\", null, shadata),\n\t\twriteXmlElement(\"v:path\", null, { \"o:connecttype\": \"none\" }),\n\t\t'<v:textbox><div style=\"text-align:left\"></div></v:textbox>',\n\t\t'<x:ClientData ObjectType=\"Note\">',\n\t\t\"<x:MoveWithCells/>\",\n\t\t\"<x:SizeWithCells/>\",\n\t\t// Anchor: [startCol, colOffset, startRow, rowOffset, endCol, colOffset, endRow, rowOffset]\n\t\twriteXmlTag(\"x:Anchor\", [c.c + 1, 0, c.r + 1, 0, c.c + 3, 20, c.r + 5, 20].join(\",\")),\n\t\twriteXmlTag(\"x:AutoFill\", \"False\"),\n\t\twriteXmlTag(\"x:Row\", String(c.r)),\n\t\twriteXmlTag(\"x:Column\", String(c.c)),\n\t\tx[1].hidden ? \"\" : \"<x:Visible/>\",\n\t\t\"</x:ClientData>\",\n\t\t\"</v:shape>\",\n\t].join(\"\");\n}\n\n/**\n * Write VML XML for all comment shapes on a sheet.\n *\n * VML is required for backward-compatible comment rendering in Excel.\n * Each comment gets a text-box shape positioned relative to its cell.\n *\n * @param rId - Sheet relationship ID (used for shape ID namespace partitioning)\n * @param comments - Array of [cell_ref, comment_data] tuples\n * @returns Complete VML XML string\n */\nexport function writeVml(rId: number, comments: [string, any][]): string {\n\t// 21600 x 21600 is the standard VML coordinate space\n\tconst csize = [21600, 21600];\n\t// Define the shape path as a rectangle in VML path syntax\n\tconst bbox = [\"m0,0l0\", csize[1], csize[0], csize[1], csize[0], \"0xe\"].join(\",\");\n\tconst o: string[] = [\n\t\twriteXmlElement(\"xml\", null, {\n\t\t\t\"xmlns:v\": XLMLNS.v,\n\t\t\t\"xmlns:o\": XLMLNS.o,\n\t\t\t\"xmlns:x\": XLMLNS.x,\n\t\t\t\"xmlns:mv\": XLMLNS.mv,\n\t\t}).replace(/\\/>/, \">\"),\n\t\twriteXmlElement(\"o:shapelayout\", writeXmlElement(\"o:idmap\", null, { \"v:ext\": \"edit\", data: String(rId) }), {\n\t\t\t\"v:ext\": \"edit\",\n\t\t}),\n\t];\n\n\t// Shape IDs are partitioned by sheet: 65536 * rId + sequential\n\tlet _shapeid = 65536 * rId;\n\tconst _comments = comments || [];\n\n\t// Define the shared shape type template (TextBox #202) if there are comments\n\tif (_comments.length > 0) {\n\t\to.push(\n\t\t\twriteXmlElement(\n\t\t\t\t\"v:shapetype\",\n\t\t\t\t[\n\t\t\t\t\twriteXmlElement(\"v:stroke\", null, { joinstyle: \"miter\" }),\n\t\t\t\t\twriteXmlElement(\"v:path\", null, { gradientshapeok: \"t\", \"o:connecttype\": \"rect\" }),\n\t\t\t\t].join(\"\"),\n\t\t\t\t{\n\t\t\t\t\tid: \"_x0000_t202\",\n\t\t\t\t\tcoordsize: csize.join(\",\"),\n\t\t\t\t\t\"o:spt\": \"202\", // Shape preset type 202 = TextBox\n\t\t\t\t\tpath: bbox,\n\t\t\t\t},\n\t\t\t),\n\t\t);\n\t}\n\n\t_comments.forEach((x) => {\n\t\t++_shapeid;\n\t\to.push(writeVmlComment(x, _shapeid));\n\t});\n\to.push(\"</xml>\");\n\treturn o.join(\"\");\n}\n","import { parseXmlTag, XML_TAG_REGEX, XML_HEADER, stripNamespace } from \"../xml/parser.js\";\n\n/** Parsed metadata structure from metadata.xml */\nexport interface XLMeta {\n\t/** Registered metadata type definitions */\n\tTypes: { name: string; offsets?: number[] }[];\n\t/** Cell-level metadata references (metatype=1) */\n\tCell: { type: string; index: number }[];\n\t/** Value-level metadata references (metatype=0) */\n\tValue: { type: string; index: number }[];\n}\n\n/**\n * Parse metadata XML (ECMA-376 18.9 / MS-XLSX extensions).\n *\n * Metadata provides additional cell-level information such as dynamic array\n * properties (XLDAPR) and rich data types. The XML contains:\n * - metadataTypes: type definitions\n * - futureMetadata: type-specific data (e.g. rich value offsets)\n * - cellMetadata / valueMetadata: per-cell type+index references\n *\n * @param data - Raw XML string of metadata.xml\n * @param opts - Parsing options\n * @returns Parsed metadata structure\n */\nexport function parseMetadataXml(data: string, _opts?: any): XLMeta {\n\tconst out: XLMeta = { Types: [], Cell: [], Value: [] };\n\tif (!data) {\n\t\treturn out;\n\t}\n\n\t// metatype tracks which section we're in: 2=none, 1=cellMetadata, 0=valueMetadata\n\tlet metatype = 2;\n\tlet lastmeta: any;\n\n\tconst ignoredTags = new Set([\n\t\t\"<?xml\",\n\t\t\"<metadata\",\n\t\t\"</metadata>\",\n\t\t\"<metadataTypes\",\n\t\t\"</metadataTypes>\",\n\t\t\"</metadataType>\",\n\t\t\"</futureMetadata>\",\n\t\t\"<bk>\",\n\t\t\"</bk>\",\n\t\t\"</rc>\",\n\t\t\"<extLst\",\n\t\t\"<extLst>\",\n\t\t\"</extLst>\",\n\t\t\"<extLst/>\",\n\t\t\"<ext\",\n\t\t\"</ext>\",\n\t]);\n\n\tdata.replace(XML_TAG_REGEX, function (x: string): string {\n\t\tconst y: any = parseXmlTag(x);\n\t\tconst tag = stripNamespace(y[0]);\n\t\tif (ignoredTags.has(tag)) {\n\t\t\treturn x;\n\t\t}\n\t\tswitch (tag) {\n\t\t\tcase \"<metadataType\":\n\t\t\t\tout.Types.push({ name: y.name });\n\t\t\t\tbreak;\n\t\t\tcase \"<futureMetadata\":\n\t\t\t\t// Associate future metadata with its type definition by name\n\t\t\t\tfor (let j = 0; j < out.Types.length; ++j) {\n\t\t\t\t\tif (out.Types[j].name === y.name) {\n\t\t\t\t\t\tlastmeta = out.Types[j];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"<rc\":\n\t\t\t\t// <rc t=\"N\" v=\"M\"> references type index N (1-based) and value index M\n\t\t\t\tif (metatype === 1) {\n\t\t\t\t\tout.Cell.push({ type: out.Types[y.t - 1].name, index: +y.v });\n\t\t\t\t} else if (metatype === 0) {\n\t\t\t\t\tout.Value.push({ type: out.Types[y.t - 1].name, index: +y.v });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"<cellMetadata\":\n\t\t\t\tmetatype = 1;\n\t\t\t\tbreak;\n\t\t\tcase \"</cellMetadata>\":\n\t\t\t\tmetatype = 2;\n\t\t\t\tbreak;\n\t\t\tcase \"<valueMetadata\":\n\t\t\t\tmetatype = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"</valueMetadata>\":\n\t\t\t\tmetatype = 2;\n\t\t\t\tbreak;\n\t\t\tcase \"<rvb\":\n\t\t\t\t// Rich value block offset: records the index into the rich data store\n\t\t\t\tif (lastmeta) {\n\t\t\t\t\tif (!lastmeta.offsets) {\n\t\t\t\t\t\tlastmeta.offsets = [];\n\t\t\t\t\t}\n\t\t\t\t\tlastmeta.offsets.push(+y.i);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\treturn x;\n\t});\n\treturn out;\n}\n\n/**\n * Write minimal metadata XML for dynamic array support.\n *\n * Generates the XLDAPR (Dynamic Array Properties) metadata type that Excel\n * requires for spill-range formulas. The metadata declares a single type\n * and a single cell metadata entry referencing it.\n *\n * @returns Complete metadata.xml string\n */\nexport function writeMetadataXml(): string {\n\tconst o: string[] = [XML_HEADER];\n\to.push(\n\t\t'<metadata xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:xlrd=\"http://schemas.microsoft.com/office/spreadsheetml/2017/richdata\" xmlns:xda=\"http://schemas.microsoft.com/office/spreadsheetml/2017/dynamicarray\">\\n' +\n\t\t\t'  <metadataTypes count=\"1\">\\n' +\n\t\t\t'    <metadataType name=\"XLDAPR\" minSupportedVersion=\"120000\" copy=\"1\" pasteAll=\"1\" pasteValues=\"1\" merge=\"1\" splitFirst=\"1\" rowColShift=\"1\" clearFormats=\"1\" clearComments=\"1\" assign=\"1\" coerce=\"1\" cellMeta=\"1\"/>\\n' +\n\t\t\t\"  </metadataTypes>\\n\" +\n\t\t\t'  <futureMetadata name=\"XLDAPR\" count=\"1\">\\n' +\n\t\t\t\"    <bk>\\n\" +\n\t\t\t\"      <extLst>\\n\" +\n\t\t\t'        <ext uri=\"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}\">\\n' +\n\t\t\t'          <xda:dynamicArrayProperties fDynamic=\"1\" fCollapsed=\"0\"/>\\n' +\n\t\t\t\"        </ext>\\n\" +\n\t\t\t\"      </extLst>\\n\" +\n\t\t\t\"    </bk>\\n\" +\n\t\t\t\"  </futureMetadata>\\n\" +\n\t\t\t'  <cellMetadata count=\"1\">\\n' +\n\t\t\t\"    <bk>\\n\" +\n\t\t\t'      <rc t=\"1\" v=\"0\"/>\\n' +\n\t\t\t\"    </bk>\\n\" +\n\t\t\t\"  </cellMetadata>\\n\" +\n\t\t\t\"</metadata>\",\n\t);\n\treturn o.join(\"\");\n}\n","import { parseXmlTag, XML_TAG_REGEX } from \"../xml/parser.js\";\n\n/** A single entry in the calculation chain */\nexport interface CalcChainEntry {\n\t/** Cell reference (e.g. \"A1\") */\n\tr?: string;\n\t/** Sheet index */\n\ti?: any;\n\t/** \"new dependency level\" flag */\n\tl?: string;\n\t/** Array formula flag */\n\ta?: string;\n\t[key: string]: any;\n}\n\n/**\n * Parse the calculation chain XML (ECMA-376 18.6).\n *\n * The calculation chain records the order in which cells with formulas should\n * be recalculated. Each <c> entry references a cell and its sheet index.\n * The sheet index (i) is sticky: if omitted, it inherits from the previous entry.\n *\n * @param data - Raw XML string of calcChain.xml\n * @returns Array of calculation chain entries\n */\nexport function parseCalcChainXml(data: string): CalcChainEntry[] {\n\tconst d: CalcChainEntry[] = [];\n\tif (!data) {\n\t\treturn d;\n\t}\n\t// Sticky sheet index: persists across entries when not explicitly set\n\tlet i: any = 1;\n\t(data.match(XML_TAG_REGEX) || []).forEach((x) => {\n\t\tconst y: any = parseXmlTag(x);\n\t\tswitch (y[0]) {\n\t\t\tcase \"<?xml\":\n\t\t\t\tbreak;\n\t\t\tcase \"<calcChain\":\n\t\t\tcase \"<calcChain>\":\n\t\t\tcase \"</calcChain>\":\n\t\t\t\tbreak;\n\t\t\tcase \"<c\":\n\t\t\t\tdelete y[0];\n\t\t\t\tif (y.i) {\n\t\t\t\t\ti = y.i; // Update sticky sheet index\n\t\t\t\t} else {\n\t\t\t\t\ty.i = i; // Inherit from previous entry\n\t\t\t\t}\n\t\t\t\td.push(y);\n\t\t\t\tbreak;\n\t\t}\n\t});\n\treturn d;\n}\n","import type { WorkBook, WorkSheet, ReadOptions } from \"../types.js\";\nimport type { ZipArchive } from \"../zip/index.js\";\nimport type { ContentTypes } from \"../opc/content-types.js\";\nimport type { Relationships } from \"../opc/relationships.js\";\nimport type { SST } from \"./shared-strings.js\";\nimport type { StylesData } from \"./styles.js\";\nimport type { ThemeData } from \"./theme.js\";\nimport type { WorkbookFile, SheetEntry } from \"./workbook.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { zipReadString, zipHas } from \"../zip/index.js\";\nimport { parseContentTypes } from \"../opc/content-types.js\";\nimport { parseRelationships } from \"../opc/relationships.js\";\nimport { parseCoreProperties } from \"../opc/core-properties.js\";\nimport { parseExtendedProperties } from \"../opc/extended-properties.js\";\nimport { parseCustomProperties } from \"../opc/custom-properties.js\";\nimport { parseSstXml } from \"./shared-strings.js\";\nimport { parseStylesXml } from \"./styles.js\";\nimport { parse_theme_xml } from \"./theme.js\";\nimport { parseWorkbookXml } from \"./workbook.js\";\nimport { parseWorksheetXml, resolveSharedStrings } from \"./worksheet.js\";\nimport { parseCommentsXml, parseTcmntXml, parsePeopleXml, insertCommentsIntoSheet } from \"./comments.js\";\nimport { parseVml } from \"./vml.js\";\nimport { parseMetadataXml } from \"./metadata.js\";\nimport { parseCalcChainXml } from \"./calc-chain.js\";\nimport { resetFormatTable } from \"../ssf/table.js\";\nimport { RELS as RELTYPE } from \"../xml/namespaces.js\";\nimport { assertXmlPartLimits } from \"../xml/limits.js\";\n\n/** Strip a leading \"/\" from a path (ZIP entries don't use leading slashes) */\nfunction stripLeadingSlash(x: string): string {\n\treturn x.charAt(0) === \"/\" ? x.slice(1) : x;\n}\n\n/**\n * Resolve a relative path against a base path.\n * Handles \"..\" segments for paths like \"../comments1.xml\" relative to \"xl/worksheets/sheet1.xml\".\n */\nfunction resolve_path(target: string, basePath: string): string {\n\tif (target.charAt(0) === \"/\") {\n\t\treturn target;\n\t}\n\tconst base = basePath.slice(0, basePath.lastIndexOf(\"/\") + 1);\n\tconst parts = (base + target).split(\"/\");\n\tconst resolved: string[] = [];\n\tfor (const p of parts) {\n\t\tif (p === \"..\") {\n\t\t\tresolved.pop();\n\t\t} else if (p !== \".\") {\n\t\t\tresolved.push(p);\n\t\t}\n\t}\n\treturn resolved.join(\"/\");\n}\n\n/**\n * Read a file from the ZIP as a string.\n * Throws if the file is not found and safe is not set.\n */\nfunction getZipString(zip: ZipArchive, path: string, safe?: boolean, opts?: ReadOptions): string | null {\n\tconst p = zipReadString(zip, path);\n\tif (p == null && !safe) {\n\t\tthrow new XlsxError(\"NOT_FOUND\", \"Could not find \" + path);\n\t}\n\tif (p != null) {\n\t\tassertXmlPartLimits(path, p, opts);\n\t}\n\treturn p;\n}\n\n/** Read ZIP entry data as string (alias for XML-based files) */\nfunction getZipData(zip: ZipArchive, path: string, safe?: boolean, opts?: ReadOptions): string | null {\n\treturn getZipString(zip, path, safe, opts);\n}\n\n/** Recognized relationship types for worksheets (standard and transitional) */\nconst RELS_WS = [\n\t\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n\t\"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet\",\n];\n\n/** Determine the sheet type from a relationship type URI */\nfunction get_sheet_type(n: string): string {\n\tif (RELS_WS.indexOf(n) > -1) {\n\t\treturn \"sheet\";\n\t}\n\treturn n && n.length ? n : \"sheet\";\n}\n\n/**\n * Safely map workbook sheet entries to their target paths and types using\n * the workbook relationships. Returns null if mapping fails.\n */\nfunction safe_parse_wbrels(wbrels: Relationships, sheets: SheetEntry[]): [string, string, string][] | null {\n\tif (!wbrels) {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst result: [string, string, string][] = sheets.map((sheetEntry) => {\n\t\t\tconst id = (sheetEntry as any).id || (sheetEntry as any).strRelID;\n\t\t\t// [name, target path, sheet type]\n\t\t\treturn [sheetEntry.name, wbrels[\"!id\"][id].Target, get_sheet_type(wbrels[\"!id\"][id].Type)];\n\t\t});\n\t\treturn result.length === 0 ? null : result;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Optional worksheet relationships and annotations are best-effort in normal\n * mode. Caller configuration failures must still surface, since retrying after\n * silently ignoring a configured limit would bypass the caller's policy.\n */\nfunction tolerateOptionalSheetError(error: unknown, opts: ReadOptions): void {\n\tif (\n\t\topts.WTF ||\n\t\t(error instanceof XlsxError && (error.code === \"LIMIT_EXCEEDED\" || error.code === \"INVALID_ARGUMENT\"))\n\t) {\n\t\tthrow error;\n\t}\n}\n\n/**\n * Parse a required worksheet and then best-effort optional relationships,\n * comments, threaded comments, and VML drawings.\n */\nfunction parse_sheet(\n\tzip: ZipArchive,\n\tpath: string,\n\trelsPath: string,\n\tsheetName: string,\n\tidx: number,\n\tsheetRels: Record<string, Relationships>,\n\tsheets: Record<string, WorkSheet>,\n\tstype: string,\n\topts: any,\n\twb: WorkbookFile,\n\tthemes: ThemeData,\n\tstyles: StylesData,\n\tstrs: SST,\n): void {\n\t// Unsupported sheet types are listed in SheetNames but are not materialized.\n\tif (stype !== \"sheet\") {\n\t\treturn;\n\t}\n\n\tlet relationships: Relationships;\n\ttry {\n\t\trelationships = parseRelationships(getZipString(zip, relsPath, true, opts), path, opts);\n\t} catch (error) {\n\t\ttolerateOptionalSheetError(error, opts);\n\t\trelationships = parseRelationships(null, path, opts);\n\t}\n\tsheetRels[sheetName] = relationships;\n\n\tconst data = getZipData(zip, path, false, opts)!;\n\n\tconst _ws = parseWorksheetXml(data, opts, idx, relationships, wb, themes, styles);\n\n\t// Replace SST index placeholders with actual string values\n\tresolveSharedStrings(_ws, strs, opts);\n\n\tsheets[sheetName] = _ws;\n\n\ttry {\n\t\t// Scan sheet relationships for comments and threaded comments\n\t\tconst comments: any[] = [];\n\t\tconst commentCells = new Set<string>();\n\t\tlet tcomments: any[] = [];\n\t\tif (relationships) {\n\t\t\tfor (const n of Object.keys(relationships)) {\n\t\t\t\t// Skip internal keys\n\t\t\t\tif (n === \"!id\" || n === \"!idx\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst rel = relationships[n];\n\t\t\t\tif (!rel || !rel.Type) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Parse legacy comments (ECMA-376 18.7)\n\t\t\t\tif (rel.Type === RELTYPE.CMNT) {\n\t\t\t\t\tconst dfile = resolve_path(rel.Target, path);\n\t\t\t\t\tconst cmntData = getZipData(zip, dfile, true, opts);\n\t\t\t\t\tif (cmntData) {\n\t\t\t\t\t\tconst parsedComments = parseCommentsXml(cmntData, opts);\n\t\t\t\t\t\tif (parsedComments && parsedComments.length > 0) {\n\t\t\t\t\t\t\tfor (const comment of parsedComments) {\n\t\t\t\t\t\t\t\tif (!commentCells.has(comment.ref)) {\n\t\t\t\t\t\t\t\t\tcommentCells.add(comment.ref);\n\t\t\t\t\t\t\t\t\tcomments.push(comment);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tinsertCommentsIntoSheet(_ws, parsedComments, false);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Parse threaded comments (MS-XLSX extension)\n\t\t\t\tif (rel.Type === RELTYPE.TCMNT) {\n\t\t\t\t\tconst dfile = resolve_path(rel.Target, path);\n\t\t\t\t\tconst tcData = getZipData(zip, dfile, true, opts);\n\t\t\t\t\tif (tcData) {\n\t\t\t\t\t\ttcomments = tcomments.concat(parseTcmntXml(tcData, opts));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tcomments.length > 0) {\n\t\t\tinsertCommentsIntoSheet(_ws, tcomments, true, opts.people || []);\n\t\t}\n\n\t\t// Parse legacy VML drawings (comment anchor shapes)\n\t\tconst legacyDrawing = relationships?.[\"!id\"]?.[(_ws as any)[\"!legrel\"]];\n\t\tif (legacyDrawing) {\n\t\t\tconst dfile = resolve_path(legacyDrawing.Target, path);\n\t\t\tconst draw = getZipString(zip, dfile, true, opts);\n\t\t\tif (draw) {\n\t\t\t\tparseVml(draw, _ws, comments);\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\ttolerateOptionalSheetError(error, opts);\n\t}\n}\n\n/**\n * Parse an XLSX ZIP archive into a WorkBook object.\n *\n * Orchestrates reading of all XLSX parts: content types, relationships,\n * shared strings, themes, styles, workbook, properties, metadata, people,\n * and individual worksheets with their comments and VML drawings.\n *\n * @param zip - ZipArchive containing the XLSX file parts\n * @param opts - Read options controlling parsing behavior\n * @returns Parsed WorkBook with sheets, properties, and metadata\n * @throws XlsxError if the ZIP is not a valid XLSX file or the workbook is missing\n */\nexport function parseZip(zip: ZipArchive, opts?: ReadOptions): WorkBook {\n\tresetFormatTable();\n\tconst options: any = opts || {};\n\n\tif (!zipHas(zip, \"[Content_Types].xml\")) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported ZIP file\");\n\t}\n\n\tconst dir: ContentTypes = parseContentTypes(getZipString(zip, \"[Content_Types].xml\", false, options), options);\n\n\t// Fallback: if no workbook found in content types, try the default path\n\tif (dir.workbooks.length === 0) {\n\t\tconst binname = \"xl/workbook.xml\";\n\t\tif (getZipData(zip, binname, true, options)) {\n\t\t\tdir.workbooks.push(binname);\n\t\t}\n\t}\n\tif (dir.workbooks.length === 0) {\n\t\tthrow new XlsxError(\"NOT_FOUND\", \"Could not find workbook\");\n\t}\n\n\tconst themes: ThemeData = { themeElements: { clrScheme: [] } };\n\tlet styles: StylesData = { NumberFmt: {}, CellXf: [], Fonts: [], Fills: [], Borders: [] };\n\tlet strs: SST = [];\n\n\t// Parse shared resources unless only sheet names or properties are requested\n\tif (!options.bookSheets && !options.bookProps) {\n\t\t// Shared String Table\n\t\tif (dir.sst) {\n\t\t\tconst sstData = getZipData(zip, stripLeadingSlash(dir.sst), false, options)!;\n\t\t\tstrs = parseSstXml(sstData, options);\n\t\t}\n\n\t\t// Theme (color scheme for styled cells)\n\t\tif (dir.themes.length) {\n\t\t\tconst themeData = getZipString(zip, dir.themes[0].replace(/^\\//, \"\"), true, options);\n\t\t\tif (themeData) {\n\t\t\t\tconst parsed = parse_theme_xml(themeData);\n\t\t\t\tObject.assign(themes, parsed);\n\t\t\t}\n\t\t}\n\n\t\t// Styles (number formats, cell xf entries)\n\t\tif (dir.style) {\n\t\t\tconst styData = getZipData(zip, stripLeadingSlash(dir.style), false, options);\n\t\t\tif (styData) {\n\t\t\t\tstyles = parseStylesXml(styData, themes, options);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Parse the workbook XML (sheet list, defined names, properties)\n\tconst wb: WorkbookFile = parseWorkbookXml(\n\t\tgetZipData(zip, stripLeadingSlash(dir.workbooks[0]), false, options)!,\n\t\toptions,\n\t);\n\n\t// Parse document properties\n\tconst props: any = {};\n\tif (dir.coreprops.length) {\n\t\tconst propdata = getZipData(zip, stripLeadingSlash(dir.coreprops[0]), true, options);\n\t\tif (propdata) {\n\t\t\tObject.assign(props, parseCoreProperties(propdata));\n\t\t}\n\t\tif (dir.extprops.length) {\n\t\t\tconst extdata = getZipData(zip, stripLeadingSlash(dir.extprops[0]), true, options);\n\t\t\tif (extdata) {\n\t\t\t\tparseExtendedProperties(extdata, props);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Parse custom properties\n\tlet custprops: Record<string, any> = {};\n\tif (!options.bookSheets || options.bookProps) {\n\t\tif (dir.custprops.length) {\n\t\t\tconst custdata = getZipString(zip, stripLeadingSlash(dir.custprops[0]), true, options);\n\t\t\tif (custdata) {\n\t\t\t\tcustprops = parseCustomProperties(custdata, options);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Early return for bookSheets/bookProps-only mode\n\tconst out: any = {};\n\tif (options.bookSheets || options.bookProps) {\n\t\tlet sheets: string[] | undefined;\n\t\tif (wb.Sheets) {\n\t\t\tsheets = wb.Sheets.map((x: SheetEntry) => x.name);\n\t\t} else if (props.Worksheets && props.SheetNames?.length > 0) {\n\t\t\tsheets = props.SheetNames;\n\t\t}\n\t\tif (options.bookProps) {\n\t\t\tout.Props = props;\n\t\t\tout.Custprops = custprops;\n\t\t}\n\t\tif (options.bookSheets && sheets) {\n\t\t\tout.SheetNames = sheets;\n\t\t}\n\t\tif (options.bookSheets ? out.SheetNames : options.bookProps) {\n\t\t\treturn out as WorkBook;\n\t\t}\n\t}\n\n\tconst sheets: Record<string, WorkSheet> = Object.create(null);\n\n\t// Calculation chain (dependency order for formula recalc)\n\tif (options.bookDeps && dir.calcchain) {\n\t\tparseCalcChainXml(getZipData(zip, stripLeadingSlash(dir.calcchain), true, options) || \"\");\n\t}\n\n\t// Build the sheet name list from the workbook\n\tconst sheetRels: Record<string, Relationships> = Object.create(null);\n\tconst wbsheets = wb.Sheets;\n\tprops.Worksheets = wbsheets.length;\n\tprops.SheetNames = [];\n\tfor (let j = 0; j < wbsheets.length; ++j) {\n\t\tprops.SheetNames[j] = wbsheets[j].name;\n\t}\n\n\t// Locate the workbook relationships file\n\tconst wbrelsi = dir.workbooks[0].lastIndexOf(\"/\");\n\tlet wbrelsfile = (\n\t\tdir.workbooks[0].slice(0, wbrelsi + 1) +\n\t\t\"_rels/\" +\n\t\tdir.workbooks[0].slice(wbrelsi + 1) +\n\t\t\".rels\"\n\t).replace(/^\\//, \"\");\n\tif (!zipHas(zip, wbrelsfile)) {\n\t\twbrelsfile = \"xl/_rels/workbook.xml.rels\";\n\t}\n\tconst wbrels = parseRelationships(\n\t\tgetZipString(zip, wbrelsfile, true, options),\n\t\twbrelsfile.replace(/_rels.*/, \"s5s\"),\n\t\toptions,\n\t);\n\n\t// Parse cell metadata (for dynamic arrays, rich data, etc.)\n\tif ((dir.metadata || []).length >= 1) {\n\t\toptions.xlmeta = parseMetadataXml(\n\t\t\tgetZipData(zip, stripLeadingSlash(dir.metadata[0]), true, options) || \"\",\n\t\t\toptions,\n\t\t);\n\t}\n\n\t// Parse people list (for threaded comment author resolution)\n\tif ((dir.people || []).length >= 1) {\n\t\toptions.people = parsePeopleXml(getZipData(zip, stripLeadingSlash(dir.people[0]), true, options) || \"\");\n\t}\n\n\t// Map sheet entries to their ZIP paths via workbook relationships\n\tconst wbrelsArr = wbrels ? safe_parse_wbrels(wbrels, wb.Sheets) : null;\n\n\t// Detect legacy naming: some files use \"sheet.xml\" instead of \"sheet1.xml\"\n\tconst nmode = getZipData(zip, \"xl/worksheets/sheet.xml\", true, options) ? 1 : 0;\n\n\tfor (let i = 0; i < props.Worksheets; ++i) {\n\t\tlet stype = \"sheet\";\n\t\tlet path: string;\n\t\tif (wbrelsArr && wbrelsArr[i]) {\n\t\t\t// Resolve the sheet path from relationships, trying multiple fallback locations\n\t\t\tpath = \"xl/\" + wbrelsArr[i][1].replace(/[/]?xl\\//, \"\");\n\t\t\tif (!zipHas(zip, path)) {\n\t\t\t\tpath = wbrelsArr[i][1];\n\t\t\t}\n\t\t\tif (!zipHas(zip, path)) {\n\t\t\t\tpath = wbrelsfile.replace(/_rels\\/[\\S\\s]*$/, \"\") + wbrelsArr[i][1];\n\t\t\t}\n\t\t\tstype = wbrelsArr[i][2];\n\t\t} else {\n\t\t\t// Fallback: construct path from sheet index\n\t\t\tpath = \"xl/worksheets/sheet\" + (i + 1 - nmode) + \".xml\";\n\t\t\tpath = path.replace(/sheet0\\./, \"sheet.\");\n\t\t}\n\n\t\t// Apply sheet filter (by index, name, or array of indices/names)\n\t\tif (options.sheets != null) {\n\t\t\tif (typeof options.sheets === \"number\" && i !== options.sheets) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof options.sheets === \"string\" &&\n\t\t\t\tprops.SheetNames[i].toLowerCase() !== options.sheets.toLowerCase()\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Array.isArray(options.sheets)) {\n\t\t\t\tlet seen = false;\n\t\t\t\tfor (const s of options.sheets) {\n\t\t\t\t\tif (typeof s === \"number\" && s === i) {\n\t\t\t\t\t\tseen = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof s === \"string\" && s.toLowerCase() === props.SheetNames[i].toLowerCase()) {\n\t\t\t\t\t\tseen = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!seen) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Derive the per-sheet .rels path from the sheet path\n\t\tconst relsPath = path.replace(/^(.*)(\\/)([^/]*)$/, \"$1/_rels/$3.rels\");\n\t\tparse_sheet(\n\t\t\tzip,\n\t\t\tpath,\n\t\t\trelsPath,\n\t\t\tprops.SheetNames[i],\n\t\t\ti,\n\t\t\tsheetRels,\n\t\t\tsheets,\n\t\t\tstype,\n\t\t\toptions,\n\t\t\twb,\n\t\t\tthemes,\n\t\t\tstyles,\n\t\t\tstrs,\n\t\t);\n\t}\n\n\tconst result: WorkBook = {\n\t\tSheets: sheets,\n\t\tSheetNames: props.SheetNames,\n\t\tProps: props,\n\t\tCustprops: custprops,\n\t\tbookType: \"xlsx\",\n\t};\n\n\t// Attach workbook-level metadata (properties, sheet visibility, defined names)\n\tif (wb.WBProps) {\n\t\tresult.Workbook = {\n\t\t\tWBProps: wb.WBProps,\n\t\t\tSheets: wb.Sheets as any,\n\t\t\tNames: wb.Names as any,\n\t\t};\n\t}\n\n\treturn result;\n}\n","/**\n * Decode a base64 string to a Uint8Array.\n *\n * Automatically strips a data-URI prefix (e.g. \"data:application/octet-stream;base64,...\")\n * if present before decoding.\n *\n * @param input - Base64-encoded string, optionally prefixed with a data URI scheme\n * @returns Decoded byte array\n */\nexport function base64decode(input: string): Uint8Array {\n\tlet str = input;\n\t// Strip data-URI prefix if present (e.g. \"data:image/png;base64,...\")\n\tif (str.slice(0, 5) === \"data:\") {\n\t\tconst i = str.slice(0, 1024).indexOf(\";base64,\");\n\t\tif (i !== -1) {\n\t\t\tstr = str.slice(i + 8);\n\t\t}\n\t}\n\tconst binaryStr = atob(str);\n\tconst len = binaryStr.length;\n\tconst bytes = new Uint8Array(len);\n\tfor (let i = 0; i < len; i++) {\n\t\tbytes[i] = binaryStr.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\n/**\n * Encode a Uint8Array to a base64 string.\n *\n * Converts each byte to a character and uses the built-in btoa() for encoding.\n *\n * @param data - Byte array to encode\n * @returns Base64-encoded string\n */\nexport function base64encode(data: Uint8Array): string {\n\tlet binaryStr = \"\";\n\tfor (let i = 0; i < data.length; i++) {\n\t\tbinaryStr += String.fromCharCode(data[i]);\n\t}\n\treturn btoa(binaryStr);\n}\n","import type { CellObject } from \"../types.js\";\nimport { BErr } from \"../types.js\";\nimport { formatNumber, getDateTimeFormatKind, type DateTimeFormatKind } from \"../ssf/format.js\";\nimport { DEFAULT_FORMAT_MAP, DEFAULT_FORMAT_STRINGS, formatTable } from \"../ssf/table.js\";\nimport { dateToSerialNumber, serialNumberToDate, utcToLocal } from \"../utils/date.js\";\n\nfunction resolveNumberFormat(fmt: unknown, options?: any): string | undefined {\n\tif (typeof fmt === \"string\") {\n\t\treturn fmt === \"m/d/yy\" && options?.dateNF ? String(options.dateNF) : fmt;\n\t}\n\tif (typeof fmt !== \"number\") {\n\t\treturn undefined;\n\t}\n\tif (fmt === 14 && options?.dateNF) {\n\t\treturn String(options.dateNF);\n\t}\n\tconst table = options?.table || formatTable;\n\treturn table[fmt] || table[DEFAULT_FORMAT_MAP[fmt]] || DEFAULT_FORMAT_STRINGS[fmt];\n}\n\nfunction resolveCellNumberFormat(cell: CellObject, options?: any): string | undefined {\n\treturn resolveNumberFormat(cell.z ?? cell.XF?.numFmt ?? cell.XF?.numFmtId, options);\n}\n\n/** Return the date/time classification for a cell's number format. */\nexport function getCellDateTimeFormatKind(cell: CellObject, options?: any): DateTimeFormatKind {\n\tconst fmt = resolveCellNumberFormat(cell, options);\n\treturn fmt ? getDateTimeFormatKind(fmt) : \"none\";\n}\n\nfunction pad2(value: number): string {\n\treturn value < 10 ? \"0\" + value : \"\" + value;\n}\n\nfunction formatDateIso(date: Date, kind: DateTimeFormatKind): string {\n\tconst year = date.getUTCFullYear();\n\tconst month = date.getUTCMonth() + 1;\n\tconst day = date.getUTCDate();\n\tconst hours = date.getUTCHours();\n\tconst minutes = date.getUTCMinutes();\n\tconst seconds = date.getUTCSeconds();\n\tconst yearPart = year < 1000 ? String(year).padStart(4, \"0\") : String(year);\n\tconst datePart = `${yearPart}-${pad2(month)}-${pad2(day)}`;\n\tif (kind === \"date\") {\n\t\treturn datePart;\n\t}\n\treturn `${datePart}T${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;\n}\n\nfunction inferDateKind(date: Date, options?: any): DateTimeFormatKind {\n\tconst useUtc = options?.UTC !== false;\n\tconst hours = useUtc ? date.getUTCHours() : date.getHours();\n\tconst minutes = useUtc ? date.getUTCMinutes() : date.getMinutes();\n\tconst seconds = useUtc ? date.getUTCSeconds() : date.getSeconds();\n\tconst ms = useUtc ? date.getUTCMilliseconds() : date.getMilliseconds();\n\treturn hours || minutes || seconds || ms ? \"datetime\" : \"date\";\n}\n\nfunction normalizeDateOutput(date: Date, options?: any): Date {\n\treturn options?.UTC === false ? utcToLocal(date) : date;\n}\n\n/**\n * Attempt to format a cell value using the cell's number format or XF record.\n * Falls back to a plain string coercion if all formatting attempts fail.\n */\nfunction safeFormatCell(cell: CellObject, value: any, options?: any): string {\n\tconst isDateCell = cell.t === \"d\" && value instanceof Date;\n\tconst numberFormat = resolveCellNumberFormat(cell, options);\n\tif (numberFormat != null) {\n\t\ttry {\n\t\t\tcell.w = formatNumber(\n\t\t\t\tnumberFormat,\n\t\t\t\tisDateCell ? dateToSerialNumber(value, options?.date1904) : value,\n\t\t\t\toptions,\n\t\t\t);\n\t\t\treturn cell.w;\n\t\t} catch {}\n\t}\n\t// Fall back to the numFmtId from the cell's XF style record;\n\t// default to format 14 (short date) for date cells, or 0 (General) otherwise\n\ttry {\n\t\tcell.w = formatNumber(\n\t\t\t(cell.XF || {}).numFmtId || (isDateCell ? 14 : 0),\n\t\t\tisDateCell ? dateToSerialNumber(value, options?.date1904) : value,\n\t\t\toptions,\n\t\t);\n\t\treturn cell.w;\n\t} catch {\n\t\treturn \"\" + value;\n\t}\n}\n\n/**\n * Format a cell's value into its display string representation.\n *\n * Returns the cached `cell.w` if already computed, otherwise formats the value\n * using the cell's number format string or XF style information.\n *\n * @param cell - The cell object to format\n * @param value - Optional override value; if omitted, uses `cell.v`\n * @param options - Optional settings (e.g. `dateNF` for a default date format)\n * @returns The formatted display string, or empty string for null/blank cells\n */\nexport function formatCell(cell: CellObject, value?: any, options?: any): string {\n\t// Null cells or cells with type \"z\" (stub/blank) produce empty strings\n\tif (cell == null || cell.t == null || cell.t === \"z\") {\n\t\treturn \"\";\n\t}\n\t// Return the cached formatted string if already computed\n\tif (cell.w !== undefined) {\n\t\treturn cell.w;\n\t}\n\t// Apply the caller-supplied date format if the cell is a date without its own format\n\tif (cell.t === \"d\" && !cell.z && options && options.dateNF) {\n\t\tcell.z = options.dateNF;\n\t}\n\t// Error cells: look up the error code in BErr for a human-readable string\n\tif (cell.t === \"e\") {\n\t\treturn BErr[cell.v as number] || String(cell.v);\n\t}\n\tif (value == null) {\n\t\treturn safeFormatCell(cell, cell.v, options);\n\t}\n\treturn safeFormatCell(cell, value, options);\n}\n\n/**\n * Format a cell for worksheet export APIs.\n *\n * This mirrors `formatCell` by default. With `dateOutput: \"iso\"`, date and\n * datetime number formats are rendered as stable ISO-like strings, while\n * time-only formats keep their display value instead of becoming epoch dates.\n */\nexport function formatCellForOutput(cell: CellObject, value?: any, options?: any): string {\n\tif (options?.dateOutput !== \"iso\") {\n\t\treturn formatCell(cell, value, options);\n\t}\n\tconst cellValue = value == null ? cell.v : value;\n\tconst kind = getCellDateTimeFormatKind(cell, options);\n\tif (cell.t === \"n\" && typeof cellValue === \"number\") {\n\t\tif (kind === \"date\" || kind === \"datetime\") {\n\t\t\treturn formatDateIso(normalizeDateOutput(serialNumberToDate(cellValue, options?.date1904), options), kind);\n\t\t}\n\t\treturn formatCell(cell, value, options);\n\t}\n\tif (cellValue instanceof Date) {\n\t\treturn formatDateIso(\n\t\t\tnormalizeDateOutput(cellValue, options),\n\t\t\tkind === \"none\" || kind === \"time\" ? inferDateKind(cellValue, options) : kind,\n\t\t);\n\t}\n\treturn formatCell(cell, value, options);\n}\n","import type { WorkSheet, Sheet2JSONOpts, JSON2SheetOpts, CellObject, Range } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { decodeCell, encodeCol, encodeRow, encodeRange, safeDecodeRange, getCell } from \"../utils/cell.js\";\nimport { dateToSerialNumber, serialNumberToDate, utcToLocal, localToUtc } from \"../utils/date.js\";\nimport { clampLargeExportRange } from \"../utils/export-range.js\";\nimport { DEFAULT_MAX_EXPORT_CELLS, WorksheetCellBudget, XLSX_MAX_ROWS } from \"../utils/worksheet-budget.js\";\nimport { isDateFormat } from \"../ssf/format.js\";\nimport { formatTable } from \"../ssf/table.js\";\nimport { formatCell, formatCellForOutput, getCellDateTimeFormatKind } from \"./format.js\";\n\nfunction setRowValue(row: any, key: any, value: any): void {\n\tif (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n\t\tObject.defineProperty(row, key, { value, enumerable: true, configurable: true, writable: true });\n\t} else {\n\t\trow[key] = value;\n\t}\n}\n\n/**\n * Build a single JSON row object (or array) from a worksheet row.\n *\n * Reads each cell in the row, converts its value based on type (handling dates,\n * errors, booleans, etc.), and populates the output row keyed by column headers.\n *\n * @returns An object containing the built `row` and an `isempty` flag\n */\nfunction buildJsonRow(\n\tsheet: WorkSheet,\n\trange: Range,\n\trowIndex: number,\n\theader: number,\n\theaders: any[],\n\toptions: any,\n): { row: any; isempty: boolean } {\n\tconst defval = options.defval;\n\tconst raw = options.raw || !Object.hasOwn(options, \"raw\");\n\tlet isempty = true;\n\t// header===1 means output as arrays (numeric indices), otherwise as objects\n\tconst row: any = header === 1 ? [] : {};\n\n\t// Attach a non-enumerable __rowNum__ property for object rows so callers\n\t// can identify the source row without it polluting serialisation\n\tif (header !== 1) {\n\t\ttry {\n\t\t\tObject.defineProperty(row, \"__rowNum__\", { value: rowIndex, enumerable: false });\n\t\t} catch {\n\t\t\trow.__rowNum__ = rowIndex;\n\t\t}\n\t}\n\n\tfor (let colIdx = range.s.c; colIdx <= range.e.c; ++colIdx) {\n\t\tconst val = getCell(sheet, rowIndex, colIdx);\n\t\tif (val == null || val.t === undefined) {\n\t\t\t// No cell: use default value if provided, otherwise skip\n\t\t\tif (defval === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (headers[colIdx] != null) {\n\t\t\t\tsetRowValue(row, headers[colIdx], defval);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tlet cellValue: any = val.v;\n\t\t// Formula cells may legitimately omit their cached numeric result. Treat\n\t\t// them as blank before date-like number formats attempt serial conversion.\n\t\tif (val.t === \"n\" && cellValue == null && (val.f != null || val.F != null)) {\n\t\t\tif (defval !== undefined && headers[colIdx] != null) {\n\t\t\t\tsetRowValue(row, headers[colIdx], defval);\n\t\t\t\tisempty = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tswitch (val.t) {\n\t\t\tcase \"z\": // stub/blank cell\n\t\t\t\tif (cellValue == null) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\tcase \"e\": // error cell\n\t\t\t\t// Error code 0 (#NULL!) maps to null; other codes to undefined\n\t\t\t\tcellValue = cellValue === 0 ? null : undefined;\n\t\t\t\tbreak;\n\t\t\tcase \"s\": // string\n\t\t\tcase \"b\": // boolean\n\t\t\t\tbreak;\n\t\t\tcase \"n\": {\n\t\t\t\t// Number may actually represent a date if the format is date-like.\n\t\t\t\tconst fmtKind = getCellDateTimeFormatKind(val, options);\n\t\t\t\tif (fmtKind === \"none\" || fmtKind === \"time\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t// Number format indicates a date; convert serial number to JS Date\n\t\t\t\tcellValue = serialNumberToDate(cellValue as number, options.date1904);\n\t\t\t\tif (typeof cellValue === \"number\") {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* falls through */\n\t\t\tcase \"d\": // date\n\t\t\t\tif (!(options && (options.UTC || options.raw === false || options.dateOutput === \"iso\"))) {\n\t\t\t\t\tcellValue = utcToLocal(new Date(cellValue));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"unrecognized type \" + val.t);\n\t\t}\n\t\tif (headers[colIdx] != null) {\n\t\t\tif (cellValue == null) {\n\t\t\t\tif (val.t === \"e\" && cellValue === null) {\n\t\t\t\t\tsetRowValue(row, headers[colIdx], null);\n\t\t\t\t} else if (defval !== undefined) {\n\t\t\t\t\tsetRowValue(row, headers[colIdx], defval);\n\t\t\t\t} else if (raw && cellValue === null) {\n\t\t\t\t\tsetRowValue(row, headers[colIdx], null);\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Use raw value when rawNumbers/raw is set, otherwise format for display\n\t\t\t\tconst useRaw = val.t === \"n\" && typeof options.rawNumbers === \"boolean\" ? options.rawNumbers : raw;\n\t\t\t\tconst fmtKind = getCellDateTimeFormatKind(val, options);\n\t\t\t\tconst useDateOutput =\n\t\t\t\t\toptions.dateOutput === \"iso\" && (val.t === \"d\" || fmtKind === \"date\" || fmtKind === \"datetime\");\n\t\t\t\tsetRowValue(\n\t\t\t\t\trow,\n\t\t\t\t\theaders[colIdx],\n\t\t\t\t\tuseDateOutput || !useRaw ? formatCellForOutput(val, cellValue, options) : cellValue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (cellValue != null) {\n\t\t\t\tisempty = false;\n\t\t\t}\n\t\t}\n\t}\n\treturn { row, isempty };\n}\n\n/**\n * Convert a worksheet to an array of JSON objects (or arrays).\n *\n * The first row is used as header keys by default. Supports multiple header\n * modes (raw arrays, column-letter keys, custom headers), range overrides,\n * hidden row/column skipping, blank-row handling, and date conversion.\n *\n * @param sheet - The worksheet to convert\n * @param opts - Optional conversion options (header, range, raw, rawNumbers, defval, blankrows, skipHidden, dateNF, UTC)\n * @returns An array of row objects (or arrays when `header: 1`)\n */\nexport function sheetToJson<T = any>(sheet: WorkSheet, opts?: Sheet2JSONOpts): T[] {\n\tif (sheet == null || sheet[\"!ref\"] == null) {\n\t\treturn [];\n\t}\n\tlet header = 0,\n\t\toffset = 1;\n\tconst headers: any[] = [];\n\tconst options: any = opts || {};\n\tconst range = options.range != null ? options.range : sheet[\"!ref\"];\n\n\t// Determine header mode:\n\t//   0 = use first row values as keys (default)\n\t//   1 = raw array output (numeric indices)\n\t//   2 = column letters as keys (\"A\", \"B\", ...)\n\t//   3 = caller-supplied header array\n\tif (options.header === 1) {\n\t\theader = 1;\n\t} else if (options.header === \"A\") {\n\t\theader = 2;\n\t} else if (Array.isArray(options.header)) {\n\t\theader = 3;\n\t} else if (options.header == null) {\n\t\theader = 0;\n\t}\n\n\tconst budget = new WorksheetCellBudget(options.maxWorksheetCells, DEFAULT_MAX_EXPORT_CELLS);\n\tlet decodedRange: Range;\n\tswitch (typeof range) {\n\t\tcase \"string\":\n\t\t\tdecodedRange = safeDecodeRange(range);\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\t// Numeric range means \"start from this row\"\n\t\t\tif (!Number.isSafeInteger(range) || range < 0 || range >= XLSX_MAX_ROWS) {\n\t\t\t\tthrow new XlsxError(\n\t\t\t\t\t\"INVALID_ARGUMENT\",\n\t\t\t\t\t\"Invalid worksheet JSON range: row must be a non-negative safe integer\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tdecodedRange = safeDecodeRange(sheet[\"!ref\"]);\n\t\t\tif (range > decodedRange.e.r) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tdecodedRange.s.r = range;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tdecodedRange = range;\n\t}\n\tconst clampedRange = clampLargeExportRange(\n\t\tsheet,\n\t\tdecodedRange,\n\t\tbudget,\n\t\toptions.range == null || typeof options.range === \"number\",\n\t);\n\tif (!clampedRange) {\n\t\treturn [];\n\t}\n\tdecodedRange = clampedRange;\n\t// When headers are explicitly provided, data starts at the first row (no offset)\n\tif (header > 0) {\n\t\toffset = 0;\n\t}\n\n\tconst out: any[] = [];\n\tlet outputIndex = 0;\n\tlet rowIdx = decodedRange.s.r;\n\tconst header_cnt: Record<string, number> = Object.create(null);\n\tconst colinfo: any[] = (options.skipHidden && sheet[\"!cols\"]) || [];\n\tconst rowinfo: any[] = (options.skipHidden && sheet[\"!rows\"]) || [];\n\n\t// Build header labels from the first row (or from explicit options)\n\tfor (let colIdx = decodedRange.s.c; colIdx <= decodedRange.e.c; ++colIdx) {\n\t\tif ((colinfo[colIdx] || {}).hidden) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst val = getCell(sheet, rowIdx, colIdx);\n\t\tlet cellValue: any, headerLabel: any;\n\t\tswitch (header) {\n\t\t\tcase 1: // Raw array: use zero-based column offset as index\n\t\t\t\theaders[colIdx] = colIdx - decodedRange.s.c;\n\t\t\t\tbreak;\n\t\t\tcase 2: // Column-letter keys\n\t\t\t\theaders[colIdx] = encodeCol(colIdx);\n\t\t\t\tbreak;\n\t\t\tcase 3: // Caller-supplied headers\n\t\t\t\theaders[colIdx] = (options.header as string[])[colIdx - decodedRange.s.c];\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\t// Derive key from the header row cell value; use \"__EMPTY\" for blank headers\n\t\t\t\tconst _val = val == null ? { w: \"__EMPTY\", t: \"s\" } : val;\n\t\t\t\theaderLabel = cellValue = formatCell(_val as CellObject, null, options);\n\t\t\t\t// Deduplicate by appending \"_1\", \"_2\", ... for repeated header labels\n\t\t\t\tlet counter = header_cnt[cellValue] || 0;\n\t\t\t\tif (!counter) {\n\t\t\t\t\theader_cnt[cellValue] = 1;\n\t\t\t\t} else {\n\t\t\t\t\tdo {\n\t\t\t\t\t\theaderLabel = cellValue + \"_\" + counter++;\n\t\t\t\t\t} while (header_cnt[headerLabel]);\n\t\t\t\t\theader_cnt[cellValue] = counter;\n\t\t\t\t\theader_cnt[headerLabel] = 1;\n\t\t\t\t}\n\t\t\t\theaders[colIdx] = headerLabel;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build data rows starting after the header row (unless offset is 0)\n\tfor (rowIdx = decodedRange.s.r + offset; rowIdx <= decodedRange.e.r; ++rowIdx) {\n\t\tif ((rowinfo[rowIdx] || {}).hidden) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst row = buildJsonRow(sheet, decodedRange, rowIdx, header, headers, options);\n\t\tif (!row.isempty || (header === 1 ? options.blankrows !== false : !!options.blankrows)) {\n\t\t\tout[outputIndex++] = row.row;\n\t\t}\n\t}\n\tout.length = outputIndex;\n\treturn out;\n}\n\n/**\n * Add an array of JSON objects to an existing worksheet, or create a new one.\n *\n * Object keys become column headers (written in the first row unless\n * `skipHeader` is set). Supports dense and sparse storage, origin offsets,\n * date handling, and automatic type detection.\n *\n * @param existingSheet - An existing worksheet to append to, or `null` to create a new one\n * @param jsonData - Array of plain objects whose keys map to column headers\n * @param opts - Optional settings (header, origin, dense, skipHeader, cellDates, UTC, dateNF, nullError)\n * @returns The updated or newly created worksheet\n */\nexport function addJsonToSheet(existingSheet: WorkSheet | null, jsonData: any[], opts?: JSON2SheetOpts): WorkSheet {\n\tconst options: any = opts || {};\n\tconst dense = existingSheet ? (existingSheet as any)[\"!data\"] != null : !!options.dense;\n\t// offset is 1 to reserve the first row for headers, 0 when skipHeader is set\n\tconst offset = +!options.skipHeader;\n\tconst worksheet: any = existingSheet || {};\n\tif (!existingSheet && dense) {\n\t\tworksheet[\"!data\"] = [];\n\t}\n\n\tlet originRow = 0,\n\t\toriginCol = 0;\n\tif (worksheet && options.origin != null) {\n\t\tif (typeof options.origin === \"number\") {\n\t\t\toriginRow = options.origin;\n\t\t} else {\n\t\t\tconst parsedOrigin = typeof options.origin === \"string\" ? decodeCell(options.origin) : options.origin;\n\t\t\toriginRow = parsedOrigin.r;\n\t\t\toriginCol = parsedOrigin.c;\n\t\t}\n\t}\n\n\tconst range: Range = { s: { c: 0, r: 0 }, e: { c: originCol, r: originRow + jsonData.length - 1 + offset } };\n\tif (worksheet[\"!ref\"]) {\n\t\tconst existingRange = safeDecodeRange(worksheet[\"!ref\"]);\n\t\trange.e.c = Math.max(range.e.c, existingRange.e.c);\n\t\trange.e.r = Math.max(range.e.r, existingRange.e.r);\n\t\t// origin of -1 means \"append after the last row\"\n\t\tif (originRow === -1) {\n\t\t\toriginRow = existingRange.e.r + 1;\n\t\t\trange.e.r = originRow + jsonData.length - 1 + offset;\n\t\t}\n\t} else {\n\t\tif (originRow === -1) {\n\t\t\toriginRow = 0;\n\t\t\trange.e.r = jsonData.length - 1 + offset;\n\t\t}\n\t}\n\n\t// Collect headers from options or discover them from object keys\n\tconst headers: string[] = options.header || [];\n\tlet colIdx = 0;\n\tjsonData.forEach((rowObj, rowIdx) => {\n\t\tif (dense && !worksheet[\"!data\"][originRow + rowIdx + offset]) {\n\t\t\tworksheet[\"!data\"][originRow + rowIdx + offset] = [];\n\t\t}\n\t\tconst denseRow = dense ? worksheet[\"!data\"][originRow + rowIdx + offset] : null;\n\t\tObject.keys(rowObj).forEach((key: string) => {\n\t\t\t// Assign a column index for each key; new keys get appended to the headers array\n\t\t\tif ((colIdx = headers.indexOf(key)) === -1) {\n\t\t\t\theaders[(colIdx = headers.length)] = key;\n\t\t\t}\n\t\t\tlet value = rowObj[key];\n\t\t\tlet cellType = \"z\";\n\t\t\tlet dateFormat = \"\";\n\t\t\tconst ref = dense ? \"\" : encodeCol(originCol + colIdx) + encodeRow(originRow + rowIdx + offset);\n\t\t\tconst cell: any = dense ? denseRow[originCol + colIdx] : worksheet[ref];\n\n\t\t\t// If the value is a pre-built cell object (non-Date object), store it directly\n\t\t\tif (value && typeof value === \"object\" && !(value instanceof Date)) {\n\t\t\t\tif (dense) {\n\t\t\t\t\tdenseRow[originCol + colIdx] = value;\n\t\t\t\t} else {\n\t\t\t\t\tworksheet[ref] = value;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (typeof value === \"number\") {\n\t\t\t\t\tcellType = \"n\";\n\t\t\t\t} else if (typeof value === \"boolean\") {\n\t\t\t\t\tcellType = \"b\";\n\t\t\t\t} else if (typeof value === \"string\") {\n\t\t\t\t\tcellType = \"s\";\n\t\t\t\t} else if (value instanceof Date) {\n\t\t\t\t\tcellType = \"d\";\n\t\t\t\t\tif (!options.UTC) {\n\t\t\t\t\t\tvalue = localToUtc(value);\n\t\t\t\t\t}\n\t\t\t\t\tif (!options.cellDates) {\n\t\t\t\t\t\tcellType = \"n\";\n\t\t\t\t\t\tvalue = dateToSerialNumber(value);\n\t\t\t\t\t}\n\t\t\t\t\t// Preserve an existing date format on the cell if valid, else use option or default\n\t\t\t\t\tdateFormat =\n\t\t\t\t\t\tcell != null && cell.z && isDateFormat(String(cell.z))\n\t\t\t\t\t\t\t? String(cell.z)\n\t\t\t\t\t\t\t: options.dateNF || formatTable[14];\n\t\t\t\t} else if (value === null && options.nullError) {\n\t\t\t\t\tcellType = \"e\";\n\t\t\t\t\tvalue = 0;\n\t\t\t\t}\n\n\t\t\t\tif (!cell) {\n\t\t\t\t\t// Create a new cell object\n\t\t\t\t\tconst newCell: any = { t: cellType, v: value };\n\t\t\t\t\tif (dateFormat) {\n\t\t\t\t\t\tnewCell.z = dateFormat;\n\t\t\t\t\t}\n\t\t\t\t\tif (dense) {\n\t\t\t\t\t\tdenseRow[originCol + colIdx] = newCell;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tworksheet[ref] = newCell;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Update the existing cell in place\n\t\t\t\t\tcell.t = cellType;\n\t\t\t\t\tcell.v = value;\n\t\t\t\t\tdelete cell.w; // invalidate cached formatted string\n\t\t\t\t\tif (dateFormat) {\n\t\t\t\t\t\tcell.z = dateFormat;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\trange.e.c = Math.max(range.e.c, originCol + headers.length - 1);\n\tconst encodedOriginRow = encodeRow(originRow);\n\tif (dense && !worksheet[\"!data\"][originRow]) {\n\t\tworksheet[\"!data\"][originRow] = [];\n\t}\n\t// Write header row unless skipHeader was set (offset === 0)\n\tif (offset) {\n\t\tfor (colIdx = 0; colIdx < headers.length; ++colIdx) {\n\t\t\tif (dense) {\n\t\t\t\tworksheet[\"!data\"][originRow][colIdx + originCol] = { t: \"s\", v: headers[colIdx] };\n\t\t\t} else {\n\t\t\t\tworksheet[encodeCol(colIdx + originCol) + encodedOriginRow] = { t: \"s\", v: headers[colIdx] };\n\t\t\t}\n\t\t}\n\t}\n\tworksheet[\"!ref\"] = encodeRange(range);\n\treturn worksheet as WorkSheet;\n}\n\n/**\n * Create a new worksheet from an array of JSON objects.\n *\n * This is a convenience wrapper around `addJsonToSheet` that always creates\n * a fresh worksheet.\n *\n * @param js - Array of plain objects whose keys map to column headers\n * @param opts - Optional settings (same as `addJsonToSheet`)\n * @returns A new worksheet populated with the given data\n */\nexport function jsonToSheet(js: any[], opts?: JSON2SheetOpts): WorkSheet {\n\treturn addJsonToSheet(null, js, opts);\n}\n","import type { WorkSheet, AOA2SheetOpts, Range, Sheet2JSONOpts } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { decodeCell, encodeRange, safeDecodeRange, getCell, setCell } from \"../utils/cell.js\";\nimport { dateToSerialNumber, localToUtc } from \"../utils/date.js\";\nimport { formatNumber } from \"../ssf/format.js\";\nimport { formatTable } from \"../ssf/table.js\";\nimport { sheetToJson } from \"./json.js\";\n\n/**\n * Add an array-of-arrays to an existing worksheet, or create a new one.\n *\n * Each inner array represents a row, and each element within it a cell value.\n * Supports dense and sparse storage modes, origin offsets, date handling,\n * and automatic type detection (number, boolean, string, date, error).\n *\n * @param worksheet - An existing worksheet to append to, or `null` to create a new one\n * @param data - The array-of-arrays containing raw cell values\n * @param opts - Optional settings (origin, dense, dateNF, cellDates, UTC, date1904, nullError, sheetStubs)\n * @returns The updated or newly created worksheet\n */\nexport function addArrayToSheet(worksheet: WorkSheet | null, data: any[][], opts?: AOA2SheetOpts): WorkSheet {\n\tconst options = opts || {};\n\tconst dense = worksheet ? worksheet[\"!data\"] != null : !!options.dense;\n\tconst ws: WorkSheet = worksheet || (dense ? { \"!data\": [] } : {});\n\tif (dense && !ws[\"!data\"]) {\n\t\tws[\"!data\"] = [];\n\t}\n\n\t// Determine the insertion origin (top-left cell for the data)\n\tlet originRow = 0,\n\t\toriginCol = 0;\n\tif (ws && options.origin != null) {\n\t\tif (typeof options.origin === \"number\") {\n\t\t\toriginRow = options.origin;\n\t\t} else {\n\t\t\tconst parsedOrigin = typeof options.origin === \"string\" ? decodeCell(options.origin) : options.origin;\n\t\t\toriginRow = parsedOrigin.r;\n\t\t\toriginCol = parsedOrigin.c;\n\t\t}\n\t}\n\n\t// Initialize range with sentinel values that will be narrowed during iteration\n\tconst range: Range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 } };\n\tif (ws[\"!ref\"]) {\n\t\t// Merge with the existing range so we don't shrink the sheet\n\t\tconst existingRange = safeDecodeRange(ws[\"!ref\"]);\n\t\trange.s.c = existingRange.s.c;\n\t\trange.s.r = existingRange.s.r;\n\t\trange.e.c = Math.max(range.e.c, existingRange.e.c);\n\t\trange.e.r = Math.max(range.e.r, existingRange.e.r);\n\t\t// origin of -1 means \"append after the last row\"\n\t\tif (originRow === -1) {\n\t\t\trange.e.r = originRow = ws[\"!ref\"] ? existingRange.e.r + 1 : 0;\n\t\t}\n\t} else {\n\t\trange.s.c = range.e.c = range.s.r = range.e.r = 0;\n\t\t// On an empty sheet, append starts at the first row rather than row -1.\n\t\tif (originRow === -1) {\n\t\t\toriginRow = 0;\n\t\t}\n\t}\n\n\tlet seen = false;\n\tfor (let rowIdx = 0; rowIdx < data.length; ++rowIdx) {\n\t\tif (!data[rowIdx]) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!Array.isArray(data[rowIdx])) {\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"arrayToSheet expects an array of arrays\");\n\t\t}\n\t\tconst targetRow = originRow + rowIdx;\n\t\tconst rowData = data[rowIdx];\n\t\tfor (let colIdx = 0; colIdx < rowData.length; ++colIdx) {\n\t\t\tif (rowData[colIdx] === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet cell: any = { v: rowData[colIdx], t: \"\" };\n\t\t\tconst targetCol = originCol + colIdx;\n\n\t\t\t// Expand the tracked range to include this cell\n\t\t\tif (range.s.r > targetRow) {\n\t\t\t\trange.s.r = targetRow;\n\t\t\t}\n\t\t\tif (range.s.c > targetCol) {\n\t\t\t\trange.s.c = targetCol;\n\t\t\t}\n\t\t\tif (range.e.r < targetRow) {\n\t\t\t\trange.e.r = targetRow;\n\t\t\t}\n\t\t\tif (range.e.c < targetCol) {\n\t\t\t\trange.e.c = targetCol;\n\t\t\t}\n\t\t\tseen = true;\n\n\t\t\t// If the value is a plain object (not an array or Date), treat it as a pre-built cell object\n\t\t\tif (\n\t\t\t\trowData[colIdx] &&\n\t\t\t\ttypeof rowData[colIdx] === \"object\" &&\n\t\t\t\t!Array.isArray(rowData[colIdx]) &&\n\t\t\t\t!(rowData[colIdx] instanceof Date)\n\t\t\t) {\n\t\t\t\tcell = rowData[colIdx];\n\t\t\t} else {\n\t\t\t\t// Array values encode [value, formula]\n\t\t\t\tif (Array.isArray(cell.v)) {\n\t\t\t\t\tcell.f = rowData[colIdx][1];\n\t\t\t\t\tcell.v = cell.v[0];\n\t\t\t\t}\n\t\t\t\tif (cell.v === null) {\n\t\t\t\t\tif (cell.f) {\n\t\t\t\t\t\tcell.t = \"n\";\n\t\t\t\t\t} else if (options.nullError) {\n\t\t\t\t\t\tcell.t = \"e\";\n\t\t\t\t\t\tcell.v = 0;\n\t\t\t\t\t} else if (!options.sheetStubs) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcell.t = \"z\";\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof cell.v === \"number\") {\n\t\t\t\t\tif (isFinite(cell.v)) {\n\t\t\t\t\t\tcell.t = \"n\";\n\t\t\t\t\t} else if (isNaN(cell.v)) {\n\t\t\t\t\t\tcell.t = \"e\";\n\t\t\t\t\t\tcell.v = 0x0f; // #VALUE! error code\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcell.t = \"e\";\n\t\t\t\t\t\tcell.v = 0x07; // #DIV/0! error code\n\t\t\t\t\t}\n\t\t\t\t} else if (typeof cell.v === \"boolean\") {\n\t\t\t\t\tcell.t = \"b\";\n\t\t\t\t} else if (cell.v instanceof Date) {\n\t\t\t\t\tcell.z = options.dateNF || formatTable[14]; // default short date format\n\t\t\t\t\tif (!options.UTC) {\n\t\t\t\t\t\tcell.v = localToUtc(cell.v);\n\t\t\t\t\t}\n\t\t\t\t\tif (options.cellDates) {\n\t\t\t\t\t\tcell.t = \"d\";\n\t\t\t\t\t\tcell.w = formatNumber(cell.z, dateToSerialNumber(cell.v, options.date1904));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Store dates as serial numbers by default\n\t\t\t\t\t\tcell.t = \"n\";\n\t\t\t\t\t\tcell.v = dateToSerialNumber(cell.v, options.date1904);\n\t\t\t\t\t\tcell.w = formatNumber(cell.z, cell.v);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcell.t = \"s\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Preserve any existing number format from a prior cell at this position\n\t\t\tconst existingCell = getCell(ws, targetRow, targetCol);\n\t\t\tif (existingCell?.z && !cell.z) {\n\t\t\t\tcell.z = existingCell.z;\n\t\t\t}\n\t\t\tsetCell(ws, targetRow, targetCol, cell);\n\t\t}\n\t}\n\t// Only write the ref if we actually saw data (sentinel check: 10000000 > max valid column)\n\tif (seen && range.s.c < 10400000) {\n\t\tws[\"!ref\"] = encodeRange(range);\n\t}\n\treturn ws;\n}\n\n/**\n * Create a new worksheet from an array-of-arrays.\n *\n * This is a convenience wrapper around `addArrayToSheet` that always creates\n * a fresh worksheet.\n *\n * @param data - The array-of-arrays containing raw cell values\n * @param opts - Optional settings (same as `addArrayToSheet`)\n * @returns A new worksheet populated with the given data\n */\nexport function arrayToSheet(data: any[][], opts?: AOA2SheetOpts): WorkSheet {\n\treturn addArrayToSheet(null, data, opts);\n}\n\n/**\n * Convert a worksheet to an array-of-arrays.\n *\n * This is a convenience wrapper around `sheetToJson(sheet, { header: 1 })`\n * that mirrors `arrayToSheet` for callers that prefer explicit conversion\n * pairs.\n *\n * @param sheet - The worksheet to convert\n * @param opts - Optional conversion settings, except `header` which is fixed to array output\n * @returns A two-dimensional array of worksheet values\n */\nexport function sheetToArray<T = unknown>(sheet: WorkSheet, opts?: Omit<Sheet2JSONOpts, \"header\">): T[][] {\n\treturn sheetToJson<T[]>(sheet, { ...opts, header: 1 });\n}\n","import type { WorkSheet, Sheet2CSVOpts, Range, CSV2SheetOpts } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { encodeCol, safeDecodeRange, getCell } from \"../utils/cell.js\";\nimport { clampLargeExportRange } from \"../utils/export-range.js\";\nimport { formatCellForOutput, getCellDateTimeFormatKind } from \"./format.js\";\nimport { arrayToSheet } from \"./aoa.js\";\nimport {\n\tDEFAULT_MAX_EXPORT_CELLS,\n\tDEFAULT_MAX_IMPORT_CELLS,\n\tWorksheetCellBudget,\n\tworksheetOptionLimit,\n\tXLSX_MAX_COLUMNS,\n\tXLSX_MAX_ROWS,\n} from \"../utils/worksheet-budget.js\";\n\n/** Regex to match double-quote characters for CSV escaping (doubled inside quoted fields) */\nconst qreg = /\"/g;\n\nfunction containsSeparatorCharacter(text: string, separator: string): boolean {\n\treturn separator.length > 0 && text.includes(separator.charAt(0));\n}\n\nfunction quoteCsvField(text: string, fieldSeparator: string, recordSeparator: string, forceQuotes?: boolean): string {\n\tif (\n\t\tforceQuotes ||\n\t\ttext.includes('\"') ||\n\t\ttext.includes(\"\\r\") ||\n\t\ttext.includes(\"\\n\") ||\n\t\tcontainsSeparatorCharacter(text, fieldSeparator) ||\n\t\tcontainsSeparatorCharacter(text, recordSeparator)\n\t) {\n\t\treturn '\"' + text.replace(qreg, '\"\"') + '\"';\n\t}\n\treturn text;\n}\n\nfunction escapeFormulaText(txt: string, options: any): string {\n\tif (options.escapeFormulae === false || txt.length === 0) {\n\t\treturn txt;\n\t}\n\tswitch (txt.charCodeAt(0)) {\n\t\tcase 0x09:\n\t\tcase 0x0d:\n\t\tcase 0x2b:\n\t\tcase 0x2d:\n\t\tcase 0x3d:\n\t\tcase 0x40:\n\t\t\treturn \"'\" + txt;\n\t\tdefault:\n\t\t\treturn txt;\n\t}\n}\n\n/**\n * Build a single CSV row string from a worksheet row.\n *\n * Handles value quoting (when field/record separators, newlines, or double\n * quotes appear in the text), the special \"ID\" SYLK-avoidance quoting,\n * formula-only cells, and the `strip`/`blankrows` options.\n *\n * @returns The joined CSV row string, or `null` if the row is blank and blankrows is disabled\n */\nfunction buildCsvRow(\n\tsheet: WorkSheet,\n\trange: Range,\n\trowIndex: number,\n\tcols: string[],\n\tfieldSeparator: string,\n\trecordSeparator: string,\n\trowCount: number,\n\toptions: any,\n): string | null {\n\tlet isempty = true;\n\tconst row: string[] = [];\n\n\tfor (let colIdx = range.s.c; colIdx <= range.e.c; ++colIdx) {\n\t\t// Skip hidden columns (cols[colIdx] is undefined for hidden ones)\n\t\tif (!cols[colIdx]) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst val = getCell(sheet, rowIndex, colIdx);\n\t\tlet txt = \"\";\n\t\tif (val == null) {\n\t\t\ttxt = \"\";\n\t\t} else if (val.v != null) {\n\t\t\tisempty = false;\n\t\t\tconst fmtKind = getCellDateTimeFormatKind(val, options);\n\t\t\tconst useDateOutput =\n\t\t\t\toptions.dateOutput === \"iso\" && (val.t === \"d\" || fmtKind === \"date\" || fmtKind === \"datetime\");\n\t\t\ttxt =\n\t\t\t\t\"\" +\n\t\t\t\t(options.rawNumbers && val.t === \"n\" && !useDateOutput\n\t\t\t\t\t? val.v\n\t\t\t\t\t: formatCellForOutput(val, null, options));\n\t\t\ttxt = escapeFormulaText(txt, options);\n\t\t\ttxt = quoteCsvField(txt, fieldSeparator, recordSeparator, options.forceQuotes);\n\t\t\t// Quote bare \"ID\" in the first cell to avoid misdetection as a SYLK file\n\t\t\tif (txt === \"ID\" && rowCount === 0 && row.length === 0) {\n\t\t\t\ttxt = '\"ID\"';\n\t\t\t}\n\t\t} else if (val.f != null && !val.F) {\n\t\t\t// Cell has a formula but no cached value and is not part of an array formula\n\t\t\tisempty = false;\n\t\t\ttxt = \"=\" + val.f;\n\t\t\ttxt = escapeFormulaText(txt, options);\n\t\t\ttxt = quoteCsvField(txt, fieldSeparator, recordSeparator, options.forceQuotes);\n\t\t} else {\n\t\t\ttxt = \"\";\n\t\t}\n\t\trow.push(txt);\n\t}\n\t// Strip trailing empty cells from the row if requested\n\tif (options.strip) {\n\t\twhile (row.at(-1) === \"\") {\n\t\t\t--row.length;\n\t\t}\n\t}\n\tif (options.blankrows === false && isempty) {\n\t\treturn null;\n\t}\n\treturn row.join(fieldSeparator);\n}\n\n/**\n * Convert a worksheet to a CSV string.\n *\n * Supports customizable field and record separators, hidden row/column\n * skipping, blank-row suppression, raw number output, and forced quoting.\n *\n * @param sheet - The worksheet to convert\n * @param opts - Optional CSV generation options (FS, RS, skipHidden, strip, blankrows, rawNumbers, forceQuotes)\n * @returns The CSV string representation of the worksheet\n */\nexport function sheetToCsv(sheet: WorkSheet, opts?: Sheet2CSVOpts): string {\n\tconst out: string[] = [];\n\tconst options: any = opts == null ? {} : opts;\n\tif (sheet == null || sheet[\"!ref\"] == null) {\n\t\treturn \"\";\n\t}\n\tconst budget = new WorksheetCellBudget(options.maxWorksheetCells, DEFAULT_MAX_EXPORT_CELLS);\n\tconst range = clampLargeExportRange(sheet, safeDecodeRange(sheet[\"!ref\"]), budget);\n\tif (!range) {\n\t\treturn \"\";\n\t}\n\tconst fieldSeparator = options.FS !== undefined ? options.FS : \",\";\n\tconst recordSeparator = options.RS !== undefined ? options.RS : \"\\n\";\n\n\t// Build column-letter lookup, skipping hidden columns when skipHidden is set\n\tconst cols: string[] = [];\n\tconst colinfo: any[] = (options.skipHidden && sheet[\"!cols\"]) || [];\n\tconst rowinfo: any[] = (options.skipHidden && sheet[\"!rows\"]) || [];\n\n\tfor (let colIdx = range.s.c; colIdx <= range.e.c; ++colIdx) {\n\t\tif (!(colinfo[colIdx] || {}).hidden) {\n\t\t\tcols[colIdx] = encodeCol(colIdx);\n\t\t}\n\t}\n\n\tlet rowCount = 0;\n\tfor (let rowIdx = range.s.r; rowIdx <= range.e.r; ++rowIdx) {\n\t\tif ((rowinfo[rowIdx] || {}).hidden) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst row = buildCsvRow(sheet, range, rowIdx, cols, fieldSeparator, recordSeparator, rowCount, options);\n\t\tif (row == null) {\n\t\t\tcontinue;\n\t\t}\n\t\t// Prepend the record separator for all rows after the first\n\t\tif (row || options.blankrows !== false) {\n\t\t\tout.push((rowCount++ ? recordSeparator : \"\") + row);\n\t\t}\n\t}\n\treturn out.join(\"\");\n}\n\n/**\n * Convert a worksheet to a tab-separated values (TSV) string.\n *\n * This is a convenience wrapper around `sheetToCsv` with tab as the field\n * separator and newline as the record separator.\n *\n * @param sheet - The worksheet to convert\n * @param opts - Optional CSV/TSV generation options (same as `sheetToCsv`)\n * @returns The TSV string representation of the worksheet\n */\nexport function sheetToTxt(sheet: WorkSheet, opts?: Sheet2CSVOpts): string {\n\tconst options: any = opts || {};\n\toptions.FS = \"\\t\";\n\toptions.RS = \"\\n\";\n\treturn sheetToCsv(sheet, options);\n}\n\n/**\n * Parse an RFC 4180 CSV string into a 2D array of values.\n *\n * Handles quoted fields, escaped double-quotes, and newlines within quotes.\n */\nfunction parseCsv(text: string, sep: string, opts: CSV2SheetOpts): any[][] {\n\tconst rows: any[][] = [];\n\tlet row: any[] = [];\n\tlet i = 0;\n\tconst len = text.length;\n\tlet afterSeparator = false;\n\tlet rowActive = false;\n\tlet rowCount = 0;\n\tconst maxRows = worksheetOptionLimit(opts.maxWorksheetRows, XLSX_MAX_ROWS, \"maxWorksheetRows\");\n\tconst sheetRows = worksheetOptionLimit(opts.sheetRows, 0, \"sheetRows\");\n\tconst budget = new WorksheetCellBudget(opts.maxWorksheetCells, DEFAULT_MAX_IMPORT_CELLS);\n\n\tconst beginRow = (): void => {\n\t\tif (rowActive) {\n\t\t\treturn;\n\t\t}\n\t\t++rowCount;\n\t\tif (rowCount > XLSX_MAX_ROWS) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", `CSV data exceeds XLSX row limit ${XLSX_MAX_ROWS}`);\n\t\t}\n\t\tif (rowCount > maxRows) {\n\t\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", `worksheet row count ${rowCount} exceeds limit ${maxRows}`);\n\t\t}\n\t\trowActive = true;\n\t};\n\tconst pushField = (value: string): void => {\n\t\tif (row.length >= XLSX_MAX_COLUMNS) {\n\t\t\tthrow new XlsxError(\"MALFORMED\", `CSV row exceeds XLSX column limit ${XLSX_MAX_COLUMNS}`);\n\t\t}\n\t\tbudget.charge(\"worksheet cell\", 1);\n\t\trow.push(value);\n\t};\n\tconst finishRow = (): boolean => {\n\t\tbeginRow();\n\t\tif (row.length === 0) {\n\t\t\tbudget.charge(\"worksheet cell\", 1);\n\t\t}\n\t\trows.push(row);\n\t\trow = [];\n\t\trowActive = false;\n\t\tafterSeparator = false;\n\t\treturn sheetRows > 0 && rows.length >= sheetRows;\n\t};\n\n\twhile (i < len) {\n\t\tbeginRow();\n\t\tif (text[i] === '\"') {\n\t\t\t// Quoted field\n\t\t\tlet val = \"\";\n\t\t\ti++; // skip opening quote\n\t\t\twhile (i < len) {\n\t\t\t\tif (text[i] === '\"') {\n\t\t\t\t\tif (i + 1 < len && text[i + 1] === '\"') {\n\t\t\t\t\t\t// Escaped double-quote\n\t\t\t\t\t\tval += '\"';\n\t\t\t\t\t\ti += 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Closing quote\n\t\t\t\t\t\ti++; // skip closing quote\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tval += text[i];\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpushField(val);\n\t\t\tafterSeparator = false;\n\t\t\t// After closing quote, expect separator, newline, or end\n\t\t\tif (i < len && text[i] === sep) {\n\t\t\t\ti++;\n\t\t\t\tafterSeparator = true;\n\t\t\t} else if (i < len && (text[i] === \"\\r\" || text[i] === \"\\n\")) {\n\t\t\t\tif (text[i] === \"\\r\" && i + 1 < len && text[i + 1] === \"\\n\") {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tif (finishRow()) {\n\t\t\t\t\treturn rows;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (text[i] === sep) {\n\t\t\tpushField(\"\");\n\t\t\ti++;\n\t\t\tafterSeparator = true;\n\t\t} else if (text[i] === \"\\r\" || text[i] === \"\\n\") {\n\t\t\tif (afterSeparator) {\n\t\t\t\tpushField(\"\");\n\t\t\t}\n\t\t\tif (text[i] === \"\\r\" && i + 1 < len && text[i + 1] === \"\\n\") {\n\t\t\t\ti++;\n\t\t\t}\n\t\t\ti++;\n\t\t\tif (finishRow()) {\n\t\t\t\treturn rows;\n\t\t\t}\n\t\t} else {\n\t\t\t// Unquoted field\n\t\t\tlet val = \"\";\n\t\t\twhile (i < len && text[i] !== sep && text[i] !== \"\\r\" && text[i] !== \"\\n\") {\n\t\t\t\tval += text[i];\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tpushField(val);\n\t\t\tafterSeparator = false;\n\t\t\tif (i < len && text[i] === sep) {\n\t\t\t\ti++;\n\t\t\t\tafterSeparator = true;\n\t\t\t} else if (i < len && (text[i] === \"\\r\" || text[i] === \"\\n\")) {\n\t\t\t\tif (text[i] === \"\\r\" && i + 1 < len && text[i + 1] === \"\\n\") {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tif (finishRow()) {\n\t\t\t\t\treturn rows;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (afterSeparator) {\n\t\tpushField(\"\");\n\t}\n\tif (row.length > 0) {\n\t\tfinishRow();\n\t}\n\n\treturn rows;\n}\n\n/** Try to coerce a string value to a number or boolean */\nfunction coerceValue(val: string): string | number | boolean {\n\tif (val === \"\") {\n\t\treturn val;\n\t}\n\tif (val === \"TRUE\" || val === \"true\") {\n\t\treturn true;\n\t}\n\tif (val === \"FALSE\" || val === \"false\") {\n\t\treturn false;\n\t}\n\tconst num = Number(val);\n\tif (val.length > 0 && !isNaN(num) && isFinite(num)) {\n\t\treturn num;\n\t}\n\treturn val;\n}\n\n/**\n * Parse a CSV string into a WorkSheet.\n *\n * @param text - CSV text to parse\n * @param opts - Optional: { FS: field separator (default \",\") }\n * @returns A WorkSheet with the parsed data\n */\nexport function csvToSheet(text: string, opts?: CSV2SheetOpts): WorkSheet {\n\tconst sep = (opts && opts.FS) || \",\";\n\tconst rows = parseCsv(text, sep, opts || {});\n\t// Keep blank records visible in the worksheet by giving them a stub cell.\n\tconst data: any[][] = rows.map((row) => (row.length === 0 ? [null] : row.map((value) => coerceValue(value))));\n\treturn arrayToSheet(data, { sheetStubs: true });\n}\n","/**\n * Generated by `python3 scripts/generate-html-entities.py` from Python's `html.entities.html5`.\n * Source: https://html.spec.whatwg.org/multipage/named-characters.html\n * Do not edit manually.\n */\nexport const HTML_ENTITY_VALUES: Readonly<Record<string, string>> = {\n\tAElig: \"\\u00c6\",\n\tAMP: \"&\",\n\tAacute: \"\\u00c1\",\n\tAbreve: \"\\u0102\",\n\tAcirc: \"\\u00c2\",\n\tAcy: \"\\u0410\",\n\tAfr: \"\\ud835\\udd04\",\n\tAgrave: \"\\u00c0\",\n\tAlpha: \"\\u0391\",\n\tAmacr: \"\\u0100\",\n\tAnd: \"\\u2a53\",\n\tAogon: \"\\u0104\",\n\tAopf: \"\\ud835\\udd38\",\n\tApplyFunction: \"\\u2061\",\n\tAring: \"\\u00c5\",\n\tAscr: \"\\ud835\\udc9c\",\n\tAssign: \"\\u2254\",\n\tAtilde: \"\\u00c3\",\n\tAuml: \"\\u00c4\",\n\tBackslash: \"\\u2216\",\n\tBarv: \"\\u2ae7\",\n\tBarwed: \"\\u2306\",\n\tBcy: \"\\u0411\",\n\tBecause: \"\\u2235\",\n\tBernoullis: \"\\u212c\",\n\tBeta: \"\\u0392\",\n\tBfr: \"\\ud835\\udd05\",\n\tBopf: \"\\ud835\\udd39\",\n\tBreve: \"\\u02d8\",\n\tBscr: \"\\u212c\",\n\tBumpeq: \"\\u224e\",\n\tCHcy: \"\\u0427\",\n\tCOPY: \"\\u00a9\",\n\tCacute: \"\\u0106\",\n\tCap: \"\\u22d2\",\n\tCapitalDifferentialD: \"\\u2145\",\n\tCayleys: \"\\u212d\",\n\tCcaron: \"\\u010c\",\n\tCcedil: \"\\u00c7\",\n\tCcirc: \"\\u0108\",\n\tCconint: \"\\u2230\",\n\tCdot: \"\\u010a\",\n\tCedilla: \"\\u00b8\",\n\tCenterDot: \"\\u00b7\",\n\tCfr: \"\\u212d\",\n\tChi: \"\\u03a7\",\n\tCircleDot: \"\\u2299\",\n\tCircleMinus: \"\\u2296\",\n\tCirclePlus: \"\\u2295\",\n\tCircleTimes: \"\\u2297\",\n\tClockwiseContourIntegral: \"\\u2232\",\n\tCloseCurlyDoubleQuote: \"\\u201d\",\n\tCloseCurlyQuote: \"\\u2019\",\n\tColon: \"\\u2237\",\n\tColone: \"\\u2a74\",\n\tCongruent: \"\\u2261\",\n\tConint: \"\\u222f\",\n\tContourIntegral: \"\\u222e\",\n\tCopf: \"\\u2102\",\n\tCoproduct: \"\\u2210\",\n\tCounterClockwiseContourIntegral: \"\\u2233\",\n\tCross: \"\\u2a2f\",\n\tCscr: \"\\ud835\\udc9e\",\n\tCup: \"\\u22d3\",\n\tCupCap: \"\\u224d\",\n\tDD: \"\\u2145\",\n\tDDotrahd: \"\\u2911\",\n\tDJcy: \"\\u0402\",\n\tDScy: \"\\u0405\",\n\tDZcy: \"\\u040f\",\n\tDagger: \"\\u2021\",\n\tDarr: \"\\u21a1\",\n\tDashv: \"\\u2ae4\",\n\tDcaron: \"\\u010e\",\n\tDcy: \"\\u0414\",\n\tDel: \"\\u2207\",\n\tDelta: \"\\u0394\",\n\tDfr: \"\\ud835\\udd07\",\n\tDiacriticalAcute: \"\\u00b4\",\n\tDiacriticalDot: \"\\u02d9\",\n\tDiacriticalDoubleAcute: \"\\u02dd\",\n\tDiacriticalGrave: \"`\",\n\tDiacriticalTilde: \"\\u02dc\",\n\tDiamond: \"\\u22c4\",\n\tDifferentialD: \"\\u2146\",\n\tDopf: \"\\ud835\\udd3b\",\n\tDot: \"\\u00a8\",\n\tDotDot: \"\\u20dc\",\n\tDotEqual: \"\\u2250\",\n\tDoubleContourIntegral: \"\\u222f\",\n\tDoubleDot: \"\\u00a8\",\n\tDoubleDownArrow: \"\\u21d3\",\n\tDoubleLeftArrow: \"\\u21d0\",\n\tDoubleLeftRightArrow: \"\\u21d4\",\n\tDoubleLeftTee: \"\\u2ae4\",\n\tDoubleLongLeftArrow: \"\\u27f8\",\n\tDoubleLongLeftRightArrow: \"\\u27fa\",\n\tDoubleLongRightArrow: \"\\u27f9\",\n\tDoubleRightArrow: \"\\u21d2\",\n\tDoubleRightTee: \"\\u22a8\",\n\tDoubleUpArrow: \"\\u21d1\",\n\tDoubleUpDownArrow: \"\\u21d5\",\n\tDoubleVerticalBar: \"\\u2225\",\n\tDownArrow: \"\\u2193\",\n\tDownArrowBar: \"\\u2913\",\n\tDownArrowUpArrow: \"\\u21f5\",\n\tDownBreve: \"\\u0311\",\n\tDownLeftRightVector: \"\\u2950\",\n\tDownLeftTeeVector: \"\\u295e\",\n\tDownLeftVector: \"\\u21bd\",\n\tDownLeftVectorBar: \"\\u2956\",\n\tDownRightTeeVector: \"\\u295f\",\n\tDownRightVector: \"\\u21c1\",\n\tDownRightVectorBar: \"\\u2957\",\n\tDownTee: \"\\u22a4\",\n\tDownTeeArrow: \"\\u21a7\",\n\tDownarrow: \"\\u21d3\",\n\tDscr: \"\\ud835\\udc9f\",\n\tDstrok: \"\\u0110\",\n\tENG: \"\\u014a\",\n\tETH: \"\\u00d0\",\n\tEacute: \"\\u00c9\",\n\tEcaron: \"\\u011a\",\n\tEcirc: \"\\u00ca\",\n\tEcy: \"\\u042d\",\n\tEdot: \"\\u0116\",\n\tEfr: \"\\ud835\\udd08\",\n\tEgrave: \"\\u00c8\",\n\tElement: \"\\u2208\",\n\tEmacr: \"\\u0112\",\n\tEmptySmallSquare: \"\\u25fb\",\n\tEmptyVerySmallSquare: \"\\u25ab\",\n\tEogon: \"\\u0118\",\n\tEopf: \"\\ud835\\udd3c\",\n\tEpsilon: \"\\u0395\",\n\tEqual: \"\\u2a75\",\n\tEqualTilde: \"\\u2242\",\n\tEquilibrium: \"\\u21cc\",\n\tEscr: \"\\u2130\",\n\tEsim: \"\\u2a73\",\n\tEta: \"\\u0397\",\n\tEuml: \"\\u00cb\",\n\tExists: \"\\u2203\",\n\tExponentialE: \"\\u2147\",\n\tFcy: \"\\u0424\",\n\tFfr: \"\\ud835\\udd09\",\n\tFilledSmallSquare: \"\\u25fc\",\n\tFilledVerySmallSquare: \"\\u25aa\",\n\tFopf: \"\\ud835\\udd3d\",\n\tForAll: \"\\u2200\",\n\tFouriertrf: \"\\u2131\",\n\tFscr: \"\\u2131\",\n\tGJcy: \"\\u0403\",\n\tGT: \">\",\n\tGamma: \"\\u0393\",\n\tGammad: \"\\u03dc\",\n\tGbreve: \"\\u011e\",\n\tGcedil: \"\\u0122\",\n\tGcirc: \"\\u011c\",\n\tGcy: \"\\u0413\",\n\tGdot: \"\\u0120\",\n\tGfr: \"\\ud835\\udd0a\",\n\tGg: \"\\u22d9\",\n\tGopf: \"\\ud835\\udd3e\",\n\tGreaterEqual: \"\\u2265\",\n\tGreaterEqualLess: \"\\u22db\",\n\tGreaterFullEqual: \"\\u2267\",\n\tGreaterGreater: \"\\u2aa2\",\n\tGreaterLess: \"\\u2277\",\n\tGreaterSlantEqual: \"\\u2a7e\",\n\tGreaterTilde: \"\\u2273\",\n\tGscr: \"\\ud835\\udca2\",\n\tGt: \"\\u226b\",\n\tHARDcy: \"\\u042a\",\n\tHacek: \"\\u02c7\",\n\tHat: \"^\",\n\tHcirc: \"\\u0124\",\n\tHfr: \"\\u210c\",\n\tHilbertSpace: \"\\u210b\",\n\tHopf: \"\\u210d\",\n\tHorizontalLine: \"\\u2500\",\n\tHscr: \"\\u210b\",\n\tHstrok: \"\\u0126\",\n\tHumpDownHump: \"\\u224e\",\n\tHumpEqual: \"\\u224f\",\n\tIEcy: \"\\u0415\",\n\tIJlig: \"\\u0132\",\n\tIOcy: \"\\u0401\",\n\tIacute: \"\\u00cd\",\n\tIcirc: \"\\u00ce\",\n\tIcy: \"\\u0418\",\n\tIdot: \"\\u0130\",\n\tIfr: \"\\u2111\",\n\tIgrave: \"\\u00cc\",\n\tIm: \"\\u2111\",\n\tImacr: \"\\u012a\",\n\tImaginaryI: \"\\u2148\",\n\tImplies: \"\\u21d2\",\n\tInt: \"\\u222c\",\n\tIntegral: \"\\u222b\",\n\tIntersection: \"\\u22c2\",\n\tInvisibleComma: \"\\u2063\",\n\tInvisibleTimes: \"\\u2062\",\n\tIogon: \"\\u012e\",\n\tIopf: \"\\ud835\\udd40\",\n\tIota: \"\\u0399\",\n\tIscr: \"\\u2110\",\n\tItilde: \"\\u0128\",\n\tIukcy: \"\\u0406\",\n\tIuml: \"\\u00cf\",\n\tJcirc: \"\\u0134\",\n\tJcy: \"\\u0419\",\n\tJfr: \"\\ud835\\udd0d\",\n\tJopf: \"\\ud835\\udd41\",\n\tJscr: \"\\ud835\\udca5\",\n\tJsercy: \"\\u0408\",\n\tJukcy: \"\\u0404\",\n\tKHcy: \"\\u0425\",\n\tKJcy: \"\\u040c\",\n\tKappa: \"\\u039a\",\n\tKcedil: \"\\u0136\",\n\tKcy: \"\\u041a\",\n\tKfr: \"\\ud835\\udd0e\",\n\tKopf: \"\\ud835\\udd42\",\n\tKscr: \"\\ud835\\udca6\",\n\tLJcy: \"\\u0409\",\n\tLT: \"<\",\n\tLacute: \"\\u0139\",\n\tLambda: \"\\u039b\",\n\tLang: \"\\u27ea\",\n\tLaplacetrf: \"\\u2112\",\n\tLarr: \"\\u219e\",\n\tLcaron: \"\\u013d\",\n\tLcedil: \"\\u013b\",\n\tLcy: \"\\u041b\",\n\tLeftAngleBracket: \"\\u27e8\",\n\tLeftArrow: \"\\u2190\",\n\tLeftArrowBar: \"\\u21e4\",\n\tLeftArrowRightArrow: \"\\u21c6\",\n\tLeftCeiling: \"\\u2308\",\n\tLeftDoubleBracket: \"\\u27e6\",\n\tLeftDownTeeVector: \"\\u2961\",\n\tLeftDownVector: \"\\u21c3\",\n\tLeftDownVectorBar: \"\\u2959\",\n\tLeftFloor: \"\\u230a\",\n\tLeftRightArrow: \"\\u2194\",\n\tLeftRightVector: \"\\u294e\",\n\tLeftTee: \"\\u22a3\",\n\tLeftTeeArrow: \"\\u21a4\",\n\tLeftTeeVector: \"\\u295a\",\n\tLeftTriangle: \"\\u22b2\",\n\tLeftTriangleBar: \"\\u29cf\",\n\tLeftTriangleEqual: \"\\u22b4\",\n\tLeftUpDownVector: \"\\u2951\",\n\tLeftUpTeeVector: \"\\u2960\",\n\tLeftUpVector: \"\\u21bf\",\n\tLeftUpVectorBar: \"\\u2958\",\n\tLeftVector: \"\\u21bc\",\n\tLeftVectorBar: \"\\u2952\",\n\tLeftarrow: \"\\u21d0\",\n\tLeftrightarrow: \"\\u21d4\",\n\tLessEqualGreater: \"\\u22da\",\n\tLessFullEqual: \"\\u2266\",\n\tLessGreater: \"\\u2276\",\n\tLessLess: \"\\u2aa1\",\n\tLessSlantEqual: \"\\u2a7d\",\n\tLessTilde: \"\\u2272\",\n\tLfr: \"\\ud835\\udd0f\",\n\tLl: \"\\u22d8\",\n\tLleftarrow: \"\\u21da\",\n\tLmidot: \"\\u013f\",\n\tLongLeftArrow: \"\\u27f5\",\n\tLongLeftRightArrow: \"\\u27f7\",\n\tLongRightArrow: \"\\u27f6\",\n\tLongleftarrow: \"\\u27f8\",\n\tLongleftrightarrow: \"\\u27fa\",\n\tLongrightarrow: \"\\u27f9\",\n\tLopf: \"\\ud835\\udd43\",\n\tLowerLeftArrow: \"\\u2199\",\n\tLowerRightArrow: \"\\u2198\",\n\tLscr: \"\\u2112\",\n\tLsh: \"\\u21b0\",\n\tLstrok: \"\\u0141\",\n\tLt: \"\\u226a\",\n\tMap: \"\\u2905\",\n\tMcy: \"\\u041c\",\n\tMediumSpace: \"\\u205f\",\n\tMellintrf: \"\\u2133\",\n\tMfr: \"\\ud835\\udd10\",\n\tMinusPlus: \"\\u2213\",\n\tMopf: \"\\ud835\\udd44\",\n\tMscr: \"\\u2133\",\n\tMu: \"\\u039c\",\n\tNJcy: \"\\u040a\",\n\tNacute: \"\\u0143\",\n\tNcaron: \"\\u0147\",\n\tNcedil: \"\\u0145\",\n\tNcy: \"\\u041d\",\n\tNegativeMediumSpace: \"\\u200b\",\n\tNegativeThickSpace: \"\\u200b\",\n\tNegativeThinSpace: \"\\u200b\",\n\tNegativeVeryThinSpace: \"\\u200b\",\n\tNestedGreaterGreater: \"\\u226b\",\n\tNestedLessLess: \"\\u226a\",\n\tNewLine: \"\\n\",\n\tNfr: \"\\ud835\\udd11\",\n\tNoBreak: \"\\u2060\",\n\tNonBreakingSpace: \"\\u00a0\",\n\tNopf: \"\\u2115\",\n\tNot: \"\\u2aec\",\n\tNotCongruent: \"\\u2262\",\n\tNotCupCap: \"\\u226d\",\n\tNotDoubleVerticalBar: \"\\u2226\",\n\tNotElement: \"\\u2209\",\n\tNotEqual: \"\\u2260\",\n\tNotEqualTilde: \"\\u2242\\u0338\",\n\tNotExists: \"\\u2204\",\n\tNotGreater: \"\\u226f\",\n\tNotGreaterEqual: \"\\u2271\",\n\tNotGreaterFullEqual: \"\\u2267\\u0338\",\n\tNotGreaterGreater: \"\\u226b\\u0338\",\n\tNotGreaterLess: \"\\u2279\",\n\tNotGreaterSlantEqual: \"\\u2a7e\\u0338\",\n\tNotGreaterTilde: \"\\u2275\",\n\tNotHumpDownHump: \"\\u224e\\u0338\",\n\tNotHumpEqual: \"\\u224f\\u0338\",\n\tNotLeftTriangle: \"\\u22ea\",\n\tNotLeftTriangleBar: \"\\u29cf\\u0338\",\n\tNotLeftTriangleEqual: \"\\u22ec\",\n\tNotLess: \"\\u226e\",\n\tNotLessEqual: \"\\u2270\",\n\tNotLessGreater: \"\\u2278\",\n\tNotLessLess: \"\\u226a\\u0338\",\n\tNotLessSlantEqual: \"\\u2a7d\\u0338\",\n\tNotLessTilde: \"\\u2274\",\n\tNotNestedGreaterGreater: \"\\u2aa2\\u0338\",\n\tNotNestedLessLess: \"\\u2aa1\\u0338\",\n\tNotPrecedes: \"\\u2280\",\n\tNotPrecedesEqual: \"\\u2aaf\\u0338\",\n\tNotPrecedesSlantEqual: \"\\u22e0\",\n\tNotReverseElement: \"\\u220c\",\n\tNotRightTriangle: \"\\u22eb\",\n\tNotRightTriangleBar: \"\\u29d0\\u0338\",\n\tNotRightTriangleEqual: \"\\u22ed\",\n\tNotSquareSubset: \"\\u228f\\u0338\",\n\tNotSquareSubsetEqual: \"\\u22e2\",\n\tNotSquareSuperset: \"\\u2290\\u0338\",\n\tNotSquareSupersetEqual: \"\\u22e3\",\n\tNotSubset: \"\\u2282\\u20d2\",\n\tNotSubsetEqual: \"\\u2288\",\n\tNotSucceeds: \"\\u2281\",\n\tNotSucceedsEqual: \"\\u2ab0\\u0338\",\n\tNotSucceedsSlantEqual: \"\\u22e1\",\n\tNotSucceedsTilde: \"\\u227f\\u0338\",\n\tNotSuperset: \"\\u2283\\u20d2\",\n\tNotSupersetEqual: \"\\u2289\",\n\tNotTilde: \"\\u2241\",\n\tNotTildeEqual: \"\\u2244\",\n\tNotTildeFullEqual: \"\\u2247\",\n\tNotTildeTilde: \"\\u2249\",\n\tNotVerticalBar: \"\\u2224\",\n\tNscr: \"\\ud835\\udca9\",\n\tNtilde: \"\\u00d1\",\n\tNu: \"\\u039d\",\n\tOElig: \"\\u0152\",\n\tOacute: \"\\u00d3\",\n\tOcirc: \"\\u00d4\",\n\tOcy: \"\\u041e\",\n\tOdblac: \"\\u0150\",\n\tOfr: \"\\ud835\\udd12\",\n\tOgrave: \"\\u00d2\",\n\tOmacr: \"\\u014c\",\n\tOmega: \"\\u03a9\",\n\tOmicron: \"\\u039f\",\n\tOopf: \"\\ud835\\udd46\",\n\tOpenCurlyDoubleQuote: \"\\u201c\",\n\tOpenCurlyQuote: \"\\u2018\",\n\tOr: \"\\u2a54\",\n\tOscr: \"\\ud835\\udcaa\",\n\tOslash: \"\\u00d8\",\n\tOtilde: \"\\u00d5\",\n\tOtimes: \"\\u2a37\",\n\tOuml: \"\\u00d6\",\n\tOverBar: \"\\u203e\",\n\tOverBrace: \"\\u23de\",\n\tOverBracket: \"\\u23b4\",\n\tOverParenthesis: \"\\u23dc\",\n\tPartialD: \"\\u2202\",\n\tPcy: \"\\u041f\",\n\tPfr: \"\\ud835\\udd13\",\n\tPhi: \"\\u03a6\",\n\tPi: \"\\u03a0\",\n\tPlusMinus: \"\\u00b1\",\n\tPoincareplane: \"\\u210c\",\n\tPopf: \"\\u2119\",\n\tPr: \"\\u2abb\",\n\tPrecedes: \"\\u227a\",\n\tPrecedesEqual: \"\\u2aaf\",\n\tPrecedesSlantEqual: \"\\u227c\",\n\tPrecedesTilde: \"\\u227e\",\n\tPrime: \"\\u2033\",\n\tProduct: \"\\u220f\",\n\tProportion: \"\\u2237\",\n\tProportional: \"\\u221d\",\n\tPscr: \"\\ud835\\udcab\",\n\tPsi: \"\\u03a8\",\n\tQUOT: '\"',\n\tQfr: \"\\ud835\\udd14\",\n\tQopf: \"\\u211a\",\n\tQscr: \"\\ud835\\udcac\",\n\tRBarr: \"\\u2910\",\n\tREG: \"\\u00ae\",\n\tRacute: \"\\u0154\",\n\tRang: \"\\u27eb\",\n\tRarr: \"\\u21a0\",\n\tRarrtl: \"\\u2916\",\n\tRcaron: \"\\u0158\",\n\tRcedil: \"\\u0156\",\n\tRcy: \"\\u0420\",\n\tRe: \"\\u211c\",\n\tReverseElement: \"\\u220b\",\n\tReverseEquilibrium: \"\\u21cb\",\n\tReverseUpEquilibrium: \"\\u296f\",\n\tRfr: \"\\u211c\",\n\tRho: \"\\u03a1\",\n\tRightAngleBracket: \"\\u27e9\",\n\tRightArrow: \"\\u2192\",\n\tRightArrowBar: \"\\u21e5\",\n\tRightArrowLeftArrow: \"\\u21c4\",\n\tRightCeiling: \"\\u2309\",\n\tRightDoubleBracket: \"\\u27e7\",\n\tRightDownTeeVector: \"\\u295d\",\n\tRightDownVector: \"\\u21c2\",\n\tRightDownVectorBar: \"\\u2955\",\n\tRightFloor: \"\\u230b\",\n\tRightTee: \"\\u22a2\",\n\tRightTeeArrow: \"\\u21a6\",\n\tRightTeeVector: \"\\u295b\",\n\tRightTriangle: \"\\u22b3\",\n\tRightTriangleBar: \"\\u29d0\",\n\tRightTriangleEqual: \"\\u22b5\",\n\tRightUpDownVector: \"\\u294f\",\n\tRightUpTeeVector: \"\\u295c\",\n\tRightUpVector: \"\\u21be\",\n\tRightUpVectorBar: \"\\u2954\",\n\tRightVector: \"\\u21c0\",\n\tRightVectorBar: \"\\u2953\",\n\tRightarrow: \"\\u21d2\",\n\tRopf: \"\\u211d\",\n\tRoundImplies: \"\\u2970\",\n\tRrightarrow: \"\\u21db\",\n\tRscr: \"\\u211b\",\n\tRsh: \"\\u21b1\",\n\tRuleDelayed: \"\\u29f4\",\n\tSHCHcy: \"\\u0429\",\n\tSHcy: \"\\u0428\",\n\tSOFTcy: \"\\u042c\",\n\tSacute: \"\\u015a\",\n\tSc: \"\\u2abc\",\n\tScaron: \"\\u0160\",\n\tScedil: \"\\u015e\",\n\tScirc: \"\\u015c\",\n\tScy: \"\\u0421\",\n\tSfr: \"\\ud835\\udd16\",\n\tShortDownArrow: \"\\u2193\",\n\tShortLeftArrow: \"\\u2190\",\n\tShortRightArrow: \"\\u2192\",\n\tShortUpArrow: \"\\u2191\",\n\tSigma: \"\\u03a3\",\n\tSmallCircle: \"\\u2218\",\n\tSopf: \"\\ud835\\udd4a\",\n\tSqrt: \"\\u221a\",\n\tSquare: \"\\u25a1\",\n\tSquareIntersection: \"\\u2293\",\n\tSquareSubset: \"\\u228f\",\n\tSquareSubsetEqual: \"\\u2291\",\n\tSquareSuperset: \"\\u2290\",\n\tSquareSupersetEqual: \"\\u2292\",\n\tSquareUnion: \"\\u2294\",\n\tSscr: \"\\ud835\\udcae\",\n\tStar: \"\\u22c6\",\n\tSub: \"\\u22d0\",\n\tSubset: \"\\u22d0\",\n\tSubsetEqual: \"\\u2286\",\n\tSucceeds: \"\\u227b\",\n\tSucceedsEqual: \"\\u2ab0\",\n\tSucceedsSlantEqual: \"\\u227d\",\n\tSucceedsTilde: \"\\u227f\",\n\tSuchThat: \"\\u220b\",\n\tSum: \"\\u2211\",\n\tSup: \"\\u22d1\",\n\tSuperset: \"\\u2283\",\n\tSupersetEqual: \"\\u2287\",\n\tSupset: \"\\u22d1\",\n\tTHORN: \"\\u00de\",\n\tTRADE: \"\\u2122\",\n\tTSHcy: \"\\u040b\",\n\tTScy: \"\\u0426\",\n\tTab: \"\\t\",\n\tTau: \"\\u03a4\",\n\tTcaron: \"\\u0164\",\n\tTcedil: \"\\u0162\",\n\tTcy: \"\\u0422\",\n\tTfr: \"\\ud835\\udd17\",\n\tTherefore: \"\\u2234\",\n\tTheta: \"\\u0398\",\n\tThickSpace: \"\\u205f\\u200a\",\n\tThinSpace: \"\\u2009\",\n\tTilde: \"\\u223c\",\n\tTildeEqual: \"\\u2243\",\n\tTildeFullEqual: \"\\u2245\",\n\tTildeTilde: \"\\u2248\",\n\tTopf: \"\\ud835\\udd4b\",\n\tTripleDot: \"\\u20db\",\n\tTscr: \"\\ud835\\udcaf\",\n\tTstrok: \"\\u0166\",\n\tUacute: \"\\u00da\",\n\tUarr: \"\\u219f\",\n\tUarrocir: \"\\u2949\",\n\tUbrcy: \"\\u040e\",\n\tUbreve: \"\\u016c\",\n\tUcirc: \"\\u00db\",\n\tUcy: \"\\u0423\",\n\tUdblac: \"\\u0170\",\n\tUfr: \"\\ud835\\udd18\",\n\tUgrave: \"\\u00d9\",\n\tUmacr: \"\\u016a\",\n\tUnderBar: \"_\",\n\tUnderBrace: \"\\u23df\",\n\tUnderBracket: \"\\u23b5\",\n\tUnderParenthesis: \"\\u23dd\",\n\tUnion: \"\\u22c3\",\n\tUnionPlus: \"\\u228e\",\n\tUogon: \"\\u0172\",\n\tUopf: \"\\ud835\\udd4c\",\n\tUpArrow: \"\\u2191\",\n\tUpArrowBar: \"\\u2912\",\n\tUpArrowDownArrow: \"\\u21c5\",\n\tUpDownArrow: \"\\u2195\",\n\tUpEquilibrium: \"\\u296e\",\n\tUpTee: \"\\u22a5\",\n\tUpTeeArrow: \"\\u21a5\",\n\tUparrow: \"\\u21d1\",\n\tUpdownarrow: \"\\u21d5\",\n\tUpperLeftArrow: \"\\u2196\",\n\tUpperRightArrow: \"\\u2197\",\n\tUpsi: \"\\u03d2\",\n\tUpsilon: \"\\u03a5\",\n\tUring: \"\\u016e\",\n\tUscr: \"\\ud835\\udcb0\",\n\tUtilde: \"\\u0168\",\n\tUuml: \"\\u00dc\",\n\tVDash: \"\\u22ab\",\n\tVbar: \"\\u2aeb\",\n\tVcy: \"\\u0412\",\n\tVdash: \"\\u22a9\",\n\tVdashl: \"\\u2ae6\",\n\tVee: \"\\u22c1\",\n\tVerbar: \"\\u2016\",\n\tVert: \"\\u2016\",\n\tVerticalBar: \"\\u2223\",\n\tVerticalLine: \"|\",\n\tVerticalSeparator: \"\\u2758\",\n\tVerticalTilde: \"\\u2240\",\n\tVeryThinSpace: \"\\u200a\",\n\tVfr: \"\\ud835\\udd19\",\n\tVopf: \"\\ud835\\udd4d\",\n\tVscr: \"\\ud835\\udcb1\",\n\tVvdash: \"\\u22aa\",\n\tWcirc: \"\\u0174\",\n\tWedge: \"\\u22c0\",\n\tWfr: \"\\ud835\\udd1a\",\n\tWopf: \"\\ud835\\udd4e\",\n\tWscr: \"\\ud835\\udcb2\",\n\tXfr: \"\\ud835\\udd1b\",\n\tXi: \"\\u039e\",\n\tXopf: \"\\ud835\\udd4f\",\n\tXscr: \"\\ud835\\udcb3\",\n\tYAcy: \"\\u042f\",\n\tYIcy: \"\\u0407\",\n\tYUcy: \"\\u042e\",\n\tYacute: \"\\u00dd\",\n\tYcirc: \"\\u0176\",\n\tYcy: \"\\u042b\",\n\tYfr: \"\\ud835\\udd1c\",\n\tYopf: \"\\ud835\\udd50\",\n\tYscr: \"\\ud835\\udcb4\",\n\tYuml: \"\\u0178\",\n\tZHcy: \"\\u0416\",\n\tZacute: \"\\u0179\",\n\tZcaron: \"\\u017d\",\n\tZcy: \"\\u0417\",\n\tZdot: \"\\u017b\",\n\tZeroWidthSpace: \"\\u200b\",\n\tZeta: \"\\u0396\",\n\tZfr: \"\\u2128\",\n\tZopf: \"\\u2124\",\n\tZscr: \"\\ud835\\udcb5\",\n\taacute: \"\\u00e1\",\n\tabreve: \"\\u0103\",\n\tac: \"\\u223e\",\n\tacE: \"\\u223e\\u0333\",\n\tacd: \"\\u223f\",\n\tacirc: \"\\u00e2\",\n\tacute: \"\\u00b4\",\n\tacy: \"\\u0430\",\n\taelig: \"\\u00e6\",\n\taf: \"\\u2061\",\n\tafr: \"\\ud835\\udd1e\",\n\tagrave: \"\\u00e0\",\n\talefsym: \"\\u2135\",\n\taleph: \"\\u2135\",\n\talpha: \"\\u03b1\",\n\tamacr: \"\\u0101\",\n\tamalg: \"\\u2a3f\",\n\tamp: \"&\",\n\tand: \"\\u2227\",\n\tandand: \"\\u2a55\",\n\tandd: \"\\u2a5c\",\n\tandslope: \"\\u2a58\",\n\tandv: \"\\u2a5a\",\n\tang: \"\\u2220\",\n\tange: \"\\u29a4\",\n\tangle: \"\\u2220\",\n\tangmsd: \"\\u2221\",\n\tangmsdaa: \"\\u29a8\",\n\tangmsdab: \"\\u29a9\",\n\tangmsdac: \"\\u29aa\",\n\tangmsdad: \"\\u29ab\",\n\tangmsdae: \"\\u29ac\",\n\tangmsdaf: \"\\u29ad\",\n\tangmsdag: \"\\u29ae\",\n\tangmsdah: \"\\u29af\",\n\tangrt: \"\\u221f\",\n\tangrtvb: \"\\u22be\",\n\tangrtvbd: \"\\u299d\",\n\tangsph: \"\\u2222\",\n\tangst: \"\\u00c5\",\n\tangzarr: \"\\u237c\",\n\taogon: \"\\u0105\",\n\taopf: \"\\ud835\\udd52\",\n\tap: \"\\u2248\",\n\tapE: \"\\u2a70\",\n\tapacir: \"\\u2a6f\",\n\tape: \"\\u224a\",\n\tapid: \"\\u224b\",\n\tapos: \"'\",\n\tapprox: \"\\u2248\",\n\tapproxeq: \"\\u224a\",\n\taring: \"\\u00e5\",\n\tascr: \"\\ud835\\udcb6\",\n\tast: \"*\",\n\tasymp: \"\\u2248\",\n\tasympeq: \"\\u224d\",\n\tatilde: \"\\u00e3\",\n\tauml: \"\\u00e4\",\n\tawconint: \"\\u2233\",\n\tawint: \"\\u2a11\",\n\tbNot: \"\\u2aed\",\n\tbackcong: \"\\u224c\",\n\tbackepsilon: \"\\u03f6\",\n\tbackprime: \"\\u2035\",\n\tbacksim: \"\\u223d\",\n\tbacksimeq: \"\\u22cd\",\n\tbarvee: \"\\u22bd\",\n\tbarwed: \"\\u2305\",\n\tbarwedge: \"\\u2305\",\n\tbbrk: \"\\u23b5\",\n\tbbrktbrk: \"\\u23b6\",\n\tbcong: \"\\u224c\",\n\tbcy: \"\\u0431\",\n\tbdquo: \"\\u201e\",\n\tbecaus: \"\\u2235\",\n\tbecause: \"\\u2235\",\n\tbemptyv: \"\\u29b0\",\n\tbepsi: \"\\u03f6\",\n\tbernou: \"\\u212c\",\n\tbeta: \"\\u03b2\",\n\tbeth: \"\\u2136\",\n\tbetween: \"\\u226c\",\n\tbfr: \"\\ud835\\udd1f\",\n\tbigcap: \"\\u22c2\",\n\tbigcirc: \"\\u25ef\",\n\tbigcup: \"\\u22c3\",\n\tbigodot: \"\\u2a00\",\n\tbigoplus: \"\\u2a01\",\n\tbigotimes: \"\\u2a02\",\n\tbigsqcup: \"\\u2a06\",\n\tbigstar: \"\\u2605\",\n\tbigtriangledown: \"\\u25bd\",\n\tbigtriangleup: \"\\u25b3\",\n\tbiguplus: \"\\u2a04\",\n\tbigvee: \"\\u22c1\",\n\tbigwedge: \"\\u22c0\",\n\tbkarow: \"\\u290d\",\n\tblacklozenge: \"\\u29eb\",\n\tblacksquare: \"\\u25aa\",\n\tblacktriangle: \"\\u25b4\",\n\tblacktriangledown: \"\\u25be\",\n\tblacktriangleleft: \"\\u25c2\",\n\tblacktriangleright: \"\\u25b8\",\n\tblank: \"\\u2423\",\n\tblk12: \"\\u2592\",\n\tblk14: \"\\u2591\",\n\tblk34: \"\\u2593\",\n\tblock: \"\\u2588\",\n\tbne: \"=\\u20e5\",\n\tbnequiv: \"\\u2261\\u20e5\",\n\tbnot: \"\\u2310\",\n\tbopf: \"\\ud835\\udd53\",\n\tbot: \"\\u22a5\",\n\tbottom: \"\\u22a5\",\n\tbowtie: \"\\u22c8\",\n\tboxDL: \"\\u2557\",\n\tboxDR: \"\\u2554\",\n\tboxDl: \"\\u2556\",\n\tboxDr: \"\\u2553\",\n\tboxH: \"\\u2550\",\n\tboxHD: \"\\u2566\",\n\tboxHU: \"\\u2569\",\n\tboxHd: \"\\u2564\",\n\tboxHu: \"\\u2567\",\n\tboxUL: \"\\u255d\",\n\tboxUR: \"\\u255a\",\n\tboxUl: \"\\u255c\",\n\tboxUr: \"\\u2559\",\n\tboxV: \"\\u2551\",\n\tboxVH: \"\\u256c\",\n\tboxVL: \"\\u2563\",\n\tboxVR: \"\\u2560\",\n\tboxVh: \"\\u256b\",\n\tboxVl: \"\\u2562\",\n\tboxVr: \"\\u255f\",\n\tboxbox: \"\\u29c9\",\n\tboxdL: \"\\u2555\",\n\tboxdR: \"\\u2552\",\n\tboxdl: \"\\u2510\",\n\tboxdr: \"\\u250c\",\n\tboxh: \"\\u2500\",\n\tboxhD: \"\\u2565\",\n\tboxhU: \"\\u2568\",\n\tboxhd: \"\\u252c\",\n\tboxhu: \"\\u2534\",\n\tboxminus: \"\\u229f\",\n\tboxplus: \"\\u229e\",\n\tboxtimes: \"\\u22a0\",\n\tboxuL: \"\\u255b\",\n\tboxuR: \"\\u2558\",\n\tboxul: \"\\u2518\",\n\tboxur: \"\\u2514\",\n\tboxv: \"\\u2502\",\n\tboxvH: \"\\u256a\",\n\tboxvL: \"\\u2561\",\n\tboxvR: \"\\u255e\",\n\tboxvh: \"\\u253c\",\n\tboxvl: \"\\u2524\",\n\tboxvr: \"\\u251c\",\n\tbprime: \"\\u2035\",\n\tbreve: \"\\u02d8\",\n\tbrvbar: \"\\u00a6\",\n\tbscr: \"\\ud835\\udcb7\",\n\tbsemi: \"\\u204f\",\n\tbsim: \"\\u223d\",\n\tbsime: \"\\u22cd\",\n\tbsol: \"\\\\\",\n\tbsolb: \"\\u29c5\",\n\tbsolhsub: \"\\u27c8\",\n\tbull: \"\\u2022\",\n\tbullet: \"\\u2022\",\n\tbump: \"\\u224e\",\n\tbumpE: \"\\u2aae\",\n\tbumpe: \"\\u224f\",\n\tbumpeq: \"\\u224f\",\n\tcacute: \"\\u0107\",\n\tcap: \"\\u2229\",\n\tcapand: \"\\u2a44\",\n\tcapbrcup: \"\\u2a49\",\n\tcapcap: \"\\u2a4b\",\n\tcapcup: \"\\u2a47\",\n\tcapdot: \"\\u2a40\",\n\tcaps: \"\\u2229\\ufe00\",\n\tcaret: \"\\u2041\",\n\tcaron: \"\\u02c7\",\n\tccaps: \"\\u2a4d\",\n\tccaron: \"\\u010d\",\n\tccedil: \"\\u00e7\",\n\tccirc: \"\\u0109\",\n\tccups: \"\\u2a4c\",\n\tccupssm: \"\\u2a50\",\n\tcdot: \"\\u010b\",\n\tcedil: \"\\u00b8\",\n\tcemptyv: \"\\u29b2\",\n\tcent: \"\\u00a2\",\n\tcenterdot: \"\\u00b7\",\n\tcfr: \"\\ud835\\udd20\",\n\tchcy: \"\\u0447\",\n\tcheck: \"\\u2713\",\n\tcheckmark: \"\\u2713\",\n\tchi: \"\\u03c7\",\n\tcir: \"\\u25cb\",\n\tcirE: \"\\u29c3\",\n\tcirc: \"\\u02c6\",\n\tcirceq: \"\\u2257\",\n\tcirclearrowleft: \"\\u21ba\",\n\tcirclearrowright: \"\\u21bb\",\n\tcircledR: \"\\u00ae\",\n\tcircledS: \"\\u24c8\",\n\tcircledast: \"\\u229b\",\n\tcircledcirc: \"\\u229a\",\n\tcircleddash: \"\\u229d\",\n\tcire: \"\\u2257\",\n\tcirfnint: \"\\u2a10\",\n\tcirmid: \"\\u2aef\",\n\tcirscir: \"\\u29c2\",\n\tclubs: \"\\u2663\",\n\tclubsuit: \"\\u2663\",\n\tcolon: \":\",\n\tcolone: \"\\u2254\",\n\tcoloneq: \"\\u2254\",\n\tcomma: \",\",\n\tcommat: \"@\",\n\tcomp: \"\\u2201\",\n\tcompfn: \"\\u2218\",\n\tcomplement: \"\\u2201\",\n\tcomplexes: \"\\u2102\",\n\tcong: \"\\u2245\",\n\tcongdot: \"\\u2a6d\",\n\tconint: \"\\u222e\",\n\tcopf: \"\\ud835\\udd54\",\n\tcoprod: \"\\u2210\",\n\tcopy: \"\\u00a9\",\n\tcopysr: \"\\u2117\",\n\tcrarr: \"\\u21b5\",\n\tcross: \"\\u2717\",\n\tcscr: \"\\ud835\\udcb8\",\n\tcsub: \"\\u2acf\",\n\tcsube: \"\\u2ad1\",\n\tcsup: \"\\u2ad0\",\n\tcsupe: \"\\u2ad2\",\n\tctdot: \"\\u22ef\",\n\tcudarrl: \"\\u2938\",\n\tcudarrr: \"\\u2935\",\n\tcuepr: \"\\u22de\",\n\tcuesc: \"\\u22df\",\n\tcularr: \"\\u21b6\",\n\tcularrp: \"\\u293d\",\n\tcup: \"\\u222a\",\n\tcupbrcap: \"\\u2a48\",\n\tcupcap: \"\\u2a46\",\n\tcupcup: \"\\u2a4a\",\n\tcupdot: \"\\u228d\",\n\tcupor: \"\\u2a45\",\n\tcups: \"\\u222a\\ufe00\",\n\tcurarr: \"\\u21b7\",\n\tcurarrm: \"\\u293c\",\n\tcurlyeqprec: \"\\u22de\",\n\tcurlyeqsucc: \"\\u22df\",\n\tcurlyvee: \"\\u22ce\",\n\tcurlywedge: \"\\u22cf\",\n\tcurren: \"\\u00a4\",\n\tcurvearrowleft: \"\\u21b6\",\n\tcurvearrowright: \"\\u21b7\",\n\tcuvee: \"\\u22ce\",\n\tcuwed: \"\\u22cf\",\n\tcwconint: \"\\u2232\",\n\tcwint: \"\\u2231\",\n\tcylcty: \"\\u232d\",\n\tdArr: \"\\u21d3\",\n\tdHar: \"\\u2965\",\n\tdagger: \"\\u2020\",\n\tdaleth: \"\\u2138\",\n\tdarr: \"\\u2193\",\n\tdash: \"\\u2010\",\n\tdashv: \"\\u22a3\",\n\tdbkarow: \"\\u290f\",\n\tdblac: \"\\u02dd\",\n\tdcaron: \"\\u010f\",\n\tdcy: \"\\u0434\",\n\tdd: \"\\u2146\",\n\tddagger: \"\\u2021\",\n\tddarr: \"\\u21ca\",\n\tddotseq: \"\\u2a77\",\n\tdeg: \"\\u00b0\",\n\tdelta: \"\\u03b4\",\n\tdemptyv: \"\\u29b1\",\n\tdfisht: \"\\u297f\",\n\tdfr: \"\\ud835\\udd21\",\n\tdharl: \"\\u21c3\",\n\tdharr: \"\\u21c2\",\n\tdiam: \"\\u22c4\",\n\tdiamond: \"\\u22c4\",\n\tdiamondsuit: \"\\u2666\",\n\tdiams: \"\\u2666\",\n\tdie: \"\\u00a8\",\n\tdigamma: \"\\u03dd\",\n\tdisin: \"\\u22f2\",\n\tdiv: \"\\u00f7\",\n\tdivide: \"\\u00f7\",\n\tdivideontimes: \"\\u22c7\",\n\tdivonx: \"\\u22c7\",\n\tdjcy: \"\\u0452\",\n\tdlcorn: \"\\u231e\",\n\tdlcrop: \"\\u230d\",\n\tdollar: \"$\",\n\tdopf: \"\\ud835\\udd55\",\n\tdot: \"\\u02d9\",\n\tdoteq: \"\\u2250\",\n\tdoteqdot: \"\\u2251\",\n\tdotminus: \"\\u2238\",\n\tdotplus: \"\\u2214\",\n\tdotsquare: \"\\u22a1\",\n\tdoublebarwedge: \"\\u2306\",\n\tdownarrow: \"\\u2193\",\n\tdowndownarrows: \"\\u21ca\",\n\tdownharpoonleft: \"\\u21c3\",\n\tdownharpoonright: \"\\u21c2\",\n\tdrbkarow: \"\\u2910\",\n\tdrcorn: \"\\u231f\",\n\tdrcrop: \"\\u230c\",\n\tdscr: \"\\ud835\\udcb9\",\n\tdscy: \"\\u0455\",\n\tdsol: \"\\u29f6\",\n\tdstrok: \"\\u0111\",\n\tdtdot: \"\\u22f1\",\n\tdtri: \"\\u25bf\",\n\tdtrif: \"\\u25be\",\n\tduarr: \"\\u21f5\",\n\tduhar: \"\\u296f\",\n\tdwangle: \"\\u29a6\",\n\tdzcy: \"\\u045f\",\n\tdzigrarr: \"\\u27ff\",\n\teDDot: \"\\u2a77\",\n\teDot: \"\\u2251\",\n\teacute: \"\\u00e9\",\n\teaster: \"\\u2a6e\",\n\tecaron: \"\\u011b\",\n\tecir: \"\\u2256\",\n\tecirc: \"\\u00ea\",\n\tecolon: \"\\u2255\",\n\tecy: \"\\u044d\",\n\tedot: \"\\u0117\",\n\tee: \"\\u2147\",\n\tefDot: \"\\u2252\",\n\tefr: \"\\ud835\\udd22\",\n\teg: \"\\u2a9a\",\n\tegrave: \"\\u00e8\",\n\tegs: \"\\u2a96\",\n\tegsdot: \"\\u2a98\",\n\tel: \"\\u2a99\",\n\telinters: \"\\u23e7\",\n\tell: \"\\u2113\",\n\tels: \"\\u2a95\",\n\telsdot: \"\\u2a97\",\n\temacr: \"\\u0113\",\n\tempty: \"\\u2205\",\n\temptyset: \"\\u2205\",\n\temptyv: \"\\u2205\",\n\temsp13: \"\\u2004\",\n\temsp14: \"\\u2005\",\n\temsp: \"\\u2003\",\n\teng: \"\\u014b\",\n\tensp: \"\\u2002\",\n\teogon: \"\\u0119\",\n\teopf: \"\\ud835\\udd56\",\n\tepar: \"\\u22d5\",\n\teparsl: \"\\u29e3\",\n\teplus: \"\\u2a71\",\n\tepsi: \"\\u03b5\",\n\tepsilon: \"\\u03b5\",\n\tepsiv: \"\\u03f5\",\n\teqcirc: \"\\u2256\",\n\teqcolon: \"\\u2255\",\n\teqsim: \"\\u2242\",\n\teqslantgtr: \"\\u2a96\",\n\teqslantless: \"\\u2a95\",\n\tequals: \"=\",\n\tequest: \"\\u225f\",\n\tequiv: \"\\u2261\",\n\tequivDD: \"\\u2a78\",\n\teqvparsl: \"\\u29e5\",\n\terDot: \"\\u2253\",\n\terarr: \"\\u2971\",\n\tescr: \"\\u212f\",\n\tesdot: \"\\u2250\",\n\tesim: \"\\u2242\",\n\teta: \"\\u03b7\",\n\teth: \"\\u00f0\",\n\teuml: \"\\u00eb\",\n\teuro: \"\\u20ac\",\n\texcl: \"!\",\n\texist: \"\\u2203\",\n\texpectation: \"\\u2130\",\n\texponentiale: \"\\u2147\",\n\tfallingdotseq: \"\\u2252\",\n\tfcy: \"\\u0444\",\n\tfemale: \"\\u2640\",\n\tffilig: \"\\ufb03\",\n\tfflig: \"\\ufb00\",\n\tffllig: \"\\ufb04\",\n\tffr: \"\\ud835\\udd23\",\n\tfilig: \"\\ufb01\",\n\tfjlig: \"fj\",\n\tflat: \"\\u266d\",\n\tfllig: \"\\ufb02\",\n\tfltns: \"\\u25b1\",\n\tfnof: \"\\u0192\",\n\tfopf: \"\\ud835\\udd57\",\n\tforall: \"\\u2200\",\n\tfork: \"\\u22d4\",\n\tforkv: \"\\u2ad9\",\n\tfpartint: \"\\u2a0d\",\n\tfrac12: \"\\u00bd\",\n\tfrac13: \"\\u2153\",\n\tfrac14: \"\\u00bc\",\n\tfrac15: \"\\u2155\",\n\tfrac16: \"\\u2159\",\n\tfrac18: \"\\u215b\",\n\tfrac23: \"\\u2154\",\n\tfrac25: \"\\u2156\",\n\tfrac34: \"\\u00be\",\n\tfrac35: \"\\u2157\",\n\tfrac38: \"\\u215c\",\n\tfrac45: \"\\u2158\",\n\tfrac56: \"\\u215a\",\n\tfrac58: \"\\u215d\",\n\tfrac78: \"\\u215e\",\n\tfrasl: \"\\u2044\",\n\tfrown: \"\\u2322\",\n\tfscr: \"\\ud835\\udcbb\",\n\tgE: \"\\u2267\",\n\tgEl: \"\\u2a8c\",\n\tgacute: \"\\u01f5\",\n\tgamma: \"\\u03b3\",\n\tgammad: \"\\u03dd\",\n\tgap: \"\\u2a86\",\n\tgbreve: \"\\u011f\",\n\tgcirc: \"\\u011d\",\n\tgcy: \"\\u0433\",\n\tgdot: \"\\u0121\",\n\tge: \"\\u2265\",\n\tgel: \"\\u22db\",\n\tgeq: \"\\u2265\",\n\tgeqq: \"\\u2267\",\n\tgeqslant: \"\\u2a7e\",\n\tges: \"\\u2a7e\",\n\tgescc: \"\\u2aa9\",\n\tgesdot: \"\\u2a80\",\n\tgesdoto: \"\\u2a82\",\n\tgesdotol: \"\\u2a84\",\n\tgesl: \"\\u22db\\ufe00\",\n\tgesles: \"\\u2a94\",\n\tgfr: \"\\ud835\\udd24\",\n\tgg: \"\\u226b\",\n\tggg: \"\\u22d9\",\n\tgimel: \"\\u2137\",\n\tgjcy: \"\\u0453\",\n\tgl: \"\\u2277\",\n\tglE: \"\\u2a92\",\n\tgla: \"\\u2aa5\",\n\tglj: \"\\u2aa4\",\n\tgnE: \"\\u2269\",\n\tgnap: \"\\u2a8a\",\n\tgnapprox: \"\\u2a8a\",\n\tgne: \"\\u2a88\",\n\tgneq: \"\\u2a88\",\n\tgneqq: \"\\u2269\",\n\tgnsim: \"\\u22e7\",\n\tgopf: \"\\ud835\\udd58\",\n\tgrave: \"`\",\n\tgscr: \"\\u210a\",\n\tgsim: \"\\u2273\",\n\tgsime: \"\\u2a8e\",\n\tgsiml: \"\\u2a90\",\n\tgt: \">\",\n\tgtcc: \"\\u2aa7\",\n\tgtcir: \"\\u2a7a\",\n\tgtdot: \"\\u22d7\",\n\tgtlPar: \"\\u2995\",\n\tgtquest: \"\\u2a7c\",\n\tgtrapprox: \"\\u2a86\",\n\tgtrarr: \"\\u2978\",\n\tgtrdot: \"\\u22d7\",\n\tgtreqless: \"\\u22db\",\n\tgtreqqless: \"\\u2a8c\",\n\tgtrless: \"\\u2277\",\n\tgtrsim: \"\\u2273\",\n\tgvertneqq: \"\\u2269\\ufe00\",\n\tgvnE: \"\\u2269\\ufe00\",\n\thArr: \"\\u21d4\",\n\thairsp: \"\\u200a\",\n\thalf: \"\\u00bd\",\n\thamilt: \"\\u210b\",\n\thardcy: \"\\u044a\",\n\tharr: \"\\u2194\",\n\tharrcir: \"\\u2948\",\n\tharrw: \"\\u21ad\",\n\thbar: \"\\u210f\",\n\thcirc: \"\\u0125\",\n\thearts: \"\\u2665\",\n\theartsuit: \"\\u2665\",\n\thellip: \"\\u2026\",\n\thercon: \"\\u22b9\",\n\thfr: \"\\ud835\\udd25\",\n\thksearow: \"\\u2925\",\n\thkswarow: \"\\u2926\",\n\thoarr: \"\\u21ff\",\n\thomtht: \"\\u223b\",\n\thookleftarrow: \"\\u21a9\",\n\thookrightarrow: \"\\u21aa\",\n\thopf: \"\\ud835\\udd59\",\n\thorbar: \"\\u2015\",\n\thscr: \"\\ud835\\udcbd\",\n\thslash: \"\\u210f\",\n\thstrok: \"\\u0127\",\n\thybull: \"\\u2043\",\n\thyphen: \"\\u2010\",\n\tiacute: \"\\u00ed\",\n\tic: \"\\u2063\",\n\ticirc: \"\\u00ee\",\n\ticy: \"\\u0438\",\n\tiecy: \"\\u0435\",\n\tiexcl: \"\\u00a1\",\n\tiff: \"\\u21d4\",\n\tifr: \"\\ud835\\udd26\",\n\tigrave: \"\\u00ec\",\n\tii: \"\\u2148\",\n\tiiiint: \"\\u2a0c\",\n\tiiint: \"\\u222d\",\n\tiinfin: \"\\u29dc\",\n\tiiota: \"\\u2129\",\n\tijlig: \"\\u0133\",\n\timacr: \"\\u012b\",\n\timage: \"\\u2111\",\n\timagline: \"\\u2110\",\n\timagpart: \"\\u2111\",\n\timath: \"\\u0131\",\n\timof: \"\\u22b7\",\n\timped: \"\\u01b5\",\n\tin: \"\\u2208\",\n\tincare: \"\\u2105\",\n\tinfin: \"\\u221e\",\n\tinfintie: \"\\u29dd\",\n\tinodot: \"\\u0131\",\n\tint: \"\\u222b\",\n\tintcal: \"\\u22ba\",\n\tintegers: \"\\u2124\",\n\tintercal: \"\\u22ba\",\n\tintlarhk: \"\\u2a17\",\n\tintprod: \"\\u2a3c\",\n\tiocy: \"\\u0451\",\n\tiogon: \"\\u012f\",\n\tiopf: \"\\ud835\\udd5a\",\n\tiota: \"\\u03b9\",\n\tiprod: \"\\u2a3c\",\n\tiquest: \"\\u00bf\",\n\tiscr: \"\\ud835\\udcbe\",\n\tisin: \"\\u2208\",\n\tisinE: \"\\u22f9\",\n\tisindot: \"\\u22f5\",\n\tisins: \"\\u22f4\",\n\tisinsv: \"\\u22f3\",\n\tisinv: \"\\u2208\",\n\tit: \"\\u2062\",\n\titilde: \"\\u0129\",\n\tiukcy: \"\\u0456\",\n\tiuml: \"\\u00ef\",\n\tjcirc: \"\\u0135\",\n\tjcy: \"\\u0439\",\n\tjfr: \"\\ud835\\udd27\",\n\tjmath: \"\\u0237\",\n\tjopf: \"\\ud835\\udd5b\",\n\tjscr: \"\\ud835\\udcbf\",\n\tjsercy: \"\\u0458\",\n\tjukcy: \"\\u0454\",\n\tkappa: \"\\u03ba\",\n\tkappav: \"\\u03f0\",\n\tkcedil: \"\\u0137\",\n\tkcy: \"\\u043a\",\n\tkfr: \"\\ud835\\udd28\",\n\tkgreen: \"\\u0138\",\n\tkhcy: \"\\u0445\",\n\tkjcy: \"\\u045c\",\n\tkopf: \"\\ud835\\udd5c\",\n\tkscr: \"\\ud835\\udcc0\",\n\tlAarr: \"\\u21da\",\n\tlArr: \"\\u21d0\",\n\tlAtail: \"\\u291b\",\n\tlBarr: \"\\u290e\",\n\tlE: \"\\u2266\",\n\tlEg: \"\\u2a8b\",\n\tlHar: \"\\u2962\",\n\tlacute: \"\\u013a\",\n\tlaemptyv: \"\\u29b4\",\n\tlagran: \"\\u2112\",\n\tlambda: \"\\u03bb\",\n\tlang: \"\\u27e8\",\n\tlangd: \"\\u2991\",\n\tlangle: \"\\u27e8\",\n\tlap: \"\\u2a85\",\n\tlaquo: \"\\u00ab\",\n\tlarr: \"\\u2190\",\n\tlarrb: \"\\u21e4\",\n\tlarrbfs: \"\\u291f\",\n\tlarrfs: \"\\u291d\",\n\tlarrhk: \"\\u21a9\",\n\tlarrlp: \"\\u21ab\",\n\tlarrpl: \"\\u2939\",\n\tlarrsim: \"\\u2973\",\n\tlarrtl: \"\\u21a2\",\n\tlat: \"\\u2aab\",\n\tlatail: \"\\u2919\",\n\tlate: \"\\u2aad\",\n\tlates: \"\\u2aad\\ufe00\",\n\tlbarr: \"\\u290c\",\n\tlbbrk: \"\\u2772\",\n\tlbrace: \"{\",\n\tlbrack: \"[\",\n\tlbrke: \"\\u298b\",\n\tlbrksld: \"\\u298f\",\n\tlbrkslu: \"\\u298d\",\n\tlcaron: \"\\u013e\",\n\tlcedil: \"\\u013c\",\n\tlceil: \"\\u2308\",\n\tlcub: \"{\",\n\tlcy: \"\\u043b\",\n\tldca: \"\\u2936\",\n\tldquo: \"\\u201c\",\n\tldquor: \"\\u201e\",\n\tldrdhar: \"\\u2967\",\n\tldrushar: \"\\u294b\",\n\tldsh: \"\\u21b2\",\n\tle: \"\\u2264\",\n\tleftarrow: \"\\u2190\",\n\tleftarrowtail: \"\\u21a2\",\n\tleftharpoondown: \"\\u21bd\",\n\tleftharpoonup: \"\\u21bc\",\n\tleftleftarrows: \"\\u21c7\",\n\tleftrightarrow: \"\\u2194\",\n\tleftrightarrows: \"\\u21c6\",\n\tleftrightharpoons: \"\\u21cb\",\n\tleftrightsquigarrow: \"\\u21ad\",\n\tleftthreetimes: \"\\u22cb\",\n\tleg: \"\\u22da\",\n\tleq: \"\\u2264\",\n\tleqq: \"\\u2266\",\n\tleqslant: \"\\u2a7d\",\n\tles: \"\\u2a7d\",\n\tlescc: \"\\u2aa8\",\n\tlesdot: \"\\u2a7f\",\n\tlesdoto: \"\\u2a81\",\n\tlesdotor: \"\\u2a83\",\n\tlesg: \"\\u22da\\ufe00\",\n\tlesges: \"\\u2a93\",\n\tlessapprox: \"\\u2a85\",\n\tlessdot: \"\\u22d6\",\n\tlesseqgtr: \"\\u22da\",\n\tlesseqqgtr: \"\\u2a8b\",\n\tlessgtr: \"\\u2276\",\n\tlesssim: \"\\u2272\",\n\tlfisht: \"\\u297c\",\n\tlfloor: \"\\u230a\",\n\tlfr: \"\\ud835\\udd29\",\n\tlg: \"\\u2276\",\n\tlgE: \"\\u2a91\",\n\tlhard: \"\\u21bd\",\n\tlharu: \"\\u21bc\",\n\tlharul: \"\\u296a\",\n\tlhblk: \"\\u2584\",\n\tljcy: \"\\u0459\",\n\tll: \"\\u226a\",\n\tllarr: \"\\u21c7\",\n\tllcorner: \"\\u231e\",\n\tllhard: \"\\u296b\",\n\tlltri: \"\\u25fa\",\n\tlmidot: \"\\u0140\",\n\tlmoust: \"\\u23b0\",\n\tlmoustache: \"\\u23b0\",\n\tlnE: \"\\u2268\",\n\tlnap: \"\\u2a89\",\n\tlnapprox: \"\\u2a89\",\n\tlne: \"\\u2a87\",\n\tlneq: \"\\u2a87\",\n\tlneqq: \"\\u2268\",\n\tlnsim: \"\\u22e6\",\n\tloang: \"\\u27ec\",\n\tloarr: \"\\u21fd\",\n\tlobrk: \"\\u27e6\",\n\tlongleftarrow: \"\\u27f5\",\n\tlongleftrightarrow: \"\\u27f7\",\n\tlongmapsto: \"\\u27fc\",\n\tlongrightarrow: \"\\u27f6\",\n\tlooparrowleft: \"\\u21ab\",\n\tlooparrowright: \"\\u21ac\",\n\tlopar: \"\\u2985\",\n\tlopf: \"\\ud835\\udd5d\",\n\tloplus: \"\\u2a2d\",\n\tlotimes: \"\\u2a34\",\n\tlowast: \"\\u2217\",\n\tlowbar: \"_\",\n\tloz: \"\\u25ca\",\n\tlozenge: \"\\u25ca\",\n\tlozf: \"\\u29eb\",\n\tlpar: \"(\",\n\tlparlt: \"\\u2993\",\n\tlrarr: \"\\u21c6\",\n\tlrcorner: \"\\u231f\",\n\tlrhar: \"\\u21cb\",\n\tlrhard: \"\\u296d\",\n\tlrm: \"\\u200e\",\n\tlrtri: \"\\u22bf\",\n\tlsaquo: \"\\u2039\",\n\tlscr: \"\\ud835\\udcc1\",\n\tlsh: \"\\u21b0\",\n\tlsim: \"\\u2272\",\n\tlsime: \"\\u2a8d\",\n\tlsimg: \"\\u2a8f\",\n\tlsqb: \"[\",\n\tlsquo: \"\\u2018\",\n\tlsquor: \"\\u201a\",\n\tlstrok: \"\\u0142\",\n\tlt: \"<\",\n\tltcc: \"\\u2aa6\",\n\tltcir: \"\\u2a79\",\n\tltdot: \"\\u22d6\",\n\tlthree: \"\\u22cb\",\n\tltimes: \"\\u22c9\",\n\tltlarr: \"\\u2976\",\n\tltquest: \"\\u2a7b\",\n\tltrPar: \"\\u2996\",\n\tltri: \"\\u25c3\",\n\tltrie: \"\\u22b4\",\n\tltrif: \"\\u25c2\",\n\tlurdshar: \"\\u294a\",\n\tluruhar: \"\\u2966\",\n\tlvertneqq: \"\\u2268\\ufe00\",\n\tlvnE: \"\\u2268\\ufe00\",\n\tmDDot: \"\\u223a\",\n\tmacr: \"\\u00af\",\n\tmale: \"\\u2642\",\n\tmalt: \"\\u2720\",\n\tmaltese: \"\\u2720\",\n\tmap: \"\\u21a6\",\n\tmapsto: \"\\u21a6\",\n\tmapstodown: \"\\u21a7\",\n\tmapstoleft: \"\\u21a4\",\n\tmapstoup: \"\\u21a5\",\n\tmarker: \"\\u25ae\",\n\tmcomma: \"\\u2a29\",\n\tmcy: \"\\u043c\",\n\tmdash: \"\\u2014\",\n\tmeasuredangle: \"\\u2221\",\n\tmfr: \"\\ud835\\udd2a\",\n\tmho: \"\\u2127\",\n\tmicro: \"\\u00b5\",\n\tmid: \"\\u2223\",\n\tmidast: \"*\",\n\tmidcir: \"\\u2af0\",\n\tmiddot: \"\\u00b7\",\n\tminus: \"\\u2212\",\n\tminusb: \"\\u229f\",\n\tminusd: \"\\u2238\",\n\tminusdu: \"\\u2a2a\",\n\tmlcp: \"\\u2adb\",\n\tmldr: \"\\u2026\",\n\tmnplus: \"\\u2213\",\n\tmodels: \"\\u22a7\",\n\tmopf: \"\\ud835\\udd5e\",\n\tmp: \"\\u2213\",\n\tmscr: \"\\ud835\\udcc2\",\n\tmstpos: \"\\u223e\",\n\tmu: \"\\u03bc\",\n\tmultimap: \"\\u22b8\",\n\tmumap: \"\\u22b8\",\n\tnGg: \"\\u22d9\\u0338\",\n\tnGt: \"\\u226b\\u20d2\",\n\tnGtv: \"\\u226b\\u0338\",\n\tnLeftarrow: \"\\u21cd\",\n\tnLeftrightarrow: \"\\u21ce\",\n\tnLl: \"\\u22d8\\u0338\",\n\tnLt: \"\\u226a\\u20d2\",\n\tnLtv: \"\\u226a\\u0338\",\n\tnRightarrow: \"\\u21cf\",\n\tnVDash: \"\\u22af\",\n\tnVdash: \"\\u22ae\",\n\tnabla: \"\\u2207\",\n\tnacute: \"\\u0144\",\n\tnang: \"\\u2220\\u20d2\",\n\tnap: \"\\u2249\",\n\tnapE: \"\\u2a70\\u0338\",\n\tnapid: \"\\u224b\\u0338\",\n\tnapos: \"\\u0149\",\n\tnapprox: \"\\u2249\",\n\tnatur: \"\\u266e\",\n\tnatural: \"\\u266e\",\n\tnaturals: \"\\u2115\",\n\tnbsp: \"\\u00a0\",\n\tnbump: \"\\u224e\\u0338\",\n\tnbumpe: \"\\u224f\\u0338\",\n\tncap: \"\\u2a43\",\n\tncaron: \"\\u0148\",\n\tncedil: \"\\u0146\",\n\tncong: \"\\u2247\",\n\tncongdot: \"\\u2a6d\\u0338\",\n\tncup: \"\\u2a42\",\n\tncy: \"\\u043d\",\n\tndash: \"\\u2013\",\n\tne: \"\\u2260\",\n\tneArr: \"\\u21d7\",\n\tnearhk: \"\\u2924\",\n\tnearr: \"\\u2197\",\n\tnearrow: \"\\u2197\",\n\tnedot: \"\\u2250\\u0338\",\n\tnequiv: \"\\u2262\",\n\tnesear: \"\\u2928\",\n\tnesim: \"\\u2242\\u0338\",\n\tnexist: \"\\u2204\",\n\tnexists: \"\\u2204\",\n\tnfr: \"\\ud835\\udd2b\",\n\tngE: \"\\u2267\\u0338\",\n\tnge: \"\\u2271\",\n\tngeq: \"\\u2271\",\n\tngeqq: \"\\u2267\\u0338\",\n\tngeqslant: \"\\u2a7e\\u0338\",\n\tnges: \"\\u2a7e\\u0338\",\n\tngsim: \"\\u2275\",\n\tngt: \"\\u226f\",\n\tngtr: \"\\u226f\",\n\tnhArr: \"\\u21ce\",\n\tnharr: \"\\u21ae\",\n\tnhpar: \"\\u2af2\",\n\tni: \"\\u220b\",\n\tnis: \"\\u22fc\",\n\tnisd: \"\\u22fa\",\n\tniv: \"\\u220b\",\n\tnjcy: \"\\u045a\",\n\tnlArr: \"\\u21cd\",\n\tnlE: \"\\u2266\\u0338\",\n\tnlarr: \"\\u219a\",\n\tnldr: \"\\u2025\",\n\tnle: \"\\u2270\",\n\tnleftarrow: \"\\u219a\",\n\tnleftrightarrow: \"\\u21ae\",\n\tnleq: \"\\u2270\",\n\tnleqq: \"\\u2266\\u0338\",\n\tnleqslant: \"\\u2a7d\\u0338\",\n\tnles: \"\\u2a7d\\u0338\",\n\tnless: \"\\u226e\",\n\tnlsim: \"\\u2274\",\n\tnlt: \"\\u226e\",\n\tnltri: \"\\u22ea\",\n\tnltrie: \"\\u22ec\",\n\tnmid: \"\\u2224\",\n\tnopf: \"\\ud835\\udd5f\",\n\tnot: \"\\u00ac\",\n\tnotin: \"\\u2209\",\n\tnotinE: \"\\u22f9\\u0338\",\n\tnotindot: \"\\u22f5\\u0338\",\n\tnotinva: \"\\u2209\",\n\tnotinvb: \"\\u22f7\",\n\tnotinvc: \"\\u22f6\",\n\tnotni: \"\\u220c\",\n\tnotniva: \"\\u220c\",\n\tnotnivb: \"\\u22fe\",\n\tnotnivc: \"\\u22fd\",\n\tnpar: \"\\u2226\",\n\tnparallel: \"\\u2226\",\n\tnparsl: \"\\u2afd\\u20e5\",\n\tnpart: \"\\u2202\\u0338\",\n\tnpolint: \"\\u2a14\",\n\tnpr: \"\\u2280\",\n\tnprcue: \"\\u22e0\",\n\tnpre: \"\\u2aaf\\u0338\",\n\tnprec: \"\\u2280\",\n\tnpreceq: \"\\u2aaf\\u0338\",\n\tnrArr: \"\\u21cf\",\n\tnrarr: \"\\u219b\",\n\tnrarrc: \"\\u2933\\u0338\",\n\tnrarrw: \"\\u219d\\u0338\",\n\tnrightarrow: \"\\u219b\",\n\tnrtri: \"\\u22eb\",\n\tnrtrie: \"\\u22ed\",\n\tnsc: \"\\u2281\",\n\tnsccue: \"\\u22e1\",\n\tnsce: \"\\u2ab0\\u0338\",\n\tnscr: \"\\ud835\\udcc3\",\n\tnshortmid: \"\\u2224\",\n\tnshortparallel: \"\\u2226\",\n\tnsim: \"\\u2241\",\n\tnsime: \"\\u2244\",\n\tnsimeq: \"\\u2244\",\n\tnsmid: \"\\u2224\",\n\tnspar: \"\\u2226\",\n\tnsqsube: \"\\u22e2\",\n\tnsqsupe: \"\\u22e3\",\n\tnsub: \"\\u2284\",\n\tnsubE: \"\\u2ac5\\u0338\",\n\tnsube: \"\\u2288\",\n\tnsubset: \"\\u2282\\u20d2\",\n\tnsubseteq: \"\\u2288\",\n\tnsubseteqq: \"\\u2ac5\\u0338\",\n\tnsucc: \"\\u2281\",\n\tnsucceq: \"\\u2ab0\\u0338\",\n\tnsup: \"\\u2285\",\n\tnsupE: \"\\u2ac6\\u0338\",\n\tnsupe: \"\\u2289\",\n\tnsupset: \"\\u2283\\u20d2\",\n\tnsupseteq: \"\\u2289\",\n\tnsupseteqq: \"\\u2ac6\\u0338\",\n\tntgl: \"\\u2279\",\n\tntilde: \"\\u00f1\",\n\tntlg: \"\\u2278\",\n\tntriangleleft: \"\\u22ea\",\n\tntrianglelefteq: \"\\u22ec\",\n\tntriangleright: \"\\u22eb\",\n\tntrianglerighteq: \"\\u22ed\",\n\tnu: \"\\u03bd\",\n\tnum: \"#\",\n\tnumero: \"\\u2116\",\n\tnumsp: \"\\u2007\",\n\tnvDash: \"\\u22ad\",\n\tnvHarr: \"\\u2904\",\n\tnvap: \"\\u224d\\u20d2\",\n\tnvdash: \"\\u22ac\",\n\tnvge: \"\\u2265\\u20d2\",\n\tnvgt: \">\\u20d2\",\n\tnvinfin: \"\\u29de\",\n\tnvlArr: \"\\u2902\",\n\tnvle: \"\\u2264\\u20d2\",\n\tnvlt: \"<\\u20d2\",\n\tnvltrie: \"\\u22b4\\u20d2\",\n\tnvrArr: \"\\u2903\",\n\tnvrtrie: \"\\u22b5\\u20d2\",\n\tnvsim: \"\\u223c\\u20d2\",\n\tnwArr: \"\\u21d6\",\n\tnwarhk: \"\\u2923\",\n\tnwarr: \"\\u2196\",\n\tnwarrow: \"\\u2196\",\n\tnwnear: \"\\u2927\",\n\toS: \"\\u24c8\",\n\toacute: \"\\u00f3\",\n\toast: \"\\u229b\",\n\tocir: \"\\u229a\",\n\tocirc: \"\\u00f4\",\n\tocy: \"\\u043e\",\n\todash: \"\\u229d\",\n\todblac: \"\\u0151\",\n\todiv: \"\\u2a38\",\n\todot: \"\\u2299\",\n\todsold: \"\\u29bc\",\n\toelig: \"\\u0153\",\n\tofcir: \"\\u29bf\",\n\tofr: \"\\ud835\\udd2c\",\n\togon: \"\\u02db\",\n\tograve: \"\\u00f2\",\n\togt: \"\\u29c1\",\n\tohbar: \"\\u29b5\",\n\tohm: \"\\u03a9\",\n\toint: \"\\u222e\",\n\tolarr: \"\\u21ba\",\n\tolcir: \"\\u29be\",\n\tolcross: \"\\u29bb\",\n\toline: \"\\u203e\",\n\tolt: \"\\u29c0\",\n\tomacr: \"\\u014d\",\n\tomega: \"\\u03c9\",\n\tomicron: \"\\u03bf\",\n\tomid: \"\\u29b6\",\n\tominus: \"\\u2296\",\n\toopf: \"\\ud835\\udd60\",\n\topar: \"\\u29b7\",\n\toperp: \"\\u29b9\",\n\toplus: \"\\u2295\",\n\tor: \"\\u2228\",\n\torarr: \"\\u21bb\",\n\tord: \"\\u2a5d\",\n\torder: \"\\u2134\",\n\torderof: \"\\u2134\",\n\tordf: \"\\u00aa\",\n\tordm: \"\\u00ba\",\n\torigof: \"\\u22b6\",\n\toror: \"\\u2a56\",\n\torslope: \"\\u2a57\",\n\torv: \"\\u2a5b\",\n\toscr: \"\\u2134\",\n\toslash: \"\\u00f8\",\n\tosol: \"\\u2298\",\n\totilde: \"\\u00f5\",\n\totimes: \"\\u2297\",\n\totimesas: \"\\u2a36\",\n\touml: \"\\u00f6\",\n\tovbar: \"\\u233d\",\n\tpar: \"\\u2225\",\n\tpara: \"\\u00b6\",\n\tparallel: \"\\u2225\",\n\tparsim: \"\\u2af3\",\n\tparsl: \"\\u2afd\",\n\tpart: \"\\u2202\",\n\tpcy: \"\\u043f\",\n\tpercnt: \"%\",\n\tperiod: \".\",\n\tpermil: \"\\u2030\",\n\tperp: \"\\u22a5\",\n\tpertenk: \"\\u2031\",\n\tpfr: \"\\ud835\\udd2d\",\n\tphi: \"\\u03c6\",\n\tphiv: \"\\u03d5\",\n\tphmmat: \"\\u2133\",\n\tphone: \"\\u260e\",\n\tpi: \"\\u03c0\",\n\tpitchfork: \"\\u22d4\",\n\tpiv: \"\\u03d6\",\n\tplanck: \"\\u210f\",\n\tplanckh: \"\\u210e\",\n\tplankv: \"\\u210f\",\n\tplus: \"+\",\n\tplusacir: \"\\u2a23\",\n\tplusb: \"\\u229e\",\n\tpluscir: \"\\u2a22\",\n\tplusdo: \"\\u2214\",\n\tplusdu: \"\\u2a25\",\n\tpluse: \"\\u2a72\",\n\tplusmn: \"\\u00b1\",\n\tplussim: \"\\u2a26\",\n\tplustwo: \"\\u2a27\",\n\tpm: \"\\u00b1\",\n\tpointint: \"\\u2a15\",\n\tpopf: \"\\ud835\\udd61\",\n\tpound: \"\\u00a3\",\n\tpr: \"\\u227a\",\n\tprE: \"\\u2ab3\",\n\tprap: \"\\u2ab7\",\n\tprcue: \"\\u227c\",\n\tpre: \"\\u2aaf\",\n\tprec: \"\\u227a\",\n\tprecapprox: \"\\u2ab7\",\n\tpreccurlyeq: \"\\u227c\",\n\tpreceq: \"\\u2aaf\",\n\tprecnapprox: \"\\u2ab9\",\n\tprecneqq: \"\\u2ab5\",\n\tprecnsim: \"\\u22e8\",\n\tprecsim: \"\\u227e\",\n\tprime: \"\\u2032\",\n\tprimes: \"\\u2119\",\n\tprnE: \"\\u2ab5\",\n\tprnap: \"\\u2ab9\",\n\tprnsim: \"\\u22e8\",\n\tprod: \"\\u220f\",\n\tprofalar: \"\\u232e\",\n\tprofline: \"\\u2312\",\n\tprofsurf: \"\\u2313\",\n\tprop: \"\\u221d\",\n\tpropto: \"\\u221d\",\n\tprsim: \"\\u227e\",\n\tprurel: \"\\u22b0\",\n\tpscr: \"\\ud835\\udcc5\",\n\tpsi: \"\\u03c8\",\n\tpuncsp: \"\\u2008\",\n\tqfr: \"\\ud835\\udd2e\",\n\tqint: \"\\u2a0c\",\n\tqopf: \"\\ud835\\udd62\",\n\tqprime: \"\\u2057\",\n\tqscr: \"\\ud835\\udcc6\",\n\tquaternions: \"\\u210d\",\n\tquatint: \"\\u2a16\",\n\tquest: \"?\",\n\tquesteq: \"\\u225f\",\n\tquot: '\"',\n\trAarr: \"\\u21db\",\n\trArr: \"\\u21d2\",\n\trAtail: \"\\u291c\",\n\trBarr: \"\\u290f\",\n\trHar: \"\\u2964\",\n\trace: \"\\u223d\\u0331\",\n\tracute: \"\\u0155\",\n\tradic: \"\\u221a\",\n\traemptyv: \"\\u29b3\",\n\trang: \"\\u27e9\",\n\trangd: \"\\u2992\",\n\trange: \"\\u29a5\",\n\trangle: \"\\u27e9\",\n\traquo: \"\\u00bb\",\n\trarr: \"\\u2192\",\n\trarrap: \"\\u2975\",\n\trarrb: \"\\u21e5\",\n\trarrbfs: \"\\u2920\",\n\trarrc: \"\\u2933\",\n\trarrfs: \"\\u291e\",\n\trarrhk: \"\\u21aa\",\n\trarrlp: \"\\u21ac\",\n\trarrpl: \"\\u2945\",\n\trarrsim: \"\\u2974\",\n\trarrtl: \"\\u21a3\",\n\trarrw: \"\\u219d\",\n\tratail: \"\\u291a\",\n\tratio: \"\\u2236\",\n\trationals: \"\\u211a\",\n\trbarr: \"\\u290d\",\n\trbbrk: \"\\u2773\",\n\trbrace: \"}\",\n\trbrack: \"]\",\n\trbrke: \"\\u298c\",\n\trbrksld: \"\\u298e\",\n\trbrkslu: \"\\u2990\",\n\trcaron: \"\\u0159\",\n\trcedil: \"\\u0157\",\n\trceil: \"\\u2309\",\n\trcub: \"}\",\n\trcy: \"\\u0440\",\n\trdca: \"\\u2937\",\n\trdldhar: \"\\u2969\",\n\trdquo: \"\\u201d\",\n\trdquor: \"\\u201d\",\n\trdsh: \"\\u21b3\",\n\treal: \"\\u211c\",\n\trealine: \"\\u211b\",\n\trealpart: \"\\u211c\",\n\treals: \"\\u211d\",\n\trect: \"\\u25ad\",\n\treg: \"\\u00ae\",\n\trfisht: \"\\u297d\",\n\trfloor: \"\\u230b\",\n\trfr: \"\\ud835\\udd2f\",\n\trhard: \"\\u21c1\",\n\trharu: \"\\u21c0\",\n\trharul: \"\\u296c\",\n\trho: \"\\u03c1\",\n\trhov: \"\\u03f1\",\n\trightarrow: \"\\u2192\",\n\trightarrowtail: \"\\u21a3\",\n\trightharpoondown: \"\\u21c1\",\n\trightharpoonup: \"\\u21c0\",\n\trightleftarrows: \"\\u21c4\",\n\trightleftharpoons: \"\\u21cc\",\n\trightrightarrows: \"\\u21c9\",\n\trightsquigarrow: \"\\u219d\",\n\trightthreetimes: \"\\u22cc\",\n\tring: \"\\u02da\",\n\trisingdotseq: \"\\u2253\",\n\trlarr: \"\\u21c4\",\n\trlhar: \"\\u21cc\",\n\trlm: \"\\u200f\",\n\trmoust: \"\\u23b1\",\n\trmoustache: \"\\u23b1\",\n\trnmid: \"\\u2aee\",\n\troang: \"\\u27ed\",\n\troarr: \"\\u21fe\",\n\trobrk: \"\\u27e7\",\n\tropar: \"\\u2986\",\n\tropf: \"\\ud835\\udd63\",\n\troplus: \"\\u2a2e\",\n\trotimes: \"\\u2a35\",\n\trpar: \")\",\n\trpargt: \"\\u2994\",\n\trppolint: \"\\u2a12\",\n\trrarr: \"\\u21c9\",\n\trsaquo: \"\\u203a\",\n\trscr: \"\\ud835\\udcc7\",\n\trsh: \"\\u21b1\",\n\trsqb: \"]\",\n\trsquo: \"\\u2019\",\n\trsquor: \"\\u2019\",\n\trthree: \"\\u22cc\",\n\trtimes: \"\\u22ca\",\n\trtri: \"\\u25b9\",\n\trtrie: \"\\u22b5\",\n\trtrif: \"\\u25b8\",\n\trtriltri: \"\\u29ce\",\n\truluhar: \"\\u2968\",\n\trx: \"\\u211e\",\n\tsacute: \"\\u015b\",\n\tsbquo: \"\\u201a\",\n\tsc: \"\\u227b\",\n\tscE: \"\\u2ab4\",\n\tscap: \"\\u2ab8\",\n\tscaron: \"\\u0161\",\n\tsccue: \"\\u227d\",\n\tsce: \"\\u2ab0\",\n\tscedil: \"\\u015f\",\n\tscirc: \"\\u015d\",\n\tscnE: \"\\u2ab6\",\n\tscnap: \"\\u2aba\",\n\tscnsim: \"\\u22e9\",\n\tscpolint: \"\\u2a13\",\n\tscsim: \"\\u227f\",\n\tscy: \"\\u0441\",\n\tsdot: \"\\u22c5\",\n\tsdotb: \"\\u22a1\",\n\tsdote: \"\\u2a66\",\n\tseArr: \"\\u21d8\",\n\tsearhk: \"\\u2925\",\n\tsearr: \"\\u2198\",\n\tsearrow: \"\\u2198\",\n\tsect: \"\\u00a7\",\n\tsemi: \";\",\n\tseswar: \"\\u2929\",\n\tsetminus: \"\\u2216\",\n\tsetmn: \"\\u2216\",\n\tsext: \"\\u2736\",\n\tsfr: \"\\ud835\\udd30\",\n\tsfrown: \"\\u2322\",\n\tsharp: \"\\u266f\",\n\tshchcy: \"\\u0449\",\n\tshcy: \"\\u0448\",\n\tshortmid: \"\\u2223\",\n\tshortparallel: \"\\u2225\",\n\tshy: \"\\u00ad\",\n\tsigma: \"\\u03c3\",\n\tsigmaf: \"\\u03c2\",\n\tsigmav: \"\\u03c2\",\n\tsim: \"\\u223c\",\n\tsimdot: \"\\u2a6a\",\n\tsime: \"\\u2243\",\n\tsimeq: \"\\u2243\",\n\tsimg: \"\\u2a9e\",\n\tsimgE: \"\\u2aa0\",\n\tsiml: \"\\u2a9d\",\n\tsimlE: \"\\u2a9f\",\n\tsimne: \"\\u2246\",\n\tsimplus: \"\\u2a24\",\n\tsimrarr: \"\\u2972\",\n\tslarr: \"\\u2190\",\n\tsmallsetminus: \"\\u2216\",\n\tsmashp: \"\\u2a33\",\n\tsmeparsl: \"\\u29e4\",\n\tsmid: \"\\u2223\",\n\tsmile: \"\\u2323\",\n\tsmt: \"\\u2aaa\",\n\tsmte: \"\\u2aac\",\n\tsmtes: \"\\u2aac\\ufe00\",\n\tsoftcy: \"\\u044c\",\n\tsol: \"/\",\n\tsolb: \"\\u29c4\",\n\tsolbar: \"\\u233f\",\n\tsopf: \"\\ud835\\udd64\",\n\tspades: \"\\u2660\",\n\tspadesuit: \"\\u2660\",\n\tspar: \"\\u2225\",\n\tsqcap: \"\\u2293\",\n\tsqcaps: \"\\u2293\\ufe00\",\n\tsqcup: \"\\u2294\",\n\tsqcups: \"\\u2294\\ufe00\",\n\tsqsub: \"\\u228f\",\n\tsqsube: \"\\u2291\",\n\tsqsubset: \"\\u228f\",\n\tsqsubseteq: \"\\u2291\",\n\tsqsup: \"\\u2290\",\n\tsqsupe: \"\\u2292\",\n\tsqsupset: \"\\u2290\",\n\tsqsupseteq: \"\\u2292\",\n\tsqu: \"\\u25a1\",\n\tsquare: \"\\u25a1\",\n\tsquarf: \"\\u25aa\",\n\tsquf: \"\\u25aa\",\n\tsrarr: \"\\u2192\",\n\tsscr: \"\\ud835\\udcc8\",\n\tssetmn: \"\\u2216\",\n\tssmile: \"\\u2323\",\n\tsstarf: \"\\u22c6\",\n\tstar: \"\\u2606\",\n\tstarf: \"\\u2605\",\n\tstraightepsilon: \"\\u03f5\",\n\tstraightphi: \"\\u03d5\",\n\tstrns: \"\\u00af\",\n\tsub: \"\\u2282\",\n\tsubE: \"\\u2ac5\",\n\tsubdot: \"\\u2abd\",\n\tsube: \"\\u2286\",\n\tsubedot: \"\\u2ac3\",\n\tsubmult: \"\\u2ac1\",\n\tsubnE: \"\\u2acb\",\n\tsubne: \"\\u228a\",\n\tsubplus: \"\\u2abf\",\n\tsubrarr: \"\\u2979\",\n\tsubset: \"\\u2282\",\n\tsubseteq: \"\\u2286\",\n\tsubseteqq: \"\\u2ac5\",\n\tsubsetneq: \"\\u228a\",\n\tsubsetneqq: \"\\u2acb\",\n\tsubsim: \"\\u2ac7\",\n\tsubsub: \"\\u2ad5\",\n\tsubsup: \"\\u2ad3\",\n\tsucc: \"\\u227b\",\n\tsuccapprox: \"\\u2ab8\",\n\tsucccurlyeq: \"\\u227d\",\n\tsucceq: \"\\u2ab0\",\n\tsuccnapprox: \"\\u2aba\",\n\tsuccneqq: \"\\u2ab6\",\n\tsuccnsim: \"\\u22e9\",\n\tsuccsim: \"\\u227f\",\n\tsum: \"\\u2211\",\n\tsung: \"\\u266a\",\n\tsup1: \"\\u00b9\",\n\tsup2: \"\\u00b2\",\n\tsup3: \"\\u00b3\",\n\tsup: \"\\u2283\",\n\tsupE: \"\\u2ac6\",\n\tsupdot: \"\\u2abe\",\n\tsupdsub: \"\\u2ad8\",\n\tsupe: \"\\u2287\",\n\tsupedot: \"\\u2ac4\",\n\tsuphsol: \"\\u27c9\",\n\tsuphsub: \"\\u2ad7\",\n\tsuplarr: \"\\u297b\",\n\tsupmult: \"\\u2ac2\",\n\tsupnE: \"\\u2acc\",\n\tsupne: \"\\u228b\",\n\tsupplus: \"\\u2ac0\",\n\tsupset: \"\\u2283\",\n\tsupseteq: \"\\u2287\",\n\tsupseteqq: \"\\u2ac6\",\n\tsupsetneq: \"\\u228b\",\n\tsupsetneqq: \"\\u2acc\",\n\tsupsim: \"\\u2ac8\",\n\tsupsub: \"\\u2ad4\",\n\tsupsup: \"\\u2ad6\",\n\tswArr: \"\\u21d9\",\n\tswarhk: \"\\u2926\",\n\tswarr: \"\\u2199\",\n\tswarrow: \"\\u2199\",\n\tswnwar: \"\\u292a\",\n\tszlig: \"\\u00df\",\n\ttarget: \"\\u2316\",\n\ttau: \"\\u03c4\",\n\ttbrk: \"\\u23b4\",\n\ttcaron: \"\\u0165\",\n\ttcedil: \"\\u0163\",\n\ttcy: \"\\u0442\",\n\ttdot: \"\\u20db\",\n\ttelrec: \"\\u2315\",\n\ttfr: \"\\ud835\\udd31\",\n\tthere4: \"\\u2234\",\n\ttherefore: \"\\u2234\",\n\ttheta: \"\\u03b8\",\n\tthetasym: \"\\u03d1\",\n\tthetav: \"\\u03d1\",\n\tthickapprox: \"\\u2248\",\n\tthicksim: \"\\u223c\",\n\tthinsp: \"\\u2009\",\n\tthkap: \"\\u2248\",\n\tthksim: \"\\u223c\",\n\tthorn: \"\\u00fe\",\n\ttilde: \"\\u02dc\",\n\ttimes: \"\\u00d7\",\n\ttimesb: \"\\u22a0\",\n\ttimesbar: \"\\u2a31\",\n\ttimesd: \"\\u2a30\",\n\ttint: \"\\u222d\",\n\ttoea: \"\\u2928\",\n\ttop: \"\\u22a4\",\n\ttopbot: \"\\u2336\",\n\ttopcir: \"\\u2af1\",\n\ttopf: \"\\ud835\\udd65\",\n\ttopfork: \"\\u2ada\",\n\ttosa: \"\\u2929\",\n\ttprime: \"\\u2034\",\n\ttrade: \"\\u2122\",\n\ttriangle: \"\\u25b5\",\n\ttriangledown: \"\\u25bf\",\n\ttriangleleft: \"\\u25c3\",\n\ttrianglelefteq: \"\\u22b4\",\n\ttriangleq: \"\\u225c\",\n\ttriangleright: \"\\u25b9\",\n\ttrianglerighteq: \"\\u22b5\",\n\ttridot: \"\\u25ec\",\n\ttrie: \"\\u225c\",\n\ttriminus: \"\\u2a3a\",\n\ttriplus: \"\\u2a39\",\n\ttrisb: \"\\u29cd\",\n\ttritime: \"\\u2a3b\",\n\ttrpezium: \"\\u23e2\",\n\ttscr: \"\\ud835\\udcc9\",\n\ttscy: \"\\u0446\",\n\ttshcy: \"\\u045b\",\n\ttstrok: \"\\u0167\",\n\ttwixt: \"\\u226c\",\n\ttwoheadleftarrow: \"\\u219e\",\n\ttwoheadrightarrow: \"\\u21a0\",\n\tuArr: \"\\u21d1\",\n\tuHar: \"\\u2963\",\n\tuacute: \"\\u00fa\",\n\tuarr: \"\\u2191\",\n\tubrcy: \"\\u045e\",\n\tubreve: \"\\u016d\",\n\tucirc: \"\\u00fb\",\n\tucy: \"\\u0443\",\n\tudarr: \"\\u21c5\",\n\tudblac: \"\\u0171\",\n\tudhar: \"\\u296e\",\n\tufisht: \"\\u297e\",\n\tufr: \"\\ud835\\udd32\",\n\tugrave: \"\\u00f9\",\n\tuharl: \"\\u21bf\",\n\tuharr: \"\\u21be\",\n\tuhblk: \"\\u2580\",\n\tulcorn: \"\\u231c\",\n\tulcorner: \"\\u231c\",\n\tulcrop: \"\\u230f\",\n\tultri: \"\\u25f8\",\n\tumacr: \"\\u016b\",\n\tuml: \"\\u00a8\",\n\tuogon: \"\\u0173\",\n\tuopf: \"\\ud835\\udd66\",\n\tuparrow: \"\\u2191\",\n\tupdownarrow: \"\\u2195\",\n\tupharpoonleft: \"\\u21bf\",\n\tupharpoonright: \"\\u21be\",\n\tuplus: \"\\u228e\",\n\tupsi: \"\\u03c5\",\n\tupsih: \"\\u03d2\",\n\tupsilon: \"\\u03c5\",\n\tupuparrows: \"\\u21c8\",\n\turcorn: \"\\u231d\",\n\turcorner: \"\\u231d\",\n\turcrop: \"\\u230e\",\n\turing: \"\\u016f\",\n\turtri: \"\\u25f9\",\n\tuscr: \"\\ud835\\udcca\",\n\tutdot: \"\\u22f0\",\n\tutilde: \"\\u0169\",\n\tutri: \"\\u25b5\",\n\tutrif: \"\\u25b4\",\n\tuuarr: \"\\u21c8\",\n\tuuml: \"\\u00fc\",\n\tuwangle: \"\\u29a7\",\n\tvArr: \"\\u21d5\",\n\tvBar: \"\\u2ae8\",\n\tvBarv: \"\\u2ae9\",\n\tvDash: \"\\u22a8\",\n\tvangrt: \"\\u299c\",\n\tvarepsilon: \"\\u03f5\",\n\tvarkappa: \"\\u03f0\",\n\tvarnothing: \"\\u2205\",\n\tvarphi: \"\\u03d5\",\n\tvarpi: \"\\u03d6\",\n\tvarpropto: \"\\u221d\",\n\tvarr: \"\\u2195\",\n\tvarrho: \"\\u03f1\",\n\tvarsigma: \"\\u03c2\",\n\tvarsubsetneq: \"\\u228a\\ufe00\",\n\tvarsubsetneqq: \"\\u2acb\\ufe00\",\n\tvarsupsetneq: \"\\u228b\\ufe00\",\n\tvarsupsetneqq: \"\\u2acc\\ufe00\",\n\tvartheta: \"\\u03d1\",\n\tvartriangleleft: \"\\u22b2\",\n\tvartriangleright: \"\\u22b3\",\n\tvcy: \"\\u0432\",\n\tvdash: \"\\u22a2\",\n\tvee: \"\\u2228\",\n\tveebar: \"\\u22bb\",\n\tveeeq: \"\\u225a\",\n\tvellip: \"\\u22ee\",\n\tverbar: \"|\",\n\tvert: \"|\",\n\tvfr: \"\\ud835\\udd33\",\n\tvltri: \"\\u22b2\",\n\tvnsub: \"\\u2282\\u20d2\",\n\tvnsup: \"\\u2283\\u20d2\",\n\tvopf: \"\\ud835\\udd67\",\n\tvprop: \"\\u221d\",\n\tvrtri: \"\\u22b3\",\n\tvscr: \"\\ud835\\udccb\",\n\tvsubnE: \"\\u2acb\\ufe00\",\n\tvsubne: \"\\u228a\\ufe00\",\n\tvsupnE: \"\\u2acc\\ufe00\",\n\tvsupne: \"\\u228b\\ufe00\",\n\tvzigzag: \"\\u299a\",\n\twcirc: \"\\u0175\",\n\twedbar: \"\\u2a5f\",\n\twedge: \"\\u2227\",\n\twedgeq: \"\\u2259\",\n\tweierp: \"\\u2118\",\n\twfr: \"\\ud835\\udd34\",\n\twopf: \"\\ud835\\udd68\",\n\twp: \"\\u2118\",\n\twr: \"\\u2240\",\n\twreath: \"\\u2240\",\n\twscr: \"\\ud835\\udccc\",\n\txcap: \"\\u22c2\",\n\txcirc: \"\\u25ef\",\n\txcup: \"\\u22c3\",\n\txdtri: \"\\u25bd\",\n\txfr: \"\\ud835\\udd35\",\n\txhArr: \"\\u27fa\",\n\txharr: \"\\u27f7\",\n\txi: \"\\u03be\",\n\txlArr: \"\\u27f8\",\n\txlarr: \"\\u27f5\",\n\txmap: \"\\u27fc\",\n\txnis: \"\\u22fb\",\n\txodot: \"\\u2a00\",\n\txopf: \"\\ud835\\udd69\",\n\txoplus: \"\\u2a01\",\n\txotime: \"\\u2a02\",\n\txrArr: \"\\u27f9\",\n\txrarr: \"\\u27f6\",\n\txscr: \"\\ud835\\udccd\",\n\txsqcup: \"\\u2a06\",\n\txuplus: \"\\u2a04\",\n\txutri: \"\\u25b3\",\n\txvee: \"\\u22c1\",\n\txwedge: \"\\u22c0\",\n\tyacute: \"\\u00fd\",\n\tyacy: \"\\u044f\",\n\tycirc: \"\\u0177\",\n\tycy: \"\\u044b\",\n\tyen: \"\\u00a5\",\n\tyfr: \"\\ud835\\udd36\",\n\tyicy: \"\\u0457\",\n\tyopf: \"\\ud835\\udd6a\",\n\tyscr: \"\\ud835\\udcce\",\n\tyucy: \"\\u044e\",\n\tyuml: \"\\u00ff\",\n\tzacute: \"\\u017a\",\n\tzcaron: \"\\u017e\",\n\tzcy: \"\\u0437\",\n\tzdot: \"\\u017c\",\n\tzeetrf: \"\\u2128\",\n\tzeta: \"\\u03b6\",\n\tzfr: \"\\ud835\\udd37\",\n\tzhcy: \"\\u0436\",\n\tzigrarr: \"\\u21dd\",\n\tzopf: \"\\ud835\\udd6b\",\n\tzscr: \"\\ud835\\udccf\",\n\tzwj: \"\\u200d\",\n\tzwnj: \"\\u200c\",\n};\n","import type { WorkSheet, Sheet2HTMLOpts, HTML2SheetOpts, Range, CellObject } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { BErr } from \"../types.js\";\nimport { encodeCol, encodeRow, decodeRange, getCell } from \"../utils/cell.js\";\nimport { clampLargeExportRange, rangeCellCount } from \"../utils/export-range.js\";\nimport { escapeHtml } from \"../xml/escape.js\";\nimport { escapeHtmlAttribute, writeHtmlElement } from \"../xml/writer.js\";\nimport { formatCell } from \"./format.js\";\nimport { arrayToSheet } from \"./aoa.js\";\nimport { HTML_ENTITY_VALUES } from \"./html-entities.js\";\nimport {\n\tDEFAULT_MAX_EXPORT_CELLS,\n\tDEFAULT_MAX_IMPORT_CELLS,\n\tWorksheetCellBudget,\n\tworksheetOptionLimit,\n\tXLSX_MAX_COLUMNS,\n\tXLSX_MAX_ROWS,\n} from \"../utils/worksheet-budget.js\";\n\n/** Default HTML document prefix wrapping the table in a minimal page structure */\nconst HTML_BEGIN = '<html><head><meta charset=\"utf-8\"/><title>SheetJS Table Export</title></head><body>';\n/** Default HTML document suffix closing the body and html tags */\nconst HTML_END = \"</body></html>\";\nconst UNSAFE_LINK_TARGET_RE = /^(?:javascript|vbscript|data):/;\n\nfunction isIgnorableLinkTargetCode(code: number): boolean {\n\treturn (\n\t\tcode <= 0x20 ||\n\t\tcode === 0x7f ||\n\t\tcode === 0xad ||\n\t\tcode === 0x61c ||\n\t\tcode === 0x180e ||\n\t\t(code >= 0x200b && code <= 0x200f) ||\n\t\t(code >= 0x202a && code <= 0x202e) ||\n\t\t(code >= 0x2060 && code <= 0x206f) ||\n\t\tcode === 0xfeff\n\t);\n}\n\nfunction isSanitizedLinkTarget(target: string): boolean {\n\tlet normalized = \"\";\n\tfor (let i = 0; i < target.length; ++i) {\n\t\tif (!isIgnorableLinkTargetCode(target.charCodeAt(i))) {\n\t\t\tnormalized += target[i];\n\t\t}\n\t}\n\tnormalized = normalized.toLowerCase();\n\treturn !UNSAFE_LINK_TARGET_RE.test(normalized);\n}\n\nfunction sanitizeRichTextStyle(styleText: string): string {\n\tconst safeDeclarations: string[] = [];\n\tfor (const declaration of styleText.split(\";\")) {\n\t\tconst separator = declaration.indexOf(\":\");\n\t\tif (separator === -1) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst property = declaration.slice(0, separator).trim().toLowerCase();\n\t\tconst value = declaration\n\t\t\t.slice(separator + 1)\n\t\t\t.trim()\n\t\t\t.toLowerCase();\n\t\tif (property === \"text-decoration\" && value === \"underline\") {\n\t\t\tsafeDeclarations.push(\"text-decoration: underline;\");\n\t\t} else if (\n\t\t\tproperty === \"text-underline-style\" &&\n\t\t\t(value === \"double\" || value === \"single-accounting\" || value === \"double-accounting\")\n\t\t) {\n\t\t\tsafeDeclarations.push(\"text-underline-style:\" + value + \";\");\n\t\t} else if (property === \"font-size\" && /^(?:0|[1-9]\\d*)(?:\\.\\d+)?pt$/.test(value)) {\n\t\t\tsafeDeclarations.push(\"font-size:\" + value + \";\");\n\t\t} else if (property === \"text-effect\" && value === \"outline\") {\n\t\t\tsafeDeclarations.push(\"text-effect: outline;\");\n\t\t} else if (property === \"text-shadow\" && value === \"auto\") {\n\t\t\tsafeDeclarations.push(\"text-shadow: auto;\");\n\t\t}\n\t}\n\treturn safeDeclarations.join(\"\");\n}\n\n/**\n * CellObject.h is an HTML-shaped cache, including for direct worksheet input.\n * Keep the presentation-only subset emitted by the XLSX rich-text reader and\n * render every other tag as inert text.\n */\nfunction sanitizeCellHtml(html: string): string {\n\tconst output: string[] = [];\n\tconst openTags: string[] = [];\n\tlet offset = 0;\n\n\twhile (offset < html.length) {\n\t\tconst tagStart = html.indexOf(\"<\", offset);\n\t\tif (tagStart === -1) {\n\t\t\toutput.push(html.slice(offset));\n\t\t\tbreak;\n\t\t}\n\t\toutput.push(html.slice(offset, tagStart));\n\t\tconst tagEnd = html.indexOf(\">\", tagStart + 1);\n\t\tif (tagEnd === -1) {\n\t\t\toutput.push(escapeHtml(html.slice(tagStart)));\n\t\t\tbreak;\n\t\t}\n\n\t\tconst token = html.slice(tagStart, tagEnd + 1);\n\t\tconst simpleOpen = token.match(/^<([bis]|sup|sub)>$/i);\n\t\tconst simpleClose = token.match(/^<\\/([bis]|sup|sub)>$/i);\n\t\tconst spanOpen = token.match(/^<span\\s+style\\s*=\\s*([\"'])([\\s\\S]*)\\1\\s*>$/i);\n\n\t\tif (/^<br\\s*\\/?>$/i.test(token)) {\n\t\t\toutput.push(\"<br/>\");\n\t\t} else if (simpleOpen) {\n\t\t\tconst name = simpleOpen[1].toLowerCase();\n\t\t\topenTags.push(name);\n\t\t\toutput.push(\"<\" + name + \">\");\n\t\t} else if (spanOpen) {\n\t\t\topenTags.push(\"span\");\n\t\t\toutput.push('<span style=\"' + escapeHtmlAttribute(sanitizeRichTextStyle(spanOpen[2])) + '\">');\n\t\t} else if (simpleClose) {\n\t\t\tconst name = simpleClose[1].toLowerCase();\n\t\t\tif (openTags[openTags.length - 1] === name) {\n\t\t\t\topenTags.pop();\n\t\t\t\toutput.push(\"</\" + name + \">\");\n\t\t\t} else {\n\t\t\t\toutput.push(escapeHtml(token));\n\t\t\t}\n\t\t} else if (/^<\\/span>$/i.test(token) && openTags[openTags.length - 1] === \"span\") {\n\t\t\topenTags.pop();\n\t\t\toutput.push(\"</span>\");\n\t\t} else {\n\t\t\toutput.push(escapeHtml(token));\n\t\t}\n\t\toffset = tagEnd + 1;\n\t}\n\n\twhile (openTags.length) {\n\t\toutput.push(\"</\" + openTags.pop() + \">\");\n\t}\n\treturn output.join(\"\");\n}\n\n/**\n * Build a single HTML `<tr>` row from a worksheet row, handling merged cells,\n * error coercion, hyperlinks, editable mode, and data attributes.\n */\ninterface HtmlMergeCell {\n\trowSpan: number;\n\tcolSpan: number;\n}\n\nfunction buildHtmlMergeIndex(\n\tws: WorkSheet,\n\trange: Range,\n\tbudget: WorksheetCellBudget,\n): Map<number, HtmlMergeCell | null> {\n\tconst merges = ws[\"!merges\"] || [];\n\tbudget.charge(\"worksheet merge metadata\", merges.length);\n\tconst index = new Map<number, HtmlMergeCell | null>();\n\tfor (let i = 0; i < merges.length; ++i) {\n\t\tconst merge = merges[i];\n\t\trangeCellCount(merge, \"worksheet merge\");\n\t\tconst startRow = Math.max(range.s.r, merge.s.r);\n\t\tconst endRow = Math.min(range.e.r, merge.e.r);\n\t\tconst startColumn = Math.max(range.s.c, merge.s.c);\n\t\tconst endColumn = Math.min(range.e.c, merge.e.c);\n\t\tif (startRow > endRow || startColumn > endColumn) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (let row = startRow; row <= endRow; ++row) {\n\t\t\tfor (let column = startColumn; column <= endColumn; ++column) {\n\t\t\t\tconst key = row * XLSX_MAX_COLUMNS + column;\n\t\t\t\tif (index.has(key)) {\n\t\t\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Invalid worksheet merge: ranges must not overlap\");\n\t\t\t\t}\n\t\t\t\tindex.set(\n\t\t\t\t\tkey,\n\t\t\t\t\trow === merge.s.r && column === merge.s.c\n\t\t\t\t\t\t? { rowSpan: merge.e.r - merge.s.r + 1, colSpan: merge.e.c - merge.s.c + 1 }\n\t\t\t\t\t\t: null,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\treturn index;\n}\n\nfunction buildHtmlRow(\n\tws: WorkSheet,\n\trange: Range,\n\trowIndex: number,\n\toptions: Sheet2HTMLOpts,\n\tmergeIndex: Map<number, HtmlMergeCell | null>,\n): string {\n\tconst cells: string[] = [];\n\n\tfor (let colIdx = range.s.c; colIdx <= range.e.c; ++colIdx) {\n\t\tconst merge = mergeIndex.get(rowIndex * XLSX_MAX_COLUMNS + colIdx);\n\t\tif (merge === null) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst rowSpan = merge?.rowSpan ?? 0;\n\t\tconst colSpan = merge?.colSpan ?? 0;\n\n\t\tconst coord = encodeCol(colIdx) + encodeRow(rowIndex);\n\t\tlet cell: any = getCell(ws, rowIndex, colIdx);\n\n\t\t// Coerce non-finite numeric cells into Excel error representations:\n\t\t// NaN -> #VALUE! (0x24), Infinity -> #DIV/0! (0x07)\n\t\tif (cell && cell.t === \"n\" && cell.v != null && !isFinite(cell.v)) {\n\t\t\tif (isNaN(cell.v)) {\n\t\t\t\tcell = { t: \"e\", v: 0x24, w: BErr[0x24] };\n\t\t\t} else {\n\t\t\t\tcell = { t: \"e\", v: 0x07, w: BErr[0x07] };\n\t\t\t}\n\t\t}\n\n\t\t// Resolve cell content: preserve the safe rich-text subset in cell.h,\n\t\t// then fall back to escaped formatted text.\n\t\tlet cellContent = \"\";\n\t\tif (cell && cell.v != null) {\n\t\t\tcellContent = cell.h ? sanitizeCellHtml(cell.h) : escapeHtml(cell.w || formatCell(cell) || \"\");\n\t\t}\n\n\t\tconst cellAttrs: Record<string, string> = {};\n\t\tif (rowSpan > 1) {\n\t\t\tcellAttrs.rowspan = String(rowSpan);\n\t\t}\n\t\tif (colSpan > 1) {\n\t\t\tcellAttrs.colspan = String(colSpan);\n\t\t}\n\n\t\tif (options.editable) {\n\t\t\t// In editable mode, wrap content in a contenteditable span for inline editing\n\t\t\tcellContent = '<span contenteditable=\"true\">' + cellContent + \"</span>\";\n\t\t} else if (cell) {\n\t\t\t// In non-editable mode, attach data attributes for round-tripping\n\t\t\tcellAttrs[\"data-t\"] = (cell && cell.t) || \"z\";\n\t\t\tif (cell.v != null) {\n\t\t\t\tcellAttrs[\"data-v\"] = cell.v instanceof Date ? cell.v.toISOString() : String(cell.v);\n\t\t\t}\n\t\t\tif (cell.z != null) {\n\t\t\t\tcellAttrs[\"data-z\"] = String(cell.z);\n\t\t\t}\n\t\t\tif (cell.f != null) {\n\t\t\t\tcellAttrs[\"data-f\"] = cell.f;\n\t\t\t}\n\t\t\t// Wrap in an anchor tag if the cell has a non-internal hyperlink,\n\t\t\t// filtering out unsafe URI schemes unless sanitization is disabled.\n\t\t\tif (\n\t\t\t\tcell.l &&\n\t\t\t\t(cell.l.Target || \"#\").charAt(0) !== \"#\" &&\n\t\t\t\t(options.sanitizeLinks === false || isSanitizedLinkTarget(cell.l.Target || \"\"))\n\t\t\t) {\n\t\t\t\tcellContent = writeHtmlElement(\"a\", cellContent, { href: cell.l.Target });\n\t\t\t}\n\t\t}\n\t\t// Each cell gets a unique id: \"{tableId}-{cellRef}\" (e.g. \"sjs-A1\")\n\t\tcellAttrs.id = (options.id || \"sjs\") + \"-\" + coord;\n\t\tcells.push(writeHtmlElement(\"td\", cellContent, cellAttrs));\n\t}\n\n\treturn \"<tr>\" + cells.join(\"\") + \"</tr>\";\n}\n\n/**\n * Convert a worksheet to an HTML table string.\n *\n * Generates a full HTML document (or fragment) containing a `<table>` with\n * one `<tr>` per row. Supports merged cells, hyperlinks, editable mode,\n * and data attributes for round-tripping.\n *\n * @param ws - The worksheet to convert\n * @param opts - Optional HTML generation options (header, footer, id, editable, sanitizeLinks)\n * @returns The HTML string representation of the worksheet\n */\nexport function sheetToHtml(ws: WorkSheet, opts?: Sheet2HTMLOpts): string {\n\tconst options: Sheet2HTMLOpts = opts || {};\n\tconst header = options.header != null ? options.header : HTML_BEGIN;\n\tconst footer = options.footer != null ? options.footer : HTML_END;\n\tconst out: string[] = [header];\n\tconst budget = new WorksheetCellBudget(options.maxWorksheetCells, DEFAULT_MAX_EXPORT_CELLS);\n\tconst range = clampLargeExportRange(ws, decodeRange(ws[\"!ref\"] || \"A1\"), budget);\n\tconst rows: string[] = [];\n\tif (ws[\"!ref\"] && range) {\n\t\tconst mergeIndex = buildHtmlMergeIndex(ws, range, budget);\n\t\tfor (let rowIdx = range.s.r; rowIdx <= range.e.r; ++rowIdx) {\n\t\t\trows.push(buildHtmlRow(ws, range, rowIdx, options, mergeIndex));\n\t\t}\n\t}\n\tout.push(writeHtmlElement(\"table\", rows.join(\"\"), options.id ? { id: options.id } : null));\n\tout.push(footer);\n\treturn out.join(\"\");\n}\n\nconst NUMERIC_REFERENCE_REPLACEMENTS: Readonly<Record<number, number>> = {\n\t0x80: 0x20ac,\n\t0x82: 0x201a,\n\t0x83: 0x0192,\n\t0x84: 0x201e,\n\t0x85: 0x2026,\n\t0x86: 0x2020,\n\t0x87: 0x2021,\n\t0x88: 0x02c6,\n\t0x89: 0x2030,\n\t0x8a: 0x0160,\n\t0x8b: 0x2039,\n\t0x8c: 0x0152,\n\t0x8e: 0x017d,\n\t0x91: 0x2018,\n\t0x92: 0x2019,\n\t0x93: 0x201c,\n\t0x94: 0x201d,\n\t0x95: 0x2022,\n\t0x96: 0x2013,\n\t0x97: 0x2014,\n\t0x98: 0x02dc,\n\t0x99: 0x2122,\n\t0x9a: 0x0161,\n\t0x9b: 0x203a,\n\t0x9c: 0x0153,\n\t0x9e: 0x017e,\n\t0x9f: 0x0178,\n};\n\nfunction decodeNumericReference(codePoint: number): string {\n\tif (codePoint === 0 || codePoint > 0x10ffff || (codePoint >= 0xd800 && codePoint <= 0xdfff)) {\n\t\treturn \"\\ufffd\";\n\t}\n\treturn String.fromCodePoint(NUMERIC_REFERENCE_REPLACEMENTS[codePoint] ?? codePoint);\n}\n\n/** Decode semicolon-terminated HTML named and numeric character references exactly once. */\nfunction decodeHtmlEntities(s: string): string {\n\treturn s.replace(/&(?:#(\\d+)|#[xX]([\\dA-Fa-f]+)|([\\dA-Za-z]+));/g, (entity, decimal, hex, name) => {\n\t\tif (name) {\n\t\t\tconst normalizedName = String(name);\n\t\t\treturn Object.hasOwn(HTML_ENTITY_VALUES, normalizedName) ? HTML_ENTITY_VALUES[normalizedName] : entity;\n\t\t}\n\t\tconst codePoint = parseInt(decimal || hex, decimal ? 10 : 16);\n\t\treturn decodeNumericReference(codePoint);\n\t});\n}\n\n/** Strip HTML tags from a string, returning only text content */\nfunction stripTags(s: string): string {\n\treturn s.replace(/<[^>]*>/g, \"\");\n}\n\n/** Extract an attribute value from a tag string */\nfunction getAttr(tag: string, name: string): string | null {\n\tconst re = new RegExp(\"(?:^|\\\\s)\" + name + \"\\\\s*=\\\\s*(?:\\\"([^\\\"]*)\\\"|'([^']*)')\", \"i\");\n\tconst m = tag.match(re);\n\treturn m ? (m[1] ?? m[2]) : null;\n}\n\nfunction parseHtmlSpan(value: string | null, name: string, allowZero = false): number {\n\tif (value == null) {\n\t\treturn 1;\n\t}\n\tif (!(allowZero ? /^(?:0|[1-9]\\d*)$/ : /^[1-9]\\d*$/).test(value)) {\n\t\tthrow new XlsxError(\n\t\t\t\"MALFORMED\",\n\t\t\t`Invalid HTML ${name}: expected a ${allowZero ? \"non-negative\" : \"positive\"} integer`,\n\t\t);\n\t}\n\tconst span = Number(value);\n\tif (!Number.isSafeInteger(span)) {\n\t\tthrow new XlsxError(\"MALFORMED\", `Invalid HTML ${name}: expected a safe integer`);\n\t}\n\treturn span;\n}\n\ninterface HtmlTableRow {\n\thtml: string;\n\tremainingInGroup: number;\n}\n\n/** Extract retained rows while preserving their truncated row-group boundaries for rowspan=\"0\". */\nfunction extractHtmlRows(tableBody: string, rowLimit: number): HtmlTableRow[] {\n\tconst rows: HtmlTableRow[] = [];\n\tlet groupRows: string[] = [];\n\tconst appendGroup = (groupRows: string[]): void => {\n\t\tfor (let i = 0; i < groupRows.length; ++i) {\n\t\t\trows.push({ html: groupRows[i], remainingInGroup: groupRows.length - i });\n\t\t}\n\t};\n\tconst flushGroup = (): void => {\n\t\tappendGroup(groupRows);\n\t\tgroupRows = [];\n\t};\n\tconst tokenRegex = /<(thead|tbody|tfoot)\\b[^>]*>|<\\/(thead|tbody|tfoot)\\s*>|<tr\\b[^>]*>[\\s\\S]*?<\\/tr>/gi;\n\tlet match: RegExpExecArray | null;\n\twhile ((match = tokenRegex.exec(tableBody))) {\n\t\tif (match[1]) {\n\t\t\tflushGroup();\n\t\t} else if (match[2]) {\n\t\t\tflushGroup();\n\t\t} else {\n\t\t\tgroupRows.push(match[0]);\n\t\t\tif (rows.length + groupRows.length >= rowLimit) {\n\t\t\t\tflushGroup();\n\t\t\t\treturn rows;\n\t\t\t}\n\t\t}\n\t}\n\tflushGroup();\n\treturn rows;\n}\n\n/** Construct a typed cell from an explicit data-t/data-v pair. */\nfunction typedCell(type: string, rawValue: string | null): CellObject | null {\n\tif (rawValue == null) {\n\t\tswitch (type) {\n\t\t\tcase \"n\":\n\t\t\t\treturn { t: \"n\" };\n\t\t\tcase \"b\":\n\t\t\t\treturn { t: \"b\" };\n\t\t\tcase \"d\":\n\t\t\t\treturn { t: \"d\" };\n\t\t\tcase \"e\":\n\t\t\t\treturn { t: \"e\" };\n\t\t\tcase \"s\":\n\t\t\t\treturn { t: \"s\" };\n\t\t\tcase \"z\":\n\t\t\t\treturn { t: \"z\" };\n\t\t}\n\t\treturn null;\n\t}\n\tconst decodedValue = decodeHtmlEntities(rawValue);\n\tswitch (type) {\n\t\tcase \"n\": {\n\t\t\tconst value = Number(decodedValue);\n\t\t\treturn Number.isFinite(value) ? { t: \"n\", v: value } : null;\n\t\t}\n\t\tcase \"b\":\n\t\t\treturn { t: \"b\", v: decodedValue === \"true\" || decodedValue === \"1\" };\n\t\tcase \"d\": {\n\t\t\tconst value = new Date(decodedValue);\n\t\t\treturn Number.isNaN(value.getTime()) ? null : { t: \"d\", v: value };\n\t\t}\n\t\tcase \"e\": {\n\t\t\tconst value = Number(decodedValue);\n\t\t\treturn Number.isFinite(value) ? { t: \"e\", v: value } : null;\n\t\t}\n\t\tcase \"s\":\n\t\t\treturn { t: \"s\", v: decodedValue };\n\t\tcase \"z\":\n\t\t\treturn { t: \"z\" };\n\t}\n\treturn null;\n}\n\n/** Try to coerce a plain text value to number or boolean */\nfunction coerceTextValue(text: string): string | number | boolean {\n\tif (text === \"\") {\n\t\treturn text;\n\t}\n\tif (text === \"TRUE\" || text === \"true\") {\n\t\treturn true;\n\t}\n\tif (text === \"FALSE\" || text === \"false\") {\n\t\treturn false;\n\t}\n\tconst num = Number(text);\n\tif (text.length > 0 && !isNaN(num) && isFinite(num)) {\n\t\treturn num;\n\t}\n\treturn text;\n}\n\nfunction textFromHtml(innerHtml: string): string {\n\treturn decodeHtmlEntities(stripTags(innerHtml.replace(/<\\s*br\\s*\\/?>/gi, \"\\n\"))).trim();\n}\n\n/**\n * Parse an HTML string containing a `<table>` into a WorkSheet.\n *\n * Handles `rowspan`/`colspan` attributes and uses `data-t`/`data-v`\n * attributes (when present) for round-trip fidelity.\n * This is a lightweight table parser: it recognizes quoted attributes,\n * table cells, ordinary `<br>` line breaks, and semicolon-terminated HTML\n * character references without implementing full browser DOM parsing.\n *\n * @param html - HTML string containing a table\n * @returns A WorkSheet with the parsed table data\n */\nexport function htmlToSheet(html: string, opts?: HTML2SheetOpts): WorkSheet {\n\tconst options = opts || {};\n\tconst maxRows = worksheetOptionLimit(options.maxWorksheetRows, XLSX_MAX_ROWS, \"maxWorksheetRows\");\n\tconst sheetRows = worksheetOptionLimit(options.sheetRows, 0, \"sheetRows\");\n\tconst budget = new WorksheetCellBudget(options.maxWorksheetCells, DEFAULT_MAX_IMPORT_CELLS);\n\t// Find the first <table>...</table> block\n\tconst tableMatch = html.match(/<table[^>]*>([\\s\\S]*?)<\\/table>/i);\n\tif (!tableMatch) {\n\t\treturn arrayToSheet([]);\n\t}\n\n\tconst tableBody = tableMatch[1];\n\tconst extractionLimit =\n\t\tsheetRows > 0 ? Math.min(sheetRows, XLSX_MAX_ROWS + 1) : Math.min(maxRows, XLSX_MAX_ROWS) + 1;\n\tconst rowMatches = extractHtmlRows(tableBody, extractionLimit);\n\tconst retainedRowCount = rowMatches.length;\n\tif (retainedRowCount > XLSX_MAX_ROWS) {\n\t\tthrow new XlsxError(\"MALFORMED\", `HTML table exceeds XLSX row limit ${XLSX_MAX_ROWS}`);\n\t}\n\tif (retainedRowCount > maxRows) {\n\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", `worksheet row count ${retainedRowCount} exceeds limit ${maxRows}`);\n\t}\n\n\tconst data: any[][] = [];\n\t// Track cells occupied by rowspan from previous rows: occupied[row][col] = true\n\tconst occupied: Record<number, Record<number, boolean>> = {};\n\n\tfor (let r = 0; r < retainedRowCount; r++) {\n\t\tif (!data[r]) {\n\t\t\tdata[r] = [];\n\t\t}\n\t\tif (!occupied[r]) {\n\t\t\toccupied[r] = {};\n\t\t}\n\n\t\tconst rowHtml = rowMatches[r].html;\n\t\tconst cellMatches = rowHtml.match(/<t[dh][^>]*>[\\s\\S]*?<\\/t[dh]>/gi) || [];\n\n\t\tlet col = 0;\n\t\tfor (let ci = 0; ci < cellMatches.length; ci++) {\n\t\t\t// Skip columns occupied by rowspan from prior rows\n\t\t\twhile (occupied[r][col]) {\n\t\t\t\tcol++;\n\t\t\t}\n\t\t\tif (col >= XLSX_MAX_COLUMNS) {\n\t\t\t\tthrow new XlsxError(\"MALFORMED\", `HTML row exceeds XLSX column limit ${XLSX_MAX_COLUMNS}`);\n\t\t\t}\n\n\t\t\tconst cellHtml = cellMatches[ci];\n\t\t\tconst tagEnd = cellHtml.indexOf(\">\");\n\t\t\tconst tag = cellHtml.slice(0, tagEnd + 1);\n\n\t\t\tconst rowspanStr = getAttr(tag, \"rowspan\");\n\t\t\tconst colspanStr = getAttr(tag, \"colspan\");\n\t\t\tconst declaredRowSpan = parseHtmlSpan(rowspanStr, \"rowspan\", true);\n\t\t\tconst rs = declaredRowSpan === 0 ? rowMatches[r].remainingInGroup : declaredRowSpan;\n\t\t\tconst cs = parseHtmlSpan(colspanStr, \"colspan\");\n\t\t\tif (r + rs > XLSX_MAX_ROWS || col + cs > XLSX_MAX_COLUMNS) {\n\t\t\t\tthrow new XlsxError(\"MALFORMED\", \"Invalid HTML span: range exceeds XLSX worksheet bounds\");\n\t\t\t}\n\t\t\tconst retainedRowSpan = sheetRows > 0 ? Math.min(rs, sheetRows - r) : rs;\n\t\t\tbudget.charge(\"worksheet cell\", retainedRowSpan * cs);\n\t\t\tconst dataT = getAttr(tag, \"data-t\");\n\t\t\tconst dataV = getAttr(tag, \"data-v\");\n\t\t\tconst dataF = getAttr(tag, \"data-f\");\n\t\t\tconst dataZ = getAttr(tag, \"data-z\");\n\n\t\t\t// Extract cell value\n\t\t\tconst innerHtml = cellHtml.slice(tagEnd + 1, cellHtml.lastIndexOf(\"</\"));\n\t\t\tconst explicitCell = dataT ? typedCell(dataT, dataV) : null;\n\t\t\tlet value: CellObject | string | number | boolean;\n\t\t\tif (explicitCell) {\n\t\t\t\tif (dataF != null) {\n\t\t\t\t\texplicitCell.f = decodeHtmlEntities(dataF);\n\t\t\t\t}\n\t\t\t\tif (dataZ != null) {\n\t\t\t\t\texplicitCell.z = decodeHtmlEntities(dataZ);\n\t\t\t\t}\n\t\t\t\tvalue = explicitCell;\n\t\t\t} else {\n\t\t\t\tvalue = coerceTextValue(textFromHtml(innerHtml));\n\t\t\t}\n\n\t\t\tdata[r][col] = value;\n\n\t\t\t// Mark cells occupied by rowspan/colspan\n\t\t\tfor (let dr = 0; dr < retainedRowSpan; dr++) {\n\t\t\t\tfor (let dc = 0; dc < cs; dc++) {\n\t\t\t\t\tif (dr === 0 && dc === 0) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst tr = r + dr;\n\t\t\t\t\tconst tc = col + dc;\n\t\t\t\t\tif (!occupied[tr]) {\n\t\t\t\t\t\toccupied[tr] = {};\n\t\t\t\t\t}\n\t\t\t\t\toccupied[tr][tc] = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fill colspan cells in the current row with empty strings\n\t\t\tfor (let dc = 1; dc < cs; dc++) {\n\t\t\t\tdata[r][col + dc] = \"\";\n\t\t\t}\n\n\t\t\tcol += cs;\n\t\t}\n\t}\n\n\treturn arrayToSheet(data);\n}\n","import type {\n\tBookPropsResult,\n\tBookSheetsAndPropsResult,\n\tBookSheetsResult,\n\tReadOptions,\n\tReadResult,\n\tWorkBook,\n} from \"./types.js\";\nimport { XlsxError } from \"./errors.js\";\nimport { zipRead } from \"./zip/index.js\";\nimport { parseZip } from \"./xlsx/parse-zip.js\";\nimport { base64decode } from \"./utils/base64.js\";\nimport { resetFormatTable } from \"./ssf/table.js\";\nimport { csvToSheet } from \"./api/csv.js\";\nimport { htmlToSheet } from \"./api/html.js\";\n\n/**\n * Normalize any supported input type into a Uint8Array for ZIP parsing.\n *\n * Handles Uint8Array, ArrayBuffer, Node Buffer, base64 strings, binary strings, and plain arrays.\n */\nfunction to_uint8array(data: any, opts: ReadOptions): Uint8Array {\n\tif (data instanceof Uint8Array) {\n\t\treturn data;\n\t}\n\tif (data instanceof ArrayBuffer) {\n\t\treturn new Uint8Array(data);\n\t}\n\tif (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n\t\t// Node.js Buffer: create a Uint8Array view over the same memory\n\t\treturn new Uint8Array(data.buffer, data.byteOffset, data.length);\n\t}\n\tif (typeof data === \"string\") {\n\t\tif (opts.type === \"base64\") {\n\t\t\treturn base64decode(data);\n\t\t}\n\t\t// Treat as a binary string where each character's charCode is a byte value\n\t\tconst u8 = new Uint8Array(data.length);\n\t\tfor (let i = 0; i < data.length; ++i) {\n\t\t\tu8[i] = data.charCodeAt(i);\n\t\t}\n\t\treturn u8;\n\t}\n\tif (Array.isArray(data)) {\n\t\treturn new Uint8Array(data);\n\t}\n\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Unsupported data type for read()\");\n}\n\n/**\n * Auto-detect the input data type based on its JavaScript type.\n *\n * Used when the caller does not explicitly set opts.type.\n */\nfunction detect_type(data: any): ReadOptions[\"type\"] {\n\tif (data instanceof Uint8Array || data instanceof ArrayBuffer) {\n\t\treturn \"array\";\n\t}\n\tif (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n\t\treturn \"buffer\";\n\t}\n\tif (typeof data === \"string\") {\n\t\treturn \"base64\";\n\t}\n\treturn \"array\";\n}\n\n/** Wrap a single worksheet into a WorkBook */\nfunction sheetToWorkBook(ws: any, name?: string): WorkBook {\n\tconst n = name || \"Sheet1\";\n\treturn {\n\t\tSheetNames: [n],\n\t\tSheets: { [n]: ws },\n\t};\n}\n\ntype BookSheetsReadOptions = Omit<ReadOptions, \"bookSheets\" | \"bookProps\"> & {\n\tbookSheets: true;\n\tbookProps?: false;\n};\n\ntype BookPropsReadOptions = Omit<ReadOptions, \"bookSheets\" | \"bookProps\"> & {\n\tbookSheets?: false;\n\tbookProps: true;\n};\n\ntype BookSheetsAndPropsReadOptions = Omit<ReadOptions, \"bookSheets\" | \"bookProps\"> & {\n\tbookSheets: true;\n\tbookProps: true;\n};\n\ntype FullReadOptions = Omit<ReadOptions, \"bookSheets\" | \"bookProps\"> & {\n\tbookSheets?: false;\n\tbookProps?: false;\n};\n\nfunction rejectUnsupportedReadOptions(options: ReadOptions): void {\n\tfor (const [name, requested] of [\n\t\t[\"bookFiles\", options.bookFiles],\n\t\t[\"bookVBA\", options.bookVBA],\n\t\t[\"bookDeps\", options.bookDeps],\n\t\t[\"xlfn\", options.xlfn],\n\t] as const) {\n\t\tif (requested) {\n\t\t\tthrow new XlsxError(\"UNSUPPORTED\", `Read option \"${name}\" is not supported`);\n\t\t}\n\t}\n}\n\nfunction selectReadResult(workbook: WorkBook, options: ReadOptions): ReadResult {\n\tif (options.bookSheets && options.bookProps) {\n\t\treturn {\n\t\t\tSheetNames: workbook.SheetNames,\n\t\t\tProps: workbook.Props ?? {},\n\t\t\tCustprops: workbook.Custprops ?? {},\n\t\t};\n\t}\n\tif (options.bookSheets) {\n\t\treturn { SheetNames: workbook.SheetNames };\n\t}\n\tif (options.bookProps) {\n\t\treturn { Props: workbook.Props ?? {}, Custprops: workbook.Custprops ?? {} };\n\t}\n\treturn workbook;\n}\n\n/**\n * Read a spreadsheet from an in-memory data source.\n *\n * Supports XLSX (ZIP), CSV, and HTML input. For string input with type \"string\",\n * auto-detects HTML (starts with \"<\") vs CSV.\n *\n * @param data - File contents as Uint8Array, ArrayBuffer, Buffer, base64 string, binary string, or plain text string\n * @param opts - Read options controlling parsing behavior\n * @returns A full workbook, or the metadata-only shape selected by bookSheets and bookProps\n * @throws XlsxError if the format or an affirmative compatibility option is unsupported\n */\nexport function read(data: any, opts?: FullReadOptions): Promise<WorkBook>;\nexport function read(data: any, opts: BookSheetsAndPropsReadOptions): Promise<BookSheetsAndPropsResult>;\nexport function read(data: any, opts: BookSheetsReadOptions): Promise<BookSheetsResult>;\nexport function read(data: any, opts: BookPropsReadOptions): Promise<BookPropsResult>;\nexport function read(data: any, opts?: ReadOptions): Promise<ReadResult>;\nexport async function read(data: any, opts?: ReadOptions): Promise<ReadResult> {\n\tconst options: ReadOptions = opts ? { ...opts } : {};\n\tif (options.password) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Password-protected workbooks are not supported\");\n\t}\n\trejectUnsupportedReadOptions(options);\n\tresetFormatTable();\n\tif (!options.type) {\n\t\toptions.type = detect_type(data);\n\t}\n\n\t// Handle plain text string input (CSV or HTML)\n\tif (options.type === \"string\" && typeof data === \"string\") {\n\t\tconst trimmed = data.trimStart();\n\t\tif (trimmed.charAt(0) === \"<\") {\n\t\t\treturn selectReadResult(sheetToWorkBook(htmlToSheet(data, options)), options);\n\t\t}\n\t\treturn selectReadResult(sheetToWorkBook(csvToSheet(data, options)), options);\n\t}\n\n\tconst u8 = to_uint8array(data, options);\n\n\t// 0x504B = \"PK\" -- ZIP file magic number (Phil Katz)\n\tif (u8[0] === 0x50 && u8[1] === 0x4b) {\n\t\tconst zip = await zipRead(u8, options);\n\t\treturn parseZip(zip, options);\n\t}\n\n\t// 0x25504446 = \"%PDF\" -- PDF file magic number\n\tif (u8[0] === 0x25 && u8[1] === 0x50 && u8[2] === 0x44 && u8[3] === 0x46) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"PDF File is not a spreadsheet\");\n\t}\n\n\t// 0x89504E47 = \"\\x89PNG\" -- PNG file magic number\n\tif (u8[0] === 0x89 && u8[1] === 0x50 && u8[2] === 0x4e && u8[3] === 0x47) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"PNG Image File is not a spreadsheet\");\n\t}\n\n\tthrow new XlsxError(\"UNSUPPORTED\", \"Unsupported file format. xlsx-format only supports XLSX files.\");\n}\n","import type { WorkBook } from \"../types.js\";\nimport type { ZipArchive } from \"../zip/index.js\";\nimport type { Relationships } from \"../opc/relationships.js\";\nimport { zipCreate, zipAddString } from \"../zip/index.js\";\nimport { createContentTypes, writeContentTypes } from \"../opc/content-types.js\";\nimport { writeRelationships, addRelationship, getRelsPath } from \"../opc/relationships.js\";\nimport { writeCoreProperties } from \"../opc/core-properties.js\";\nimport { writeExtendedProperties } from \"../opc/extended-properties.js\";\nimport { writeCustomProperties } from \"../opc/custom-properties.js\";\nimport { writeSstXml } from \"./shared-strings.js\";\nimport { buildStyleRegistry, writeStylesXml } from \"./styles.js\";\nimport { write_theme_xml } from \"./theme.js\";\nimport { writeWorkbookXml } from \"./workbook.js\";\nimport { writeWorksheetXml } from \"./worksheet.js\";\nimport { collectCellComments, writeCommentsXml, writeTcmntXml, writePeopleXml } from \"./comments.js\";\nimport { writeVml } from \"./vml.js\";\nimport { writeMetadataXml } from \"./metadata.js\";\nimport { resetFormatTable, formatTable, loadFormatTable } from \"../ssf/table.js\";\nimport { RELS as RELTYPE } from \"../xml/namespaces.js\";\n\n/**\n * Write a WorkBook to a ZIP archive in XLSX format.\n *\n * Orchestrates the serialization of all workbook parts: core/extended/custom\n * properties, worksheets, shared strings, styles, theme, metadata, comments\n * (both simple and threaded), VML drawings, and relationships.\n *\n * @param wb - WorkBook to serialize\n * @param opts - Write options (mutated to carry shared state like Strings and rels)\n * @returns ZipArchive containing all XLSX parts ready for final compression\n */\nexport function writeZipXlsx(wb: WorkBook, opts: any): ZipArchive {\n\t// Initialize the spreadsheet format table (SSF) from the workbook\n\tif (wb && !(wb as any).SSF) {\n\t\t(wb as any).SSF = { ...formatTable };\n\t}\n\tif (wb && (wb as any).SSF) {\n\t\tresetFormatTable();\n\t\tloadFormatTable((wb as any).SSF);\n\t}\n\n\t// Initialize shared write state on opts\n\topts.rels = { \"!id\": {} } as any; // Top-level .rels\n\topts.wbrels = { \"!id\": {} } as any; // xl/_rels/workbook.xml.rels\n\topts.Strings = [] as any; // Shared string table accumulator\n\topts.Strings.Count = 0;\n\topts.Strings.Unique = 0;\n\topts.revStrings = new Map(); // Reverse lookup: string -> SST index\n\n\tconst ct = createContentTypes();\n\tconst zip = zipCreate();\n\tlet filePath = \"\";\n\n\topts.cellXfs = [];\n\tif (opts.cellStyles) {\n\t\topts.styleRegistry = buildStyleRegistry(wb, opts);\n\t}\n\n\tif (!wb.Props) {\n\t\twb.Props = {};\n\t}\n\n\t// --- Core properties (title, author, dates, etc.) ---\n\tfilePath = \"docProps/core.xml\";\n\tzipAddString(zip, filePath, writeCoreProperties(wb.Props, opts));\n\tct.coreprops.push(filePath);\n\taddRelationship(opts.rels, 2, filePath, RELTYPE.CORE_PROPS);\n\n\t// --- Extended properties (application name, sheet names, etc.) ---\n\tfilePath = \"docProps/app.xml\";\n\tif (wb.Props && (wb.Props as any).SheetNames) {\n\t\t/* already set */\n\t} else if (!wb.Workbook || !wb.Workbook.Sheets) {\n\t\t(wb.Props as any).SheetNames = wb.SheetNames;\n\t} else {\n\t\t// Exclude \"veryHidden\" sheets (Hidden === 2) from the app properties\n\t\tconst visibleSheetNames: string[] = [];\n\t\tfor (let sheetIdx = 0; sheetIdx < wb.SheetNames.length; ++sheetIdx) {\n\t\t\tif ((wb.Workbook.Sheets[sheetIdx] || ({} as any)).Hidden !== 2) {\n\t\t\t\tvisibleSheetNames.push(wb.SheetNames[sheetIdx]);\n\t\t\t}\n\t\t}\n\t\t(wb.Props as any).SheetNames = visibleSheetNames;\n\t}\n\t(wb.Props as any).Worksheets = (wb.Props as any).SheetNames.length;\n\tzipAddString(zip, filePath, writeExtendedProperties(wb.Props));\n\tct.extprops.push(filePath);\n\taddRelationship(opts.rels, 3, filePath, RELTYPE.EXT_PROPS);\n\n\t// --- Custom properties ---\n\tif (wb.Custprops !== wb.Props && Object.keys(wb.Custprops || {}).length > 0) {\n\t\tfilePath = \"docProps/custom.xml\";\n\t\tzipAddString(zip, filePath, writeCustomProperties(wb.Custprops));\n\t\tct.custprops.push(filePath);\n\t\taddRelationship(opts.rels, 4, filePath, RELTYPE.CUST_PROPS);\n\t}\n\n\t// People list for threaded comments; starts with a default author\n\tconst people: string[] = [\"SheetJ5\"];\n\topts.tcid = 0; // Threaded comment ID counter\n\n\t// --- Worksheets ---\n\tfor (let rId = 1; rId <= wb.SheetNames.length; ++rId) {\n\t\tconst wsrels: Relationships = { \"!id\": {} };\n\t\tconst ws = wb.Sheets[wb.SheetNames[rId - 1]];\n\t\tlet comments: [string, any[]][] = [];\n\t\tlet needtc = false;\n\n\t\tif (ws) {\n\t\t\tcomments = collectCellComments(ws);\n\t\t\t// Preserve the historical internal staging property as a fallback.\n\t\t\tif (comments.length === 0 && Array.isArray((ws as any)[\"!comments\"])) {\n\t\t\t\tcomments = (ws as any)[\"!comments\"].map(([ref, list]: [string, any[]]) => {\n\t\t\t\t\tconst copied = list.map((comment) => ({ ...comment }));\n\t\t\t\t\tif ((list as any).hidden != null) {\n\t\t\t\t\t\t(copied as any).hidden = (list as any).hidden;\n\t\t\t\t\t}\n\t\t\t\t\treturn [ref, copied];\n\t\t\t\t});\n\t\t\t}\n\t\t\t// A public helper can append a legacy-shaped comment to an imported thread.\n\t\t\t// Serialize the copied list as one thread so no comment is discarded.\n\t\t\tfor (const [, list] of comments) {\n\t\t\t\tif (list.some((comment) => comment.T === true)) {\n\t\t\t\t\tfor (const comment of list) {\n\t\t\t\t\t\tcomment.T = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tneedtc = comments.some(([, list]) => list.some((comment) => comment.T === true));\n\t\t\tif (needtc) {\n\t\t\t\taddRelationship(wsrels, -1, \"../threadedComments/threadedComment\" + rId + \".xml\", RELTYPE.TCMNT);\n\t\t\t}\n\t\t\tif (comments.length > 0) {\n\t\t\t\taddRelationship(wsrels, -1, \"../comments\" + rId + \".xml\", RELTYPE.CMNT);\n\t\t\t\taddRelationship(wsrels, -1, \"../drawings/vmlDrawing\" + rId + \".vml\", RELTYPE.VML);\n\t\t\t}\n\t\t}\n\n\t\tfilePath = \"xl/worksheets/sheet\" + rId + \".xml\";\n\t\tzipAddString(zip, filePath, writeWorksheetXml(ws || ({} as any), opts, rId - 1, wsrels, wb));\n\t\tct.sheets.push(filePath);\n\t\taddRelationship(opts.wbrels, -1, \"worksheets/sheet\" + rId + \".xml\", RELTYPE.SHEET);\n\n\t\tif (comments.length > 0) {\n\t\t\t// Write threaded comments if needed\n\t\t\tif (needtc) {\n\t\t\t\tconst cf = \"xl/threadedComments/threadedComment\" + rId + \".xml\";\n\t\t\t\tzipAddString(zip, cf, writeTcmntXml(comments, people, opts));\n\t\t\t\tct.threadedcomments.push(cf);\n\t\t\t}\n\n\t\t\t// Write legacy comments XML (always needed when comments exist)\n\t\t\tconst cf2 = \"xl/comments\" + rId + \".xml\";\n\t\t\tzipAddString(zip, cf2, writeCommentsXml(comments));\n\t\t\tct.comments.push(cf2);\n\n\t\t\t// Write VML drawing for comment anchor shapes and visibility.\n\t\t\tzipAddString(zip, \"xl/drawings/vmlDrawing\" + rId + \".vml\", writeVml(rId, comments));\n\t\t}\n\n\t\t// Write per-sheet relationships if any exist\n\t\tif ((wsrels[\"!id\"] as any).rId1) {\n\t\t\tzipAddString(zip, getRelsPath(filePath), writeRelationships(wsrels));\n\t\t}\n\t}\n\n\t// --- Shared strings ---\n\tif (opts.Strings != null && opts.Strings.length > 0) {\n\t\tfilePath = \"xl/sharedStrings.xml\";\n\t\tzipAddString(zip, filePath, writeSstXml(opts.Strings, opts));\n\t\tct.strs.push(filePath);\n\t\taddRelationship(opts.wbrels, -1, \"sharedStrings.xml\", RELTYPE.SST);\n\t}\n\n\t// --- Workbook ---\n\tfilePath = \"xl/workbook.xml\";\n\tzipAddString(zip, filePath, writeWorkbookXml(wb));\n\tct.workbooks.push(filePath);\n\taddRelationship(opts.rels, 1, filePath, RELTYPE.WB);\n\n\t// --- Theme ---\n\tfilePath = \"xl/theme/theme1.xml\";\n\tzipAddString(zip, filePath, write_theme_xml());\n\tct.themes.push(filePath);\n\taddRelationship(opts.wbrels, -1, \"theme/theme1.xml\", RELTYPE.THEME);\n\n\t// --- Styles ---\n\tfilePath = \"xl/styles.xml\";\n\tzipAddString(zip, filePath, writeStylesXml(wb, opts));\n\tct.styles.push(filePath);\n\taddRelationship(opts.wbrels, -1, \"styles.xml\", RELTYPE.STY);\n\n\t// --- Metadata (dynamic array support) ---\n\tfilePath = \"xl/metadata.xml\";\n\tzipAddString(zip, filePath, writeMetadataXml());\n\tct.metadata.push(filePath);\n\taddRelationship(opts.wbrels, -1, \"metadata.xml\", RELTYPE.META);\n\n\t// --- People (for threaded comments authorship) ---\n\tif (people.length > 1) {\n\t\tfilePath = \"xl/persons/person.xml\";\n\t\tzipAddString(zip, filePath, writePeopleXml(people));\n\t\tct.people.push(filePath);\n\t\taddRelationship(opts.wbrels, -1, \"persons/person.xml\", RELTYPE.PEOPLE);\n\t}\n\n\t// --- Content types and top-level relationships ---\n\tzipAddString(zip, \"[Content_Types].xml\", writeContentTypes(ct, opts));\n\tzipAddString(zip, \"_rels/.rels\", writeRelationships(opts.rels));\n\tzipAddString(zip, \"xl/_rels/workbook.xml.rels\", writeRelationships(opts.wbrels));\n\n\treturn zip;\n}\n","import type { WorkBook, WriteOptions, WriteResult } from \"./types.js\";\nimport { XlsxError } from \"./errors.js\";\nimport { zipWrite } from \"./zip/index.js\";\nimport { writeZipXlsx } from \"./xlsx/write-zip.js\";\nimport { validateWorkbook } from \"./xlsx/workbook.js\";\nimport { base64encode } from \"./utils/base64.js\";\nimport { resetFormatTable } from \"./ssf/table.js\";\nimport { sheetToCsv, sheetToTxt } from \"./api/csv.js\";\nimport { sheetToHtml } from \"./api/html.js\";\n\n/** Encode a text string as a UTF-8 Uint8Array */\nfunction textToUint8Array(text: string): Uint8Array {\n\treturn new TextEncoder().encode(text);\n}\n\n/** Convert text output to the requested output type */\nfunction textOutput(text: string, type?: string): WriteResult {\n\tswitch (type) {\n\t\tcase \"string\":\n\t\t\treturn text;\n\t\tcase \"base64\":\n\t\t\treturn base64encode(textToUint8Array(text));\n\t\tcase \"buffer\":\n\t\t\tif (typeof Buffer !== \"undefined\") {\n\t\t\t\treturn Buffer.from(text, \"utf8\");\n\t\t\t}\n\t\t\treturn textToUint8Array(text);\n\t\tcase \"array\":\n\t\t\treturn textToUint8Array(text);\n\t\tdefault:\n\t\t\treturn text;\n\t}\n}\n\ntype Base64WriteOptions = Omit<WriteOptions, \"type\"> & { type: \"base64\" };\ntype BinaryWriteOptions = Omit<WriteOptions, \"type\"> & { type: \"array\" | \"buffer\" };\ntype TextWriteOptions = Omit<WriteOptions, \"bookType\" | \"type\"> & {\n\tbookType: \"csv\" | \"tsv\" | \"html\";\n\ttype?: \"string\";\n};\ntype SpreadsheetWriteOptions = Omit<WriteOptions, \"bookType\" | \"type\"> & {\n\tbookType?: \"xlsx\" | \"xlsm\";\n\ttype?: \"string\";\n};\n\nfunction hasVbaPayload(value: unknown): boolean {\n\tif (value == null) {\n\t\treturn false;\n\t}\n\tif (typeof value === \"string\" || Array.isArray(value)) {\n\t\treturn value.length > 0;\n\t}\n\tif (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n\t\treturn value.byteLength > 0;\n\t}\n\treturn true;\n}\n\nfunction rejectUnsupportedWriteOptions(wb: WorkBook, options: WriteOptions): void {\n\tif (options.bookVBA) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", 'Write option \"bookVBA\" is not supported');\n\t}\n\tif (options.themeXLSX) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", 'Write option \"themeXLSX\" is not supported');\n\t}\n\tif (hasVbaPayload(wb?.vbaraw)) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Workbooks containing VBA data cannot be written\");\n\t}\n}\n\n/** Get the first worksheet from a workbook */\nfunction firstSheet(wb: WorkBook) {\n\treturn wb.Sheets[wb.SheetNames[0]];\n}\n\n/**\n * Write a WorkBook to an in-memory representation.\n *\n * Supports XLSX (default), CSV, TSV, and HTML output formats via opts.bookType.\n *\n * @param wb - WorkBook object to serialize\n * @param opts - Write options controlling output format and behavior\n * @returns A string for base64 or text output; otherwise a portable Uint8Array\n * @throws XlsxError if a requested compatibility option or non-empty VBA payload is unsupported\n */\nexport function write(wb: WorkBook, opts?: BinaryWriteOptions | SpreadsheetWriteOptions): Promise<Uint8Array>;\nexport function write(wb: WorkBook, opts: Base64WriteOptions | TextWriteOptions): Promise<string>;\nexport function write(wb: WorkBook, opts?: WriteOptions): Promise<WriteResult>;\nexport async function write(wb: WorkBook, opts?: WriteOptions): Promise<WriteResult> {\n\tconst options: any = { ...opts };\n\tif (options.password) {\n\t\tthrow new XlsxError(\"UNSUPPORTED\", \"Password-protected workbooks are not supported\");\n\t}\n\trejectUnsupportedWriteOptions(wb, options);\n\tresetFormatTable();\n\tif (!opts || !(opts as any).unsafe) {\n\t\tvalidateWorkbook(wb);\n\t}\n\t// cellStyles implies cellNF (number format) and sheetStubs (empty cell placeholders)\n\tif (options.cellStyles) {\n\t\toptions.cellNF = true;\n\t\toptions.sheetStubs = true;\n\t}\n\n\tconst bookType = options.bookType || \"xlsx\";\n\n\tswitch (bookType) {\n\t\tcase \"csv\": {\n\t\t\tconst ws = firstSheet(wb);\n\t\t\treturn textOutput(ws ? sheetToCsv(ws, options) : \"\", options.type);\n\t\t}\n\t\tcase \"tsv\": {\n\t\t\tconst ws = firstSheet(wb);\n\t\t\treturn textOutput(ws ? sheetToTxt(ws, options) : \"\", options.type);\n\t\t}\n\t\tcase \"html\": {\n\t\t\tconst ws = firstSheet(wb);\n\t\t\treturn textOutput(ws ? sheetToHtml(ws, options) : \"\", options.type);\n\t\t}\n\t\tdefault: {\n\t\t\tconst zip = writeZipXlsx(wb, options);\n\t\t\tconst compressed = await zipWrite(zip, !!options.compression);\n\n\t\t\tswitch (options.type) {\n\t\t\t\tcase \"base64\":\n\t\t\t\t\treturn base64encode_u8(compressed);\n\t\t\t\tcase \"buffer\":\n\t\t\t\t\tif (typeof Buffer !== \"undefined\") {\n\t\t\t\t\t\treturn Buffer.from(compressed.buffer, compressed.byteOffset, compressed.byteLength);\n\t\t\t\t\t}\n\t\t\t\t\treturn compressed;\n\t\t\t\tcase \"array\":\n\t\t\t\t\treturn compressed;\n\t\t\t\tdefault:\n\t\t\t\t\treturn compressed;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Thin wrapper to encode Uint8Array to base64 */\nfunction base64encode_u8(data: Uint8Array): string {\n\treturn base64encode(data);\n}\n","import type { WorkBook, WorkSheet, CellObject, CellStyle, Range, Sheet2FormulaeOpts } from \"../types.js\";\nimport { XlsxError } from \"../errors.js\";\nimport { validateSheetName } from \"../xlsx/workbook.js\";\nimport {\n\tencodeCol,\n\tencodeRow,\n\tencodeRange,\n\tdecodeRange,\n\tsafeDecodeRange,\n\tgetCell,\n\tgetOrCreateCell,\n} from \"../utils/cell.js\";\nimport { clampLargeExportRange } from \"../utils/export-range.js\";\nimport { DEFAULT_MAX_EXPORT_CELLS, WorksheetCellBudget } from \"../utils/worksheet-budget.js\";\n\n/**\n * Create a new blank workbook, optionally containing an initial worksheet.\n *\n * @param ws - Optional worksheet to include as the first sheet\n * @param wsname - Name for the initial sheet (defaults to \"Sheet1\")\n * @returns A new workbook object\n */\nexport function createWorkbook(ws?: WorkSheet, wsname?: string): WorkBook {\n\tconst wb: WorkBook = { SheetNames: [], Sheets: {} };\n\tif (ws) {\n\t\tappendSheet(wb, ws, wsname || \"Sheet1\");\n\t}\n\treturn wb;\n}\n\n/**\n * Append a worksheet to the end of a workbook's sheet list.\n *\n * If no name is provided, generates one automatically (\"Sheet1\", \"Sheet2\", ...).\n * When `roll` is true and the name already exists, appends an incrementing\n * numeric suffix to make it unique (e.g. \"Sheet1\" -> \"Sheet2\").\n *\n * @param wb - The workbook to add the sheet to\n * @param ws - The worksheet to append\n * @param name - Optional sheet name; auto-generated if omitted\n * @param roll - If true, auto-increment the name suffix on collision instead of throwing\n * @returns The final sheet name that was used\n */\nexport function appendSheet(wb: WorkBook, ws: WorkSheet, name?: string, roll?: boolean): string {\n\tlet i = 1;\n\tif (!name) {\n\t\t// Auto-generate \"Sheet1\", \"Sheet2\", ... until a unique name is found\n\t\tfor (; i <= 0xffff; ++i, name = undefined) {\n\t\t\tif (wb.SheetNames.indexOf((name = \"Sheet\" + i)) === -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!name || wb.SheetNames.length >= 0xffff) {\n\t\tthrow new XlsxError(\"LIMIT_EXCEEDED\", \"Too many worksheets\");\n\t}\n\t// When rolling, strip any trailing digits and increment to find a unique name\n\tif (roll && wb.SheetNames.indexOf(name) >= 0 && name.length < 32) {\n\t\tconst m = name.match(/\\d+$/);\n\t\ti = (m && +m[0]) || 0;\n\t\tconst root = (m && name.slice(0, m.index)) || name;\n\t\tfor (++i; i <= 0xffff; ++i) {\n\t\t\tif (wb.SheetNames.indexOf((name = root + i)) === -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvalidateSheetName(name);\n\tif (wb.SheetNames.indexOf(name) >= 0) {\n\t\tthrow new XlsxError(\"DUPLICATE\", \"Worksheet with name |\" + name + \"| already exists!\");\n\t}\n\n\twb.SheetNames.push(name);\n\t// Define the property explicitly so names such as \"__proto__\" remain own,\n\t// enumerable sheet entries on ordinary caller-provided maps.\n\tObject.defineProperty(wb.Sheets, name, {\n\t\tvalue: ws,\n\t\tenumerable: true,\n\t\tconfigurable: true,\n\t\twritable: true,\n\t});\n\treturn name;\n}\n\n/**\n * Create a new empty worksheet.\n *\n * @param opts - Optional settings; set `dense: true` for dense storage mode (array-of-arrays backing)\n * @returns A new empty worksheet object\n */\nexport function createSheet(opts?: { dense?: boolean }): WorkSheet {\n\tconst out: any = {};\n\tif (opts?.dense) {\n\t\tout[\"!data\"] = [];\n\t}\n\treturn out as WorkSheet;\n}\n\n/**\n * Resolve a sheet name or numeric index to a validated sheet index.\n *\n * @param wb - The workbook to search\n * @param sh - Sheet name (string) or zero-based sheet index (number)\n * @returns The zero-based sheet index\n * @throws If the sheet name or index is not found in the workbook\n */\nexport function getSheetIndex(wb: WorkBook, sh: number | string): number {\n\tif (typeof sh === \"number\") {\n\t\tif (sh >= 0 && wb.SheetNames.length > sh) {\n\t\t\treturn sh;\n\t\t}\n\t\tthrow new XlsxError(\"NOT_FOUND\", \"Cannot find sheet # \" + sh);\n\t} else if (typeof sh === \"string\") {\n\t\tconst idx = wb.SheetNames.indexOf(sh);\n\t\tif (idx !== -1) {\n\t\t\treturn idx;\n\t\t}\n\t\tthrow new XlsxError(\"NOT_FOUND\", \"Cannot find sheet name |\" + sh + \"|\");\n\t}\n\tthrow new XlsxError(\"NOT_FOUND\", \"Cannot find sheet |\" + sh + \"|\");\n}\n\n/**\n * Set the visibility state of a worksheet in the workbook.\n *\n * Initialises the `Workbook.Sheets` metadata array if it does not yet exist.\n *\n * @param wb - The workbook containing the sheet\n * @param sh - Sheet name or zero-based index\n * @param vis - Visibility level: 0 = visible, 1 = hidden, 2 = very hidden\n */\nexport function setSheetVisibility(wb: WorkBook, sh: number | string, vis: 0 | 1 | 2): void {\n\tif (!wb.Workbook) {\n\t\twb.Workbook = {};\n\t}\n\tif (!wb.Workbook.Sheets) {\n\t\twb.Workbook.Sheets = [];\n\t}\n\n\tconst idx = getSheetIndex(wb, sh);\n\tif (!wb.Workbook.Sheets[idx]) {\n\t\twb.Workbook.Sheets[idx] = {};\n\t}\n\n\tswitch (vis) {\n\t\tcase 0:\n\t\tcase 1:\n\t\tcase 2:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new XlsxError(\"INVALID_ARGUMENT\", \"Bad sheet visibility setting \" + vis);\n\t}\n\twb.Workbook.Sheets[idx].Hidden = vis;\n}\n\n/**\n * Set the number format string on a cell.\n *\n * @param cell - The cell object to modify\n * @param fmt - A number format string (e.g. \"0.00%\") or built-in format ID\n * @returns The same cell object, for chaining\n */\nexport function setCellNumberFormat(cell: CellObject, fmt: string | number): CellObject {\n\tcell.z = fmt;\n\tdelete cell.w;\n\treturn cell;\n}\n\n/**\n * Set or replace the style object on a cell.\n *\n * Mutates `cell` in place and returns the same object for chaining.\n */\nexport function setCellStyle(cell: CellObject, style: CellStyle): CellObject {\n\tcell.s = style;\n\treturn cell;\n}\n\nfunction expandSheetRef(ws: WorkSheet, range: Range): void {\n\tif (!ws[\"!ref\"]) {\n\t\tws[\"!ref\"] = encodeRange(range);\n\t\treturn;\n\t}\n\tconst current = decodeRange(ws[\"!ref\"]);\n\tif (current.s.r > range.s.r) {\n\t\tcurrent.s.r = range.s.r;\n\t}\n\tif (current.s.c > range.s.c) {\n\t\tcurrent.s.c = range.s.c;\n\t}\n\tif (current.e.r < range.e.r) {\n\t\tcurrent.e.r = range.e.r;\n\t}\n\tif (current.e.c < range.e.c) {\n\t\tcurrent.e.c = range.e.c;\n\t}\n\tws[\"!ref\"] = encodeRange(current);\n}\n\n/**\n * Apply a style to every existing cell in a range.\n *\n * Mutates `ws` in place and returns the same worksheet for chaining. When\n * `createCells` is true, missing cells in the range are created as styled stubs.\n */\nexport function styleRange(\n\tws: WorkSheet,\n\trange: string | Range,\n\tstyle: CellStyle,\n\topts?: { createCells?: boolean },\n): WorkSheet {\n\tconst rng = typeof range === \"string\" ? safeDecodeRange(range) : range;\n\tconst createCells = !!opts?.createCells;\n\tfor (let R = rng.s.r; R <= rng.e.r; ++R) {\n\t\tfor (let C = rng.s.c; C <= rng.e.c; ++C) {\n\t\t\tconst cell = createCells ? getOrCreateCell(ws, R, C) : getCell(ws, R, C);\n\t\t\tif (cell) {\n\t\t\t\tcell.s = style;\n\t\t\t}\n\t\t}\n\t}\n\tif (createCells) {\n\t\texpandSheetRef(ws, rng);\n\t}\n\treturn ws;\n}\n\n/**\n * Add a merged-cell range and expand `!ref` to include it.\n *\n * Mutates `ws` in place and returns the same worksheet for chaining.\n */\nexport function mergeCells(ws: WorkSheet, range: string | Range): WorkSheet {\n\tconst rng = typeof range === \"string\" ? safeDecodeRange(range) : range;\n\tif (!ws[\"!merges\"]) {\n\t\tws[\"!merges\"] = [];\n\t}\n\tws[\"!merges\"].push(rng);\n\texpandSheetRef(ws, rng);\n\treturn ws;\n}\n\n/**\n * Set a row height in points.\n *\n * Mutates `ws` in place and returns the same worksheet for chaining. Row indexes\n * are zero-based.\n */\nexport function setRowHeight(ws: WorkSheet, row: number, hpt: number): WorkSheet {\n\tif (!ws[\"!rows\"]) {\n\t\tws[\"!rows\"] = [];\n\t}\n\tif (!ws[\"!rows\"][row]) {\n\t\tws[\"!rows\"][row] = {};\n\t}\n\tws[\"!rows\"][row].hpt = hpt;\n\treturn ws;\n}\n\n/**\n * Set a column width.\n *\n * Mutates `ws` in place and returns the same worksheet for chaining. Column\n * indexes are zero-based.\n */\nexport function setColumnWidth(ws: WorkSheet, col: number, width: number): WorkSheet {\n\tif (!ws[\"!cols\"]) {\n\t\tws[\"!cols\"] = [];\n\t}\n\tif (!ws[\"!cols\"][col]) {\n\t\tws[\"!cols\"][col] = {};\n\t}\n\tws[\"!cols\"][col].width = width;\n\treturn ws;\n}\n\n/**\n * Freeze rows and/or columns in a worksheet view.\n *\n * Mutates `ws` in place and returns the same worksheet for chaining.\n */\nexport function freezePanes(ws: WorkSheet, pane: { xSplit?: number; ySplit?: number }): WorkSheet {\n\tws[\"!views\"] = [\n\t\t{\n\t\t\tstate: \"frozen\",\n\t\t\txSplit: pane.xSplit,\n\t\t\tySplit: pane.ySplit,\n\t\t},\n\t];\n\treturn ws;\n}\n\n/**\n * Set or remove a hyperlink on a cell.\n *\n * Pass `undefined` or an empty string for `target` to remove an existing link.\n *\n * @param cell - The cell object to modify\n * @param target - The hyperlink URL or path; falsy to remove\n * @param tooltip - Optional tooltip text shown on hover\n * @returns The same cell object, for chaining\n */\nexport function setCellHyperlink(cell: CellObject, target?: string, tooltip?: string): CellObject {\n\tif (!target) {\n\t\tdelete cell.l;\n\t} else {\n\t\tcell.l = { Target: target };\n\t\tif (tooltip) {\n\t\t\tcell.l.Tooltip = tooltip;\n\t\t}\n\t}\n\treturn cell;\n}\n\n/**\n * Set an internal (within-workbook) link on a cell.\n *\n * Internal links are prefixed with \"#\" to distinguish them from external URLs.\n *\n * @param cell - The cell object to modify\n * @param range - The target cell reference or range string (e.g. \"Sheet2!A1\")\n * @param tooltip - Optional tooltip text shown on hover\n * @returns The same cell object, for chaining\n */\nexport function setCellInternalLink(cell: CellObject, range: string, tooltip?: string): CellObject {\n\treturn setCellHyperlink(cell, \"#\" + range, tooltip);\n}\n\n/**\n * Add a comment (note) to a cell.\n *\n * Initialises the cell's comment array if it does not yet exist, then appends\n * a new comment entry.\n *\n * @param cell - The cell object to modify\n * @param text - The comment text content\n * @param author - Optional author name (defaults to \"SheetJS\")\n */\nexport function addCellComment(cell: CellObject, text: string, author?: string): void {\n\tif (!cell.c) {\n\t\tcell.c = [];\n\t}\n\tcell.c.push({ t: text, a: author || \"SheetJS\" });\n}\n\n/**\n * Set an array formula across a rectangular range of cells.\n *\n * The formula is stored on the top-left cell of the range (`cell.f`), and every\n * cell in the range receives the `cell.F` property indicating the array formula\n * extent. Optionally marks the formula as a dynamic array formula.\n *\n * @param ws - The worksheet to modify\n * @param range - The target range as a string (e.g. \"A1:C3\") or range object\n * @param formula - The array formula expression (without surrounding braces)\n * @param dynamic - If true, mark as a dynamic array formula (spill)\n * @returns The modified worksheet\n */\nexport function setArrayFormula(\n\tws: WorkSheet,\n\trange: string | { s: { r: number; c: number }; e: { r: number; c: number } },\n\tformula: string,\n\tdynamic?: boolean,\n): WorkSheet {\n\tconst rng = typeof range !== \"string\" ? range : safeDecodeRange(range);\n\tconst rngstr = typeof range === \"string\" ? range : encodeRange(range);\n\n\tfor (let R = rng.s.r; R <= rng.e.r; ++R) {\n\t\tfor (let C = rng.s.c; C <= rng.e.c; ++C) {\n\t\t\tconst cell = getOrCreateCell(ws, R, C);\n\t\t\tcell.t = \"n\";\n\t\t\tcell.F = rngstr; // array formula range shared by all cells in the group\n\t\t\tdelete cell.v;\n\t\t\t// Only the top-left cell carries the actual formula text\n\t\t\tif (R === rng.s.r && C === rng.s.c) {\n\t\t\t\tcell.f = formula;\n\t\t\t\tif (dynamic) {\n\t\t\t\t\tcell.D = true; // dynamic array (spill) flag\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Expand the worksheet's !ref to encompass the array formula range\n\tif (ws[\"!ref\"]) {\n\t\tconst wsr = decodeRange(ws[\"!ref\"]);\n\t\tif (wsr.s.r > rng.s.r) {\n\t\t\twsr.s.r = rng.s.r;\n\t\t}\n\t\tif (wsr.s.c > rng.s.c) {\n\t\t\twsr.s.c = rng.s.c;\n\t\t}\n\t\tif (wsr.e.r < rng.e.r) {\n\t\t\twsr.e.r = rng.e.r;\n\t\t}\n\t\tif (wsr.e.c < rng.e.c) {\n\t\t\twsr.e.c = rng.e.c;\n\t\t}\n\t\tws[\"!ref\"] = encodeRange(wsr);\n\t} else {\n\t\tws[\"!ref\"] = encodeRange(rng);\n\t}\n\treturn ws;\n}\n\n/**\n * Convert a worksheet to an array of formula strings.\n *\n * Each entry has the format \"CellRef=Value\" (e.g. \"A1=42\", \"B2='Hello\").\n * For array formulas, the ref is the full range (e.g. \"A1:C3={formula}\").\n * String values are prefixed with a single quote; booleans become TRUE/FALSE.\n *\n * @param ws - The worksheet to extract formulas from\n * @param opts - Optional worksheet export budget\n * @returns An array of \"ref=value\" strings representing every non-empty cell\n */\nexport function sheetToFormulae(ws: WorkSheet, opts?: Sheet2FormulaeOpts): string[] {\n\tif (ws == null || ws[\"!ref\"] == null) {\n\t\treturn [];\n\t}\n\tconst budget = new WorksheetCellBudget(opts?.maxWorksheetCells, DEFAULT_MAX_EXPORT_CELLS);\n\tconst r = clampLargeExportRange(ws, safeDecodeRange(ws[\"!ref\"]), budget);\n\tif (!r) {\n\t\treturn [];\n\t}\n\tconst cols: string[] = [];\n\tconst cmds: string[] = [];\n\n\t// Pre-compute column letters for the range\n\tfor (let C = r.s.c; C <= r.e.c; ++C) {\n\t\tcols[C] = encodeCol(C);\n\t}\n\n\tfor (let R = r.s.r; R <= r.e.r; ++R) {\n\t\tconst rr = encodeRow(R);\n\t\tfor (let C = r.s.c; C <= r.e.c; ++C) {\n\t\t\tconst y = cols[C] + rr;\n\t\t\tconst x = getCell(ws, R, C);\n\t\t\tif (x === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlet val = \"\";\n\t\t\tlet ref = y;\n\t\t\t// For array formulas, use the range as the ref; skip non-origin cells\n\t\t\tif (x.F != null) {\n\t\t\t\tref = x.F;\n\t\t\t\tif (!x.f) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tval = x.f;\n\t\t\t\t// Normalise single-cell array formula refs to \"A1:A1\" format\n\t\t\t\tif (ref.indexOf(\":\") === -1) {\n\t\t\t\t\tref = ref + \":\" + ref;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (x.f != null) {\n\t\t\t\tval = x.f;\n\t\t\t} else if (x.t === \"z\") {\n\t\t\t\tcontinue;\n\t\t\t} else if (x.t === \"n\" && x.v != null) {\n\t\t\t\tval = \"\" + x.v;\n\t\t\t} else if (x.t === \"b\") {\n\t\t\t\tval = x.v ? \"TRUE\" : \"FALSE\";\n\t\t\t} else if (x.w !== undefined) {\n\t\t\t\tval = \"'\" + x.w;\n\t\t\t} else if (x.v === undefined) {\n\t\t\t\tcontinue;\n\t\t\t} else if (x.t === \"s\") {\n\t\t\t\tval = \"'\" + x.v; // prefix string values with a single quote\n\t\t\t} else {\n\t\t\t\tval = \"\" + x.v;\n\t\t\t}\n\t\t\tcmds.push(ref + \"=\" + val);\n\t\t}\n\t}\n\treturn cmds;\n}\n","// xlsx-format - Modern TypeScript XLSX parser and writer\n// Public API\n\n// Types\nexport type {\n\tWorkBook,\n\tWorkSheet,\n\tCellObject,\n\tCellAddress,\n\tRange,\n\tProperties,\n\tFullProperties,\n\tBookSheetsResult,\n\tBookPropsResult,\n\tBookSheetsAndPropsResult,\n\tReadResult,\n\tWriteResult,\n\tReadOptions,\n\tWriteOptions,\n\tExcelDataType,\n\tComment,\n\tComments,\n\tHyperlink,\n\tStyleColor,\n\tCellFont,\n\tCellFill,\n\tCellBorderStyle,\n\tCellBorderSide,\n\tCellBorder,\n\tCellAlignment,\n\tCellStyle,\n\tColInfo,\n\tRowInfo,\n\tSheetView,\n\tMarginInfo,\n\tProtectInfo,\n\tAutoFilterInfo,\n\tDenseSheetData,\n\tSheet,\n\tSheetProps,\n\tDefinedName,\n\tWBView,\n\tWorkbookProperties,\n\tWBProps,\n\tSheet2CSVOpts,\n\tSheet2HTMLOpts,\n\tSheet2JSONOpts,\n\tCSV2SheetOpts,\n\tHTML2SheetOpts,\n\tSheet2FormulaeOpts,\n\tWorksheetCellBudgetOptions,\n\tAOA2SheetOpts,\n\tJSON2SheetOpts,\n\tNumberFormat,\n} from \"./types.js\";\nexport type { XlsxErrorCode } from \"./errors.js\";\nexport { XlsxError } from \"./errors.js\";\n\n// Read / Write\nexport { read } from \"./read.js\";\nexport { write } from \"./write.js\";\n\n// Utilities - workbook/sheet manipulation\nexport {\n\tcreateWorkbook,\n\tappendSheet,\n\tsetSheetVisibility,\n\tcreateSheet,\n\tgetSheetIndex,\n\tsetCellNumberFormat,\n\tsetCellStyle,\n\tstyleRange,\n\tmergeCells,\n\tsetRowHeight,\n\tsetColumnWidth,\n\tfreezePanes,\n\tsetCellHyperlink,\n\tsetCellInternalLink,\n\taddCellComment,\n\tsetArrayFormula,\n\tsheetToFormulae,\n} from \"./api/book.js\";\n\n// Utilities - format conversions\nexport { arrayToSheet, sheetToArray, addArrayToSheet } from \"./api/aoa.js\";\nexport { jsonToSheet, sheetToJson, addJsonToSheet } from \"./api/json.js\";\nexport { sheetToCsv, sheetToTxt, csvToSheet } from \"./api/csv.js\";\nexport { sheetToHtml, htmlToSheet } from \"./api/html.js\";\nexport { formatCell } from \"./api/format.js\";\n\n// Cell utilities\nexport {\n\tdecodeCell,\n\tencodeCell,\n\tdecodeRange,\n\tencodeRange,\n\tdecodeCol,\n\tencodeCol,\n\tdecodeRow,\n\tencodeRow,\n} from \"./utils/cell.js\";\n\n// SSF (Number Formatting)\nexport { formatNumber } from \"./ssf/format.js\";\n\n// Version\nexport const version = \"2.4.5\"; // x-release-please-version\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,IAAa,YAAb,cAA+B,MAAM;CAGpC,YAAY,MAAqB,SAAiB,SAAwB;EACzE,MAAM,SAAS,OAAO;wBAHd;EAIR,KAAK,OAAO;EACZ,KAAK,OAAO;EACZ,OAAO,eAAe,MAAM,WAAW,SAAS;CACjD;AACD;;;;;;;;;;;AClBA,MAAM,wBAAQ,IAAI,YAAY,GAAG;AACjC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;CAC7B,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAEtB,IAAI,IAAI,IAAK,MAAM,IAAK,aAAa,MAAM;CAE5C,MAAM,KAAK;AACZ;;;;;;;;;;AAWA,SAAgB,MAAM,KAAyB;CAC9C,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAE/B,MAAO,QAAQ,IAAK,OAAO,MAAM,IAAI,MAAM;CAG5C,QAAQ,MAAM,gBAAgB;AAC/B;;;;;;;;;AC3BA,eAAe,cAAc,UAAsC,WAAW,UAA+B;CAC5G,MAAM,SAAS,SAAS,UAAU;CAClC,MAAM,SAAuB,CAAC;CAC9B,IAAI,cAAc;CAClB,SAAS;EACR,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;EAC1C,IAAI,MACH;EAED,OAAO,KAAK,KAAK;EACjB,eAAe,MAAM;EACrB,IAAI,cAAc,UACjB,MAAM,IAAI,UAAU,kBAAkB,iDAAiD,SAAS,QAAQ;CAE1G;CACA,MAAM,SAAS,IAAI,WAAW,WAAW;CACzC,IAAI,SAAS;CACb,KAAK,MAAM,SAAS,QAAQ;EAC3B,OAAO,IAAI,OAAO,MAAM;EACxB,UAAU,MAAM;CACjB;CACA,OAAO;AACR;;;;;;;;;;;AAYA,eAAsB,QAAQ,MAAkB,WAAW,UAA+B;CACzF,MAAM,KAAK,IAAI,oBAAoB,aAAa;CAChD,MAAM,SAAS,GAAG,SAAS,UAAU;CACrC,MAAM,eAAe,OAAO,MAAM,IAA+B,CAAC,CAAC,WAAW,OAAO,MAAM,CAAC;CAC5F,IAAI;EACH,MAAM,CAAC,UAAU,MAAM,QAAQ,IAAI,CAAC,cAAc,GAAG,UAAU,QAAQ,GAAG,YAAY,CAAC;EACvF,OAAO;CACR,SAAS,KAAK;EACb,IAAI;GACH,MAAM,OAAO,MAAM,GAAG;EACvB,QAAQ,CAER;EACA,MAAM;CACP;AACD;;;;;;;;;;AAWA,eAAsB,QAAQ,MAAuC;CACpE,MAAM,KAAK,IAAI,kBAAkB,aAAa;CAC9C,MAAM,SAAS,GAAG,SAAS,UAAU;CACrC,MAAM,eAAe,OAAO,MAAM,IAA+B,CAAC,CAAC,WAAW,OAAO,MAAM,CAAC;CAC5F,IAAI;EACH,MAAM,CAAC,UAAU,MAAM,QAAQ,IAAI,CAAC,cAAc,GAAG,QAAQ,GAAG,YAAY,CAAC;EAC7E,OAAO;CACR,SAAS,KAAK;EACb,IAAI;GACH,MAAM,OAAO,MAAM,GAAG;EACvB,QAAQ,CAER;EACA,MAAM;CACP;AACD;;;;AC9DA,MAAM,UAAU,IAAI,YAAY;AAChC,MAAM,UAAU,IAAI,YAAY;AAEhC,MAAM,0BAA0B;AAChC,MAAM,uCAAuC;AAC7C,MAAM,uCAAuC;AAE7C,SAASA,oBAAkB,MAAsB;CAChD,OAAO,KAAK,OAAO,CAAC,MAAM,MAAM,KAAK,MAAM,CAAC,IAAI;AACjD;AAEA,SAAS,WAAW,MAAsB;CACzC,OAAO,KAAK,QAAQ,WAAW,cAAc,UAAU,YAAY,CAAC;AACrE;;AAGA,SAAS,eAAe,SAAqB,MAA6B;CACzE,IAAI,OAAO,OAAO,QAAQ,OAAO,IAAI,GACpC,OAAO;CAER,MAAM,YAAY,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,MAAM;CAC/D,IAAI,OAAO,OAAO,QAAQ,OAAO,SAAS,GACzC,OAAO;CAGR,MAAM,aAAa,WAAWA,oBAAkB,IAAI,CAAC;CACrD,MAAM,UAAU,OAAO,KAAK,QAAQ,KAAK,CAAC,CAAC,QACzC,cAAc,WAAWA,oBAAkB,SAAS,CAAC,MAAM,UAC7D;CACA,IAAI,QAAQ,SAAS,GACpB,MAAM,IAAI,UAAU,aAAa,4BAA4B,KAAK,WAAW,QAAQ,KAAK,IAAI,GAAG;CAElG,OAAO,QAAQ,MAAM;AACtB;;AAIA,MAAM,YAAY;;AAElB,MAAM,cAAc;;AAEpB,MAAM,WAAW;AAEjB,MAAM,YAAY;AAClB,MAAM,YAAY;AAElB,SAAS,YAAY,OAA2B,UAAkB,MAAsB;CACvF,IAAI,SAAS,MACZ,OAAO;CAER,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GACtC,MAAM,IAAI,UAAU,oBAAoB,uBAAuB,KAAK,sCAAsC;CAE3G,OAAO;AACR;AAEA,SAAS,YAAY,MAAkB,KAAa,KAAa,MAAoB;CACpF,IAAI,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,SAAS,KACjG,MAAM,IAAI,UAAU,aAAa,gBAAgB,KAAK,eAAe;AAEvE;AAEA,SAAS,UAAU,KAAiB,KAAa,MAAsB;CACtE,YAAY,KAAK,KAAK,GAAG,IAAI;CAC7B,OAAO,QAAQ,KAAK,GAAG;AACxB;AAEA,SAAS,UAAU,KAAiB,KAAa,MAAsB;CACtE,YAAY,KAAK,KAAK,GAAG,IAAI;CAC7B,OAAO,QAAQ,KAAK,GAAG;AACxB;AAEA,SAAS,cAAqB;CAC7B,MAAM,IAAI,UAAU,eAAe,mDAAmD;AACvF;AAEA,SAAS,UAAU,MAAc,MAAkB,UAAwB;CAE1E,IADe,MAAM,IACZ,MAAM,UACd,MAAM,IAAI,UAAU,gBAAgB,iCAAiC,MAAM;AAE7E;;AAGA,SAAS,QAAQ,KAAiB,KAAqB;CACtD,OAAO,IAAI,OAAQ,IAAI,MAAM,MAAM;AACpC;;AAGA,SAAS,QAAQ,KAAiB,KAAqB;CACtD,QAAQ,IAAI,OAAQ,IAAI,MAAM,MAAM,IAAM,IAAI,MAAM,MAAM,KAAO,IAAI,MAAM,MAAM,QAAS;AAC3F;;AAGA,SAAS,SAAS,KAAiB,KAAa,KAAmB;CAClE,IAAI,OAAO,MAAM;CACjB,IAAI,MAAM,KAAM,OAAO,IAAK;AAC7B;;AAGA,SAAS,SAAS,KAAiB,KAAa,KAAmB;CAClE,IAAI,OAAO,MAAM;CACjB,IAAI,MAAM,KAAM,OAAO,IAAK;CAC5B,IAAI,MAAM,KAAM,OAAO,KAAM;CAC7B,IAAI,MAAM,KAAM,OAAO,KAAM;AAC9B;;;;;;;;;;;;AAaA,eAAsB,QAAQ,MAAkB,MAA4C;CAC3F,MAAM,gBAAgB,YAAY,MAAM,eAAe,yBAAyB,eAAe;CAC/F,MAAM,4BAA4B,YACjC,MAAM,2BACN,sCACA,2BACD;CACA,MAAM,4BAA4B,YACjC,MAAM,2BACN,sCACA,2BACD;CAGA,IAAI,aAAa;CACjB,KAAK,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,KAAK,SAAS,OAAO,KAClE,IAAI,QAAQ,MAAM,CAAC,MAAM,UAAU;EAClC,MAAM,aAAa,QAAQ,MAAM,IAAI,EAAE;EACvC,IAAI,IAAI,KAAK,eAAe,KAAK,QAAQ;GACxC,aAAa;GACb;EACD;CACD;CAED,IAAI,eAAe,IAClB,MAAM,IAAI,UAAU,aAAa,6BAA6B;CAG/D,YAAY,MAAM,YAAY,IAAI,MAAM;CACxC,MAAM,iBAAiB,UAAU,MAAM,aAAa,IAAI,qBAAqB;CAC7E,YAAY,MAAM,YAAY,KAAK,gBAAgB,cAAc;CAEjE,MAAM,aAAa,UAAU,MAAM,aAAa,GAAG,kBAAkB;CACrE,MAAM,eAAe,UAAU,MAAM,aAAa,GAAG,oCAAoC;CACzF,MAAM,kBAAkB,UAAU,MAAM,aAAa,GAAG,uBAAuB;CAC/E,MAAM,YAAY,UAAU,MAAM,aAAa,IAAI,kBAAkB;CACrE,MAAM,SAAS,UAAU,MAAM,aAAa,IAAI,6BAA6B;CAC7E,MAAM,WAAW,UAAU,MAAM,aAAa,IAAI,+BAA+B;CACjF,IAAI,oBAAoB,aAAa,cAAc,aAAa,WAAW,aAAa,aAAa,WACpG,YAAY;CAEb,IAAI,eAAe,KAAK,iBAAiB,KAAK,oBAAoB,WACjE,MAAM,IAAI,UAAU,eAAe,wDAAwD;CAE5F,IAAI,YAAY,eACf,MAAM,IAAI,UAAU,kBAAkB,4BAA4B,UAAU,iBAAiB,eAAe;CAE7G,YAAY,MAAM,UAAU,QAAQ,mBAAmB;CACvD,IAAI,WAAW,SAAS,YACvB,MAAM,IAAI,UAAU,aAAa,8CAA8C;CAYhF,MAAM,UAAqB,CAAC;CAC5B,IAAI,MAAM;CACV,MAAM,QAAQ,WAAW;CACzB,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK;EACnC,YAAY,MAAM,KAAK,IAAI,yBAAyB;EACpD,IAAI,MAAM,KAAK,OACd,MAAM,IAAI,UAAU,aAAa,4DAA4D;EAE9F,IAAI,UAAU,MAAM,KAAK,6BAA6B,MAAM,aAC3D,MAAM,IAAI,UAAU,aAAa,0CAA0C;EAE5E,MAAM,SAAS,UAAU,MAAM,MAAM,IAAI,sCAAsC;EAC/E,MAAM,SAAS,UAAU,MAAM,MAAM,IAAI,uBAAuB;EAChE,MAAM,WAAW,UAAU,MAAM,MAAM,IAAI,mCAAmC;EAC9E,MAAM,aAAa,UAAU,MAAM,MAAM,IAAI,qCAAqC;EAClF,MAAM,UAAU,UAAU,MAAM,MAAM,IAAI,oCAAoC;EAC9E,MAAM,WAAW,UAAU,MAAM,MAAM,IAAI,gCAAgC;EAC3E,MAAM,aAAa,UAAU,MAAM,MAAM,IAAI,kCAAkC;EAC/E,MAAM,YAAY,UAAU,MAAM,MAAM,IAAI,8BAA8B;EAC1E,MAAM,cAAc,UAAU,MAAM,MAAM,IAAI,uCAAuC;EACrF,IACC,aAAa,aACb,eAAe,aACf,gBAAgB,aAChB,cAAc,WAEd,YAAY;EAEb,IAAI,cAAc,GACjB,MAAM,IAAI,UAAU,eAAe,wDAAwD;EAE5F,MAAM,WAAW,MAAM,KAAK,UAAU,WAAW;EACjD,IAAI,WAAW,OACd,MAAM,IAAI,UAAU,aAAa,4DAA4D;EAE9F,MAAM,YAAY,KAAK,SAAS,MAAM,IAAI,MAAM,KAAK,OAAO;EAC5D,MAAM,OAAO,QAAQ,OAAO,SAAS;EACrC,QAAQ,KAAK;GAAE;GAAQ,KAAK;GAAQ;GAAU;GAAY;GAAM;EAAY,CAAC;EAC7E,MAAM;CACP;CAGA,MAAM,QAAoC,OAAO,OAAO,IAAI;CAC5D,MAAM,4BAAY,IAAI,IAAY;CAClC,MAAM,cAA6F,CAAC;CACpG,IAAI,yBAAyB;CAE7B,KAAK,MAAM,SAAS,SAAS;EAC5B,MAAM,OAAO,MAAM;EAGnB,IAAI,KAAK,SAAS,GAAG,GACpB;EAED,IAAI,UAAU,IAAI,IAAI,GACrB,MAAM,IAAI,UAAU,aAAa,gCAAgC,MAAM;EAExE,UAAU,IAAI,IAAI;EAElB,MAAM,MAAM,MAAM;EAClB,YAAY,MAAM,KAAK,IAAI,yBAAyB,MAAM,MAAM;EAChE,IAAI,UAAU,MAAM,KAAK,6BAA6B,MAAM,WAC3D,MAAM,IAAI,UAAU,aAAa,oCAAoC;EAEtE,MAAM,cAAc,UAAU,MAAM,MAAM,GAAG,sCAAsC;EACnF,MAAM,eAAe,UAAU,MAAM,MAAM,IAAI,oCAAoC;EACnF,MAAM,gBAAgB,UAAU,MAAM,MAAM,IAAI,gCAAgC;EAChF,MAAM,YAAY,MAAM,KAAK,eAAe;EAC5C,YAAY,MAAM,WAAW,MAAM,UAAU,iBAAiB,MAAM,MAAM;EAC1E,MAAM,UAAU,YAAY,MAAM;EAClC,IAAI,gBAAgB,MAAM,QACzB,MAAM,IAAI,UAAU,aAAa,iDAAiD,MAAM,MAAM;EAG/F,IADkB,QAAQ,OAAO,KAAK,SAAS,MAAM,IAAI,MAAM,KAAK,YAAY,CACpE,MAAM,MACjB,MAAM,IAAI,UAAU,aAAa,oDAAoD,MAAM;EAE5F,IAAI,MAAM,aAAa,2BACtB,MAAM,IAAI,UACT,kBACA,sBAAsB,KAAK,qBAAqB,MAAM,WAAW,iBAAiB,2BACnF;EAED,0BAA0B,MAAM;EAChC,IAAI,yBAAyB,2BAC5B,MAAM,IAAI,UACT,kBACA,wCAAwC,uBAAuB,iBAAiB,2BACjF;EAGD,IAAI,MAAM,WAAW,GAAG;GACvB,IAAI,MAAM,aAAa,MAAM,YAC5B,MAAM,IAAI,UACT,aACA,6BAA6B,KAAK,kDACnC;GAGD,MAAM,WAAW,KAAK,SAAS,WAAW,OAAO;GACjD,UAAU,MAAM,UAAU,MAAM,GAAG;GACnC,MAAM,QAAQ;EACf,OAAO,IAAI,MAAM,WAAW,GAE3B,YAAY,KAAK;GAChB;GACA,YAAY,KAAK,SAAS,WAAW,OAAO;GAC5C,cAAc,MAAM;GACpB,KAAK,MAAM;EACZ,CAAC;OAED,MAAM,IAAI,UAAU,eAAe,uCAAuC,MAAM,QAAQ;CAE1F;CAIA,KAAK,MAAM,OAAO,aAAa;EAC9B,MAAM,SAAS,MAAM,QAAQ,IAAI,YAAY,IAAI,YAAY;EAC7D,IAAI,OAAO,WAAW,IAAI,cACzB,MAAM,IAAI,UACT,aACA,sBAAsB,IAAI,KAAK,eAAe,OAAO,OAAO,mBAAmB,IAAI,cACpF;EAED,UAAU,IAAI,MAAM,QAAQ,IAAI,GAAG;EACnC,MAAM,IAAI,QAAQ;CACnB;CAEA,OAAO,EAAE,MAAM;AAChB;;;;;;;;;;;AAYA,eAAsB,SAAS,SAAqB,UAAyC;CAE5F,MAAM,aADQ,OAAO,KAAK,QAAQ,KACX,CAAC,CAAC,KAAK,UAAU;EACvC;EACA,WAAW,QAAQ,OAAO,IAAI;EAC9B,MAAM,QAAQ,MAAM;EACpB,KAAK,MAAM,QAAQ,MAAM,KAAK;CAC/B,EAAE;CAGF,IAAI;CACJ,IAAI;CACJ,IAAI,UAAU;EAEb,kBAAkB,MADI,QAAQ,IAAI,WAAW,IAAI,OAAO,MAAM,QAAQ,EAAE,IAAI,CAAC,CAAC;EAE9E,UAAU,WAAW,UAAU,CAAC;CACjC,OAAO;EACN,kBAAkB,WAAW,KAAK,MAAM,EAAE,IAAI;EAC9C,UAAU,WAAW,UAAU,CAAC;CACjC;CAGA,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC3C,aAAa,KAAK,WAAW,EAAE,CAAC,UAAU,SAAS,gBAAgB,EAAE,CAAC;EACtE,aAAa,KAAK,WAAW,EAAE,CAAC,UAAU;CAC3C;CACA,aAAa;CAEb,MAAM,MAAM,IAAI,WAAW,SAAS;CACpC,IAAI,SAAS;CACb,MAAM,iBAAsD,CAAC;CAG7D,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;EAC3C,MAAM,QAAQ,WAAW;EACzB,MAAM,WAAW,gBAAgB;EACjC,eAAe,KAAK;GAAE;GAAQ,OAAO;EAAE,CAAC;EAExC,SAAS,KAAK,QAAQ,SAAS;EAC/B,SAAS,KAAK,SAAS,GAAG,EAAE;EAC5B,SAAS,KAAK,SAAS,GAAG,CAAC;EAC3B,SAAS,KAAK,SAAS,GAAG,QAAQ,EAAE;EACpC,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG;EACpC,SAAS,KAAK,SAAS,IAAI,SAAS,MAAM;EAC1C,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM;EAC5C,SAAS,KAAK,SAAS,IAAI,MAAM,UAAU,MAAM;EACjD,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,IAAI,IAAI,MAAM,WAAW,SAAS,EAAE;EACpC,IAAI,IAAI,UAAU,SAAS,KAAK,MAAM,UAAU,MAAM;EACtD,UAAU,KAAK,MAAM,UAAU,SAAS,SAAS;CAClD;CAGA,MAAM,UAAU;CAChB,KAAK,MAAM,MAAM,gBAAgB;EAChC,MAAM,QAAQ,WAAW,GAAG;EAC5B,MAAM,WAAW,gBAAgB,GAAG;EAEpC,SAAS,KAAK,QAAQ,WAAW;EACjC,SAAS,KAAK,SAAS,GAAG,EAAE;EAC5B,SAAS,KAAK,SAAS,GAAG,EAAE;EAC5B,SAAS,KAAK,SAAS,GAAG,CAAC;EAC3B,SAAS,KAAK,SAAS,IAAI,QAAQ,GAAG,MAAM;EAC5C,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG;EACpC,SAAS,KAAK,SAAS,IAAI,SAAS,MAAM;EAC1C,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM;EAC5C,SAAS,KAAK,SAAS,IAAI,MAAM,UAAU,MAAM;EACjD,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,CAAC;EAC5B,SAAS,KAAK,SAAS,IAAI,GAAG,MAAM;EACpC,IAAI,IAAI,MAAM,WAAW,SAAS,EAAE;EACpC,UAAU,KAAK,MAAM,UAAU;CAChC;CAGA,MAAM,SAAS,SAAS;CACxB,SAAS,KAAK,QAAQ,QAAQ;CAC9B,SAAS,KAAK,SAAS,GAAG,CAAC;CAC3B,SAAS,KAAK,SAAS,GAAG,CAAC;CAC3B,SAAS,KAAK,SAAS,GAAG,WAAW,MAAM;CAC3C,SAAS,KAAK,SAAS,IAAI,WAAW,MAAM;CAC5C,SAAS,KAAK,SAAS,IAAI,MAAM;CACjC,SAAS,KAAK,SAAS,IAAI,OAAO;CAClC,SAAS,KAAK,SAAS,IAAI,CAAC;CAE5B,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,cAAc,SAAqB,MAA6B;CAC/E,MAAM,eAAe,eAAe,SAAS,IAAI;CACjD,IAAI,gBAAgB,MACnB,OAAO;CAER,OAAO,QAAQ,OAAO,QAAQ,MAAM,aAAa;AAClD;;;;;;;;AASA,SAAgB,aAAa,SAAqB,MAAc,SAAuB;CACtF,QAAQ,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAC7C;;AAGA,SAAgB,YAAwB;CACvC,OAAO,EAAE,OAAO,CAAC,EAAE;AACpB;;;;;;;;;;;AAYA,SAAgB,OAAO,SAAqB,MAAuB;CAClE,OAAO,eAAe,SAAS,IAAI,KAAK;AACzC;;;;AC7cA,MAAa,6BAA6B;AAC1C,MAAa,uBAAuB;AACpC,MAAa,gCAAgC;AAC7C,MAAa,6BAA6B;AAC1C,MAAa,qCAAqC;AAClD,MAAa,kCAAkC;AAC/C,MAAa,6BAA6B;AAG1C,SAAgB,eAAe,OAA2B,UAAkB,MAAsB;CACjG,IAAI,SAAS,MACZ,OAAO;CAER,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,GACtC,MAAM,IAAI,UAAU,oBAAoB,uBAAuB,KAAK,sCAAsC;CAE3G,OAAO;AACR;AAEA,SAAgB,0BAA0B,MAAc,OAAe,OAAqB;CAC3F,IAAI,QAAQ,OACX,MAAM,IAAI,UAAU,kBAAkB,gBAAgB,KAAK,SAAS,MAAM,iBAAiB,OAAO;AAEpG;AAEA,SAAgB,oBAAoB,UAAkB,MAAc,MAA8B;CACjG,MAAM,kBAAkB,eAAe,MAAM,iBAAiB,4BAA4B,iBAAiB;CAC3G,IAAI,KAAK,SAAS,iBACjB,MAAM,IAAI,UACT,kBACA,gBAAgB,SAAS,QAAQ,KAAK,OAAO,iBAAiB,iBAC/D;CAGD,MAAM,aAAa,eAAe,MAAM,YAAY,sBAAsB,YAAY;CACtF,MAAM,qBAAqB,eAC1B,MAAM,yBAEN,oBACD;CACA,MAAM,kBAAkB,eAAe,MAAM,iBAAiB,4BAA4B,iBAAiB;CAC3G,IAAI,WAAW;CACf,IAAI,QAAQ;CACZ,IAAI,SAAS;CACb,QAAQ,SAAS,KAAK,QAAQ,KAAK,SAAS,CAAC,OAAO,IAAI;EACvD,0BAA0B,GAAG,SAAS,OAAO,EAAE,UAAU,UAAU;EACnE,MAAM,cAAc,KAAK,QAAQ,KAAK,SAAS,CAAC;EAChD,MAAM,YAAY,gBAAgB,KAAK,KAAK,SAAS,SAAS,cAAc,SAAS;EACrF,IAAI,YAAY,iBACf,MAAM,IAAI,UACT,kBACA,gBAAgB,SAAS,cAAc,UAAU,iBAAiB,iBACnE;EAED,IAAI,gBAAgB,IACnB;EAED,IAAI,WAAW,SAAS;EACxB,OAAO,WAAW,eAAe,KAAK,WAAW,QAAQ,KAAK,IAC7D,EAAE;EAEH,MAAM,QAAQ,KAAK,WAAW,QAAQ;EACtC,MAAM,eAAe,UAAU;EAC/B,MAAM,4BAA4B,UAAU,MAAM,UAAU;EAC5D,MAAM,gBAAgB,KAAK,WAAW,cAAc,CAAC,MAAM;EAC3D,IAAI,cACH,QAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;OACvB,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,EAAE,QAAQ,oBACpE,MAAM,IAAI,UACT,kBACA,gBAAgB,SAAS,iBAAiB,MAAM,iBAAiB,oBAClE;EAED,SAAS;CACV;AACD;;;;AC5FA,MAAM,YAAY;AAGlB,MAAM,YAAY;AAElB,MAAM,YAAY;;AAGlB,MAAa,aAAa;;;;;AAM1B,MAAa,oFAAmC,MAAM,SAAS,IAAI,YAAY;AAG/E,MAAM,WAAW;;;;;;;;;;;AAYjB,SAAgB,YACf,KACA,WACA,SACA,MACsB;CACtB,MAAM,QAA6B,CAAC;CACpC,IAAI,UAAU;CACd,IAAI,WAAW;CAEf,OAAO,YAAY,IAAI,QAAQ,EAAE,SAChC,KAAK,WAAW,IAAI,WAAW,OAAO,OAAO,MAAM,aAAa,MAAM,aAAa,IAClF;CAGF,IAAI,CAAC,WACJ,MAAM,KAAK,IAAI,MAAM,GAAG,OAAO;CAEhC,IAAI,YAAY,IAAI,QACnB,OAAO;CAER,MAAM,yBAAyB,eAC9B,MAAM,wBACN,oCACA,wBACD;CACA,UAAU,YAAY;CACtB,IAAI;CACJ,IAAI,YAAY;CAChB,OAAQ,YAAY,UAAU,KAAK,GAAG,GAAI;EACzC,0BAA0B,iBAAiB,EAAE,WAAW,sBAAsB;EAE9E,MAAM,UAAU,UAAU,EAAE,CAAC,MAAM,CAAC;EACpC,IAAI,QAAQ;EAEZ,KAAK,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,EAAE,OACzC,IAAI,QAAQ,WAAW,KAAK,MAAM,IACjC;EAGF,IAAI,WAAW,QAAQ,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK;EAE5C,OAAO,QAAQ,WAAW,QAAQ,CAAC,MAAM,IACxC,EAAE;EAGH,MAAM,eAAe,UAAU,QAAQ,WAAW,QAAQ,CAAC,OAAO,MAAM,YAAY,KAAK,IAAI;EAC7F,MAAM,YAAY,QAAQ,MAAM,QAAQ,IAAI,aAAa,QAAQ,SAAS,WAAW;EAGrF,IAAI,WAAW;EACf,KAAK,WAAW,GAAG,WAAW,SAAS,QAAQ,EAAE,UAChD,IAAI,SAAS,WAAW,QAAQ,MAAM,IACrC;EAGF,IAAI,aAAa,SAAS,QAAQ;GAEjC,IAAI,SAAS,QAAQ,GAAG,IAAI,GAC3B,WAAW,SAAS,MAAM,GAAG,SAAS,QAAQ,GAAG,CAAC;GAEnD,MAAM,YAAY;GAClB,IAAI,CAAC,SACJ,MAAM,SAAS,YAAY,KAAK;EAElC,OAAO;GAGN,MAAM,aACJ,aAAa,KAAK,SAAS,MAAM,GAAG,CAAC,MAAM,UAAU,UAAU,MAAM,SAAS,MAAM,WAAW,CAAC;GAElG,IAAI,MAAM,cAAc,SAAS,MAAM,WAAW,GAAG,QAAQ,MAAM,OAClE;GAED,MAAM,aAAa;GACnB,IAAI,CAAC,SACJ,MAAM,UAAU,YAAY,KAAK;EAEnC;CACD;CACA,OAAO;AACR;;;;;;AAOA,SAAgB,eAAe,GAAmB;CACjD,OAAO,EAAE,QAAQ,UAAU,KAAK;AACjC;;;;;;;AAQA,SAAgB,gBAAgB,OAAqB;CACpD,QAAQ,OAAR;EACC,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,QACJ,OAAO;EACR,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,SACJ,OAAO;CACT;CACA,OAAO;AACR;;;;;ACjJA,MAAM,YAAoC;CACzC,UAAU;CACV,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,SAAS;AACV;;AAGA,MAAM,iBAAyC;CAC9C,MAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACN;AAGA,MAAM,WAAW;AAEjB,MAAM,YAAY;AAElB,MAAM,mBAAmB;AAEzB,MAAM,WAAW;AAGjB,MAAM,WAAW;;;;;AAMjB,SAAS,oBAAoB,WAA4B;CACxD,OACC,cAAc,KACd,cAAc,MACd,cAAc,MACb,aAAa,MAAQ,aAAa,SAClC,aAAa,SAAU,aAAa,SACpC,aAAa,SAAW,aAAa;AAExC;;;;;;AAOA,SAAS,eAAe,MAAsB;CAC7C,MAAM,MAAM;CACZ,MAAM,IAAI,IAAI,QAAQ,WAAW;CACjC,IAAI,MAAM,IAET,OAAO,IACL,QAAQ,WAAW,IAAI,IAAI,OAAO;EAElC,IAAI,UAAU,KACb,OAAO,UAAU;EAElB,MAAM,YAAY,OAAO,SAAS,MAAM,IAAI,KAAK,KAAK,EAAE;EACxD,OAAO,oBAAoB,SAAS,IAAI,OAAO,cAAc,SAAS,IAAI;CAC3E,CAAC,CAAC,CACD,QAAQ,YAAY,IAAI,MAAM;EAC9B,OAAO,OAAO,aAAa,SAAS,GAAG,EAAE,CAAC;CAC3C,CAAC;CAGH,MAAM,cAAc,IAAI,QAAQ,KAAK;CACrC,OAAO,eAAe,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,GAAG,WAAW,IAAI,eAAe,IAAI,MAAM,cAAc,CAAC,CAAC;AACnH;;;;;;;AAQA,SAAgB,YAAY,MAAc,MAAwB;CACjE,MAAM,MAAM,eAAe,IAAI;CAC/B,OAAO,OAAO,IAAI,QAAQ,SAAS,IAAI,IAAI;AAC5C;;;;;;;;AASA,SAAgB,UAAU,MAAsB;CAE/C,OACCC,KACE,QAAQ,WAAW,SAAS,eAAe,KAAK,CAAC,CAGjD,QAAQ,wBAAwB,SAAS,CAAC,CAC1C,QAAQ,WAAW,SAAS,QAAQ,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,EAAC,CAAE,MAAM,EAAE,IAAI,GAAG;AAEhG;AAcA,MAAM,eAAe;;;;;;;;AASrB,SAAgB,WAAW,MAAsB;CAEhD,OAAOA,KACL,QAAQ,WAAW,SAAS,eAAe,KAAK,CAAC,CACjD,QAAQ,OAAO,OAAO,CAAC,CACvB,QAAQ,eAAe,SAAS,SAAS,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,EAAC,CAAE,MAAM,EAAE,IAAI,GAAG;AACpG;;AAGA,MAAM,WAA+B;CACpC,CAAC,QAAQ,GAAG;CACZ,CAAC,UAAU,GAAQ;CACnB,CAAC,QAAQ,IAAG;CACZ,CAAC,QAAQ,GAAG;CACZ,CAAC,MAAM,GAAG;CACV,CAAC,MAAM,GAAG;CACV,CAAC,OAAO,GAAG;AACZ,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,OAAO,MAAM,OAAO,KAAK,IAAI,GAAG,EAAE,CAAC;;;;ACzI9D,MAAM,UAAU;;;;;;;;;AAUhB,SAAgB,YAAY,SAAiB,SAAyB;CACrE,OACC,MAAM,WAAW,QAAQ,MAAM,OAAO,IAAI,4BAA0B,MAAM,MAAM,UAAU,OAAO,UAAU;AAE7G;;;;;;AAOA,SAASC,sBAAoB,YAA4C;CACxE,OAAO,OAAO,KAAK,UAAU,CAAC,CAC5B,KAAK,QAAQ,MAAM,MAAM,QAAO,WAAW,OAAO,IAAG,CAAC,CACtD,KAAK,EAAE;AACV;AAEA,MAAM,4BAAoD;CACzD,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAK;CACL,KAAK;AACN;AAKA,MAAM,2BAA2B;;AAGjC,SAAgB,oBAAoB,OAAuB;CAC1D,OAAO,MAAM,QAAQ,2BAA2B,cAAc;EAC7D,OACC,0BAA0B,cAAc,QAAQ,UAAU,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,IAAI;CAE1G,CAAC;AACF;AAEA,SAAS,qBAAqB,YAA4C;CACzE,OAAO,OAAO,KAAK,UAAU,CAAC,CAC5B,KAAK,QAAQ,MAAM,MAAM,QAAO,oBAAoB,WAAW,IAAI,IAAI,IAAG,CAAC,CAC3E,KAAK,EAAE;AACV;;;;;AAMA,SAAgB,iBAAiB,SAAiB,SAAiB,YAAoD;CACtH,OACC,MACA,WACC,cAAc,OAAO,qBAAqB,UAAU,IAAI,MACzD,MACA,UACA,OACA,UACA;AAEF;;;;;;;;;;AAWA,SAAgB,gBACf,SACA,SACA,YACS;CACT,OACC,MACA,WACC,cAAc,OAAOA,sBAAoB,UAAU,IAAI,OAEvD,WAAW,QACR,QAAQ,MAAM,OAAO,IAAI,4BAA0B,MAAM,MAAM,UAAU,OAAO,UACjF,OACH;AAEF;;;;;;;;AASA,SAAgB,iBAAiB,MAAY,cAAgC;CAC5E,IAAI;EAEH,OAAO,KAAK,YAAY,CAAC,CAAC,QAAQ,SAAS,EAAE;CAC9C,SAAS,OAAO;EACf,IAAI,cACH,MAAM;CAER;CACA,OAAO;AACR;;;;;;;;;;;;;AAcA,SAAgB,iBAAiB,OAAY,MAAwB;CACpE,QAAQ,OAAO,OAAf;EACC,KAAK,UAAU;GACd,IAAI,SAAS,gBAAgB,aAAa,UAAU,KAAK,CAAC;GAC1D,IAAI,MAEH,SAAS,OAAO,QAAQ,WAAW,SAAS;GAE7C,OAAO;EACR;EACA,KAAK,UAEJ,OAAO,iBAAiB,QAAQ,OAAO,QAAQ,UAAU,SAAS,UAAU,OAAO,KAAK,CAAC,CAAC;EAC3F,KAAK,WACJ,OAAO,gBAAgB,WAAW,QAAQ,SAAS,OAAO;CAC5D;CACA,IAAI,iBAAiB,MACpB,OAAO,gBAAgB,eAAe,iBAAiB,KAAK,CAAC;CAE9D,MAAM,IAAI,UAAU,oBAAoB,yBAAyB,OAAO,KAAK,CAAC;AAC/E;;;;;;;;ACrJA,MAAa,QAAgC;CAC5C,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,IAAI;CACJ,MAAM;CACN,OAAO;CACP,IAAI;CACJ,SAAS;CACT,UAAU;CACV,IAAI;CACJ,GAAG;CACH,KAAK;CACL,IAAI;CACJ,KAAK;CACL,KAAK;AACN;;;;;;AAOA,MAAa,aAAa;CACzB;CACA;CACA;CACA;AACD;;;;;;AAOA,MAAa,OAAO;CACnB,IAAI;CACJ,OAAO;CACP,YAAY;CACZ,OAAO;CACP,KAAK;CACL,MAAM;CACN,YAAY;CACZ,WAAW;CACX,YAAY;CACZ,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,SAAS;CACT,MAAM;CACN,OAAO;AACR;;;;ACpDA,MAAM,UAAU;;;;;AAMhB,MAAM,mBAA2C;CAChD,8EAA8E;CAC9E,wDAAwD;CACxD,2DAA2D;CAC3D,wDAAwD;CACxD,iFAAiF;CACjF,6EAA6E;CAC7E,sCAAsC;CACtC,8EAA8E;CAC9E,uCAAuC;CACvC,2CAA2C;CAC3C,uCAAuC;CACvC,+EAA+E;CAC/E,wCAAwC;CACxC,iFAAiF;CACjF,0CAA0C;CAC1C,0EAA0E;CAC1E,mCAAmC;CACnC,8DAA8D;CAC9D,uEAAuE;CACvE,yEAAyE;CACzE,4EAA4E;CAC5E,qCAAqC;CACrC,iDAAiD;CACjD,uCAAuC;CACvC,iFAAiF;CACjF,0CAA0C;CAC1C,sCAAsC;CACtC,6EAA6E;CAC7E,2DAA2D;CAC3D,wCAAwC;CACxC,gFAAgF;CAChF,yCAAyC;CACzC,6DAA6D;CAC7D,4DAA4D;AAC7D;;;;;AAMA,MAAM,UAAkD;CACvD,WAAW;EACV,MAAM;EACN,MAAM;CACP;CACA,MAAM,EACL,MAAM,gFACP;CACA,UAAU,EACT,MAAM,2EACP;CACA,QAAQ,EACP,MAAM,4EACP;CACA,QAAQ,EACP,MAAM,6EACP;CACA,SAAS,EACR,MAAM,8EACP;CACA,QAAQ,EACP,MAAM,0CACP;CACA,UAAU,EACT,MAAM,gFACP;CACA,QAAQ,EACP,MAAM,yEACP;AACD;;;;;AAuCA,SAAgB,qBAAmC;CAClD,OAAO;EACN,WAAW,CAAC;EACZ,QAAQ,CAAC;EACT,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,QAAQ,CAAC;EACT,MAAM,CAAC;EACP,MAAM,CAAC;EACP,UAAU,CAAC;EACX,kBAAkB,CAAC;EACnB,OAAO,CAAC;EACR,WAAW,CAAC;EACZ,UAAU,CAAC;EACX,WAAW,CAAC;EACZ,QAAQ,CAAC;EACT,QAAQ,CAAC;EACT,YAAY,CAAC;EACb,KAAK,CAAC;EACN,UAAU,CAAC;EACX,UAAU,CAAC;EACX,QAAQ,CAAC;EACT,OAAO;CACR;AACD;;;;;;;;;;AAWA,SAAgB,kBAAkB,MAAiC,MAAsC;CACxG,MAAM,KAAK,mBAAmB;CAC9B,IAAI,CAAC,MACJ,OAAO;CAER,MAAM,QAAgC,CAAC;CACvC,MAAM,UAAU,KAAK,MAAM,aAAa,KAAK,CAAC;CAC9C,KAAK,MAAM,KAAK,SAAS;EACxB,MAAM,IAAI,YAAY,GAAG,QAAW,QAAW,IAAI;EAEnD,QAAS,EAAE,EAAE,CAAY,QAAQ,SAAS,GAAG,GAA7C;GACC,KAAK,SACJ;GACD,KAAK;IAEJ,GAAG,QAAQ,EAAE,WAAY,EAAE,EAAE,CAAY,MAAM,SAAS,KAAK,CAAC,IAAI,EAAE,EAAC,CAAE;IACvE;GACD,KAAK;IAEJ,MAAM,EAAE,UAAU,YAAY,KAAK,EAAE;IACrC;GACD,KAAK,aAEJ,IAAI,iBAAiB,EAAE,gBAAiB,GAAW,iBAAiB,EAAE,kBAAkB,QACvF,AAAC,GAAW,iBAAiB,EAAE,aAAa,CAAC,KAAK,EAAE,QAAQ;EAG/D;CACD;CACA,IAAI,GAAG,UAAU,MAAM,IACtB,MAAM,IAAI,UAAU,eAAe,wBAAwB,GAAG,KAAK;CAGpE,GAAG,YAAY,GAAG,WAAW,SAAS,IAAI,GAAG,WAAW,KAAK;CAC7D,GAAG,MAAM,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK;CAC3C,GAAG,QAAQ,GAAG,OAAO,SAAS,IAAI,GAAG,OAAO,KAAK;CACjD,GAAG,WAAW;CACd,OAAO;AACR;;;;;;AAOA,SAAS,iBAAiB,KAAuD;CAChF,MAAM,IAA8B,CAAC;CACrC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,GAAG,GAAG;EACzC,IAAI,CAAC,EAAE,IACN,EAAE,KAAK,CAAC;EAET,EAAE,EAAE,CAAC,KAAK,CAAC;CACZ;CACA,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,kBAAkB,IAAkB,MAAqC;CACxF,MAAM,UAAU,iBAAiB,gBAAgB;CACjD,MAAM,IAAc,CAAC;CAErB,EAAE,KAAK,UAAU;CACjB,EAAE,KACD,gBAAgB,SAAS,MAAM;EAC9B,OAAO,MAAM;EACb,aAAa,MAAM;EACnB,aAAa,MAAM;CACpB,CAAC,CACF;CAqBA,KAAK,MAAM,CAAC,KAAK,gBAAgB;EAjBhC,CAAC,OAAO,iBAAiB;EACzB,CAAC,OAAO,yDAAyD;EACjE,CAAC,OAAO,0DAA0D;EAClE,CAAC,QAAQ,0DAA0D;EACnE,CAAC,OAAO,WAAW;EACnB,CAAC,OAAO,WAAW;EACnB,CAAC,OAAO,WAAW;EACnB,CAAC,OAAO,aAAa;EACrB,CAAC,OAAO,aAAa;EACrB,CAAC,OAAO,YAAY;EACpB,CAAC,QAAQ,YAAY;EACrB,CAAC,OAAO,YAAY;EACpB,CAAC,QAAQ,YAAY;EACrB,CAAC,OAAO,iBAAiB;EACzB,CAAC,QAAQ,0DAA0D;CAG5B,GACvC,EAAE,KAAK,gBAAgB,WAAW,MAAM;EAAE,WAAW;EAAK,aAAa;CAAY,CAAC,CAAC;CAItF,MAAM,MAAM,MAAc;EACzB,IAAK,GAAW,MAAO,GAAW,EAAE,CAAC,SAAS,GAAG;GAChD,MAAM,IAAK,GAAW,EAAE,CAAC;GACzB,EAAE,KACD,gBAAgB,YAAY,MAAM;IACjC,WAAW,EAAE,OAAO,MAAM,KAAK,OAAO;IACtC,aAAa,QAAQ,EAAE,GAAG,KAAK,YAAY,WAAW,QAAQ,EAAE,EAAE;GACnE,CAAC,CACF;EACD;CACD;CAGA,MAAM,MAAM,MAAc;EACzB,KAAK,MAAM,KAAM,GAAW,MAAM,CAAC,GAClC,EAAE,KACD,gBAAgB,YAAY,MAAM;GACjC,WAAW,EAAE,OAAO,MAAM,KAAK,OAAO;GACtC,aAAa,QAAQ,EAAE,GAAG,KAAK,YAAY,WAAW,QAAQ,EAAE,EAAE;EACnE,CAAC,CACF;CAEF;CAGA,MAAM,MAAM,MAAc;EACzB,KAAK,MAAM,KAAM,GAAW,MAAM,CAAC,GAClC,EAAE,KACD,gBAAgB,YAAY,MAAM;GACjC,WAAW,EAAE,OAAO,MAAM,KAAK,OAAO;GACtC,aAAa,QAAQ,EAAE,GAAG;EAC3B,CAAC,CACF;CAEF;CAGA,GAAG,WAAW;CACd,GAAG,QAAQ;CACX,GAAG,QAAQ;CACX,GAAG,QAAQ;CACX,GAAG,MAAM;CACT,GAAG,QAAQ;CACX,GAAG,WAAW;CACd,GAAG,UAAU;CACb,GAAG,WAAW;CACd,GAAG,KAAK;CACR,GAAG,UAAU;CACb,GAAG,kBAAkB;CACrB,GAAG,UAAU;CACb,GAAG,UAAU;CACb,GAAG,QAAQ;CAGX,IAAI,EAAE,SAAS,GAAG;EACjB,EAAE,KAAK,UAAU;EAEjB,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,MAAM,GAAG;CAC9B;CACA,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;;;;;;;;AC/RA,SAASC,eAAa,QAAgB,UAA0B;CAC/D,IAAI,OAAO,OAAO,CAAC,MAAM,KACxB,OAAO;CAIR,MAAM,SADO,SAAS,MAAM,GAAG,SAAS,YAAY,GAAG,IAAI,CACzC,IAAI,OAAM,CAAE,MAAM,GAAG;CACvC,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,KAAK,OACf,IAAI,MAAM,MACT,SAAS,IAAI;MACP,IAAI,MAAM,KAChB,SAAS,KAAK,CAAC;CAGjB,OAAO,SAAS,KAAK,GAAG;AACzB;;;;;;;AAQA,SAAgB,YAAY,MAAsB;CACjD,MAAM,IAAI,KAAK,YAAY,GAAG;CAC9B,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC,IAAI;AAC9D;;;;;;;;;AAUA,SAAgB,mBACf,MACA,iBACA,MACgB;CAChB,MAAM,OAAO,EAAE,OAAO,CAAC,EAAE;CACzB,IAAI,CAAC,MACJ,OAAO;CAGR,IAAI,gBAAgB,OAAO,CAAC,MAAM,KACjC,kBAAkB,MAAM;CAGzB,MAAM,UAAU,KAAK,MAAM,aAAa,KAAK,CAAC;CAC9C,KAAK,MAAM,KAAK,SAAS;EACxB,MAAM,IAAI,YAAY,GAAG,QAAW,QAAW,IAAI;EACnD,IAAI,EAAE,OAAO,iBAAiB;GAC7B,MAAM,MAAgB;IACrB,MAAM,EAAE;IACR,QAAQ,YAAY,EAAE,MAAM;IAC5B,IAAI,EAAE;GACP;GACA,IAAI,EAAE,YACL,IAAI,aAAa,EAAE;GAGpB,MAAM,gBAAgB,EAAE,eAAe,aAAa,EAAE,SAASA,eAAa,EAAE,QAAQ,eAAe;GACrG,AAAC,KAAa,iBAAiB;GAC/B,KAAK,MAAM,CAAC,EAAE,MAAM;EACrB;CACD;CACA,OAAO;AACR;;;;;;AAOA,SAAgB,mBAAmB,MAA6B;CAC/D,MAAM,IAAc,CACnB,YACA,gBAAgB,iBAAiB,MAAM,EACtC,OAAO,MAAM,KACd,CAAC,CACF;CACA,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,GACxC,EAAE,KAAK,gBAAgB,gBAAgB,MAAM,KAAK,MAAM,CAAC,IAAW,CAAC;CAGtE,IAAI,EAAE,SAAS,GAAG;EACjB,EAAE,KAAK,kBAAkB;EAEzB,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,MAAM,GAAG;CAC9B;CACA,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;;;;;;;;;AAcA,SAAgB,gBACf,MACA,KACA,GACA,MACA,YACS;CACT,IAAI,CAAC,KAAK,QACT,AAAC,KAAa,SAAS,CAAC;CAEzB,IAAI,CAAE,KAAa,SAClB,AAAC,KAAa,UAAU;CAGzB,IAAI,MAAM,GACT,KAAK,MAAO,KAAa,SAAS,KAAK,MAAM,CAAC,QAAQ,MAAM,EAAE;CAI/D,AAAC,KAAa,UAAU,MAAM;CAC9B,MAAM,SAAmB;EACxB,IAAI,QAAQ;EACZ,MAAM;EACN,QAAQ;CACT;CACA,IAAI,YACH,OAAO,aAAa;MACd,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,QAAQ,IAAI,IAAI,IAEvC,OAAO,aAAa;CAErB,IAAI,KAAK,MAAM,CAAC,OAAO,KACtB,MAAM,IAAI,UAAU,aAAa,wBAAwB,GAAG;CAE7D,KAAK,MAAM,CAAC,OAAO,MAAM;CAEzB,AAAC,MAAc,MAAM,OAAO,OAAM,CAAE,QAAQ,MAAM,GAAG,KAAK;CAC1D,OAAO;AACR;;;;;;;;;ACvKA,MAAM,aAA0C;CAC/C,CAAC,eAAe,UAAU;CAC1B,CAAC,oBAAoB,eAAe;CACpC,CAAC,eAAe,UAAU;CAC1B,CAAC,qBAAqB,YAAY;CAClC,CAAC,kBAAkB,aAAa;CAChC,CAAC,eAAe,UAAU;CAC1B,CAAC,cAAc,SAAS;CACxB,CAAC,cAAc,QAAQ;CACvB,CAAC,kBAAkB,UAAU;CAC7B,CAAC,iBAAiB,YAAY;CAC9B,CAAC,eAAe,UAAU;CAC1B,CAAC,cAAc,SAAS;CACxB,CAAC,YAAY,OAAO;CACpB;EAAC;EAAmB;EAAe;CAAM;CACzC;EAAC;EAAoB;EAAgB;CAAM;AAC5C;;;;;;;;AASA,SAAS,YAAY,MAAc,KAA4B;CAC9D,MAAM,OAAO,MAAM;CACnB,MAAM,QAAQ,OAAO,MAAM;CAC3B,MAAM,aAAa,KAAK,QAAQ,IAAI;CACpC,IAAI,eAAe,IAClB,OAAO;CAGR,MAAM,gBAAgB,KAAK,QAAQ,KAAK,UAAU;CAClD,IAAI,kBAAkB,IACrB,OAAO;CAER,MAAM,cAAc,KAAK,QAAQ,OAAO,aAAa;CACrD,IAAI,gBAAgB,IACnB,OAAO;CAER,OAAO,KAAK,MAAM,gBAAgB,GAAG,WAAW;AACjD;;;;;;;AAQA,SAAgB,oBAAoB,MAAuC;CAC1E,MAAM,IAAyB,CAAC;CAEhC,KAAK,MAAM,WAAW,YAAY;EACjC,MAAM,UAAU,YAAY,MAAM,QAAQ,EAAE;EAC5C,IAAI,WAAW,QAAQ,QAAQ,SAAS,GACvC,EAAE,QAAQ,MAAM,YAAY,OAAO;EAGpC,IAAI,QAAQ,OAAO,UAAU,EAAE,QAAQ,KACtC,EAAE,QAAQ,MAAM,IAAI,KAAK,EAAE,QAAQ,GAAG;CAExC;CAEA,OAAO;AACR;;;;;;;;;AAUA,SAAS,mBACR,SACA,OACA,YACA,OACA,SACO;CACP,IAAI,QAAQ,YAAY,QAAQ,SAAS,QAAQ,UAAU,IAC1D;CAED,QAAQ,WAAW;CACnB,QAAQ,UAAU,KAAK;CACvB,MAAM,KAAK,aAAa,gBAAgB,SAAS,OAAO,UAAU,IAAI,YAAY,SAAS,KAAK,CAAC;AAClG;;;;;;;;AASA,SAAgB,oBACf,IACA,MACS;CACT,MAAM,QAAkB,CACvB,YACA,gBAAgB,qBAAqB,MAAM;EAC1C,YAAY,MAAM;EAClB,YAAY,MAAM;EAClB,iBAAiB,MAAM;EACvB,kBAAkB,MAAM;EACxB,aAAa,MAAM;CACpB,CAAC,CACF;CACA,MAAM,UAA+B,CAAC;CACtC,IAAI,CAAC,MAAM,CAAC,MAAM,OACjB,OAAO,MAAM,KAAK,EAAE;CAIrB,IAAI,IAAI;EACP,IAAI,GAAG,eAAe,MACrB,mBACC,mBACA,OAAO,GAAG,gBAAgB,WAAW,GAAG,cAAc,iBAAiB,GAAG,aAAa,MAAM,GAAG,GAChG,EAAE,YAAY,iBAAiB,GAC/B,OACA,OACD;EAED,IAAI,GAAG,gBAAgB,MACtB,mBACC,oBACA,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe,iBAAiB,GAAG,cAAc,MAAM,GAAG,GACnG,EAAE,YAAY,iBAAiB,GAC/B,OACA,OACD;CAEF;CAGA,KAAK,MAAM,WAAW,YAAY;EACjC,IAAI,YACH,MAAM,QAAQ,QAAQ,OAAO,OAAO,KAAK,MAAM,QAAQ,MAAM,KAAM,GAAW,QAAQ,MAAM;EAE7F,IAAI,cAAc,MACjB,YAAY;OACN,IAAI,cAAc,OACxB,YAAY;OACN,IAAI,OAAO,cAAc,UAC/B,YAAY,OAAO,SAAS;EAE7B,IAAI,aAAa,MAChB,mBAAmB,QAAQ,IAAI,WAAW,MAAM,OAAO,OAAO;CAEhE;CAEA,IAAI,MAAM,SAAS,GAAG;EACrB,MAAM,KAAK,sBAAsB;EAEjC,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACtC;CACA,OAAO,MAAM,KAAK,EAAE;AACrB;;;;;;;;AClKA,MAAM,YAAwC;CAC7C;EAAC;EAAe;EAAe;CAAQ;CACvC;EAAC;EAAc;EAAc;CAAQ;CACrC;EAAC;EAAW;EAAW;CAAQ;CAC/B;EAAC;EAAe;EAAe;CAAQ;CACvC;EAAC;EAAW;EAAW;CAAQ;CAC/B;EAAC;EAAqB;EAAqB;CAAM;CACjD;EAAC;EAAa;EAAa;CAAM;CACjC;EAAC;EAAiB;EAAiB;CAAM;CACzC;EAAC;EAAa;EAAa;CAAM;AAClC;;;;;;;;AASA,SAAS,eAAe,MAAc,KAA4B;CACjE,MAAM,KAAK,IAAI,OAAO,gBAAgB,MAAM,qCAAqC,MAAM,GAAG;CAC1F,MAAM,IAAI,KAAK,MAAM,EAAE;CACvB,OAAO,IAAI,EAAE,KAAK;AACnB;;;;;;;;AASA,SAAgB,wBAAwB,MAAc,OAA0D;CAC/G,IAAI,CAAC,OACJ,QAAQ,CAAC;CAGV,KAAK,MAAM,WAAW,WAAW;EAChC,MAAM,MAAM,eAAe,MAAM,QAAQ,EAAE;EAC3C,QAAQ,QAAQ,IAAhB;GACC,KAAK;IACJ,IAAI,KACH,AAAC,MAAc,QAAQ,MAAM,YAAY,GAAG;IAE7C;GACD,KAAK,QACJ,AAAC,MAAc,QAAQ,MAAM,QAAQ;EAEvC;CACD;CAKA,MAAM,UAAU,KAAK,MAAM,0CAA0C;CACrE,MAAM,WAAW,KAAK,MAAM,4CAA4C;CACxE,IAAI,WAAW,UAAU;EACxB,MAAM,SAAS,SAAS,EAAE,CAAC,MAAM,mCAAmC;EACpE,IAAI,QAAQ;GACX,MAAM,QAAQ,OAAO,KAAK,UAAU;IACnC,MAAM,QAAQ,MAAM,MAAM,kCAAkC;IAC5D,OAAO,QAAQ,YAAY,MAAM,EAAE,IAAI;GACxC,CAAC;GAED,MAAM,UAAU,QAAQ,EAAE,CAAC,MAAM,uBAAuB;GACxD,IAAI,SAAS;IACZ,AAAC,MAAc,aAAa,SAAS,QAAQ,IAAI,EAAE;IACnD,AAAC,MAAc,aAAa,MAAM,MAAM,GAAI,MAAc,UAAU;GACrE;EACD;CACD;CAEA,OAAO;AACR;;;;;;;AAQA,SAAgB,wBAAwB,IAA6C;CACpF,MAAM,QAAkB,CAAC;CACzB,MAAM,eAAe;CACrB,IAAI,CAAC,IACJ,KAAK,CAAC;CAEP,GAAG,cAAc;CAEjB,MAAM,KAAK,UAAU;CACrB,MAAM,KACL,gBAAgB,cAAc,MAAM;EACnC,OAAO,MAAM;EACb,YAAY,MAAM;CACnB,CAAC,CACF;CAGA,KAAK,MAAM,WAAW,WAAW;EAChC,IAAI,GAAG,QAAQ,QAAQ,QACtB;EAED,IAAI;EACJ,QAAQ,QAAQ,IAAhB;GACC,KAAK;IACJ,YAAY,UAAU,OAAO,GAAG,QAAQ,GAAG,CAAC;IAC5C;GACD,KAAK,QACJ,YAAY,GAAG,QAAQ,MAAM,SAAS;EAExC;EACA,IAAI,cAAc,QACjB,MAAM,KAAK,aAAa,QAAQ,IAAI,SAAS,CAAC;CAEhD;CAIA,MAAM,KACL,aACC,gBACA,aACC,aACA,aAAa,cAAc,iCAAiC,IAC3D,aAAa,cAAc,aAAa,SAAS,OAAO,GAAG,UAAU,CAAC,CAAC,GACxE;EAAE,MAAM;EAAK,UAAU;CAAU,CAClC,CACD,CACD;CAGA,MAAM,KACL,aACC,iBACA,aACC,aACC,GAAG,WACF,KAAK,cAAsB,eAAe,UAAU,SAAS,IAAI,aAAa,CAAC,CAC/E,KAAK,EAAE,GACT;EAAE,MAAM,OAAO,GAAG,UAAU;EAAG,UAAU;CAAQ,CAClD,CACD,CACD;CAGA,IAAI,MAAM,SAAS,GAAG;EACrB,MAAM,KAAK,eAAe;EAE1B,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACtC;CACA,OAAO,MAAM,KAAK,EAAE;AACrB;;;;AC3JA,MAAM,YAAY;;;;;;;;;AAUlB,SAAgB,sBAAsB,MAAc,MAA+C;CAClG,MAAM,IAAyB,CAAC;CAChC,IAAI,OAAO;CACX,MAAM,UAAU,KAAK,MAAM,SAAS;CACpC,IAAI,SACH,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;EACxC,MAAM,SAAS,QAAQ;EACvB,MAAM,YAAY,YAAY,MAAM;EACpC,QAAQ,eAAe,UAAU,EAAE,GAAnC;GACC,KAAK,SACJ;GACD,KAAK,eACJ;GACD,KAAK;IACJ,OAAO,YAAY,UAAU,IAAI;IACjC;GACD,KAAK;IACJ,OAAO;IACP;GACD,SACC,IAAI,OAAO,QAAQ,MAAM,MAAM,GAAG;IAEjC,MAAM,SAAS,OAAO,MAAM,GAAG;IAC/B,MAAM,OAAO,OAAO,EAAE,CAAC,MAAM,CAAC;IAC9B,MAAM,OAAO,OAAO;IACpB,QAAQ,MAAR;KAEC,KAAK;KACL,KAAK;KACL,KAAK;MACJ,EAAE,QAAQ,YAAY,IAAI;MAC1B;KACD,KAAK;MACJ,EAAE,QAAQ,gBAAgB,IAAI;MAC9B;KAED,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;KACL,KAAK;MACJ,EAAE,QAAQ,SAAS,MAAM,EAAE;MAC3B;KAED,KAAK;KACL,KAAK;KACL,KAAK;MACJ,EAAE,QAAQ,WAAW,IAAI;MACzB;KAED,KAAK;KACL,KAAK;MACJ,EAAE,QAAQ,IAAI,KAAK,IAAI;MACvB;KAED,KAAK;KACL,KAAK;MACJ,EAAE,QAAQ,YAAY,IAAI;MAC1B;KACD;MAEC,IAAI,KAAK,MAAM,EAAE,MAAM,KACtB;MAED,IAAI,MAAM,OAAO,OAAO,YAAY,aACnC,QAAQ,KAAK,cAAc,QAAQ,MAAM,MAAM;IAElD;GACD;EACF;CACD;CAED,OAAO;AACR;;;;;;;;AASA,SAAgB,sBAAsB,IAA6C;CAClF,MAAM,QAAkB,CACvB,YACA,gBAAgB,cAAc,MAAM;EACnC,OAAO,MAAM;EACb,YAAY,MAAM;CACnB,CAAC,CACF;CACA,IAAI,CAAC,IACJ,OAAO,MAAM,KAAK,EAAE;CAGrB,IAAI,MAAM;CACV,KAAK,MAAM,YAAY,OAAO,KAAK,EAAE,GAAG;EACvC,EAAE;EACF,MAAM,KACL,gBAAgB,YAAY,iBAAiB,GAAG,WAAW,IAAI,GAAG;GACjE,OAAO;GACP,KAAK,OAAO,GAAG;GACf,MAAM,UAAU,QAAQ;EACzB,CAAC,CACF;CACD;CAEA,IAAI,MAAM,SAAS,GAAG;EACrB,MAAM,KAAK,eAAe;EAE1B,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACtC;CACA,OAAO,MAAM,KAAK,EAAE;AACrB;;;;;AC/FA,SAAS,mBAAmB,KAAa,MAA6C;CACrF,MAAM,OAA4B,CAAC;CACnC,MAAM,UAAU,IAAI,MAAM,aAAa;CACvC,IAAI,OAAO;CACX,IAAI,SACH,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;EACxC,MAAM,YAAY,YAAY,QAAQ,IAAI,QAAW,QAAW,IAAI;EACpE,QAAS,UAAU,EAAE,CAAY,QAAQ,UAAU,GAAG,GAAtD;GACC,KAAK;GACL,KAAK,WACJ;GAED,KAAK,WACJ,IAAI,CAAC,UAAU,KACd;GAEF,KAAK;GACL,KAAK;IACJ,KAAK,SAAS;IACd;GACD,KAAK,aACJ;GACD,KAAK;IACJ,KAAK,OAAO,UAAU;IACtB;GACD,KAAK;IACJ,KAAK,KAAK,UAAU;IACpB;GAED,KAAK,WACJ,IAAI,CAAC,UAAU,KACd;GAEF,KAAK;GACL,KAAK;IACJ,KAAK,SAAS;IACd;GACD,KAAK,aACJ;GAED,KAAK;IACJ,IAAI,CAAC,UAAU,KACd;IAED,QAAQ,UAAU,KAAlB;KACC,KAAK;MACJ,KAAK,OAAO;MACZ;KACD,KAAK;MACJ,KAAK,OAAO;MACZ;KACD,KAAK,oBACJ,KAAK,OAAO;IAEd;GAED,KAAK;GACL,KAAK;IACJ,KAAK,IAAI;IACT;GACD,KAAK,QACJ;GAED,KAAK,MACJ,IAAI,UAAU,QAAQ,KACrB;GAEF,KAAK;GACL,KAAK;IACJ,KAAK,IAAI;IACT;GACD,KAAK,QACJ;GAED,KAAK,MACJ,IAAI,UAAU,QAAQ,KACrB;GAEF,KAAK;GACL,KAAK;IACJ,KAAK,IAAI;IACT;GACD,KAAK,QACJ;GACD,KAAK;IACJ,IAAI,UAAU,KAEb,KAAK,QAAQ,UAAU,IAAI,MAAM,GAAG,CAAC;IAEtC;GACD,KAAK;GACL,KAAK;GACL,KAAK,YACJ;GACD,KAAK;IACJ,KAAK,SAAS,UAAU;IACxB;GACD,KAAK;IACJ,KAAK,SAAS,UAAU;IACxB;GACD,KAAK,WACJ;GAED,KAAK;GACL,KAAK;GACL,KAAK,aACJ;GACD,KAAK;IACJ,OAAO;IACP;GACD,KAAK;IACJ,OAAO;IACP;GACD,SAEC,IAAK,UAAU,EAAE,CAAY,WAAW,CAAC,MAAM,MAAM,CAAC,MACrD,MAAM,IAAI,UAAU,eAAe,8BAA8B,UAAU,EAAE;EAEhF;CACD;CAED,OAAO;AACR;;AAGA,MAAM,SAAS;;AAEf,MAAM,OAAO;;;;;AAMb,SAAS,uBAAuB,KAAa,KAAsC;CAClF,MAAM,KAAK,IAAI,OAAO,gBAAgB,MAAM,cAAc,GAAG;CAC7D,MAAM,QAAQ,IAAI,OAAO,mBAAmB,MAAM,KAAK,GAAG;CAC1D,MAAM,YAAY,GAAG,KAAK,GAAG;CAC7B,IAAI,CAAC,WACJ,OAAO;CAER,MAAM,WAAW,UAAU;CAC3B,MAAM,eAAe,GAAG;CACxB,MAAM,YAAY,GAAG;CACrB,MAAM,aAAa,MAAM,KAAK,GAAG;CACjC,IAAI,CAAC,YACJ,OAAO;CAER,MAAM,SAAS,WAAW;CAC1B,MAAM,aAAa,MAAM;CAEzB,OAAO,CAAC,IAAI,MAAM,UAAU,UAAU,GAAG,IAAI,MAAM,cAAc,MAAM,CAAC;AACzE;;;;;AAMA,SAAS,0BAA0B,KAAa,KAAqB;CACpE,MAAM,KAAK,IAAI,OAAO,gBAAgB,MAAM,cAAc,GAAG;CAC7D,MAAM,QAAQ,IAAI,OAAO,mBAAmB,MAAM,KAAK,GAAG;CAC1D,MAAM,MAAgB,CAAC;CACvB,IAAI,UAAU;CACd,IAAI;CACJ,OAAQ,YAAY,GAAG,KAAK,GAAG,GAAI;EAClC,IAAI,KAAK,IAAI,MAAM,SAAS,UAAU,KAAK,CAAC;EAC5C,MAAM,YAAY,GAAG;EAErB,IAAI,CADe,MAAM,KAAK,GAChB,GACb;EAED,UAAU,MAAM;EAChB,GAAG,YAAY,MAAM;CACtB;CACA,IAAI,KAAK,IAAI,MAAM,OAAO,CAAC;CAC3B,OAAO,IAAI,KAAK,EAAE;AACnB;;AAGA,SAAS,iBAAiB,GAAW,MAA2D;CAC/F,MAAM,YAAY,uBAAuB,GAAG,GAAG;CAC/C,IAAI,CAAC,WACJ,OAAO;EAAE,GAAG;EAAK,GAAG;CAAG;CAExB,MAAM,SAAc;EAAE,GAAG;EAAK,GAAG,YAAY,UAAU,EAAE;CAAE;CAE3D,MAAM,MAAM,uBAAuB,GAAG,KAAK;CAC3C,IAAI,KACH,OAAO,IAAI,mBAAmB,IAAI,IAAI,IAAI;CAE3C,OAAO;AACR;;AAGA,SAAS,kBAAkB,IAAY,MAA6D;CACnG,OAAO,GACL,QAAQ,QAAQ,EAAE,CAAC,CACnB,MAAM,IAAI,CAAC,CACX,KAAK,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAC,CACrC,QAAQ,MAAM,EAAE,CAAC;AACpB;;AAGA,SAAS,eAAe,IAAiD;CACxE,OAAO,GACL,KAAK,MAAM;EACX,IAAI,CAAC,EAAE,GACN,OAAO;EAER,MAAM,QAAkB,CAAC;EACzB,MAAM,QAAkB,CAAC;EACzB,IAAI,EAAE,GAAG;GACR,MAAM,OAAO,EAAE;GACf,MAAM,QAAkB,CAAC;GACzB,IAAI,KAAK,GACR,MAAM,KAAK,6BAA6B;GAEzC,IAAI,KAAK,MACR,MAAM,KAAK,0BAA0B,KAAK,OAAO,GAAG;GAErD,MAAM,WAAW,OAAO,KAAK,EAAE;GAC/B,IAAI,OAAO,SAAS,QAAQ,KAAK,WAAW,GAC3C,MAAM,KAAK,eAAe,WAAW,KAAK;GAE3C,IAAI,KAAK,SACR,MAAM,KAAK,uBAAuB;GAEnC,IAAI,KAAK,QACR,MAAM,KAAK,oBAAoB;GAEhC,MAAM,KAAK,mBAAkB,MAAM,KAAK,EAAE,IAAI,KAAI;GAClD,IAAI,KAAK,GAAG;IACX,MAAM,KAAK,KAAK;IAChB,MAAM,QAAQ,MAAM;GACrB;GACA,IAAI,KAAK,GAAG;IACX,MAAM,KAAK,KAAK;IAChB,MAAM,QAAQ,MAAM;GACrB;GACA,IAAI,KAAK,QAAQ;IAChB,MAAM,KAAK,KAAK;IAChB,MAAM,QAAQ,MAAM;GACrB;GAEA,IAAI,QAAQ;GACZ,IAAI,KAAK,WAAW,iBAAiB,KAAK,WAAW,SACpD,QAAQ;QACF,IAAI,KAAK,WAAW,aAC1B,QAAQ;GAET,IAAI,OAAO;IACV,MAAM,KAAK,MAAM,QAAQ,GAAG;IAC5B,MAAM,QAAQ,OAAO,QAAQ,GAAG;GACjC;GACA,MAAM,KAAK,SAAS;EACrB;EACA,OAAO,MAAM,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC,IAAI,MAAM,KAAK,EAAE;CACxD,CAAC,CAAC,CACD,KAAK,EAAE;AACV;;AAGA,MAAM,WAAW;;AAEjB,MAAM,WAAW;AAEjB,MAAM,uCAAuB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;;AAGD,SAAgB,qBAAqB,GAAmB;CACvD,OAAO,EAAE,QAAQ,mCAAmC,KAAK,SAAiB,cACzE,qBAAqB,IAAI,SAAS,IAAI,MAAM,UAAU,YAAY,GACnE;AACD;;;;;AAMA,SAAgB,gBAAgB,GAAW,MAAkC;CAC5E,MAAM,OAAO,OAAO,KAAK,aAAa,QAAQ;CAC9C,MAAM,SAAc,CAAC;CACrB,IAAI,CAAC,GACJ,OAAO,EAAE,GAAG,GAAG;CAGhB,IAAI,EAAE,MAAM,uBAAuB,GAAG;EAErC,OAAO,IAAI,YAAY,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,MAAM,IAAI,IAAI;EACzF,OAAO,IAAI;EACX,IAAI,MACH,OAAO,IAAI,WAAW,OAAO,CAAC;CAEhC,OAAO,IAAI,EAAE,MAAM,QAAQ,GAAG;EAE7B,OAAO,IAAI;EAEX,MAAM,WAAW,0BAA0B,GAAG,KAAK;EACnD,SAAS,YAAY;EACrB,MAAM,UAAU,SAAS,MAAM,QAAQ,KAAK,CAAC;EAE7C,OAAO,IAAI,YAAY,QAAQ,KAAK,EAAE,CAAC,CAAC,QAAQ,eAAe,EAAE,GAAG,IAAI;EACxE,IAAI,MACH,OAAO,IAAI,eAAe,kBAAkB,UAAU,IAAI,CAAC;CAE7D;CACA,OAAO;AACR;;AAGA,MAAM,OACL;;;;;;;;;;;AAYD,SAAgB,YAAY,MAAc,MAA6B;CACtE,MAAM,UAAe,CAAC;CACtB,IAAI,CAAC,MACJ,OAAO;CAER,oBAAoB,qBAAqB,MAAM,IAAI;CAEnD,MAAM,MAAM,uBAAuB,MAAM,KAAK;CAC9C,IAAI,KAAK;EAER,KAAK,YAAY;EACjB,MAAM,cAAc,MAAM,KAAK,IAAI,EAAE,CAAC,SAAS,IAAI,IAAI,UAAU,MAAM,MAAM,EAAE;EAC/E,MAAM,uBAAuB,eAC5B,MAAM,sBACN,iCACA,sBACD;EACA,0BAA0B,sBAAsB,YAAY,QAAQ,oBAAoB;EACxF,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,EAAE,GAAG;GAC5C,MAAM,aAAa,gBAAgB,YAAY,EAAE,CAAC,KAAK,GAAG,IAAI;GAC9D,IAAI,cAAc,MACjB,QAAQ,QAAQ,UAAU;EAE5B;EAEA,MAAM,MAAM,YAAY,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAW,QAAW,IAAI;EACxF,QAAQ,QAAQ,IAAI;EACpB,QAAQ,SAAS,IAAI;CACtB;CACA,OAAO;AACR;;AAGA,MAAM,eAAe;;;;;;;;AASrB,SAAgB,YAAY,KAAU,MAAqC;CAC1E,IAAI,CAAC,KAAK,SACT,OAAO;CAER,MAAM,QAAkB,CAAC,UAAU;CACnC,MAAM,KACL,gBAAgB,OAAO,MAAM;EAC5B,OAAO,WAAW;EAClB,OAAO,OAAO,IAAI,KAAK;EACvB,aAAa,OAAO,IAAI,MAAM;CAC/B,CAAC,CACF;CACA,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,QAAQ,EAAE,GAAG;EACtC,IAAI,IAAI,MAAM,MACb;EAED,MAAM,QAAQ,IAAI;EAClB,IAAI,QAAQ;EACZ,IAAI,MAAM,GAET,SAAS,qBAAqB,MAAM,CAAC;OAC/B;GACN,SAAS;GACT,IAAI,CAAC,MAAM,GACV,MAAM,IAAI;GAEX,IAAI,OAAO,MAAM,MAAM,UACtB,MAAM,IAAI,OAAO,MAAM,CAAC;GAGzB,IAAI,MAAM,EAAE,MAAM,YAAY,GAC7B,SAAS;GAEV,SAAS,MAAM,UAAU,MAAM,CAAC,IAAI;EACrC;EACA,SAAS;EACT,MAAM,KAAK,KAAK;CACjB;CACA,IAAI,MAAM,SAAS,GAAG;EACrB,MAAM,KAAK,QAAQ;EAEnB,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACtC;CACA,OAAO,MAAM,KAAK,EAAE;AACrB;;;;;;;;;;;;;;ACrcA,SAAgB,gBAAgB,GAAoD;CACnF,IAAI,CAAC,GACJ,IAAI,CAAC;CAEN,EAAE,KAAK;CACP,EAAE,KAAK;CACP,EAAE,KAAK;CACP,EAAE,KAAK;CACP,EAAE,KAAK;CACP,EAAE,KAAK;CACP,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CACR,EAAE,MAAM;CAER,EAAE,MAAM;CACR,OAAO;AACR;;AAGA,IAAW,cAAsC,gBAAgB;;;;;;;;;;AAWjE,MAAa,qBAA6C;CAEzD,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CAEH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACL;;;;;;;AAQA,MAAa,yBAAiD;CAC7D,GAAG;CACH,IAAI;CACJ,GAAG;CACH,IAAI;CACJ,GAAG;CACH,IAAI;CACJ,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACL;;;;;;;;;;;AAYA,SAAgB,WAAW,KAAa,KAAsB;CAC7D,IAAI,OAAO,QAAQ,UAAU;EAC5B,MAAM,OAAO,GAAG,KAAK;EAErB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAQ,EAAE,GAAG;GAChC,IAAI,YAAY,OAAO,QAAW;IACjC,IAAI,MAAM,GACT,MAAM;IAEP;GACD;GACA,IAAI,YAAY,OAAO,KAAK;IAC3B,MAAM;IACN;GACD;EACD;EACA,IAAI,MAAM,GACT,MAAM;CAER;CACA,YAAY,OAAO;CACnB,OAAO;AACR;;;;;AAMA,SAAgB,gBAAgB,KAAmC;CAClE,KAAK,IAAI,IAAI,GAAG,IAAI,KAAQ,EAAE,GAC7B,IAAI,IAAI,OAAO,QACd,WAAW,IAAI,IAAI,CAAC;AAGvB;;;;;;AAOA,SAAgB,mBAAyB;CACxC,cAAc,gBAAgB;AAC/B;;;;AC9GA,MAAM,eAAyB;CAAE,MAAM;CAAW,MAAM;AAAG;AAC3D,MAAM,eAAyB,CAAC;AAChC,MAAM,eAAyB,EAAE,aAAa,QAAQ;AACtD,MAAM,iBAA6B,CAAC;AAEpC,SAAS,SAAS,OAAwB;CACzC,IAAI,SAAS,MACZ,OAAO;CAER,IAAI,OAAO,UAAU,UACpB,OAAO,KAAK,UAAU,KAAK;CAE5B,IAAI,MAAM,QAAQ,KAAK,GACtB,OAAO,MAAM,MAAM,IAAI,QAAQ,CAAC,CAAC,KAAK,GAAG,IAAI;CAE9C,MAAM,SAAS;CACf,OACC,MACA,OAAO,KAAK,MAAM,CAAC,CACjB,KAAK,CAAC,CACN,QAAQ,QAAQ,OAAO,SAAS,MAAS,CAAC,CAC1C,KAAK,QAAQ,KAAK,UAAU,GAAG,IAAI,MAAM,SAAS,OAAO,IAAI,CAAC,CAAC,CAC/D,KAAK,GAAG,IACV;AAEF;AAEA,SAAS,eAAe,OAAoB,MAAoC;CAC/E,MAAM,MAAM,OAAO,QAAQ,OAAO;CAClC,IAAI,CAAC,KACJ;CAED,MAAM,aAAa,IAAI,QAAQ,MAAM,EAAE,CAAC,CAAC,YAAY;CACrD,IAAI,MAAM;CACV,IAAI,gBAAgB,KAAK,UAAU,GAClC,MAAM,OAAO;MACP,IAAI,gBAAgB,KAAK,UAAU,GACzC,MAAM;MACA;EACN,IAAI,MAAM,KACT,MAAM,IAAI,UAAU,eAAe,8BAA8B,GAAG;EAErE;CACD;CACA,OAAO,EAAE,IAAI;AACd;AAEA,SAAS,cAAc,MAAiB,MAAkC;CACzE,IAAI,CAAC,MACJ;CAED,MAAM,MAAgB,CAAC;CACvB,IAAI,KAAK,MACR,IAAI,OAAO,KAAK;CAEjB,IAAI,OAAO,KAAK,SAAS,UACxB,IAAI,OAAO,KAAK;CAEjB,IAAI,KAAK,MACR,IAAI,OAAO;CAEZ,MAAM,QAAQ,eAAe,KAAK,OAAO,IAAI;CAC7C,IAAI,OACH,IAAI,QAAQ;CAEb,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,MAAM;AAC5C;AAEA,SAAS,cAAc,MAAiB,MAAkC;CACzE,IAAI,CAAC,MACJ;CAED,IAAI,KAAK,eAAe,KAAK,gBAAgB,SAAS;EACrD,IAAI,MAAM,KACT,MAAM,IAAI,UAAU,eAAe,+BAA+B,KAAK,WAAW;EAEnF;CACD;CACA,MAAM,QAAQ,eAAe,KAAK,SAAS,IAAI;CAC/C,IAAI,CAAC,OACJ;CAED,OAAO;EAAE,aAAa;EAAS,SAAS;CAAM;AAC/C;AAEA,SAAS,gBAAgB,QAAqB,MAAoC;CACjF,IAAI,CAAC,QACJ;CAED,MAAM,MAAkB,CAAC;CACzB,KAAK,MAAM,QAAQ;EAAC;EAAO;EAAS;EAAU;CAAM,GAAY;EAC/D,MAAM,QAAQ,OAAO;EACrB,IAAI,CAAC,OACJ;EAED,IAAI,MAAM,UAAU,UAAU,MAAM,UAAU,UAAU;GACvD,IAAI,MAAM,KACT,MAAM,IAAI,UAAU,eAAe,+BAA+B,MAAM,KAAK;GAE9E;EACD;EACA,MAAM,QAAQ,eAAe,MAAM,OAAO,IAAI;EAC9C,IAAI,QAAQ,QAAQ;GAAE,OAAO,MAAM;GAAO;EAAM,IAAI,EAAE,OAAO,MAAM,MAAM;CAC1E;CACA,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,MAAM;AAC5C;AAEA,SAAS,mBAAmB,WAA2B,MAAuC;CAC7F,IAAI,CAAC,WACJ;CAED,MAAM,MAAqB,CAAC;CAC5B,IAAI,UAAU,eAAe,UAAU,UAAU,eAAe,YAAY,UAAU,eAAe,SACpG,IAAI,aAAa,UAAU;MACrB,IAAI,UAAU,cAAc,MAAM,KACxC,MAAM,IAAI,UAAU,eAAe,uCAAuC,UAAU,UAAU;CAE/F,IAAI,UAAU,aAAa,SAAS,UAAU,aAAa,YAAY,UAAU,aAAa,UAC7F,IAAI,WAAW,UAAU;MACnB,IAAI,UAAU,YAAY,MAAM,KACtC,MAAM,IAAI,UAAU,eAAe,qCAAqC,UAAU,QAAQ;CAE3F,IAAI,UAAU,UACb,IAAI,WAAW;CAEhB,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,IAAI,MAAM;AAC5C;AAEA,SAAS,mBAAmB,MAAkB,MAA6C;CAC1F,MAAM,QAAQ,KAAK;CACnB,MAAM,MAA2B,CAAC;CAClC,IAAI,OAAO;EACV,IAAI,OAAO,cAAc,MAAM,MAAM,IAAI;EACzC,IAAI,OAAO,cAAc,MAAM,MAAM,IAAI;EACzC,IAAI,SAAS,gBAAgB,MAAM,QAAQ,IAAI;EAC/C,IAAI,YAAY,mBAAmB,MAAM,WAAW,IAAI;EACxD,IAAI,MAAM,UAAU,MACnB,IAAI,SAAS,MAAM;CAErB;CACA,IAAI,IAAI,UAAU,QAAQ,KAAK,KAAK,MACnC,IAAI,SAAS,KAAK;CAEnB,IAAI,IAAI,UAAU,QAAQ,KAAK,IAAI,UAAU,MAC5C,IAAI,SAAS,KAAK,GAAG;CAEtB,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,MAAM,QAAS,IAAY,SAAS,MAAS,IAAI,MAAM;AAChF;AAEA,SAAS,SAAY,OAAY,MAA2B,OAAkB;CAC7E,MAAM,MAAM,SAAS,KAAK;CAC1B,MAAM,WAAW,KAAK,IAAI,GAAG;CAC7B,IAAI,YAAY,MACf,OAAO;CAER,MAAM,KAAK,MAAM;CACjB,MAAM,KAAK,KAAK;CAChB,KAAK,IAAI,KAAK,EAAE;CAChB,OAAO;AACR;AAEA,SAAS,mBAAmB,QAAoC;CAC/D,KAAK,MAAM,OAAO,OAAO,KAAK,WAAW,GACxC,IAAI,YAAY,CAAC,SAAS,QACzB,OAAO,CAAC;AAIX;AAEA,SAAS,YACR,QACA,eACA,SACS;CACT,IAAI,UAAU,MACb,OAAO;CAER,IAAI,OAAO,WAAW,UACrB,OAAO;CAER,MAAM,UAAU,mBAAmB,MAAM;CACzC,IAAI,WAAW,MACd,OAAO;CAER,MAAM,WAAW,cAAc,IAAI,MAAM;CACzC,IAAI,YAAY,MACf,OAAO;CAER,IAAI,KAAK;CACT,OAAO,QAAQ,IAAI,EAAE,KAAK,YAAY,KACrC;CAED,cAAc,IAAI,QAAQ,EAAE;CAC5B,QAAQ,IAAI,IAAI,MAAM;CACtB,OAAO;AACR;AAEA,SAAS,kBAAkB,IAAe,UAA4C;CACrF,IAAI,GAAG,UAAU;EAChB,KAAK,MAAM,OAAO,GAAG,UAAU;GAC9B,IAAI,CAAC,KACJ;GAED,KAAK,MAAM,QAAQ,KAClB,IAAI,MACH,SAAS,IAAI;EAGhB;EACA;CACD;CACA,KAAK,MAAM,OAAO,OAAO,KAAK,EAAE,GAAG;EAClC,IAAI,IAAI,OAAO,CAAC,MAAM,KACrB;EAED,MAAM,OAAO,GAAG;EAChB,IAAI,MACH,SAAS,IAAI;CAEf;AACD;AAEA,SAAgB,mBAAmB,IAAc,MAA2B;CAC3E,MAAM,WAA0B;EAC/B,8BAAc,IAAI,QAAQ;EAC1B,yBAAS,IAAI,IAAI;EACjB,OAAO,CAAC,YAAY;EACpB,OAAO,CAAC,cAAc,YAAY;EAClC,SAAS,CAAC,cAAc;EACxB,SAAS,CAAC;GAAE,UAAU;GAAG,QAAQ;GAAG,QAAQ;GAAG,UAAU;EAAE,CAAC;EAC5D,WAAW;CACZ;CACA,MAAM,0BAAU,IAAI,IAAoB,CAAC,CAAC,SAAS,YAAY,GAAG,CAAC,CAAC,CAAC;CACrE,MAAM,0BAAU,IAAI,IAAoB,CACvC,CAAC,SAAS,YAAY,GAAG,CAAC,GAC1B,CAAC,SAAS,YAAY,GAAG,CAAC,CAC3B,CAAC;CACD,MAAM,4BAAY,IAAI,IAAoB,CAAC,CAAC,SAAS,cAAc,GAAG,CAAC,CAAC,CAAC;CACzE,MAAM,wBAAQ,IAAI,IAAoB,CAAC,CAAC,SAAS,SAAS,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;CAC1E,MAAM,gCAAgB,IAAI,IAAoB;CAE9C,KAAK,MAAM,aAAa,GAAG,YAAY;EACtC,MAAM,KAAK,GAAG,OAAO;EACrB,IAAI,CAAC,IACJ;EAED,kBAAkB,KAAK,SAAS;GAC/B,MAAM,aAAa,mBAAmB,MAAM,IAAI;GAChD,IAAI,CAAC,YACJ;GAED,MAAM,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS,WAAW,IAAI,IAAI;GACtF,MAAM,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,SAAS,WAAW,IAAI,IAAI;GACtF,MAAM,WAAW,WAAW,SAAS,SAAS,SAAS,SAAS,WAAW,WAAW,MAAM,IAAI;GAChG,MAAM,WAAW,YAAY,WAAW,QAAQ,eAAe,SAAS,OAAO;GAC/E,MAAM,KAAc;IAAE;IAAU;IAAQ;IAAQ;GAAS;GACzD,IAAI,aAAa,GAChB,GAAG,oBAAoB;GAExB,IAAI,WAAW,GACd,GAAG,YAAY;GAEhB,IAAI,WAAW,GACd,GAAG,YAAY;GAEhB,IAAI,aAAa,GAChB,GAAG,cAAc;GAElB,IAAI,WAAW,WAAW;IACzB,GAAG,YAAY,WAAW;IAC1B,GAAG,iBAAiB;GACrB;GACA,MAAM,UAAU,SAAS,SAAS,SAAS,OAAO,EAAE;GACpD,SAAS,aAAa,IAAI,MAAM,OAAO;GACvC,IAAI,YAAY,GACf,SAAS,YAAY;EAEvB,CAAC;CACF;CACA,OAAO;AACR;AAEA,SAAgB,kBAAkB,MAAW,MAAsC;CAClF,OAAO,MAAM,eAAe,cAAc,IAAI,IAAI;AACnD;;;;;AAMA,SAAS,mBAAmB,GAAW,QAAoB,OAAkB;CAC5E,MAAM,UAAU,EAAE,MAAM,aAAa;CACrC,IAAI,CAAC,SACJ;CAED,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;EACxC,MAAM,YAAY,YAAY,QAAQ,EAAE;EACxC,QAAQ,kBAAkB,UAAU,EAAE,GAAtC;GACC,KAAK,WAAW;IACf,MAAM,aAAa,YAAY,UAAU,UAAU;IACnD,MAAM,QAAQ,SAAS,UAAU,UAAU,EAAE;IAC7C,OAAO,UAAU,SAAS;IAC1B,IAAI,QAAQ,GAAG;KACd,IAAI,QAAQ,KAAO,CAEnB;KACA,WAAW,YAAY,KAAK;IAC7B;IACA;GACD;EACD;CACD;AACD;AAEA,SAAS,WAAW,KAAkD;CACrE,IAAI,IAAI,KACP,OAAO,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE;AAG9C;AAEA,SAAS,WAAW,GAAW,QAA0B;CACxD,MAAM,QAAQ,EAAE,MAAM,2EAA2E;CACjG,IAAI,CAAC,OACJ;CAED,KAAK,MAAM,WAAW,OAAO;EAC5B,MAAM,OAAiB,CAAC;EACxB,MAAM,OAAO,QAAQ,MAAM,0BAA0B;EACrD,IAAI,MAAM;GACT,MAAM,MAAM,YAAY,KAAK,EAAE;GAC/B,IAAI,IAAI,KACP,KAAK,OAAO,IAAI;EAElB;EACA,MAAM,OAAO,QAAQ,MAAM,wBAAwB;EACnD,IAAI,MAAM;GACT,MAAM,MAAM,YAAY,KAAK,EAAE;GAC/B,IAAI,IAAI,KACP,KAAK,OAAO,WAAW,IAAI,GAAG;EAEhC;EACA,IAAI,wBAAwB,KAAK,OAAO,GACvC,KAAK,OAAO;EAEb,MAAM,QAAQ,QAAQ,MAAM,2BAA2B;EACvD,IAAI,OAAO;GACV,MAAM,SAAS,WAAW,YAAY,MAAM,EAAE,CAAC;GAC/C,IAAI,QACH,KAAK,QAAQ;EAEf;EACA,OAAO,MAAM,KAAK,IAAI;CACvB;AACD;AAEA,SAAS,WAAW,GAAW,QAA0B;CACxD,MAAM,QAAQ,EAAE,MAAM,2EAA2E;CACjG,IAAI,CAAC,OACJ;CAED,KAAK,MAAM,WAAW,OAAO;EAC5B,MAAM,UAAU,QAAQ,MAAM,+BAA+B;EAC7D,MAAM,OAAiB,CAAC;EACxB,IAAI,SAEH;OADmB,YAAY,QAAQ,EAC1B,CAAC,CAAC,gBAAgB,SAAS;IACvC,KAAK,cAAc;IACnB,MAAM,KAAK,QAAQ,MAAM,6BAA6B;IACtD,IAAI,IAAI;KACP,MAAM,SAAS,WAAW,YAAY,GAAG,EAAE,CAAC;KAC5C,IAAI,QACH,KAAK,UAAU;IAEjB;GACD;;EAED,OAAO,MAAM,KAAK,IAAI;CACvB;AACD;AAEA,SAAS,gBAAgB,WAAmB,MAAuE;CAClH,MAAM,QAAQ,UAAU,MACvB,IAAI,OAAO,gBAAgB,OAAO,0CAA0C,OAAO,IAAI,CACxF;CACA,IAAI,CAAC,OACJ;CAED,MAAM,OAAO,MAAM,EAAE,CAAC,MAAM,SAAS;CACrC,IAAI,CAAC,MACJ;CAED,MAAM,MAAM,YAAY,KAAK,EAAE;CAC/B,IAAI,IAAI,UAAU,UAAU,IAAI,UAAU,UACzC;CAED,MAAM,QAAQ,MAAM,EAAE,CAAC,MAAM,2BAA2B;CACxD,MAAM,cAAc,QAAQ,WAAW,YAAY,MAAM,EAAE,CAAC,IAAI;CAChE,OAAO,cAAc;EAAE,OAAO,IAAI;EAAO,OAAO;CAAY,IAAI,EAAE,OAAO,IAAI,MAAM;AACpF;AAEA,SAAS,aAAa,GAAW,QAA0B;CAC1D,MAAM,UAAU,EAAE,MAAM,iFAAiF;CACzG,IAAI,CAAC,SACJ;CAED,KAAK,MAAM,aAAa,SAAS;EAChC,MAAM,SAAqB,CAAC;EAC5B,KAAK,MAAM,QAAQ;GAAC;GAAO;GAAS;GAAU;EAAM,GAAY;GAC/D,MAAM,SAAS,gBAAgB,WAAW,IAAI;GAC9C,IAAI,QACH,OAAO,QAAQ;EAEjB;EACA,OAAO,QAAQ,KAAK,MAAM;CAC3B;AACD;;;;;AAMA,SAAS,iBAAiB,GAAW,QAA0B;CAC9D,MAAM,UAAU,EAAE,MAAM,aAAa;CACrC,IAAI,CAAC,SACJ;CAED,IAAI,KAAyB;CAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;EACxC,MAAM,YAAY,YAAY,QAAQ,EAAE;EACxC,QAAQ,kBAAkB,UAAU,EAAE,GAAtC;GACC,KAAK;IACJ,KAAK;KACJ,UAAU,SAAS,UAAU,UAAU,EAAE,KAAK;KAC9C,QAAQ,SAAS,UAAU,QAAQ,EAAE,KAAK;KAC1C,QAAQ,SAAS,UAAU,QAAQ,EAAE,KAAK;KAC1C,UAAU,SAAS,UAAU,UAAU,EAAE,KAAK;KAC9C,MAAM,SAAS,UAAU,MAAM,EAAE,KAAK;IACvC;IACA,IAAI,UAAU,mBACb,GAAG,oBAAoB,UAAU,sBAAsB;IAExD,IAAI,UAAU,WACb,GAAG,YAAY,UAAU,cAAc;IAExC,IAAI,UAAU,WACb,GAAG,YAAY,UAAU,cAAc;IAExC,IAAI,UAAU,aACb,GAAG,cAAc,UAAU,gBAAgB;IAE5C,IAAI,UAAU,gBACb,GAAG,iBAAiB,UAAU,mBAAmB;IAElD,OAAO,OAAO,KAAK,EAAE;IACrB;GACD,KAAK,cACJ,IAAI,IAAI;IACP,MAAM,YAA2B,CAAC;IAClC,IACC,UAAU,eAAe,UACzB,UAAU,eAAe,YACzB,UAAU,eAAe,SAEzB,UAAU,aAAa,UAAU;IAElC,IACC,UAAU,aAAa,SACvB,UAAU,aAAa,YACvB,UAAU,aAAa,UAEvB,UAAU,WAAW,UAAU,aAAa,WAAW,WAAW,UAAU;IAE7E,IAAI,UAAU,aAAa,KAC1B,UAAU,WAAW;IAEtB,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC,SAAS,GACnC,GAAG,YAAY;GAEjB;EAEF;CACD;AACD;AAEA,SAAgB,eAAe,QAAoB,YAA2C;CAC7F,MAAM,KAAK,OAAO,OAAO;CACzB,IAAI,CAAC,IACJ;CAED,MAAM,QAAmB,CAAC;CAC1B,MAAM,OAAO,OAAO,MAAM,GAAG,UAAU;CACvC,IAAI,QAAQ,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GACtC,MAAM,OAAO;CAEd,MAAM,OAAO,OAAO,MAAM,GAAG,UAAU;CACvC,IAAI,QAAQ,KAAK,gBAAgB,WAAW,KAAK,SAChD,MAAM,OAAO;CAEd,MAAM,SAAS,OAAO,QAAQ,GAAG,YAAY;CAC7C,IAAI,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,GAC1C,MAAM,SAAS;CAEhB,IAAI,GAAG,WACN,MAAM,YAAY,GAAG;CAEtB,IAAI,GAAG,UACN,MAAM,SAAS,OAAO,UAAU,GAAG,aAAa,YAAY,GAAG,aAAa,GAAG;CAEhF,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,QAAQ;AAChD;;AAGA,SAAS,kBAAkB,KAAqB;CAC/C,OAAO,IAAI,QAAQ,SAAS,GAAG;AAChC;;;;;;;;;;;;AAaA,SAAgB,eAAe,MAAc,SAAe,MAAwB;CACnF,MAAM,SAAqB;EAC1B,WAAW,CAAC;EACZ,QAAQ,CAAC;EACT,OAAO,CAAC;EACR,OAAO,CAAC;EACR,SAAS,CAAC;CACX;CAEA,IAAI,CAAC,MACJ,OAAO;CAIR,MAAM,UAAU,KAAK,MAAM,uDAAuD;CAClF,IAAI,SACH,mBAAmB,QAAQ,IAAI,QAAQ,IAAI;CAG5C,MAAM,QAAQ,KAAK,MAAM,mDAAmD;CAC5E,IAAI,OACH,WAAW,MAAM,IAAI,MAAM;CAG5B,MAAM,QAAQ,KAAK,MAAM,mDAAmD;CAC5E,IAAI,OACH,WAAW,MAAM,IAAI,MAAM;CAG5B,MAAM,UAAU,KAAK,MAAM,uDAAuD;CAClF,IAAI,SACH,aAAa,QAAQ,IAAI,MAAM;CAIhC,MAAM,UAAU,KAAK,MAAM,uDAAuD;CAClF,IAAI,SACH,iBAAiB,QAAQ,IAAI,MAAM;CAGpC,OAAO;AACR;;;;;;;;;;;;AAaA,SAAgB,eAAe,KAAU,OAAoB;CAC5D,MAAM,QAAkB,CAAC,UAAU;CACnC,MAAM,WAAW,OAAO;CACxB,MAAM,KACL,gBAAgB,cAAc,MAAM;EACnC,OAAO,WAAW;EAClB,YAAY;CACb,CAAC,CACF;CAEA,MAAM,UAAU,UAAU,2BAAW,IAAI,IAAoB;CAC7D,IAAI,QAAQ,OAAO,GAClB,MAAM,KACL,sBACC,QAAQ,OACR,QACA,MAAM,KAAK,QAAQ,QAAQ,CAAC,CAAC,CAC3B,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAC3B,KAAK,CAAC,IAAI,UAAU,wBAAuB,KAAK,qBAAmB,UAAU,IAAI,IAAI,MAAK,CAAC,CAC3F,KAAK,EAAE,IACT,YACF;CAGD,MAAM,QAAQ,UAAU,SAAS,CAAC,YAAY;CAC9C,MAAM,KAAK,oBAAmB,MAAM,SAAS,QAAO,MAAM,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE,IAAI,UAAU;CAE9F,MAAM,QAAQ,UAAU,SAAS,CAAC,cAAc,YAAY;CAC5D,MAAM,KAAK,oBAAmB,MAAM,SAAS,QAAO,MAAM,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE,IAAI,UAAU;CAE9F,MAAM,UAAU,UAAU,WAAW,CAAC,cAAc;CACpD,MAAM,KAAK,sBAAqB,QAAQ,SAAS,QAAO,QAAQ,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,IAAI,YAAY;CAGxG,MAAM,KAAK,wGAA8F;CAEzG,MAAM,UAAU,UAAU,WAAW,CACpC;EAAE,UAAU;EAAG,QAAQ;EAAG,QAAQ;EAAG,UAAU;CAAE,GACjD;EAAE,UAAU;EAAG,QAAQ;EAAG,QAAQ;EAAG,UAAU;CAAE,CAClD;CACA,MAAM,KAAK,sBAAqB,QAAQ,SAAS,QAAO,QAAQ,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,IAAI,YAAY;CAGxG,MAAM,KAAK,8FAAsF;CAEjG,MAAM,KAAK,eAAe;CAE1B,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACrC,OAAO,MAAM,KAAK,EAAE;AACrB;AAEA,SAAS,UAAU,MAAwB;CAC1C,MAAM,QAAkB,CAAC;CACzB,MAAM,KAAK,gBAAe,KAAK,QAAQ,MAAM,MAAK;CAClD,IAAI,KAAK,OAAO,KACf,MAAM,KAAK,kBAAiB,KAAK,MAAM,MAAM,MAAK;MAElD,MAAM,KAAK,sBAAoB;CAEhC,MAAM,KAAK,iBAAgB,UAAU,KAAK,QAAQ,SAAS,IAAI,MAAK;CACpE,MAAM,KAAK,qBAAmB;CAC9B,IAAI,KAAK,MACR,MAAM,KAAK,MAAM;CAElB,OAAO,WAAW,MAAM,KAAK,EAAE,IAAI;AACpC;AAEA,SAAS,UAAU,MAAwB;CAC1C,IAAI,KAAK,gBAAgB,WAAW,KAAK,SAAS,KACjD,OACC,6DACA,KAAK,QAAQ,MACb;CAGF,IAAI,KAAK,gBAAgB,SACxB,OAAO;CAER,OAAO;AACR;AAEA,SAAS,YAAY,QAA4B;CAGhD,OAAO,aADK;EADG;EAAQ;EAAS;EAAO;CACvB,CAAC,CAAC,KAAK,SAAS,gBAAgB,MAAM,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,EACpD,IAAI;AAC3B;AAEA,SAAS,gBAAgB,MAAc,QAAmE;CACzG,IAAI,CAAC,QACJ,OAAO,MAAM,OAAO;CAErB,MAAM,QAAQ,OAAO,OAAO,MAAM,kBAAiB,OAAO,MAAM,MAAM,SAAQ;CAC9E,OAAO,MAAM,OAAO,cAAa,OAAO,QAAQ,QAAO,QAAQ,OAAO,OAAO;AAC9E;AAEA,SAAS,YAAY,IAAqB;CACzC,MAAM,QAAgC;EACrC,UAAU,OAAO,GAAG,QAAQ;EAC5B,QAAQ,OAAO,GAAG,MAAM;EACxB,QAAQ,OAAO,GAAG,MAAM;EACxB,UAAU,OAAO,GAAG,QAAQ;EAC5B,MAAM;CACP;CACA,IAAI,GAAG,mBACN,MAAM,oBAAoB;CAE3B,IAAI,GAAG,WACN,MAAM,YAAY;CAEnB,IAAI,GAAG,WACN,MAAM,YAAY;CAEnB,IAAI,GAAG,aACN,MAAM,cAAc;CAErB,IAAI,GAAG,gBACN,MAAM,iBAAiB;CAExB,IAAI,CAAC,GAAG,WACP,OAAO,gBAAgB,MAAM,MAAM,KAAK;CAEzC,MAAM,iBAAyC,CAAC;CAChD,IAAI,GAAG,UAAU,YAChB,eAAe,aAAa,GAAG,UAAU;CAE1C,IAAI,GAAG,UAAU,UAChB,eAAe,WAAW,GAAG,UAAU,aAAa,WAAW,WAAW,GAAG,UAAU;CAExF,IAAI,GAAG,UAAU,UAChB,eAAe,WAAW;CAE3B,OAAO,gBAAgB,MAAM,gBAAgB,aAAa,MAAM,cAAc,GAAG,KAAK;AACvF;;;;;;;;;;;;;;AC3wBA,SAAgB,gBAAgB,MAAyB;CACxD,MAAM,QAAmB,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,EAAE;CAG5D,MAAM,SAAmB,CAAC;CAC1B,MAAM,WAAW,KAAK,MAAM,6CAA6C;CACzE,IAAI,UAAU;EAEb,MAAM,WAAW;EACjB,IAAI;EACJ,OAAQ,IAAI,SAAS,KAAK,SAAS,EAAE,GACpC,OAAO,KAAK,EAAE,EAAE;CAElB;CACA,MAAM,cAAc,YAAY;CAEhC,OAAO;AACR;;;;;;;;;AAkBA,SAAgB,kBAA0B;CAEzC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BR;;;;;ACtCA,MAAM,aAAuC;CAC5C;EAAC;EAAqB;EAAO;CAAM;CACnC;EAAC;EAAwB;EAAM;CAAM;CACrC;EAAC;EAAc;EAAO;CAAM;CAC5B;EAAC;EAAsB;EAAO;CAAM;CACpC,CAAC,YAAY,EAAE;CACf;EAAC;EAAY;EAAO;CAAM;CAC1B;EAAC;EAAuB;EAAG;CAAK;CAChC;EAAC;EAAiB;EAAO;CAAM;CAC/B;EAAC;EAAsB;EAAO;CAAM;CACpC;EAAC;EAAqB;EAAO;CAAM;CACnC;EAAC;EAAgB;EAAO;CAAM;CAC9B;EAAC;EAAyB;EAAO;CAAM;CACvC;EAAC;EAA0B;EAAM;CAAM;CACvC;EAAC;EAA8B;EAAM;CAAM;CAC3C;EAAC;EAAqB;EAAM;CAAM;CAClC,CAAC,eAAe,KAAK;CACrB;EAAC;EAAwB;EAAO;CAAM;CACtC,CAAC,eAAe,SAAS;AAC1B;;AAGA,MAAM,YAAsC;CAC3C;EAAC;EAAa;EAAG;CAAK;CACtB;EAAC;EAA0B;EAAM;CAAM;CACvC;EAAC;EAAc;EAAG;CAAK;CACvB;EAAC;EAAa;EAAO;CAAM;CAC3B;EAAC;EAAwB;EAAM;CAAM;CACrC;EAAC;EAAiB;EAAM;CAAM;CAC9B;EAAC;EAAsB;EAAM;CAAM;CACnC;EAAC;EAAY;EAAK;CAAK;CACvB,CAAC,cAAc,SAAS;AACzB;;AAGA,MAAM,WAAqC,CAAC;;AAG5C,MAAM,YAAsC;CAC3C,CAAC,iBAAiB,MAAM;CACxB,CAAC,YAAY,MAAM;CACnB,CAAC,cAAc,MAAM;CACrB,CAAC,kBAAkB,MAAM;CACzB,CAAC,kBAAkB,OAAO;CAC1B,CAAC,iBAAiB,MAAM;CACxB,CAAC,WAAW,OAAO;CACnB,CAAC,gBAAgB,KAAK;CACtB,CAAC,gBAAgB,OAAO;CACxB,CAAC,WAAW,IAAI;AACjB;;;;;AAMA,SAAS,qBAAqB,QAAe,UAA0C;CACtF,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;EACvC,MAAM,QAAQ,OAAO;EACrB,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,EAAE,GAAG;GACzC,MAAM,aAAa,SAAS;GAC5B,IAAI,MAAM,WAAW,OAAO,MAC3B,MAAM,WAAW,MAAM,WAAW;QAElC,QAAQ,WAAW,IAAnB;IACC,KAAK;KACJ,IAAI,OAAO,MAAM,WAAW,QAAQ,UACnC,MAAM,WAAW,MAAM,gBAAgB,MAAM,WAAW,GAAG;KAE5D;IACD,KAAK,OACJ,IAAI,OAAO,MAAM,WAAW,QAAQ,UACnC,MAAM,WAAW,MAAM,SAAS,MAAM,WAAW,KAAK,EAAE;GAG3D;EAEF;CACD;AACD;;;;;AAMA,SAAS,cAAc,QAA6B,UAA0C;CAC7F,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,EAAE,GAAG;EACzC,MAAM,aAAa,SAAS;EAC5B,IAAI,OAAO,WAAW,OAAO,MAC5B,OAAO,WAAW,MAAM,WAAW;OAEnC,QAAQ,WAAW,IAAnB;GACC,KAAK;IACJ,IAAI,OAAO,OAAO,WAAW,QAAQ,UACpC,OAAO,WAAW,MAAM,gBAAgB,OAAO,WAAW,GAAG;IAE9D;GACD,KAAK,OACJ,IAAI,OAAO,OAAO,WAAW,QAAQ,UACpC,OAAO,WAAW,MAAM,SAAS,OAAO,WAAW,KAAK,EAAE;EAG7D;CAEF;AACD;;;;;;AAOA,SAAgB,kBAAkB,IAAwB;CACzD,cAAc,GAAG,SAAS,UAAU;CACpC,cAAc,GAAG,QAAQ,SAAS;CAClC,qBAAqB,GAAG,QAAQ,SAAS;CACzC,qBAAqB,GAAG,QAAQ,QAAQ;AACzC;;AAmBA,MAAM,WAAW,MAAM,KAAK,UAAU;;;;;;;;;AAUtC,SAAgB,kBAAkB,GAAW,MAAyB;CACrE,IAAI;EACH,IAAI,MAAM,IACT,MAAM,IAAI,UAAU,oBAAoB,4BAA4B;EAErE,IAAI,EAAE,SAAS,IACd,MAAM,IAAI,UAAU,oBAAoB,mCAAmC;EAG5E,IAAI,EAAE,WAAW,CAAC,MAAM,MAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,MAAM,IAC9D,MAAM,IAAI,UAAU,oBAAoB,oDAAoD;EAE7F,IAAI,EAAE,YAAY,MAAM,WACvB,MAAM,IAAI,UAAU,oBAAoB,gCAAgC;EAEzE,KAAK,MAAM,KAAK,UACf,IAAI,EAAE,QAAQ,CAAC,MAAM,IACpB,MAAM,IAAI,UAAU,oBAAoB,0CAA0C;CAGrF,SAAS,OAAO;EACf,IAAI,MACH,OAAO;EAER,MAAM;CACP;CACA,OAAO;AACR;;;;;;;;AASA,SAAgB,sBAAsB,YAAsB,eAA6B;CACxF,KAAK,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,EAAE,GAAG;EAC3C,kBAAkB,WAAW,EAAE;EAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,EAAE,GACxB,IAAI,WAAW,OAAO,WAAW,IAChC,MAAM,IAAI,UAAU,aAAa,2BAA2B,WAAW,EAAE;CAG5E;AACD;;;;;;;AAQA,SAAgB,iBAAiB,IAAoB;CACpD,IAAI,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,QAChC,MAAM,IAAI,UAAU,oBAAoB,kBAAkB;CAE3D,IAAI,CAAC,GAAG,WAAW,QAClB,MAAM,IAAI,UAAU,oBAAoB,mBAAmB;CAE5D,MAAM,SAAU,GAAG,YAAY,GAAG,SAAS,UAAW,CAAC;CACvD,sBAAsB,GAAG,YAAY,MAAM;AAC5C;;AAGA,MAAM,YAAY;;;;;;;;;;;;AAalB,SAAgB,iBAAiB,MAAc,OAA2B;CACzE,IAAI,CAAC,MACJ,MAAM,IAAI,UAAU,aAAa,qBAAqB;CAEvD,MAAM,WAAyB;EAC9B,YAAY,CAAC;EACb,SAAS,CAAC;EACV,QAAQ,CAAC;EACT,QAAQ,CAAC;EACT,QAAQ,CAAC;EACT,OAAO,CAAC;EACR,OAAO;CACR;CACA,IAAI,QAAQ;CACZ,IAAI,QAAa,CAAC;CAElB,IAAI,UAAU;CAEd,MAAM,8BAAc,IAAI,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,KAAK,QAAQ,eAAe,SAAS,OAAO,QAAgB,KAAqB;EAChF,MAAM,YAAiB,YAAY,MAAM;EACzC,MAAM,MAAM,eAAe,UAAU,EAAE;EACvC,IAAI,YAAY,IAAI,GAAG,GACtB,OAAO;EAER,QAAQ,KAAR;GACC,KAAK;IAEJ,IAAI,OAAO,MAAM,SAAS,GACzB,QAAQ,UAAU,OAAO,MAAM,SAAS,CAAC,GAAG;IAE7C,SAAS,QAAQ,UAAU;IAC3B;GAED,KAAK;IACJ,OAAO,UAAU;IACjB,SAAS,aAAa;IACtB;GAED,KAAK;GACL,KAAK;IACJ,WAAW,SAAS,YAAY;KAC/B,IAAI,UAAU,QAAQ,OAAO,MAC5B;KAED,QAAQ,QAAQ,IAAhB;MACC,KAAK;OACJ,SAAS,QAAQ,QAAQ,MAAM,gBAAgB,UAAU,QAAQ,GAAG;OACpE;MACD,KAAK;OACJ,SAAS,QAAQ,QAAQ,MAAM,SAAS,UAAU,QAAQ,KAAK,EAAE;OACjE;MACD,SACC,SAAS,QAAQ,QAAQ,MAAM,UAAU,QAAQ;KACnD;IACD,CAAC;IACD,IAAI,UAAU,UACb,SAAS,QAAQ,WAAW,UAAU;IAEvC;GAED,KAAK;GACL,KAAK;IACJ,OAAO,UAAU;IACjB,SAAS,OAAO,KAAK,SAAS;IAC9B;GAED,KAAK;IAEJ,QAAQ,UAAU,OAAlB;KACC,KAAK;MACJ,UAAU,SAAS;MACnB;KACD,KAAK;MACJ,UAAU,SAAS;MACnB;KACD,SACC,UAAU,SAAS;IACrB;IACA,OAAO,UAAU;IACjB,UAAU,OAAO,YAAY,UAAU,IAAI;IAC3C,OAAO,UAAU;IACjB,SAAS,OAAO,KAAK,SAAS;IAC9B;GAED,KAAK;IACJ,QAAQ,CAAC;IACT,MAAM,OAAO,UAAU;IACvB,IAAI,UAAU,SACb,MAAM,UAAU,UAAU;IAE3B,IAAI,UAAU,cACb,MAAM,QAAQ,CAAC,UAAU;IAE1B,IAAI,gBAAgB,UAAU,UAAU,GAAG,GAC1C,MAAM,SAAS;IAGhB,UAAU,MAAM,OAAO;IACvB;GAED,KAAK;IAEJ,MAAM,MAAM,YAAY,KAAK,MAAM,SAAS,GAAG,CAAC;IAChD,SAAS,MAAM,KAAK,KAAK;IACzB;GAGD,KAAK;GACL,KAAK;IACJ,OAAO,UAAU;IACjB,SAAS,SAAS;EAEpB;EACA,OAAO;CACR,CAAC;CAED,IAAI,WAAW,QAAQ,SAAS,KAAK,MAAM,IAC1C,MAAM,IAAI,UAAU,eAAe,wBAAwB,SAAS,KAAK;CAG1E,kBAAkB,QAAQ;CAE1B,OAAO;AACR;;;;;;;AAQA,SAAgB,iBAAiB,IAAsB;CACtD,MAAM,QAAkB,CAAC,UAAU;CACnC,MAAM,KACL,gBAAgB,YAAY,MAAM;EACjC,OAAO,WAAW;EAClB,WAAW,MAAM;CAClB,CAAC,CACF;CAEA,MAAM,cAAc,CAAC,EAAE,GAAG,aAAa,GAAG,SAAS,SAAS,CAAC,EAAC,CAAE,SAAS;CAEzE,MAAM,aAAkB,EAAE,UAAU,eAAe;CACnD,IAAI,GAAG,YAAY,GAAG,SAAS,SAAS;EAEvC,WAAW,SAAS,MAAM;GACzB,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,SAChC;GAED,MAAM,MAAM,GAAG,SAAS;GACxB,IAAI,IAAI,EAAE,OAAO,MAChB;GAED,IAAI,IAAI,EAAE,QAAQ,EAAE,IACnB;GAED,WAAW,EAAE,MAAM,IAAI,EAAE;EAC1B,CAAC;EACD,IAAI,GAAG,SAAS,QAAQ,UAAU;GACjC,WAAW,WAAW,GAAG,SAAS,QAAQ;GAC1C,OAAO,WAAW;EACnB;CACD;CACA,MAAM,KAAK,gBAAgB,cAAc,MAAM,UAAU,CAAC;CAE1D,MAAM,SAAU,GAAG,YAAY,GAAG,SAAS,UAAW,CAAC;CAGvD,IAAI,OAAO,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ;EACpC,MAAM,KAAK,aAAa;EACxB,IAAI,IAAI;EACR,KAAK,IAAI,GAAG,IAAI,GAAG,WAAW,QAAQ,EAAE,GAAG;GAC1C,IAAI,CAAC,OAAO,IACX;GAED,IAAI,CAAC,OAAO,EAAE,CAAC,QACd;EAEF;EACA,IAAI,MAAM,GAAG,WAAW,QACvB,IAAI;EAEL,MAAM,KAAK,gCAA+B,IAAI,oBAAkB,IAAI,MAAK;EACzE,MAAM,KAAK,cAAc;CAC1B;CAGA,MAAM,KAAK,UAAU;CACrB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,WAAW,QAAQ,EAAE,GAAG;EAC9C,MAAM,MAAW,EAAE,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE;EAElE,IAAI,UAAU,MAAM,IAAI;EACxB,IAAI,UAAU,SAAS,IAAI;EAC3B,IAAI,OAAO,IACV,QAAQ,OAAO,EAAE,CAAC,QAAlB;GACC,KAAK;IACJ,IAAI,QAAQ;IACZ;GACD,KAAK,GACJ,IAAI,QAAQ;EAEd;EAED,MAAM,KAAK,gBAAgB,SAAS,MAAM,GAAG,CAAC;CAC/C;CACA,MAAM,KAAK,WAAW;CAGtB,IAAI,aAAa;EAChB,MAAM,KAAK,gBAAgB;EAC3B,IAAI,GAAG,YAAY,GAAG,SAAS,OAC9B,GAAG,SAAS,MAAM,SAAS,MAAM;GAChC,MAAM,IAAS,EAAE,MAAM,EAAE,KAAK;GAC9B,IAAI,EAAE,SACL,EAAE,UAAU,EAAE;GAEf,IAAI,EAAE,SAAS,MACd,EAAE,eAAe,KAAK,EAAE;GAEzB,IAAI,EAAE,QACL,EAAE,SAAS;GAEZ,IAAI,CAAC,EAAE,KACN;GAED,MAAM,KAAK,gBAAgB,eAAe,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC;EAC/D,CAAC;EAEF,MAAM,KAAK,iBAAiB;CAC7B;CAEA,IAAI,MAAM,SAAS,GAAG;EACrB,MAAM,KAAK,aAAa;EAExB,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACtC;CACA,OAAO,MAAM,KAAK,EAAE;AACrB;;;;;;;;ACkHA,MAAa,OAA+B;CAC3C,GAAM;CACN,GAAM;CACN,IAAM;CACN,IAAM;CACN,IAAM;CACN,IAAM;CACN,IAAM;CACN,IAAM;AACP;;AAGA,MAAa,QAAgC,CAAC;AAC9C,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,IAAI,GACvC,MAAM,KAAK,CAAC;;;;;;;;;AC9qBb,SAAgB,UAAU,QAAwB;CACjD,OAAO,SAAS,kBAAkB,MAAM,GAAG,EAAE,IAAI;AAClD;;;;;;AAOA,SAAgB,UAAU,KAAqB;CAC9C,OAAO,MAAM,MAAM;AACpB;;;;;;AAgBA,SAAgB,kBAAkB,MAAsB;CACvD,OAAO,KAAK,QAAQ,YAAY,IAAI;AACrC;;;;;;;;;AAUA,SAAgB,UAAU,QAAwB;CACjD,MAAM,IAAI,kBAAkB,MAAM;CAClC,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,GAE/B,IAAI,KAAK,IAAI,EAAE,WAAW,CAAC,IAAI;CAEhC,OAAO,IAAI;AACZ;;;;;;;;;;AAWA,SAAgB,UAAU,KAAqB;CAC9C,IAAI,MAAM,GACT,MAAM,IAAI,UAAU,oBAAoB,oBAAoB,GAAG;CAEhE,IAAI,SAAS;CAEb,KAAK,EAAE,KAAK,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK,EAAE,GAE/C,SAAS,OAAO,cAAe,MAAM,KAAK,KAAM,EAAE,IAAI;CAEvD,OAAO;AACR;;;;;;AAgBA,SAAgB,kBAAkB,MAAsB;CACvD,OAAO,KAAK,QAAQ,cAAc,IAAI;AACvC;;;;;;;;;;AAoBA,SAAgB,WAAW,MAA2B;CACrD,IAAI,IAAI,GACP,IAAI;CACL,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAAG;EACrC,MAAM,WAAW,KAAK,WAAW,CAAC;EAClC,IAAI,YAAY,MAAM,YAAY,IAEjC,IAAI,KAAK,KAAK,WAAW;OACnB,IAAI,YAAY,MAAM,YAAY,IAExC,IAAI,KAAK,KAAK,WAAW;CAE3B;CAEA,OAAO;EAAE,GAAG,IAAI;EAAG,GAAG,IAAI;CAAE;AAC7B;;;;;;AAOA,SAAgB,WAAW,MAA2B;CACrD,IAAI,MAAM,KAAK,IAAI;CACnB,IAAI,SAAS;CAEb,OAAO,KAAK,OAAQ,MAAM,KAAK,KAAM,GACpC,SAAS,OAAO,cAAe,MAAM,KAAK,KAAM,EAAE,IAAI;CAEvD,OAAO,UAAU,KAAK,IAAI;AAC3B;;;;;;;;;AAUA,SAAgB,YAAY,OAAsB;CACjD,MAAM,MAAM,MAAM,QAAQ,GAAG;CAC7B,IAAI,QAAQ,IACX,OAAO;EAAE,GAAG,WAAW,KAAK;EAAG,GAAG,WAAW,KAAK;CAAE;CAErD,OAAO;EAAE,GAAG,WAAW,MAAM,MAAM,GAAG,GAAG,CAAC;EAAG,GAAG,WAAW,MAAM,MAAM,MAAM,CAAC,CAAC;CAAE;AAClF;;;;;;;;;;;;;;AAeA,SAAgB,YAAY,IAAyB,IAA0B;CAC9E,IAAI,OAAO,UAAa,OAAO,OAAO,UACrC,OAAO,YAAa,GAAa,GAAI,GAAa,CAAC;CAEpD,MAAM,IAAI,OAAO,OAAO,WAAW,KAAK,WAAW,EAAiB;CACpE,MAAM,IAAI,OAAO,OAAO,WAAW,KAAK,WAAW,EAAE;CACrD,OAAO,MAAM,IAAI,IAAI,IAAI,MAAM;AAChC;;;;;;;;;;AAWA,SAAgB,gBAAgB,OAAsB;CACrD,MAAM,SAAS;EAAE,GAAG;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,GAAG;GAAE,GAAG;GAAG,GAAG;EAAE;CAAE;CACtD,IAAI,MAAM,GACT,IAAI,GACJ,WAAW;CACZ,MAAM,MAAM,MAAM;CAGlB,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,GAAG;EAC3B,KAAK,WAAW,MAAM,WAAW,CAAC,IAAI,MAAM,KAAK,WAAW,IAC3D;EAED,MAAM,KAAK,MAAM;CAClB;CACA,OAAO,EAAE,IAAI,EAAE;CAGf,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,GAAG;EAC3B,KAAK,WAAW,MAAM,WAAW,CAAC,IAAI,MAAM,KAAK,WAAW,GAC3D;EAED,MAAM,KAAK,MAAM;CAClB;CACA,OAAO,EAAE,IAAI,EAAE;CAGf,IAAI,MAAM,OAAO,aAAa,IAAI;EACjC,OAAO,EAAE,IAAI,OAAO,EAAE;EACtB,OAAO,EAAE,IAAI,OAAO,EAAE;EACtB,OAAO;CACR;CACA,EAAE;CAGF,KAAK,MAAM,GAAG,MAAM,KAAK,EAAE,GAAG;EAC7B,KAAK,WAAW,MAAM,WAAW,CAAC,IAAI,MAAM,KAAK,WAAW,IAC3D;EAED,MAAM,KAAK,MAAM;CAClB;CACA,OAAO,EAAE,IAAI,EAAE;CAGf,KAAK,MAAM,GAAG,MAAM,KAAK,EAAE,GAAG;EAC7B,KAAK,WAAW,MAAM,WAAW,CAAC,IAAI,MAAM,KAAK,WAAW,GAC3D;EAED,MAAM,KAAK,MAAM;CAClB;CACA,OAAO,EAAE,IAAI,EAAE;CACf,OAAO;AACR;;AAGA,SAAgB,QAAQ,OAAkB,KAAa,KAAqC;CAC3F,MAAM,OAAO,MAAM;CACnB,IAAI,QAAQ,MACX,OAAO,KAAK,IAAI,GAAG;CAEpB,OAAO,MAAM,UAAU,GAAG,IAAI,UAAU,GAAG;AAC5C;;AAGA,SAAgB,QAAQ,OAAkB,KAAa,KAAa,MAA8B;CACjG,MAAM,OAAO,MAAM;CACnB,IAAI,QAAQ,MAAM;EACjB,IAAI,CAAC,KAAK,MACT,KAAK,OAAO,CAAC;EAEd,KAAK,IAAI,CAAC,OAAO;EACjB,OAAO;CACR;CACA,MAAM,WAAW;EAAE,GAAG;EAAK,GAAG;CAAI,CAAC,KAAK;CACxC,OAAO;AACR;;AAGA,SAAgB,gBAAgB,OAAkB,KAAa,KAAyB;CACvF,OAAO,QAAQ,OAAO,KAAK,GAAG,KAAK,QAAQ,OAAO,KAAK,KAAK,EAAE,GAAG,IAAI,CAAC;AACvE;;;;;;;;;;;;;;;;ACrQA,SAAgB,mBAAmB,GAAS,UAA4B;CACvE,MAAM,QAAQ,EAAE,QAAQ;CACxB,IAAI,UAEH,QAAQ,QADc,KAAK,IAAI,MAAM,GAAG,GAAG,GAAG,GAAG,CACrB,KAAM;CAInC,QAAQ,QADS,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,CACvB,KAAM;AAC9B;;;;;;;;;;;;AAaA,SAAgB,mBAAmB,GAAW,UAA0B;CACvE,IAAI,UAEH,OAAO,IAAI,KADW,KAAK,IAAI,MAAM,GAAG,GAAG,GAAG,GAAG,CACrB,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI;CAIxD,OAAO,IAAI,KADM,KAAK,IAAI,MAAM,IAAI,IAAI,GAAG,GAAG,CACvB,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI;AACnD;;;;;;;;;;AAWA,SAAgB,WAAW,GAAe;CACzC,MAAM,MAAM,EAAE,kBAAkB;CAChC,OAAO,IAAI,KAAK,EAAE,QAAQ,IAAI,MAAM,KAAK,GAAI;AAC9C;;;;;;;;;AAUA,SAAgB,WAAW,GAAe;CACzC,MAAM,MAAM,EAAE,kBAAkB;CAChC,uBAAO,IAAI,KAAK,EAAE,QAAQ,IAAI,MAAM,KAAK,GAAI;AAC9C;;;;;AC3CA,MAAM,iBAAiB,MAAsB,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE;;AAE1E,MAAM,gBAAgB,OAAY,WAA2B,KAAK,MAAK,CAAE,SAAS,OAAO,GAAG;;AAE5F,MAAM,iBAAiB,OAAY,WAA2B,KAAK,MAAK,CAAE,SAAS,OAAO,GAAG;;AAE7F,MAAM,sBAAsB,OAAY,WAA2B,KAAK,MAAK,CAAE,OAAO,OAAO,GAAG;;AAEhG,MAAM,mBAAmB,OAAY,WAA2B,KAAK,KAAK,MAAM,KAAK,EAAC,CAAE,SAAS,OAAO,GAAG;;;;;;;AAQ3G,SAAS,gBAAgB,GAAW,GAAqB;CACxD,IAAI,KAAK;CACT,OACC,EAAE,UAAU,IAAI,MACf,EAAE,WAAW,CAAC,IAAI,QAAQ,QAC1B,EAAE,WAAW,IAAI,CAAC,IAAI,QAAQ,QAC9B,EAAE,WAAW,IAAI,CAAC,IAAI,QAAQ,QAC9B,EAAE,WAAW,IAAI,CAAC,IAAI,QAAQ,QAC9B,EAAE,WAAW,IAAI,CAAC,IAAI,QAAQ,QAC9B,EAAE,WAAW,IAAI,CAAC,IAAI,QAAQ,OAC9B,EAAE,WAAW,IAAI,CAAC,IAAI,QAAQ;AAEjC;AAGA,MAAM,OAAmB,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM;CAC5D,MAAM,IAAI,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;CACjC,OAAO,CACN,IAAI,KAAK,eAAe,SAAS,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAC/D,IAAI,KAAK,eAAe,SAAS,EAAE,SAAS,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAC/D;AACD,CAAC;AACD,MAAM,SAAqB,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,MAAM;CAC/D,MAAM,IAAI,IAAI,KAAK,KAAM,GAAG,CAAC;CAC7B,MAAM,QAAQ,IAAI,KAAK,eAAe,SAAS,EAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;CAC3E,MAAM,OAAO,IAAI,KAAK,eAAe,SAAS,EAAE,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;CAEzE,OAAO;EAAC,MAAM;EAAI;EAAO;CAAI;AAC9B,CAAC;;;;;;;AAsBD,SAAS,qBAAqB,OAAuB;CACpD,MAAM,UAAU,MAAM,YAAY,EAAE;CACpC,IAAI,QAAQ,QAAQ,GAAG,IAAI,IAAI;EAC9B,MAAM,WAAW,QAAQ,MAAM,GAAG,QAAQ,QAAQ,GAAG,CAAC;EAKtD,OAAO,EAHN,SAAS,QAAQ,GAAG,IAAI,KACrB,SAAS,MAAM,GAAG,SAAS,MAAM,GAAG,CAAC,MAAM,OAAO,KAAK,EAAE,IACzD,SAAS,MAAM,GAAG,EAAE,IAAI,IAAI,OAAO,SAAS,SAAS,EAAE,KAC9C,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,GAAG,CAAC,KAAK,KAAK,CAAC;CACnE;CACA,MAAM,gBACL,QAAQ,QAAQ,GAAG,IAAI,KACpB,QAAQ,MAAM,GAAG,QAAQ,MAAM,GAAG,CAAC,MAAM,OAAO,KAAK,EAAE,IACvD,QAAQ,MAAM,GAAG,EAAE,IAAI,IAAI,OAAO,QAAQ,SAAS,EAAE;CACzD,OAAO,OAAO,aAAa;AAC5B;;AAGA,SAAS,cAAc,OAAa,GAAqB;CAExD,EAAE,MAAM;CACR,MAAM,MAAM,MAAM,OAAO;CAEzB,IAAI,MAAM,QAAQ,IAAI,aACrB,QAAQ,MAAM,KAAK;CAEpB,OAAO;AACR;;;;;;;;;;;;;;;;;AAkBA,SAAgB,mBAAmB,OAAe,MAAY,WAAwC;CAErG,IAAI,QAAQ,WAAW,QAAQ,GAC9B,OAAO;CAER,QAAQ,qBAAqB,KAAK;CAClC,IAAI,OAAO,QAAQ;CACnB,IAAI,OAAO,KAAK,MAAM,SAAS,QAAQ,KAAK;CAC5C,MAAM,MAAkB;EACvB,WAAW;EACX,aAAa;EACb,YAAY,SAAS,QAAQ,QAAQ;EACrC,MAAM;EACN,OAAO;EACP,KAAK;EACL,OAAO;EACP,SAAS;EACT,SAAS;EACT,WAAW;CACZ;CACA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAI,MAC9B,IAAI,aAAa;CAElB,IAAI,QAAQ,KAAK,UAEhB,QAAQ;CAGT,IAAI,IAAI,aAAa,OAAQ;EAC5B,IAAI,aAAa;EACjB,IAAI,EAAE,SAAS,OAAO;GACrB,IAAI,cAAc,OAAO;GACzB,EAAE;GACF,EAAE,IAAI;EACP;CACD;CACA,IAAI;CACJ,IAAI,MAAM;CACV,IAAI,SAAS,IAAI;EAEhB,OAAO,YAAY;GAAC;GAAM;GAAI;EAAE,IAAI;GAAC;GAAM;GAAG;EAAE;EAChD,MAAM;CACP,OAAO,IAAI,SAAS,GAAG;EAEtB,OAAO,YAAY;GAAC;GAAM;GAAG;EAAE,IAAI;GAAC;GAAM;GAAG;EAAC;EAC9C,MAAM;CACP,OAAO;EAEN,IAAI,OAAO,IACV,EAAE;EAEH,MAAM,WAAW,IAAI,KAAK,MAAM,GAAG,CAAC;EACpC,SAAS,QAAQ,SAAS,QAAQ,IAAI,OAAO,CAAC;EAC9C,OAAO;GAAC,SAAS,YAAY;GAAG,SAAS,SAAS,IAAI;GAAG,SAAS,QAAQ;EAAC;EAC3E,MAAM,SAAS,OAAO;EAEtB,IAAI,OAAO,IACV,OAAO,MAAM,KAAK;EAEnB,IAAI,WACH,MAAM,cAAc,UAAU,IAAI;CAEpC;CACA,IAAI,OAAO,KAAK;CAChB,IAAI,QAAQ,KAAK;CACjB,IAAI,MAAM,KAAK;CAEf,IAAI,UAAU,OAAO;CACrB,OAAO,KAAK,MAAM,OAAO,EAAE;CAC3B,IAAI,UAAU,OAAO;CACrB,OAAO,KAAK,MAAM,OAAO,EAAE;CAC3B,IAAI,QAAQ;CACZ,IAAI,YAAY;CAChB,OAAO;AACR;;AAGA,SAAS,kBAAkB,GAAmB;CAC7C,OAAO,EAAE,QAAQ,GAAG,MAAM,KAAK,IAAI,EAAE,QAAQ,4BAA4B,IAAI;AAC9E;;AAGA,SAAS,kBAAkB,GAAmB;CAC7C,IAAI,EAAE,QAAQ,GAAG,MAAM,IACtB,OAAO;CAER,OAAO,EAAE,QAAQ,+BAA+B,KAAK,CAAC,CAAC,QAAQ,gBAAgB,OAAO;AACvF;;AAGA,SAAS,cAAc,GAAmB;CACzC,MAAM,IAAI,IAAI,IAAI,KAAK;CACvB,IAAI,IAAI,kBAAkB,EAAE,QAAQ,EAAE,CAAC;CACvC,IAAI,EAAE,UAAU,GACf,OAAO;CAER,IAAI,EAAE,YAAY,EAAE;CACpB,IAAI,EAAE,UAAU,GACf,OAAO;CAER,OAAO,EAAE,cAAc,CAAC;AACzB;;AAGA,SAAS,cAAc,GAAmB;CACzC,MAAM,IAAI,kBAAkB,EAAE,QAAQ,EAAE,CAAC;CACzC,OAAO,EAAE,UAAU,IAAI,IAAI,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,EAAE,YAAY,CAAC,IAAI;AACrF;;;;;;;;;AAUA,SAAS,gBAAgB,GAAmB;CAC3C,IAAI,CAAC,SAAS,CAAC,GACd,OAAO,MAAM,CAAC,IAAI,UAAU;CAG7B,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;CACxD,IAAI;CAEJ,IAAI,KAAK,MAAM,KAAK,IACnB,IAAI,EAAE,YAAY,KAAK,CAAC;MAClB,IAAI,KAAK,IAAI,CAAC,KAAK,GACzB,IAAI,cAAc,CAAC;MACb,IAAI,MAAM,IAChB,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,UAAU,GAAG,EAAE;MAEjC,IAAI,cAAc,CAAC;CAGpB,OAAO,kBAAkB,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAC5D;;;;;;;;AASA,SAAS,YAAY,GAAQ,MAAmB;CAC/C,QAAQ,OAAO,GAAf;EACC,KAAK,UACJ,OAAO;EACR,KAAK,WACJ,OAAO,IAAI,SAAS;EACrB,KAAK,UACJ,QAAQ,IAAI,OAAO,IAAI,EAAE,SAAS,EAAE,IAAI,gBAAgB,CAAC;EAC1D,KAAK,aACJ,OAAO;EACR,KAAK;GACJ,IAAI,KAAK,MACR,OAAO;GAER,IAAI,aAAa,MAChB,OAAO,aAAa,IAAI,mBAAmB,GAAG,QAAQ,KAAK,QAAQ,GAAG,IAAI;CAE7E;CACA,MAAM,IAAI,UAAU,eAAe,0CAA0C,CAAC;AAC/E;;;;;;;;;;;;;;;AAgBA,SAAS,eAAe,MAAc,KAAa,KAAiB,KAAsB;CACzF,IAAI,SAAS;CACb,IAAI,gBAAgB;CACpB,IAAI,cAAc;CAClB,IAAI,OAAO,IAAI;CACf,IAAI,aAAqB;CACzB,IAAI,eAAe;CACnB,QAAQ,MAAR;EACC,KAAK,IACJ,OAAO,IAAI,OAAO;EAEnB,KAAK;GACJ,QAAQ,IAAI,QAAZ;IACC,KAAK;IACL,KAAK;KACJ,aAAa,OAAO;KACpB,eAAe;KACf;IACD;KACC,aAAa,OAAO;KACpB,eAAe;GAEjB;GACA;EACD,KAAK;GACJ,QAAQ,IAAI,QAAZ;IACC,KAAK;IACL,KAAK;KACJ,aAAa,IAAI;KACjB,eAAe,IAAI;KACnB;IACD,KAAK,GACJ,OAAO,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC9B,KAAK,GACJ,OAAO,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC9B,SACC,OAAO,OAAO,IAAI,QAAQ,EAAE,CAAC;GAC/B;GACA;EACD,KAAK;GACJ,QAAQ,IAAI,QAAZ;IACC,KAAK;IACL,KAAK;KACJ,aAAa,IAAI;KACjB,eAAe,IAAI;KACnB;IACD,KAAK,GACJ,OAAO,KAAK,IAAI,UAAU,CAAC;IAC5B,SACC,OAAO,KAAK,IAAI,UAAU,CAAC;GAC7B;GACA;EACD,KAAK;GACJ,QAAQ,IAAI,QAAZ;IACC,KAAK;IACL,KAAK;KAEJ,aAAa,KAAM,IAAI,QAAQ,MAAM;KACrC,eAAe,IAAI;KACnB;IACD,SACC,MAAM,IAAI,UAAU,aAAa,sBAAsB,GAAG;GAC5D;GACA;EACD,KAAK;GACJ,QAAQ,IAAI,QAAZ;IACC,KAAK;IACL,KAAK;KACJ,aAAa,IAAI;KACjB,eAAe,IAAI;KACnB;IACD,SACC,MAAM,IAAI,UAAU,aAAa,sBAAsB,GAAG;GAC5D;GACA;EACD,KAAK;GACJ,QAAQ,IAAI,QAAZ;IACC,KAAK;IACL,KAAK;KACJ,aAAa,IAAI;KACjB,eAAe,IAAI;KACnB;IACD,SACC,MAAM,IAAI,UAAU,aAAa,wBAAwB,GAAG;GAC9D;GACA;EACD,KAAK;GACJ,IAAI,QAAQ,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,QAC3E,MAAM,IAAI,UAAU,aAAa,wBAAwB,GAAG;GAE7D,IAAI,IAAI,eAAe,MAAM,QAAQ,OAAO,QAAQ,OACnD,OAAO,aAAa,IAAI,SAAS,IAAI,MAAM;GAG5C,IAAI,OAAQ,GACX,cAAc,QAAQ,IAAI,MAAO;QAEjC,cAAc,QAAQ,IAAI,KAAK;GAEhC,gBAAgB,KAAK,MAAM,eAAe,IAAI,UAAU,IAAI,WAAW;GACvE,IAAI,iBAAiB,KAAK,aACzB,gBAAgB;GAEjB,IAAI,QAAQ,KACX,OAAO,kBAAkB,IAAI,MAAM,KAAK,gBAAgB;GAEzD,SAAS,aAAa,eAAe,IAAI,GAAI;GAC7C,IAAI,QAAQ,MACX,OAAO,OAAO,UAAU,GAAG,CAAC;GAG7B,OAAO,MAAM,OAAO,UAAU,GAAG,IAAI,SAAS,CAAC;EAChD,KAAK;GACJ,QAAQ,KAAR;IACC,KAAK;IACL,KAAK;KAEJ,aAAa,IAAI,YAAY,KAAK,IAAI;KACtC;IACD,KAAK;IACL,KAAK;KAEJ,cAAc,IAAI,YAAY,KAAK,IAAI,SAAS,KAAK,IAAI;KACzD;IACD,KAAK;IACL,KAAK;KAEJ,eACG,IAAI,YAAY,KAAK,IAAI,SAAS,KAAK,IAAI,WAAW,MACvD,QAAQ,IAAI,KAAK,MAAM,IAAI,UAAU,IAAI,UAAU,IAAI,IAAI;KAC7D;IACD,SACC,MAAM,IAAI,UAAU,aAAa,yBAAyB,GAAG;GAC/D;GACA,eAAe,IAAI,WAAW,IAAI,IAAI;GACtC;EACD,KAAK;GACJ,aAAa;GACb,eAAe;CAEjB;CACA,OAAO,eAAe,IAAI,aAAa,YAAY,YAAY,IAAI;AACpE;;AAGA,SAAS,SAAS,KAAqB;CACtC,OAAO,IAAI,QAAQ,oBAAoB,GAAG;AAC3C;AAEA,MAAM,OAAO;;AAEb,SAAS,cAAc,MAAc,KAAa,KAAqB;CACtE,MAAM,OAAO,IAAI,QAAQ,MAAM,EAAE;CACjC,MAAM,MAAM,IAAI,SAAS,KAAK;CAC9B,OAAO,UAAU,MAAM,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG;AAC3E;;;;;AAMA,SAAS,aAAa,MAAc,KAAa,KAAqB;CACrE,IAAI,MAAM,IAAI,SAAS;CAEvB,OAAO,IAAI,WAAW,MAAM,CAAC,MAAM,IAClC,EAAE;CAEH,OAAO,UAAU,MAAM,IAAI,UAAU,GAAG,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,SAAS,IAAI,CAAC;AACzF;;AAGA,SAAS,cAAc,KAAa,KAAqB;CACxD,IAAI;CACJ,MAAM,MAAM,IAAI,QAAQ,GAAG,IAAI,IAAI,QAAQ,GAAG,IAAI;CAClD,IAAI,IAAI,MAAM,aAAa,GAAG;EAC7B,IAAI,QAAQ,GACX,OAAO;EAER,IAAI,MAAM,GACT,OAAO,MAAM,cAAc,KAAK,CAAC,GAAG;EAErC,MAAM,SAAS,IAAI,QAAQ,GAAG;EAC9B,MAAM,KACL,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,SAAS,IAC/C,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,SAAU,SACrD,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI;EAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,EAAC,CAAE,YAAY,MAAM,KAAM,SAAS,MAAM,MAAO;EAC3E,IAAI,EAAE,QAAQ,GAAG,MAAM,IAAI;GAC1B,MAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM;GACpD,IAAI,EAAE,QAAQ,GAAG,MAAM,IACtB,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,UAAU,CAAC,IAAI,QAAQ,QAAQ,EAAE,SAAS;QAEpE,KAAK,QAAQ,QAAQ;GAEtB,OAAO,EAAE,UAAU,GAAG,CAAC,MAAM,MAAM;IAClC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,IAAI,MAAM,EAAE,UAAU,IAAI,MAAM;IACvE,IAAI,EAAE,QAAQ,cAAc,IAAI,CAAC,CAAC,QAAQ,SAAS,IAAI;GACxD;GACA,IAAI,EAAE,QAAQ,OAAO,GAAG;EACzB;EACA,IAAI,EAAE,QACL,6BACC,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,GAAG,UAAU,IAAI,SAAS,MAAM,MAAM,IAAI,MAAM,GAAG,UAAU,EAAE,IAAI,GAClG;CACD,OACC,IAAI,IAAI,cAAc,GAAG;CAG1B,IAAI,IAAI,MAAM,QAAQ,KAAK,EAAE,MAAM,UAAU,GAC5C,IAAI,EAAE,UAAU,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC;CAG/D,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,MAAM,KAAK,GACnC,IAAI,EAAE,QAAQ,OAAO,GAAG;CAEzB,OAAO,EAAE,QAAQ,KAAK,GAAG;AAC1B;;;;;;;;;;;;;;AAeA,SAAS,SAAS,OAAe,gBAAwB,OAA2B;CACnF,MAAM,MAAM,QAAQ,IAAI,KAAK;CAC7B,IAAI,WAAW,QAAQ;CAEvB,IAAI,gBAAgB,GACnB,YAAY,GACZ,YAAY;CACb,IAAI,gBAAgB,GACnB,YAAY,GACZ,cAAc;CACf,IAAI,UAAU,KAAK,MAAM,QAAQ;CACjC,OAAO,YAAY,gBAAgB;EAClC,UAAU,KAAK,MAAM,QAAQ;EAE7B,YAAY,UAAU,YAAY;EAClC,cAAc,UAAU,YAAY;EAEpC,IAAI,WAAW,UAAU,MACxB;EAGD,WAAW,KAAK,WAAW;EAC3B,gBAAgB;EAChB,YAAY;EACZ,gBAAgB;EAChB,YAAY;CACb;CAEA,IAAI,cAAc,gBAAgB;EACjC,IAAI,YAAY,gBAAgB;GAC/B,cAAc;GACd,YAAY;EACb,OAAO;GACN,cAAc;GACd,YAAY;EACb;CACD;CACA,IAAI,CAAC,OACJ,OAAO;EAAC;EAAG,MAAM;EAAW;CAAW;CAExC,MAAM,YAAY,KAAK,MAAO,MAAM,YAAa,WAAW;CAC5D,OAAO;EAAC;EAAW,MAAM,YAAY,YAAY;EAAa;CAAW;AAC1E;AAGA,MAAM,QAAQ;;AAGd,SAAS,aAAa,GAAa,MAAc,MAAsB;CACtE,MAAM,MAAM,SAAS,EAAE,IAAI,EAAE;CAC7B,MAAM,KAAK,KAAK,MAAM,OAAO,GAAG;CAChC,MAAM,OAAO,KAAK,MAAM,KAAK,GAAG;CAChC,MAAM,MAAM,KAAK,OAAO;CACxB,MAAM,MAAM;CACZ,OACC,QACC,SAAS,IAAI,KAAK,KAAK,QACxB,OACC,QAAQ,IACN,IAAI,OAAO,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,MAAM,IACxC,cAAc,KAAK,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,KAAK,EAAE,EAAE,CAAC,MAAM;AAExF;;AAGA,SAAS,aAAa,GAAa,MAAc,MAAsB;CACtE,OAAO,QAAQ,SAAS,IAAI,KAAK,KAAK,QAAQ,IAAI,OAAO,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,MAAM;AACvF;AAGA,MAAM,OAAO;AAEb,MAAM,aAAa;AAEnB,MAAM,QAAQ;;;;;;AAOd,SAAS,MAAM,KAAqB;CACnC,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,QAAQ,EAAE,GAAG;EACtC,MAAM,KAAK,IAAI,WAAW,CAAC;EAC3B,QAAQ,IAAR;GACC,KAAK,IACJ;GACD,KAAK;IACJ,KAAK;IACL;GACD,KAAK;IACJ,KAAK;IACL;GACD,SACC,KAAK,OAAO,aAAa,EAAE;EAC7B;CACD;CACA,OAAO;AACR;;AAGA,SAAS,IAAI,KAAa,GAAmB;CAC5C,MAAM,MAAM,MAAM,IAAI,KAAK;CAC3B,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC;CACzB,OAAO,KAAK,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,IAAI;AACjD;;AAGA,SAAS,IAAI,KAAa,GAAmB;CAC5C,MAAM,QAAQ,MAAM,KAAK,MAAM,GAAG;CAClC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC;CACzB,IAAI,KAAK,KAAK,KAAK,MAAM,QAAQ,EAAE,EAAC,CAAE,QACrC,OAAO;CAER,OAAO,KAAK,MAAM,QAAQ,EAAE;AAC7B;;AAGA,SAAS,MAAM,KAAa,GAAmB;CAC9C,IAAI,KAAK,KAAK,KAAK,OAAO,MAAM,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,EAAC,CAAE,QACpE,OAAO;CAER,OAAO;AACR;;AAGA,SAAS,IAAI,KAAqB;CAEjC,IAAI,MAAM,cAAc,MAAM,aAC7B,OAAO,MAAM,OAAO,IAAI,MAAM,IAAK,MAAM,IAAK;CAE/C,OAAO,KAAK,KAAK,MAAM,GAAG;AAC3B;;;;;;;;;;;;;AAcA,SAAS,cAAc,MAAc,KAAa,KAAqB;CAEtE,IAAI,KAAK,WAAW,CAAC,MAAM,MAAM,CAAC,IAAI,MAAM,UAAU,GAAG;EACxD,MAAM,OAAO,IAAI,QAAQ,QAAQ,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE;EACxE,IAAI,OAAO,GACV,OAAO,cAAc,KAAK,MAAM,GAAG;EAEpC,OAAO,MAAM,cAAc,KAAK,MAAM,CAAC,GAAG,IAAI;CAC/C;CAEA,IAAI,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,IACtC,OAAO,aAAa,MAAM,KAAK,GAAG;CAEnC,IAAI,IAAI,QAAQ,GAAG,MAAM,IACxB,OAAO,cAAc,MAAM,KAAK,GAAG;CAEpC,IAAI,IAAI,QAAQ,GAAG,MAAM,IACxB,OAAO,cAAc,KAAK,GAAG;CAG9B,IAAI,IAAI,WAAW,CAAC,MAAM,IACzB,OAAO,MAAM,cAAc,MAAM,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,GAAG,GAAG;CAEnF,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,OAAO,KAAK,IAAI,GAAG;CACzB,MAAM,OAAO,MAAM,IAAI,MAAM;CAC7B,IAAI,IAAI,MAAM,OAAO,GACpB,OAAO,OAAO,gBAAgB,MAAM,IAAI,MAAM;CAE/C,IAAI,IAAI,MAAM,SAAS,GAAG;EACzB,IAAI,gBAAgB,KAAK,CAAC;EAC1B,IAAI,MAAM,KACT,IAAI;EAEL,OAAO,EAAE,SAAS,IAAI,SAAS,IAAI,MAAM,IAAI,UAAU,GAAG,IAAI,SAAS,EAAE,MAAM,CAAC,IAAI;CACrF;CACA,IAAK,IAAI,IAAI,MAAM,KAAK,GACvB,OAAO,aAAa,GAAG,MAAM,IAAI;CAElC,IAAI,IAAI,MAAM,QAAQ,GACrB,OAAO,OAAO,gBAAgB,MAAM,IAAI,SAAS,IAAI,QAAQ,GAAG,CAAC;CAElE,IAAK,IAAI,IAAI,MAAM,IAAI,GAAI;EAC1B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,CACvB,QAAQ,aAAa,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC,CACzC,QAAQ,OAAO,MAAM,MAAM,EAAE,EAAE,CAAC,CAAC,CACjC,QAAQ,aAAa,IAAI,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,EAAG,EAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;EACxF,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,QAAQ,QAAQ,GAAG;CAC5D;CACA,MAAM,IAAI,QAAQ,aAAa,IAAI;CACnC,IAAK,IAAI,IAAI,MAAM,cAAc,GAChC,OACC,OACA,IAAI,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CACpB,QAAQ,mBAAmB,KAAK,CAAC,CACjC,QAAQ,aAAa,KAAK,CAAC,CAC3B,QAAQ,QAAQ,EAAE,EAAE,CAAC,SAAS,OAAO,GAAG;CAG5C,IAAI,IAAI,MAAM,mBAAmB,GAChC,OAAO,OAAO,SAAS,gBAAgB,MAAM,CAAC,CAAC;CAEhD,IAAK,IAAI,IAAI,MAAM,mBAAmB,GACrC,OAAO,MAAM,IACV,MAAM,cAAc,MAAM,KAAK,CAAC,GAAG,IACnC,SAAS,MAAM,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,IACzD,MACA,aAAa,IAAI,KAAK,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,MAAM;CAEnD,IAAK,IAAI,IAAI,MAAM,UAAU,GAC5B,OAAO,cAAc,MAAM,IAAI,QAAQ,UAAU,EAAE,GAAG,GAAG;CAG1D,IAAK,IAAI,IAAI,MAAM,yBAAyB,GAAI;EAC/C,IAAI,cAAc,cAAc,MAAM,IAAI,QAAQ,UAAU,EAAE,GAAG,GAAG,CAAC;EACrE,KAAK;EACL,OAAO,cACN,cAAc,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,UAAU,MAAM;GAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI,MAAM,MAAM,MAAM;EAC3D,CAAC,CACF;CACD;CACA,IAAI,IAAI,MAAM,KAAK,GAAG;EACrB,IAAI,cAAc,MAAM,cAAc,GAAG;EACzC,OAAO,MAAM,EAAE,UAAU,GAAG,CAAC,IAAI,OAAO,EAAE,UAAU,GAAG,CAAC,IAAI,MAAM,EAAE,UAAU,CAAC;CAChF;CAEA,IAAI,KAAK;CACT,IAAK,IAAI,IAAI,MAAM,6BAA6B,GAAI;EACnD,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC;EAC5B,KAAK,SAAS,MAAM,KAAK,IAAI,IAAI,EAAE,IAAI,GAAG,KAAK;EAC/C,IAAI;EACJ,KAAK,UAAU,KAAK,EAAE,IAAI,GAAG,EAAE;EAC/B,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,MAAM,KAChC,KAAK,GAAG,UAAU,GAAG,GAAG,SAAS,CAAC,IAAI;EAEvC,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE;EACzB,KAAK,mBAAmB,GAAG,IAAI,EAAE;EACjC,IAAI,GAAG,SAAS,EAAE,EAAE,CAAC,QACpB,KAAK,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI;EAEvD,KAAK;EACL,OAAO;CACR;CAEA,IAAK,IAAI,IAAI,MAAM,+BAA+B,GAAI;EACrD,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC;EACnD,KAAK,SAAS,MAAM,KAAK,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI;EAC9C,OACC,QACC,GAAG,OAAO,GAAG,KAAK,KAAK,QACxB,OACC,GAAG,KACD,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,mBAAmB,GAAG,IAAI,EAAE,IAC3E,IAAI,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM;CAEtD;CACA,IAAK,IAAI,IAAI,MAAM,UAAU,GAAI;EAChC,IAAI,gBAAgB,KAAK,CAAC;EAC1B,IAAI,IAAI,UAAU,EAAE,QACnB,OAAO;EAER,OAAO,MAAM,IAAI,UAAU,GAAG,IAAI,SAAS,EAAE,MAAM,CAAC,IAAI;CACzD;CACA,IAAK,IAAI,IAAI,MAAM,qBAAqB,GAAI;EAC3C,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,aAAa,IAAI;EACpE,KAAK,EAAE,QAAQ,GAAG;EAClB,MAAM,OAAO,IAAI,QAAQ,GAAG,IAAI;EAChC,MAAM,OAAO,IAAI,SAAS,EAAE,SAAS;EACrC,OAAO,MAAM,IAAI,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC;CAC3E;CACA,IAAK,IAAI,IAAI,MAAM,oBAAoB,GAAI;EAC1C,KAAK,IAAI,KAAK,EAAE,EAAE,CAAC,MAAM;EACzB,OAAO,MAAM,IACV,MAAM,cAAc,MAAM,KAAK,CAAC,GAAG,IACnC,SAAS,IAAI,GAAG,CAAC,CAAC,CACjB,QAAQ,cAAc,KAAK,CAAC,CAC5B,QAAQ,UAAU,OAAO,SAAS,GAAG,SAAS,IAAI,aAAa,GAAG,IAAI,GAAG,MAAM,IAAI,MAAM,EAAE,IAC5F,MACA,aAAa,IAAI,EAAE,EAAE,CAAC,MAAM;CAChC;CACA,QAAQ,KAAR;EACC,KAAK,cACJ,OAAO,cAAc,MAAM,YAAY,GAAG;EAC3C,KAAK;EACL,KAAK;EACL,KAAK,SAAS;GACb,MAAM,IAAI,SAAS,gBAAgB,MAAM,CAAC,CAAC;GAC3C,OAAO,MAAM,MAAM,OAAO,IAAI;EAC/B;EACA,KAAK,cACJ,OAAO,cAAc,MAAM,cAAc,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG;EAClE,KAAK,YACJ,OAAO,cAAc,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,QAAQ,GAAG;CACjE;CACA,MAAM,IAAI,UAAU,eAAe,yBAAyB,MAAM,GAAG;AACtE;;;;;;;AAQA,SAAS,cAAc,MAAc,KAAa,KAAqB;CAEtE,IAAI,KAAK,WAAW,CAAC,MAAM,MAAM,CAAC,IAAI,MAAM,UAAU,GAAG;EACxD,MAAM,OAAO,IAAI,QAAQ,QAAQ,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE;EACxE,IAAI,OAAO,GACV,OAAO,cAAc,KAAK,MAAM,GAAG;EAEpC,OAAO,MAAM,cAAc,KAAK,MAAM,CAAC,GAAG,IAAI;CAC/C;CAEA,IAAI,IAAI,WAAW,IAAI,SAAS,CAAC,MAAM,IACtC,OAAO,aAAa,MAAM,KAAK,GAAG;CAEnC,IAAI,IAAI,QAAQ,GAAG,MAAM,IACxB,OAAO,cAAc,MAAM,KAAK,GAAG;CAEpC,IAAI,IAAI,QAAQ,GAAG,MAAM,IACxB,OAAO,cAAc,KAAK,GAAG;CAG9B,IAAI,IAAI,WAAW,CAAC,MAAM,IACzB,OAAO,MAAM,cAAc,MAAM,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,GAAG,GAAG;CAEnF,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM,OAAO,KAAK,IAAI,GAAG;CACzB,MAAM,OAAO,MAAM,IAAI,MAAM;CAC7B,IAAI,IAAI,MAAM,OAAO,GACpB,OAAO,OAAO,aAAa,MAAM,IAAI,MAAM;CAE5C,IAAI,IAAI,MAAM,SAAS,GAAG;EACzB,IAAI,KAAK;EACT,IAAI,QAAQ,GACX,IAAI;EAEL,OAAO,EAAE,SAAS,IAAI,SAAS,IAAI,MAAM,IAAI,UAAU,GAAG,IAAI,SAAS,EAAE,MAAM,CAAC,IAAI;CACrF;CACA,IAAK,IAAI,IAAI,MAAM,KAAK,GACvB,OAAO,aAAa,GAAG,MAAM,IAAI;CAElC,IAAI,IAAI,MAAM,QAAQ,GACrB,OAAO,OAAO,aAAa,MAAM,IAAI,SAAS,IAAI,QAAQ,GAAG,CAAC;CAE/D,IAAK,IAAI,IAAI,MAAM,IAAI,GAAI;EAC1B,KAAK,KAAK,IAAG,CAAE,QAAQ,aAAa,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,OAAO,MAAM,MAAM,EAAE,EAAE,CAAC;EACzF,IAAI,EAAE,QAAQ,aAAa,IAAI,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,EAAG,EAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;EAC5F,OAAO,IAAI,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,QAAQ,QAAQ,GAAG;CAC5D;CACA,MAAM,IAAI,QAAQ,aAAa,IAAI;CACnC,IAAK,IAAI,IAAI,MAAM,cAAc,GAChC,OACC,QACC,KAAK,KAAI,CACR,QAAQ,mBAAmB,KAAK,CAAC,CACjC,QAAQ,aAAa,KAAK,CAAC,CAC3B,QAAQ,QAAQ,EAAE,EAAE,CAAC,SAAS,OAAO,GAAG;CAG5C,IAAI,IAAI,MAAM,mBAAmB,GAChC,OAAO,OAAO,SAAS,KAAK,IAAI;CAEjC,IAAK,IAAI,IAAI,MAAM,mBAAmB,GACrC,OAAO,MAAM,IAAI,MAAM,cAAc,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,MAAM,IAAI,OAAO,EAAE,EAAE,CAAC,MAAM;CAE1G,IAAK,IAAI,IAAI,MAAM,UAAU,GAC5B,OAAO,cAAc,MAAM,IAAI,QAAQ,UAAU,EAAE,GAAG,GAAG;CAG1D,IAAK,IAAI,IAAI,MAAM,yBAAyB,GAAI;EAC/C,IAAI,cAAc,cAAc,MAAM,IAAI,QAAQ,UAAU,EAAE,GAAG,GAAG,CAAC;EACrE,KAAK;EACL,OAAO,cACN,cAAc,IAAI,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,UAAU,MAAM;GAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,IAAI,IAAI,MAAM,MAAM,MAAM;EAC3D,CAAC,CACF;CACD;CACA,IAAI,IAAI,MAAM,KAAK,GAAG;EACrB,IAAI,cAAc,MAAM,cAAc,GAAG;EACzC,OAAO,MAAM,EAAE,UAAU,GAAG,CAAC,IAAI,OAAO,EAAE,UAAU,GAAG,CAAC,IAAI,MAAM,EAAE,UAAU,CAAC;CAChF;CAEA,IAAI,KAAK;CACT,IAAK,IAAI,IAAI,MAAM,6BAA6B,GAAI;EACnD,KAAK,KAAK,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC;EAC5B,KAAK,SAAS,MAAM,KAAK,IAAI,IAAI,EAAE,IAAI,GAAG,KAAK;EAC/C,IAAI;EACJ,KAAK,UAAU,KAAK,EAAE,IAAI,GAAG,EAAE;EAC/B,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,MAAM,KAChC,KAAK,GAAG,UAAU,GAAG,GAAG,SAAS,CAAC,IAAI;EAEvC,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE;EACzB,KAAK,mBAAmB,GAAG,IAAI,EAAE;EACjC,IAAI,GAAG,SAAS,EAAE,EAAE,CAAC,QACpB,KAAK,MAAM,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI;EAEvD,KAAK;EACL,OAAO;CACR;CAEA,IAAK,IAAI,IAAI,MAAM,+BAA+B,GAAI;EACrD,KAAK,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC;EACnD,KAAK,SAAS,MAAM,KAAK,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI;EAC9C,OACC,QACC,GAAG,OAAO,GAAG,KAAK,KAAK,QACxB,OACC,GAAG,KACD,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,MAAM,EAAE,KAAK,mBAAmB,GAAG,IAAI,EAAE,IAC3E,IAAI,OAAO,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM;CAEtD;CACA,IAAK,IAAI,IAAI,MAAM,UAAU,GAAI;EAChC,IAAI,KAAK;EACT,IAAI,IAAI,UAAU,EAAE,QACnB,OAAO;EAER,OAAO,MAAM,IAAI,UAAU,GAAG,IAAI,SAAS,EAAE,MAAM,CAAC,IAAI;CACzD;CACA,IAAK,IAAI,IAAI,MAAM,oBAAoB,GAAI;EAC1C,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,aAAa,IAAI;EACpE,KAAK,EAAE,QAAQ,GAAG;EAClB,MAAM,OAAO,IAAI,QAAQ,GAAG,IAAI;EAChC,MAAM,OAAO,IAAI,SAAS,EAAE,SAAS;EACrC,OAAO,MAAM,IAAI,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,UAAU,IAAI,SAAS,IAAI,CAAC;CAC3E;CACA,IAAK,IAAI,IAAI,MAAM,oBAAoB,GACtC,OAAO,MAAM,IACV,MAAM,cAAc,MAAM,KAAK,CAAC,GAAG,IACnC,SAAS,KAAK,GAAG,CAAC,CACjB,QAAQ,cAAc,KAAK,CAAC,CAC5B,QAAQ,UAAU,OAAO,SAAS,GAAG,SAAS,IAAI,aAAa,GAAG,IAAI,GAAG,MAAM,IAAI,MAAM,EAAE,IAC5F,MACA,aAAa,GAAG,EAAE,EAAE,CAAC,MAAM;CAE/B,QAAQ,KAAR;EACC,KAAK;EACL,KAAK;EACL,KAAK,SAAS;GACb,MAAM,IAAI,SAAS,KAAK,IAAI;GAC5B,OAAO,MAAM,MAAM,OAAO,IAAI;EAC/B;EACA,SACC,IAAI,IAAI,MAAM,WAAW,GACxB,OACC,cAAc,MAAM,IAAI,MAAM,GAAG,IAAI,YAAY,GAAG,CAAC,GAAG,GAAG,IAC3D,MAAM,IAAI,MAAM,IAAI,YAAY,GAAG,CAAC,CAAC;CAGzC;CACA,MAAM,IAAI,UAAU,eAAe,yBAAyB,MAAM,GAAG;AACtE;;AAGA,SAAS,UAAU,MAAc,KAAa,KAAqB;CAClE,QAAQ,MAAM,OAAO,MAAM,cAAc,MAAM,KAAK,GAAG,IAAI,cAAc,MAAM,KAAK,GAAG;AACxF;;;;;;;;;;;;AAaA,SAAS,cAAc,KAAuB;CAC7C,MAAM,MAAgB,CAAC;CACvB,IAAI,SAAS;CACb,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,EAAE,GACjC,QAAQ,IAAI,WAAW,CAAC,GAAxB;EACC,KAAK;GACJ,SAAS,CAAC;GACV;EACD,KAAK;EACL,KAAK;EACL,KAAK;GACJ,EAAE;GACF;EACD,KAAK;GACJ,IAAI,IAAI,UAAU,IAAI,UAAU,GAAG,CAAC;GACpC,IAAI,IAAI;CACV;CAED,IAAI,IAAI,UAAU,IAAI,UAAU,CAAC;CACjC,IAAI,QACH,MAAM,IAAI,UAAU,aAAa,aAAa,MAAM,wBAAwB;CAE7E,OAAO;AACR;;AAGA,MAAM,cAAc;AAKpB,SAAS,uBAAuB,SAAkB,SAAkB,UAAuC;CAC1G,IAAI,SACH,OAAO,UAAU,aAAa;CAE/B,IAAI,SACH,OAAO;CAER,OAAO,WAAW,SAAS;AAC5B;;;;;;;;;;;AAYA,SAAgB,sBAAsB,KAAiC;CACtE,IAAI,IAAI;CACR,IAAI,IAAI;CACR,IAAI,IAAI;CACR,IAAI,UAAU;CACd,IAAI,UAAU;CACd,IAAI,WAAW;CACf,OAAO,IAAI,IAAI,QACd,QAAS,IAAI,IAAI,OAAO,CAAC,GAAzB;EACC,KAAK;GACJ,IAAI,gBAAgB,KAAK,CAAC,GACzB,KAAK;GAEN;GACA;EACD,KAAK;GAEJ,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,MAAM,IAAI,IAAI;GAG7C,EAAE;GACF;EACD,KAAK;GACJ,KAAK;GACL;EACD,KAAK;GACJ,KAAK;GACL;EACD,KAAK;GACJ,EAAE;GACF;EACD,KAAK;EACL,KAAK,KAEJ,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;GAC3D,UAAU;GACV,KAAK;GACL;EACD;EAED,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACJ,UAAU;GACV,EAAE;GACF;EACD,KAAK;EACL,KAAK;GACJ,WAAW;GACX,EAAE;GACF;EACD,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACJ,UAAU;GACV,EAAE;GACF;EACD,KAAK;EACL,KAAK;EACL,KAAK;GACJ,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,OAAO;IACpD,UAAU;IACV,KAAK;IACL;GACD;GACA,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,SAAS;IACtD,UAAU;IACV,KAAK;IACL;GACD;GACA,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,SAA6B;IAC1E,UAAU;IACV,KAAK;IACL;GACD;GACA,EAAE;GACF;EACD,KAAK;GAEJ,IAAI;GACJ,OAAO,IAAI,OAAO,GAAG,MAAM,OAAO,IAAI,IAAI,QACzC,KAAK,IAAI,OAAO,CAAC;GAElB,IAAI,EAAE,MAAM,WAAW,GACtB,UAAU;GAEX;EACD,KAAK;EACL,KAAK;EACL,KAAK;GAEJ,OACC,IAAI,IAAI,WACP,YAAY,QAAS,IAAI,IAAI,OAAO,EAAE,CAAC,CAAE,IAAI,MAC5C,MAAM,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,CAAC,IAAI;GAIhF;EACD,KAAK;GACJ,OAAO,IAAI,OAAO,EAAE,CAAC,MAAM;GAG3B;EACD,KAAK;GACJ,EAAE;GACF,IAAI,IAAI,OAAO,CAAC,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,KAC9C,EAAE;GAEH;EACD,KAAK;EACL,KAAK;GACJ,EAAE;GACF;EACD,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACJ,OAAO,IAAI,IAAI,UAAU,aAAa,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI;GAGjE;EACD,KAAK;GACJ,EAAE;GACF;EACD,SACC,EAAE;CAEJ;CAED,OAAO,uBAAuB,SAAS,SAAS,QAAQ;AACzD;;;;;;;;;;AAWA,SAAgB,aAAa,KAAsB;CAClD,OAAO,sBAAsB,GAAG,MAAM;AACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAS,SAAS,KAAa,OAAY,MAAW,MAAsB;CAC3E,MAAM,MAA2B,CAAC;CAClC,IAAI,WAAW;CACf,IAAI,IAAI;CACR,IAAI,OAAO;CACX,IAAI,gBAAgB;CACpB,IAAI,UAA6B;CACjC,IAAI;CACJ,IAAI;CAGJ,IAAI,aAAa;CAGjB,OAAO,IAAI,IAAI,QACd,QAAS,OAAO,IAAI,OAAO,CAAC,GAA5B;EACC,KAAK;GACJ,IAAI,CAAC,gBAAgB,KAAK,CAAC,GAC1B,MAAM,IAAI,UAAU,aAAa,4BAA4B,OAAO,SAAS,GAAG;GAEjF,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAU;GAChD,KAAK;GACL;EACD,KAAK;GAEJ,KAAK,WAAW,KAAK,WAAW,IAAI,WAAW,EAAE,CAAC,OAAO,MAAM,IAAI,IAAI,SACtE,YAAY,OAAO,aAAa,QAAQ;GAEzC,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAS;GAC/C,EAAE;GACF;EACD,KAAK,MAAM;GAEV,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;GAC/B,MAAM,KAAK,aAAa,OAAO,aAAa,MAAM,WAAW;GAC7D,IAAI,IAAI,UAAU;IAAE,MAAM;IAAI,OAAO;GAAS;GAC9C,EAAE;GACF;EACD;EACA,KAAK;GAEJ,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAI;GAC1C,KAAK;GACL;EACD,KAAK;GAEJ,IAAI,IAAI,UAAU;IAAE,MAAM;IAAY;GAAM;GAC5C,EAAE;GACF;EACD,KAAK;EACL,KAAK,KAEJ,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK;GAC3D,IAAI,WAAW,MAAM;IACpB,UAAU,mBAAmB,OAAO,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,GAAG;IACnE,IAAI,WAAW,MACd,OAAO;GAET;GACA,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO,IAAI,UAAU,GAAG,IAAI,CAAC;GAAE;GAC9D,gBAAgB;GAChB,KAAK;GACL;EACD;EAED,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,KAEJ,OAAO,KAAK,YAAY;EAEzB,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GAEJ,IAAI,QAAQ,GACX,OAAO;GAER,IAAI,WAAW,MAAM;IACpB,UAAU,mBAAmB,OAAO,IAAI;IACxC,IAAI,WAAW,MACd,OAAO;GAET;GAEA,WAAW;GACX,OAAO,EAAE,IAAI,IAAI,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC,YAAY,MAAM,MAC1D,YAAY;GAGb,IAAI,SAAS,OAAO,cAAc,YAAY,MAAM,KACnD,OAAO;GAGR,IAAI,SAAS,KACZ,OAAO;GAER,IAAI,IAAI,UAAU;IAAE,MAAM;IAAM,OAAO;GAAS;GAChD,gBAAgB;GAChB;EACD,KAAK;EACL,KAAK;EACL,KAAK,KAAU;GAEd,MAAM,YAAsB;IAAE,MAAM;IAAM,OAAO;GAAK;GACtD,IAAI,WAAW,MACd,UAAU,mBAAmB,OAAO,IAAI;GAEzC,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,OAAO;IACpD,IAAI,WAAW,MACd,UAAU,QAAQ,QAAQ,SAAS,KAAK,IAAI,OAAO,IAAI,CAAC,IAAI;IAE7D,UAAU,OAAO;IACjB,aAAa;IACb,KAAK;GACN,OAAO,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,SAAS;IAC7D,IAAI,WAAW,MACd,UAAU,QAAQ,QAAQ,SAAS,KAAK,OAAO;IAEhD,UAAU,OAAO;IACjB,KAAK;IACL,aAAa;GACd,OAAO,IAAI,IAAI,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,SAA6B;IAEjF,IAAI,WAAW,MACd,UAAU,QAAQ,QAAQ,SAAS,KAAK,OAAiB;IAE1D,UAAU,OAAO;IACjB,KAAK;IACL,aAAa;GACd,OAAO;IACN,UAAU,OAAO;IACjB,EAAE;GACH;GACA,IAAI,WAAW,QAAQ,UAAU,SAAS,KACzC,OAAO;GAER,IAAI,IAAI,UAAU;GAClB,gBAAgB;GAChB;EACD;EACA,KAAK;GAEJ,WAAW;GACX,OAAO,IAAI,OAAO,GAAG,MAAM,OAAO,IAAI,IAAI,QACzC,YAAY,IAAI,OAAO,CAAC;GAEzB,IAAI,SAAS,MAAM,EAAE,MAAM,KAC1B,MAAM,IAAI,UAAU,aAAa,gCAA8B,WAAW,GAAG;GAE9E,IAAI,SAAS,MAAM,WAAW,GAAG;IAEhC,IAAI,WAAW,MAAM;KACpB,UAAU,mBAAmB,OAAO,IAAI;KACxC,IAAI,WAAW,MACd,OAAO;IAET;IACA,IAAI,IAAI,UAAU;KAAE,MAAM;KAAK,OAAO,SAAS,YAAY;IAAE;IAC7D,gBAAgB,SAAS,OAAO,CAAC;GAClC,OAAO,IAAI,SAAS,QAAQ,GAAG,IAAI,IAAI;IAEtC,YAAY,SAAS,MAAM,cAAc,KAAK,CAAC,EAAC,CAAE,MAAM;IACxD,IAAI,CAAC,aAAa,GAAG,GACpB,IAAI,IAAI,UAAU;KAAE,MAAM;KAAK,OAAO;IAAS;GAEjD;GACA;EACD,KAAK,KACJ,IAAI,WAAW,MAAM;GAEpB,WAAW;GACX,OAAO,EAAE,IAAI,IAAI,WAAW,OAAO,IAAI,OAAO,CAAC,OAAO,KACrD,YAAY;GAEb,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAS;GAC/C;EACD;EAED,KAAK;EACL,KAAK;GAEJ,WAAW;GACX,OAAO,EAAE,IAAI,IAAI,UAAU,YAAY,QAAS,OAAO,IAAI,OAAO,CAAC,CAAE,IAAI,IACxE,YAAY;GAEb,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAS;GAC/C;EACD,KAAK;GAEJ,WAAW;GACX,OAAO,IAAI,OAAO,EAAE,CAAC,MAAM,MAC1B,YAAY;GAEb,IAAI,IAAI,UAAU;IAAE,MAAM;IAAM,OAAO;GAAS;GAChD,gBAAgB;GAChB;EACD,KAAK;GAEJ,EAAE;GACF,IAAI,IAAI,OAAO,CAAC,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,KAC9C,EAAE;GAEH;EACD,KAAK;EACL,KAAK;GACJ,IAAI,IAAI,UAAU;IAAE,MAAM,SAAS,IAAI,MAAM;IAAM,OAAO;GAAK;GAC/D,EAAE;GACF;EACD,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GAEJ,WAAW;GACX,OAAO,IAAI,IAAI,UAAU,aAAa,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI,IAChE,YAAY,IAAI,OAAO,CAAC;GAEzB,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAS;GAC/C;EACD,KAAK;GACJ,IAAI,IAAI,UAAU;IAAE,MAAM;IAAM,OAAO;GAAK;GAC5C,EAAE;GACF;EACD,KAAK;GACJ,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAI;GAC1C,EAAE;GACF;EACD;GAEC,IAAI,wCAA6C,QAAQ,IAAI,MAAM,IAClE,MAAM,IAAI,UAAU,aAAa,4BAA4B,OAAO,SAAS,GAAG;GAEjF,IAAI,IAAI,UAAU;IAAE,MAAM;IAAK,OAAO;GAAK;GAC3C,EAAE;CAEJ;CAeD,IAAI,oBAAoB;CACxB,IAAI,kBAAkB;CACtB,IAAI;CACJ,KAAK,IAAI,IAAI,SAAS,GAAG,gBAAgB,KAAK,KAAK,GAAG,EAAE,GAAG;EAC1D,IAAI,CAAC,IAAI,IACR;EAED,QAAQ,IAAI,EAAE,CAAE,MAAhB;GACC,KAAK;GACL,KAAK;IACJ,IAAI,EAAE,CAAE,OAAO;IACf,gBAAgB;IAChB,IAAI,oBAAoB,GACvB,oBAAoB;IAErB;GACD,KAAK;IACJ,IAAK,MAAM,IAAI,EAAE,CAAE,MAAM,MAAM,OAAO,GAAI;KACzC,kBAAkB,KAAK,IAAI,iBAAiB,IAAI,EAAE,CAAC,SAAS,CAAC;KAC7D,oBAAoB;IACrB;IACA,IAAI,oBAAoB,GACvB,oBAAoB;GAGtB,KAAK;GACL,KAAK;GACL,KAAK;IACJ,gBAAgB,IAAI,EAAE,CAAE;IACxB;GACD,KAAK;IACJ,gBAAgB,IAAI,EAAE,CAAE;IACxB,IAAI,oBAAoB,GACvB,oBAAoB;IAErB;GACD,KAAK;IAEJ,IAAI,kBAAkB,KAAK;KAC1B,IAAI,EAAE,CAAE,OAAO;KACf,IAAI,oBAAoB,GACvB,oBAAoB;IAEtB;IACA;GACD,KAAK,KACJ;GACD,KAAK;IACJ,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAE,MAAM,MAAM,MAAM,GACtD,oBAAoB;IAErB,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAE,MAAM,MAAM,MAAM,GACtD,oBAAoB;IAErB,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAE,MAAM,MAAM,MAAM,GACtD,oBAAoB;EAEvB;CACD;CASA,IAAI,SAAS;EACZ,IAAI;EACJ,QAAQ,mBAAR;GACC,KAAK,GACJ;GACD,KAAK;GACL,KAAK;GACL,KAAK;IAEJ,IAAI,QAAQ,cAAc,IAAK;KAC9B,QAAQ,aAAa;KACrB,EAAE,QAAQ;IACX;IACA,IAAI,QAAQ,WAAW,IAAI;KAC1B,QAAQ,UAAU;KAClB,EAAE,QAAQ;IACX;IACA,IAAI,QAAQ,WAAW,IAAI;KAC1B,QAAQ,UAAU;KAClB,EAAE,QAAQ;IACX;IACA,IAAI,QAAQ,SAAS,IAAI;KACxB,QAAQ,QAAQ;KAChB,EAAE,QAAQ;KACV,MAAM,mBAAmB,QAAQ,SAAS;KAC1C,IAAI,KAAK;MACR,IAAI,aAAa,QAAQ;MACzB,IAAI,UAAU,QAAQ;MACtB,IAAI,UAAU,QAAQ;MACtB,IAAI,QAAQ,QAAQ;MACpB,UAAU;KACX;IACD;IACA;GACD,KAAK;IAEJ,QAAQ,iBAAR;KACC,KAAK;MACJ,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,EAAE,IAAI;MAC3D;KACD,KAAK;MACJ,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,GAAG,IAAI;MAC5D;KACD,KAAK,GACJ,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,GAAI,IAAI;IAE/D;IACA,IAAI,QAAQ,cAAc,GAAG;KAC5B,QAAQ,aAAa;KACrB,EAAE,QAAQ;IACX;IACA,IAAI,QAAQ,WAAW,IAAI;KAC1B,QAAQ,UAAU;KAClB,EAAE,QAAQ;IACX;IACA,IAAI,QAAQ,WAAW,IAAI;KAC1B,QAAQ,UAAU;KAClB,EAAE,QAAQ;IACX;IACA,IAAI,QAAQ,SAAS,IAAI;KACxB,QAAQ,QAAQ;KAChB,EAAE,QAAQ;KACV,MAAM,mBAAmB,QAAQ,SAAS;KAC1C,IAAI,KAAK;MACR,IAAI,aAAa,QAAQ;MACzB,IAAI,UAAU,QAAQ;MACtB,IAAI,UAAU,QAAQ;MACtB,IAAI,QAAQ,QAAQ;MACpB,UAAU;KACX;IACD;EAEF;CACD;CAUA,IAAI,eAAe;CACnB,IAAI;CACJ,KAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,EAAE,GAAG;EAChC,IAAI,CAAC,IAAI,IACR;EAED,QAAQ,IAAI,EAAE,CAAE,MAAhB;GACC,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,KACJ;GACD,KAAK;IAEJ,IAAI,EAAE,CAAE,QAAQ;IAChB,IAAI,EAAE,CAAE,OAAO;IACf;GACD,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACJ,IAAI,EAAE,CAAE,QAAQ,eAAe,IAAI,EAAE,CAAE,KAAK,WAAW,CAAC,GAAG,IAAI,EAAE,CAAE,OAAO,SAAU,eAAe;IACnG,IAAI,EAAE,CAAE,OAAO;IACf;GACD,KAAK;GACL,KAAK;IAEJ,YAAY,IAAI;IAChB,OACC,IAAI,cAAc,UAChB,OAAO,IAAI,UAAU,CAAE,UAAU,OAClC,SAAS,QACP,SAAS,OAAO,SAAS,QAC1B,IAAI,YAAY,MAAM,SACrB,IAAI,YAAY,EAAE,CAAE,SAAS,OAC5B,IAAI,YAAY,EAAE,CAAE,SAAS,OAAO,IAAI,YAAY,EAAE,CAAE,UAAU,QACpE,IAAI,EAAE,CAAE,SAAS,QAAQ,SAAS,OAAO,SAAS,OAAO,SAAS,QAClE,SAAS,QACR,IAAI,UAAU,CAAE,UAAU,OACzB,IAAI,UAAU,CAAE,UAAU,OAC1B,IAAI,YAAY,MAAM,QACtB,IAAI,YAAY,EAAE,CAAE,SAAS,OAChC;KACD,IAAI,EAAE,CAAE,SAAS,IAAI,UAAU,CAAE;KACjC,IAAI,aAAa;MAAE,OAAO;MAAI,MAAM;KAAI;KACxC,EAAE;IACH;IACA,gBAAgB,IAAI,EAAE,CAAE;IACxB,IAAI,YAAY;IAChB;GACD,KAAK;IACJ,IAAI,EAAE,CAAE,OAAO;IACf,IAAI,EAAE,CAAE,QAAQ,YAAY,OAAO,IAAI;EAEzC;CACD;CAGA,IAAI,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI,aAAa,SAAS,GAAG;EAC5B,IAAI,aAAa,WAAW,CAAC,MAAM,IAAI;GAEtC,gBAAgB,QAAQ,KAAK,aAAa,WAAW,CAAC,MAAM,KAAK,CAAC,QAAQ;GAC1E,kBAAkB,UAAU,KAAK,cAAc,aAAa;EAC7D,OAAO;GAEN,gBAAgB,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ;GACjD,kBAAkB,UAAU,KAAK,cAAc,aAAa;GAE5D,IAAI,gBAAgB,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,SAAS,KAAK;IACvD,kBAAkB,gBAAgB,UAAU,CAAC;IAC7C,IAAI,EAAE,CAAC,QAAQ,MAAM,IAAI,EAAE,CAAC;GAC7B;EACD;EAEA,YAAY,gBAAgB,SAAS;EACrC,IAAI,QAAQ,IAAI;EAEhB,KAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,EAAE,GAC7B,IAAI,IAAI,MAAM,QAAQ,IAAI,EAAE,CAAE,SAAS,OAAO,IAAI,EAAE,CAAE,MAAM,QAAQ,GAAG,IAAI,IAAI;GAC9E,QAAQ;GACR;EACD;EAED,IAAI,QAAQ,IAAI;EAChB,IAAI,UAAU,IAAI,UAAU,gBAAgB,QAAQ,GAAG,MAAM,IAAI;GAEhE,KAAK,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,EAAE,GAAG;IACrC,IAAI,IAAI,MAAM,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAE,IAAI,MAAM,IACpD;IAED,IAAI,aAAa,IAAI,EAAE,CAAE,MAAM,SAAS,GAAG;KAC1C,aAAa,IAAI,EAAE,CAAE,MAAM;KAC3B,IAAI,EAAE,CAAE,QAAQ,gBAAgB,UAAU,YAAY,GAAG,YAAY,IAAI,IAAI,EAAE,CAAE,MAAM,MAAM;IAC9F,OAAO,IAAI,YAAY,GACtB,IAAI,EAAE,CAAE,QAAQ;SACV;KACN,IAAI,EAAE,CAAE,QAAQ,gBAAgB,UAAU,GAAG,YAAY,CAAC;KAC1D,YAAY;IACb;IACA,IAAI,EAAE,CAAE,OAAO;IACf,QAAQ;GACT;GACA,IAAI,aAAa,KAAK,QAAQ,IAAI,QACjC,IAAI,MAAM,CAAE,QAAQ,gBAAgB,UAAU,GAAG,YAAY,CAAC,IAAI,IAAI,MAAM,CAAE;EAEhF,OAAO,IAAI,UAAU,IAAI,UAAU,gBAAgB,QAAQ,GAAG,MAAM,IAAI;GAEvE,YAAY,gBAAgB,QAAQ,GAAG,IAAI;GAC3C,KAAK,IAAI,OAAO,KAAK,GAAG,EAAE,GAAG;IAC5B,IAAI,IAAI,MAAM,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAE,IAAI,MAAM,IACpD;IAED,UACC,IAAI,EAAE,CAAE,MAAM,QAAQ,GAAG,IAAI,MAAM,MAAM,QACtC,IAAI,EAAE,CAAE,MAAM,QAAQ,GAAG,IAAI,IAC7B,IAAI,EAAE,CAAE,MAAM,SAAS;IAC3B,eAAe,IAAI,EAAE,CAAE,MAAM,UAAU,UAAU,CAAC;IAClD,OAAO,WAAW,GAAG,EAAE,SACtB,IACC,aAAa,MACZ,IAAI,EAAE,CAAE,MAAM,OAAO,OAAO,MAAM,OAAO,IAAI,EAAE,CAAE,MAAM,OAAO,OAAO,MAAM,MAE5E,eAAe,gBAAgB,OAAO,WAAW,IAAI;IAGvD,IAAI,EAAE,CAAE,QAAQ;IAChB,IAAI,EAAE,CAAE,OAAO;IACf,QAAQ;GACT;GACA,IAAI,aAAa,KAAK,QAAQ,IAAI,QACjC,IAAI,MAAM,CAAE,QAAQ,gBAAgB,UAAU,GAAG,YAAY,CAAC,IAAI,IAAI,MAAM,CAAE;GAG/E,YAAY,gBAAgB,QAAQ,GAAG,IAAI;GAC3C,KAAK,IAAI,OAAO,IAAI,IAAI,QAAQ,EAAE,GAAG;IACpC,IAAI,IAAI,MAAM,QAAS,MAAM,QAAQ,IAAI,EAAE,CAAE,IAAI,MAAM,MAAM,MAAM,OAClE;IAED,UAAU,IAAI,EAAE,CAAE,MAAM,QAAQ,GAAG,IAAI,MAAM,MAAM,QAAQ,IAAI,EAAE,CAAE,MAAM,QAAQ,GAAG,IAAI,IAAI;IAC5F,eAAe,IAAI,EAAE,CAAE,MAAM,UAAU,GAAG,OAAO;IACjD,OAAO,UAAU,IAAI,EAAE,CAAE,MAAM,QAAQ,EAAE,SACxC,IAAI,YAAY,gBAAgB,QAC/B,gBAAgB,gBAAgB,OAAO,WAAW;IAGpD,IAAI,EAAE,CAAE,QAAQ;IAChB,IAAI,EAAE,CAAE,OAAO;IACf,QAAQ;GACT;EACD;CACD;CAEA,KAAK,IAAI,GAAG,IAAI,IAAI,QAAQ,EAAE,GAC7B,IAAI,IAAI,MAAM,QAAQ,KAAK,QAAQ,IAAI,EAAE,CAAE,IAAI,IAAI,IAAI;EACtD,gBAAgB,OAAO,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAE,UAAU,MAAM,CAAC,QAAQ;EACvF,IAAI,EAAE,CAAE,QAAQ,UAAU,IAAI,EAAE,CAAE,MAAM,IAAI,EAAE,CAAE,OAAO,aAAa;EACpE,IAAI,EAAE,CAAE,OAAO;CAChB;CAGD,IAAI,SAAS;CACb,KAAK,IAAI,GAAG,MAAM,IAAI,QAAQ,EAAE,GAC/B,IAAI,IAAI,MAAM,MACb,UAAU,IAAI,EAAE,CAAE;CAGpB,OAAO;AACR;;AAGA,MAAM,WAAW;;AAGjB,SAAS,QAAQ,GAAW,IAAsC;CACjE,IAAI,MAAM,MACT,OAAO;CAER,MAAM,SAAS,WAAW,GAAG,EAAE;CAC/B,QAAQ,GAAG,IAAX;EACC,KAAK;GACJ,IAAI,KAAK,QACR,OAAO;GAER;EACD,KAAK;GACJ,IAAI,IAAI,QACP,OAAO;GAER;EACD,KAAK;GACJ,IAAI,IAAI,QACP,OAAO;GAER;EACD,KAAK;GACJ,IAAI,KAAK,QACR,OAAO;GAER;EACD,KAAK;GACJ,IAAI,KAAK,QACR,OAAO;GAER;EACD,KAAK,MACJ,IAAI,KAAK,QACR,OAAO;CAGV;CACA,OAAO;AACR;;;;;;;;;;;;;;;;;;AAmBA,SAAS,WAAW,QAAgB,OAA8B;CACjE,IAAI,MAAM,cAAc,MAAM;CAC9B,MAAM,eAAe,IAAI;CACzB,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC,QAAQ,GAAG;CAC7C,IAAI,KAAK;CACT,IAAI,eAAe,KAAK,MAAM,IAC7B,EAAE;CAEH,IAAI,IAAI,SAAS,GAChB,MAAM,IAAI,UAAU,aAAa,mCAAmC,IAAI,KAAK,GAAG,IAAI,GAAG;CAGxF,IAAI,OAAO,UAAU,UACpB,OAAO,CAAC,GAAG,IAAI,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,SAAS,KAAK,GAAG;CAEpE,IAAI,OAAO,UAAU,YAAY,CAAC,SAAS,KAAK,GAC/C,QAAQ;CAGT,QAAQ,IAAI,QAAZ;EACC,KAAK;GACJ,MAAM,MAAM,KAAK;IAAC;IAAW;IAAW;IAAW,IAAI;GAAE,IAAI;IAAC,IAAI;IAAI,IAAI;IAAI,IAAI;IAAI;GAAG;GACzF;EACD,KAAK;GACJ,MAAM,MAAM,KAAK;IAAC,IAAI;IAAI,IAAI;IAAI,IAAI;IAAI,IAAI;GAAE,IAAI;IAAC,IAAI;IAAI,IAAI;IAAI,IAAI;IAAI;GAAG;GAChF;EACD,KAAK,GACJ,MAAM,MAAM,KAAK;GAAC,IAAI;GAAI,IAAI;GAAI,IAAI;GAAI,IAAI;EAAE,IAAI;GAAC,IAAI;GAAI,IAAI;GAAI,IAAI;GAAI;EAAG;CAIlF;CAEA,MAAM,cAAc,QAAQ,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;CAElE,IAAI,IAAI,EAAE,CAAC,QAAQ,GAAG,MAAM,MAAM,IAAI,EAAE,CAAC,QAAQ,GAAG,MAAM,IACzD,OAAO,CAAC,IAAI,WAAW;CAGxB,IAAI,IAAI,EAAE,CAAC,MAAM,SAAS,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,SAAS,KAAK,MAAM;EACvE,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,QAAQ;EAChC,MAAM,KAAK,IAAI,EAAE,CAAC,MAAM,QAAQ;EAChC,OAAO,QAAQ,OAAO,EAAE,IACrB,CAAC,IAAI,IAAI,EAAE,IACX,QAAQ,OAAO,EAAE,IAChB,CAAC,IAAI,IAAI,EAAE,IACX,CAAC,IAAI,IAAI,MAAM,QAAQ,MAAM,OAAO,IAAI,EAAE;CAC/C;CACA,OAAO,CAAC,IAAI,WAAW;AACxB;;;;;;;;;;;;;AAcA,SAAgB,aAAa,KAAsB,OAAY,SAAuB;CACrF,IAAI,WAAW,MACd,UAAU,CAAC;CAEZ,IAAI,OAAO;CACX,QAAQ,OAAO,KAAf;EACC,KAAK;GAEJ,IAAI,QAAQ,YAAY,QAAQ,QAC/B,OAAO,QAAQ;QAEf,OAAO;GAER;EACD,KAAK;GACJ,IAAI,QAAQ,MAAM,QAAQ,QACzB,OAAO,QAAQ;QAGf,QAAQ,QAAQ,SAAS,OAAO,QAAQ,QAAQ,YAAW,CAAE;GAG9D,IAAI,QAAQ,MACX,OACE,QAAQ,SAAS,QAAQ,MAAM,mBAAmB,SAAU,YAAY,mBAAmB;GAE9F,IAAI,QAAQ,MACX,OAAO,uBAAuB,QAAQ;CAGzC;CACA,IAAI,gBAAgB,MAAM,CAAC,GAC1B,OAAO,YAAY,OAAO,OAAO;CAGlC,IAAI,iBAAiB,MAAM;EAC1B,MAAM,YAAY,QAAQ,MACvB,QACA,IAAI,KACJ,KAAK,IACJ,MAAM,YAAY,GAClB,MAAM,SAAS,GACf,MAAM,QAAQ,GACd,MAAM,SAAS,GACf,MAAM,WAAW,GACjB,MAAM,WAAW,GACjB,MAAM,gBAAgB,CACvB,CACD;EACF,QAAQ,mBAAmB,WAAW,QAAQ,QAAQ;CACvD;CAEA,MAAM,YAAY,WAAW,MAAM,KAAK;CACxC,IAAI,gBAAgB,UAAU,EAAE,GAC/B,OAAO,YAAY,OAAO,OAAO;CAElC,IAAI,UAAU,MACb,QAAQ;MACF,IAAI,UAAU,OACpB,QAAQ;MACF,IAAI,UAAU,MAAM,SAAS,MACnC,OAAO;MACD,IAAI,MAAM,KAAK,KAAK,UAAU,EAAE,CAAC,QAAQ,GAAG,IAAI,IACtD,OAAO;MACD,IAAI,CAAC,SAAS,KAAK,KAAK,UAAU,EAAE,CAAC,QAAQ,GAAG,IAAI,IAC1D,OAAO;CAER,OAAO,SAAS,UAAU,IAAI,OAAO,SAAS,UAAU,EAAE;AAC3D;;;;ACxgEA,MAAa,gBAAgB;AAC7B,MAAa,mBAAmB;AAChC,MAAa,2BAA2B;AACxC,MAAa,2BAA2B;AAExC,SAAgB,qBAAqB,OAA2B,UAAkB,MAAsB;CACvG,IAAI,SAAS,MACZ,OAAO;CAER,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAC3C,MAAM,IAAI,UAAU,oBAAoB,GAAG,KAAK,qCAAqC;CAEtF,OAAO;AACR;;AAGA,IAAa,sBAAb,MAAiC;CAIhC,YAAY,OAA2B,UAAkB;wBAHhD;wBACD,QAAO;EAGd,KAAK,QAAQ,qBAAqB,OAAO,UAAU,mBAAmB;CACvE;CAEA,OAAO,MAAc,OAAqB;EACzC,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAC3C,MAAM,IAAI,UAAU,aAAa,WAAW,KAAK,SAAS,OAAO;EAElE,IAAI,QAAQ,KAAK,QAAQ,KAAK,MAC7B,MAAM,IAAI,UAAU,kBAAkB,GAAG,KAAK,SAAS,KAAK,OAAO,MAAM,iBAAiB,KAAK,OAAO;EAEvG,KAAK,QAAQ;CACd;AACD;;;;AC9BA,MAAM,cAAc;AACpB,SAAgB,eAAe,OAAc,OAAO,mBAA2B;CAC9E,KAAK,MAAM,CAAC,MAAM,UAAU;EAC3B,CAAC,aAAa,MAAM,EAAE,CAAC;EACvB,CAAC,gBAAgB,MAAM,EAAE,CAAC;EAC1B,CAAC,WAAW,MAAM,EAAE,CAAC;EACrB,CAAC,cAAc,MAAM,EAAE,CAAC;CACzB,GACC,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAC3C,MAAM,IAAI,UAAU,oBAAoB,WAAW,KAAK,IAAI,KAAK,qCAAqC;CAGxG,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,GAChD,MAAM,IAAI,UAAU,oBAAoB,WAAW,KAAK,6BAA6B;CAEtF,IAAI,MAAM,EAAE,gBAAsB,MAAM,EAAE,YACzC,MAAM,IAAI,UAAU,oBAAoB,WAAW,KAAK,sCAAsC;CAI/F,QAFa,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MACxB,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;AAEtC;AAEA,SAAS,iBAAiB,OAAkB,OAA+C;CAC1F,IAAI,SAAS;CACb,IAAI,SAAS;CACb,MAAM,OAAQ,MAAc;CAC5B,IAAI,QAAQ,MACX,KAAK,MAAM,UAAU,OAAO,KAAK,IAAI,GAAG;EACvC,MAAM,SAAS,OAAO,MAAM;EAC5B,IAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,GACvE;EAED,MAAM,MAAM,KAAK;EACjB,IAAI,CAAC,KACJ;EAED,KAAK,MAAM,UAAU,OAAO,KAAK,GAAG,GAAG;GACtC,MAAM,SAAS,OAAO,MAAM;GAC5B,IAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,KAAK,IAAI,WAAW,MAC3F;GAED,IAAI,SAAS,QACZ,SAAS;GAEV,IAAI,SAAS,QACZ,SAAS;EAEX;CACD;MAEA,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG;EACrC,IAAI,CAAC,YAAY,KAAK,GAAG,KAAM,MAAc,QAAQ,MACpD;EAED,MAAM,OAAO,WAAW,GAAG;EAC3B,IAAI,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,MAAM,EAAE,KAAK,KAAK,IAAI,MAAM,EAAE,GACtF;EAED,IAAI,KAAK,IAAI,QACZ,SAAS,KAAK;EAEf,IAAI,KAAK,IAAI,QACZ,SAAS,KAAK;CAEhB;CAED,OAAO,WAAW,KAAK,OAAO;EAAE,GAAG;EAAQ,GAAG;CAAO;AACtD;AAEA,SAAgB,sBACf,OACA,OACA,SAAS,IAAI,oBAAoB,QAAW,wBAAwB,GACpE,kBAAkB,MACH;CACf,IAAI,QAAQ,eAAe,OAAO,wBAAwB;CAC1D,IAAI,SAAS,OAAO,OAAO;EAC1B,OAAO,OAAO,yBAAyB,KAAK;EAC5C,OAAO;CACR;CACA,IAAI,CAAC,iBAAiB;EACrB,OAAO,OAAO,yBAAyB,KAAK;EAC5C,OAAO;CACR;CACA,MAAM,MAAM,iBAAiB,OAAO,KAAK;CACzC,IAAI,CAAC,KACJ,OAAO;CAER,MAAM,UAAU;EACf,GAAG;GAAE,GAAG,MAAM,EAAE;GAAG,GAAG,MAAM,EAAE;EAAE;EAChC,GAAG;GACF,GAAG,KAAK,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;GACjD,GAAG,KAAK,IAAI,MAAM,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;EAClD;CACD;CACA,QAAQ,eAAe,SAAS,wBAAwB;CACxD,OAAO,OAAO,yBAAyB,KAAK;CAC5C,OAAO;AACR;;;;;;;;;;AC1CA,MAAM,YACL;AAED,MAAM,mBACL;AACD,MAAM,gBACL;AACD,MAAM,6BAA6B;;;;;;;;;;AA6BnC,SAAgB,gBAAgB,GAAW,OAA4B;CACtE,MAAM,eAAe,QAAgB,WAAuC;EAC3E,MAAM,UAAU,UAAU,MAAM,KAAK,SAAS,IAAI,MAAM;EACxD,OAAO,UAAU,KAAK,WAAW,QAAS,SAAY,SAAS,UAAU,OAAO;CACjF;CACA,MAAM,YAAY,QAAgB,QAAoC;EACrE,MAAM,UAAU,UAAU,GAAG,KAAK,SAAS,IAAI,MAAM;EACrD,OAAO,UAAU,KAAK,WAAW,UAAY,SAAY,SAAS,UAAU,OAAO;CACpF;CACA,MAAM,mBAAmB,YACxB,QACE,QAAQ,mBAAmB,IAAI,QAAQ,aAAa,aAAa,WAAW,cAAc;EAC1F,MAAM,QAAQ,YAAY,aAAa,WAAW;EAClD,MAAM,MAAM,YAAY,WAAW,SAAS;EAC5C,OAAO,UAAU,SAAS,MAAM,QAAQ,MAAM,MAAM;CACrD,CAAC,CAAC,CACD,QAAQ,gBAAgB,IAAI,QAAQ,aAAa,UAAU,WAAW,WAAW;EACjF,MAAM,QAAQ,SAAS,aAAa,QAAQ;EAC5C,MAAM,MAAM,SAAS,WAAW,MAAM;EACtC,OAAO,UAAU,SAAS,MAAM,QAAQ,MAAM,MAAM;CACrD,CAAC,CAAC,CACD,QAAQ,YAAY,IAAI,QAAQ,cAAc,QAAQ,WAAW,QAAQ;EACzE,MAAM,gBAAgB,YAAY,cAAc,MAAM;EACtD,MAAM,aAAa,SAAS,WAAW,GAAG;EAC1C,OAAO,UAAU,iBAAiB,aAAa,gBAAgB,aAAa;CAC7E,CAAC;CAEH,OAAO,EACL,MAAM,0BAA0B,CAAC,CACjC,KAAK,SAAS,UAAW,QAAQ,MAAM,IAAI,gBAAgB,OAAO,IAAI,OAAQ,CAAC,CAC/E,KAAK,EAAE;AACV;;;;;AC7FA,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,WAAW;AACjB,MAAM,WAAW;AACjB,MAAM,UAAU;AAChB,MAAM,cAAc;AACpB,MAAM,iBAAiB;;AAGvB,SAAS,sBAAsB,IAAe,GAAiB;CAC9D,MAAM,IAAI,gBAAgB,CAAC;CAC3B,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,KAAK,EAAE,EAAE,KAAK,GAC9D,GAAG,UAAU,YAAY,CAAC;AAE5B;;AAGA,SAAS,0BAA0B,KAAsC;CACxE,MAAM,UAAU,OAAgB,aAA6B;EAC5D,MAAM,SAAS,OAAO,UAAU,WAAW,WAAW,KAAK,IAAI,OAAO,KAAK;EAC3E,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS;CAC3C;CACA,OAAO;EACN,MAAM,OAAO,IAAI,MAAM,EAAG;EAC1B,OAAO,OAAO,IAAI,OAAO,EAAG;EAC5B,KAAK,OAAO,IAAI,KAAK,GAAI;EACzB,QAAQ,OAAO,IAAI,QAAQ,GAAI;EAC/B,QAAQ,OAAO,IAAI,QAAQ,EAAG;EAC9B,QAAQ,OAAO,IAAI,QAAQ,EAAG;CAC/B;AACD;AAEA,SAAS,wBAAwB,OAAuC;CACvE,IAAI,UAAU,MACb,OAAO;CAER,MAAM,QAAQ,YAAY,KAAK;CAC/B,OAAO,OAAO,OAAO,OAAO,KAAK,IAAI,MAAM,SAAS;AACrD;AAEA,SAAS,4BAA4B,OAAwB;CAC5D,IAAI,OAAO,UAAU,UACpB,OAAO,KAAK,UAAU,OAAO,KAAK;CAEnC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC5C;;AAGA,SAAS,6BAA6B,MAAc,MAA6B;CAEhF,OAAO,EAAE,KADG,YAAY,KAAK,MAAM,SAAS,CAAC,GAAG,MAAM,IAAI,QAAW,QAAW,IAChE,CAAC,CAAC,OAAO,GAAG;AAC7B;;AAGA,SAAS,uBAAuB,SAAoB,MAAgB,QAA6B,MAAkB;CAClH,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAAG;EACrC,MAAM,MAAM,YAAY,KAAK,IAAI,QAAW,QAAW,IAAI;EAC3D,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,KACpB;EAGD,IAAI,CAAC,aAAa,KAAK,IAAI,GAAG,KAAK,CAAC,aAAa,KAAK,IAAI,GAAG,GAC5D,MAAM,IAAI,UAAU,aAAa,uEAAuE;EAEzG,MAAM,MAAM,OAAO,IAAI,GAAG,IAAI;EAC9B,MAAM,MAAM,OAAO,IAAI,GAAG,IAAI;EAC9B,IAAI,CAAC,OAAO,cAAc,GAAG,KAAK,CAAC,OAAO,cAAc,GAAG,KAAK,MAAM,OAAO,cAC5E,MAAM,IAAI,UAAU,aAAa,qEAAqE;EAEvG,OAAO,OAAO,kBAAkB,MAAM,MAAM,CAAC;EAC7C,MAAM,QAAQ,IAAI,QAAQ,WAAW,IAAI,KAAK,IAAI;EAClD,MAAM,SAAS,IAAI,WAAW;EAC9B,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,EAAE,GAAG;GAChC,IAAI,CAAC,QAAQ,IACZ,QAAQ,KAAK,CAAC;GAEf,IAAI,UAAU,QACb,QAAQ,EAAE,CAAC,QAAQ;GAEpB,IAAI,QACH,QAAQ,EAAE,CAAC,SAAS;EAEtB;CACD;AACD;AAEA,SAAS,wBAAwB,MAAc,MAAqC;CACnF,MAAM,QAAQ,KAAK,MAAM,cAAc;CACvC,IAAI,CAAC,OACJ;CAED,MAAM,OAAO,MAAM,EAAE,CAAC,MAAM,0BAA0B;CACtD,IAAI,CAAC,MACJ;CAED,MAAM,MAAM,YAAY,KAAK,IAAI,QAAW,QAAW,IAAI;CAC3D,IAAI,IAAI,UAAU,UACjB;CAED,MAAM,OAAkB,EAAE,OAAO,SAAS;CAC1C,IAAI,IAAI,QACP,KAAK,SAAS,WAAW,IAAI,MAAM;CAEpC,IAAI,IAAI,QACP,KAAK,SAAS,WAAW,IAAI,MAAM;CAEpC,IAAI,IAAI,aACP,KAAK,cAAc,IAAI;CAExB,IAAI,IAAI,eAAe,cAAc,IAAI,eAAe,gBAAgB,IAAI,eAAe,eAC1F,KAAK,aAAa,IAAI;CAEvB,OAAO,CAAC,IAAI;AACb;;AAGA,SAAS,yBACR,GACA,QACA,MACA,QACA,MACO;CACP,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;EACvC,MAAM,MAAM,YAAY,OAAO,IAAI,QAAW,QAAW,IAAI;EAC7D,IAAI,CAAC,IAAI,KACR;EAGD,IAAI,CAAC,uCAAuC,KAAK,IAAI,GAAG,GACvD,MAAM,IAAI,UAAU,aAAa,mCAAmC;EAErE,MAAM,MAAM,gBAAgB,IAAI,GAAG;EACnC,IACC,IAAI,EAAE,IAAI,KACV,IAAI,EAAE,IAAI,KACV,IAAI,EAAE,IAAI,IAAI,EAAE,KAChB,IAAI,EAAE,IAAI,IAAI,EAAE,KAChB,IAAI,EAAE,gBACN,IAAI,EAAE,YAEN,MAAM,IAAI,UAAU,aAAa,wEAAwE;EAE1G,IAAI,KAAK,YAAY,KAAK,IAAI,EAAE,KAAK,KAAK,WACzC;EAED,MAAM,SAAS,KAAK,YAAY,IAAI,KAAK,IAAI,IAAI,EAAE,GAAG,KAAK,YAAY,CAAC,IAAI,IAAI,EAAE;EAClF,OAAO,OAAO,mBAAmB,SAAS,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE;EAChF,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,QAAQ,EAAE,GACpC,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG;GACxC,MAAM,OAAO,WAAW;IAAE,GAAG;IAAG,GAAG;GAAE,CAAC;GACtC,MAAM,QAAQ,EAAE,YAAY;GAC5B,IAAI;GACJ,IAAI,OAAO;IACV,IAAI,CAAC,EAAE,QAAQ,CAAE,IAChB,EAAE,QAAQ,CAAE,KAAK,CAAC;IAEnB,OAAO,EAAE,QAAQ,CAAE,EAAE,CAAE;GACxB,OACC,OAAO,EAAE;GAEV,IAAI,CAAC,MAAM;IACV,OAAO;KAAE,GAAG;KAAK,GAAG;IAAU;IAC9B,IAAI,OACH,EAAE,QAAQ,CAAE,EAAE,CAAE,KAAK;SAErB,EAAE,QAAQ;GAEZ;GAEA,IAAI,SAAS;GACb,IAAI,IAAI,IAAI;IACX,MAAM,MAAM,KAAK,MAAM,GAAG,IAAI;IAC9B,IAAI,KACH,SAAS,IAAI;GAEf;GACA,IAAI,IAAI,UACP,UAAU,MAAM,IAAI;GAErB,KAAM,IAAI,EAAE,QAAQ,OAAO;GAC3B,IAAI,IAAI,SACP,KAAM,EAAE,UAAU,IAAI;EAExB;CAEF;AACD;;AAGA,MAAM,YAAY;AAClB,MAAM,qBAAqB;AAE3B,SAAS,yBAAyB,KAAa,aAA6B;CAC3E,MAAM,QAAQ,mBAAmB,KAAK,GAAG;CACzC,IAAI,CAAC,OACJ,MAAM,IAAI,UAAU,aAAa,kCAAkC;CAEpE,MAAM,MAAM,OAAO,MAAM,EAAE,IAAI;CAC/B,IAAI,CAAC,OAAO,cAAc,GAAG,KAAK,MAAM,KAAK,gBAC5C,MAAM,IAAI,UAAU,aAAa,iEAAiE;CAEnG,IAAI,QAAQ,aACX,MAAM,IAAI,UAAU,aAAa,qEAAqE;CAEvG,IAAI,SAAS;CACb,KAAK,MAAM,UAAU,MAAM,IAC1B,SAAS,KAAK,UAAU,OAAO,WAAW,CAAC,IAAI;CAEhD,UAAU;CACV,IAAI,CAAC,OAAO,cAAc,MAAM,KAAK,SAAS,KAAK,iBAClD,MAAM,IAAI,UAAU,aAAa,oEAAoE;CAEtG,OAAO;AACR;;;;;AAMA,SAAS,eACR,OACA,GACA,MACA,UACA,SACA,QACA,IACA,QACA,kBACO;CACP,MAAM,QAAQ,EAAE,YAAY;CAC5B,MAAM,WAAW,IAAI,SAAS;CAC9B,IAAI,WAAW;CACf,MAAM,iCAAiB,IAAI,IAAiD;CAC5E,MAAM,wBAAyE,CAAC;CAChF,MAAM,6CAA6B,IAAI,IAAY;CAGnD,MAAM,OAAO,MAAM,MAAM,kBAAkB;CAE3C,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,QAAQ,EAAE,IAAI;EACxC,MAAM,SAAS,KAAK;EACpB,IAAI,CAAC,QACJ;EAID,MAAM,cAAc,OAAO,MAAM,uBAAuB;EACxD,IAAI,CAAC,aACJ;EAED,0BAA0B,iBAAiB,EAAE,UAAU,gBAAgB;EACvE,MAAM,SAAS,YAAY,YAAY,IAAI,QAAW,QAAW,IAAI;EAErE,MAAM,IAAI,SAAS,OAAO,GAAG,EAAE,IAAI;EACnC,IAAI,CAAC,OAAO,cAAc,CAAC,KAAK,IAAI,KAAK,cACxC,MAAM,IAAI,UAAU,aAAa,kEAAkE;EAGpG,MAAM,mBAAmB,CAAC,KAAK,aAAa,IAAI,KAAK;EAErD,IAAI,qBAAqB,OAAO,OAAO,UAAa,OAAO,WAAW,SAAY;GACjF,IAAI,CAAC,EAAE,UACN,EAAE,WAAW,CAAC;GAEf,IAAI,CAAC,EAAE,QAAQ,CAAC,IACf,EAAE,QAAQ,CAAC,KAAK,CAAC;GAElB,IAAI,OAAO,OAAO,QAAW;IAC5B,MAAM,MAAM,WAAW,OAAO,EAAE;IAChC,IAAI,OAAO,SAAS,GAAG,GACtB,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM;GAEtB;GACA,IAAI,OAAO,WAAW,KACrB,EAAE,QAAQ,CAAC,EAAE,CAAC,SAAS;EAEzB;EAKA,IAAI,CAAC,kBAAkB;GACtB,IAAI,KAAK,gBAAgB,SAAS,2BAA2B,OAAO,GAAG;IACtE,UAAU,YAAY;IACtB,IAAI;IACJ,OAAQ,mBAAmB,UAAU,KAAK,MAAM,GAAI;KACnD,OAAO,OAAO,kBAAkB,CAAC;KAOjC,MAAM,aANiB,YACtB,iBAAiB,EAAE,CAAC,MAAM,oBAAoB,CAAC,GAAG,KAAK,OAAO,IAC9D,QACA,QACA,IAE+B,CAAC,CAAC;KAClC,MAAM,mBAAmB,iBAAiB,MAAM;KAChD,MAAM,yBAAyB,iBAAiB,MAAM,qBAAqB;KAC3E,MAAM,sBAAsB,iBAAiB,MAAM,6CAA6C;KAChG,IAAI,CAAC,cAAc,CAAC,0BAA0B,CAAC,sBAAsB,IACpE;KAED,yBAAyB,YAAY,CAAC;KACtC,MAAM,oBAAoB,YAAY,uBAAuB,IAAI,QAAW,QAAW,IAAI;KAC3F,IAAI,kBAAkB,MAAM,YAAY,kBAAkB,MAAM,MAC/D;KAED,MAAM,KAAK,OAAO,kBAAkB,EAAE;KACtC,IAAI,CAAC,2BAA2B,IAAI,EAAE,GACrC;KAED,eAAe,IAAI,IAAI;MACtB,SAAS,YAAY,oBAAoB,EAAE;MAC3C,QAAQ;KACT,CAAC;KACD,2BAA2B,OAAO,EAAE;KACpC,IAAI,2BAA2B,SAAS,GACvC;IAEF;GACD;GACA;EACD;EAGA,UAAU,YAAY;EACtB,IAAI;EACJ,OAAQ,YAAY,UAAU,KAAK,MAAM,GAAI;GAC5C,OAAO,OAAO,kBAAkB,CAAC;GACjC,MAAM,UAAU,YACf,UAAU,EAAE,CAAC,MAAM,oBAAoB,CAAC,GAAG,KAAK,OAAO,IACvD,QACA,QACA,IACD;GACA,MAAM,MAAM,QAAQ;GACpB,IAAI,CAAC,KACJ;GAGD,MAAM,IAAI,yBAAyB,KAAK,CAAC;GAGzC,IAAI,IAAI,SAAS,EAAE,GAClB,SAAS,EAAE,IAAI;GAEhB,IAAI,IAAI,SAAS,EAAE,GAClB,SAAS,EAAE,IAAI;GAEhB,IAAI,IAAI,SAAS,EAAE,GAClB,SAAS,EAAE,IAAI;GAEhB,IAAI,IAAI,SAAS,EAAE,GAClB,SAAS,EAAE,IAAI;GAIhB,MAAM,WAAW,QAAQ,KAAK;GAE9B,MAAM,YAAY,QAAQ,IAAI,SAAS,QAAQ,GAAG,EAAE,IAAI;GACxD,MAAM,YAAY,UAAU,MAAM;GAElC,IAAI;GAGJ,MAAM,SAAS,UAAU,MAAM,sCAAsC;GACrE,MAAM,YAAY,UAAU,MAAM,qBAAqB;GACvD,MAAM,SAAS,UAAU,MAAM,6CAA6C;GAC5E,MAAM,UAAU,UAAU,MAAM,kDAAkD;GAClF,MAAM,kBAAkB,aAAa,QAAQ,KAAK,gBAAgB;GAElE,MAAM,IAAI,SAAS,OAAO,KAAK;GAE/B,QAAQ,UAAR;IACC,KAAK;KACJ,IAAI,MAAM,MAAM;MACf,MAAM,MAAM,SAAS,GAAG,EAAE;MAC1B,OAAO;OAAE,GAAG;OAAK,GAAG;MAAG;MAEvB,AAAC,KAAa,UAAU;KACzB,OACC,OAAO,EAAE,GAAG,IAAI;KAEjB;IACD,KAAK;KACJ,OAAO;MAAE,GAAG;MAAK,GAAG,IAAI,YAAY,CAAC,IAAI;KAAG;KAC5C;IACD,KAAK;KACJ,IAAI,SAAS;MACZ,MAAM,eAAe,gBAAgB,QAAQ,IAAI,IAAI;MACrD,OAAO;OAAE,GAAG;OAAK,GAAG,aAAa;MAAE;MACnC,IAAI,aAAa,MAAM,QACtB,KAAK,IAAI,aAAa;MAEvB,IAAI,aAAa,MAAM,QACtB,KAAK,IAAI,aAAa;KAExB,OACC,OAAO;MAAE,GAAG;MAAK,GAAG;KAAG;KAExB;IACD,KAAK;KACJ,OAAO;MAAE,GAAG;MAAK,GAAG,MAAM;KAAI;KAC9B;IACD,KAAK;KACJ,OAAO;MAAE,GAAG;MAAK,GAAG,wBAAwB,CAAC;KAAE;KAC/C,AAAC,KAAa,IAAI,MAAM,OAAO,KAAK,YAAY,CAAC;KACjD;IACD,KAAK;KACJ,IAAI,GACH,OAAO;MAAE,GAAG;MAAK,GAAG,IAAI,KAAK,CAAC;KAAE;UAEhC,OAAO,EAAE,GAAG,IAAI;KAEjB;IACD,SACC,IAAI,MAAM,MACT,OAAO;KAAE,GAAG;KAAK,GAAG,WAAW,CAAC;IAAE;SAC5B;KACN,IAAI,CAAC,mBAAmB,CAAC,KAAK,YAC7B;KAED,OAAO,kBAAkB,EAAE,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI;IAChD;GAEF;GAGA,IAAI,QAAQ;IACX,MAAM,KAAK,OAAO,OAAO;IACzB,IAAI,IAAI;KACP,MAAM,eAAe,OAAO,UAAU,GAAG,aAAa,YAAY,GAAG;KACrE,IAAI,YAAY,KAAK,GAAG,aAAa,GACpC,KAAK,KAAK;MAAE,UAAU,GAAG;MAAU,QAAQ;KAAa;KAEzD,IAAI,KAAK,YAAY;MACpB,MAAM,QAAQ,eAAe,QAAQ,SAAS;MAC9C,IAAI,OACH,KAAK,IAAI;KAEX;KACA,IAAI,KAAK,QACR;UAAI,cACH,KAAK,IAAI;KACV;IAEF;GACD;GAGA,IAAI,aAAa,KAAK,gBAAgB,OAAO;IAC5C,MAAM,OAAO,YAAY,UAAU,IAAI,QAAW,QAAW,IAAI;IACjE,MAAM,UAAU,SAAS,YAAY,OAAO,EAAE,IAAI;IAClD,IAAI,KAAK,MAAM,YAAY,KAAK,MAAM,MAAM;KAC3C,MAAM,KAAK,OAAO,KAAK,EAAE;KACzB,IAAI,SAAS;MACZ,KAAK,IAAI;MACT,eAAe,IAAI,IAAI;OAAE;OAAS,QAAQ;MAAI,CAAC;MAC/C,2BAA2B,OAAO,EAAE;KACrC,OAAO;MACN,MAAM,SAAS,eAAe,IAAI,EAAE;MACpC,IAAI,QAAQ;OACX,MAAM,SAAS,WAAW,OAAO,MAAM;OACvC,MAAM,SAAS,WAAW,GAAG;OAC7B,KAAK,IAAI,gBAAgB,OAAO,SAAS;QACxC,GAAG,OAAO,IAAI,OAAO;QACrB,GAAG,OAAO,IAAI,OAAO;OACtB,CAAC;MACF,OAAO;OACN,sBAAsB,KAAK;QAAE;QAAM;QAAK;OAAG,CAAC;OAC5C,2BAA2B,IAAI,EAAE;MAClC;KACD;IACD,OAAO,IAAI,YAAY,QACtB,KAAK,IAAI;IAEV,IAAI,KAAK,MAAM,WAAW,KAAK,KAAK;KACnC,KAAK,IAAI,KAAK;KACd,MAAM,eAAe,QAAQ,KAAK,KAAK,QAAQ,OAAO,OAAO,QAAQ,EAAE,IAAI,KAAK;KAChF,KAAK,IAAI,KAAK,OAAO,OAAO,cAAc,SAAS;IACpD;GACD;GAGA,IAAI,KAAK,MAAM,KAAK;IACnB,MAAM,WAAW,KAAK,IAAI,YAAY;IACtC,MAAM,OAAO,KAAK,KAAK,KAAK,IAAI,UAAU,QAAQ,UAAU,aAAa,YAAY;IACrF,IAAI,KAAK,aAAa,SAAS,OAAO,KAAK,MAAM,UAChD;SAAI,MACH,IAAI;MACH,KAAK,IAAI,aAAa,MAAM,KAAK,GAAG;OAAE;OAAU,QAAQ,KAAK;MAAO,CAAC;KACtE,QAAQ,CAAC;IACV;IAGD,IAAI,KAAK,aAAa,KAAK,IAAI;KAC9B,MAAM,UAAU,OAAO,SAAS,WAAW,sBAAsB,IAAI,IAAI;KACzE,IAAI,YAAY,UAAU,YAAY,UAAU,OAAO,KAAK,MAAM,UAAU;MAC3E,KAAK,IAAI;MACT,KAAK,IAAI,mBAAmB,KAAK,GAAG,QAAQ;KAC7C;IACD;GACD;GAGA,IAAI,OAAO;IACV,IAAI,CAAC,EAAE,QAAQ,CAAE,IAChB,EAAE,QAAQ,CAAE,KAAK,CAAC;IAEnB,EAAE,QAAQ,CAAE,EAAE,CAAC,KAAK;GACrB,OACC,EAAE,OAAO;EAEX;CACD;CAEA,KAAK,MAAM,WAAW,uBAAuB;EAC5C,MAAM,SAAS,eAAe,IAAI,QAAQ,EAAE;EAC5C,IAAI,CAAC,QACJ;EAED,MAAM,SAAS,WAAW,OAAO,MAAM;EACvC,MAAM,SAAS,WAAW,QAAQ,GAAG;EACrC,QAAQ,KAAK,IAAI,gBAAgB,OAAO,SAAS;GAChD,GAAG,OAAO,IAAI,OAAO;GACrB,GAAG,OAAO,IAAI,OAAO;EACtB,CAAC;CACF;AACD;;;;;;;;;AAUA,SAAgB,qBAAqB,GAAc,KAAU,MAAiB;CAC7E,MAAM,eAAe,SAAuC;EAC3D,IAAI,CAAC,QAAS,KAAa,YAAY,QACtC;EAED,MAAM,MAAO,KAAa;EAC1B,OAAQ,KAAa;EACrB,IAAI,IAAI,MAAM;GACb,KAAK,IAAI,IAAI,IAAI,CAAC;GAClB,IAAI,KAAK,aAAa,SAAS,IAAI,IAAI,CAAC,GACvC,KAAK,IAAI,IAAI,IAAI,CAAC;GAEnB,IAAI,IAAI,IAAI,CAAC,GACZ,KAAK,IAAI,IAAI,IAAI,CAAC;EAEpB;CACD;CAEA,IADc,EAAE,YAAY,MACjB;EACV,MAAM,OAAO,EAAE;EACf,KAAK,MAAM,UAAU,OAAO,KAAK,IAAI,GAAG;GACvC,MAAM,IAAI,OAAO,MAAM;GACvB,IAAI,CAAC,OAAO,cAAc,CAAC,KAAK,IAAI,GACnC;GAED,MAAM,MAAM,KAAK;GACjB,IAAI,CAAC,KACJ;GAED,KAAK,MAAM,aAAa,OAAO,KAAK,GAAG,GAAG;IACzC,MAAM,IAAI,OAAO,SAAS;IAC1B,IAAI,CAAC,OAAO,cAAc,CAAC,KAAK,IAAI,GACnC;IAED,YAAY,IAAI,EAAE;GACnB;EACD;CACD,OACC,KAAK,MAAM,OAAO,OAAO,KAAK,CAAC,GAAG;EAEjC,IAAI,IAAI,OAAO,CAAC,MAAM,KACrB;EAED,YAAY,EAAE,IAAkB;CACjC;AAEF;;;;;;;;;;;;;;;;AAiBA,SAAgB,kBACf,MACA,MACA,MACA,MACA,IACA,SACA,QACY;CACZ,IAAI,CAAC,MACJ,OAAO,CAAC;CAET,IAAI,CAAC,MACJ,OAAO,CAAC;CAET,KAAK,YAAY,qBAAqB,KAAK,WAAW,GAAG,WAAW;CACpE,MAAM,mBAAmB,qBACxB,KAAK,kBACL,4BACA,kBACD;CACA,oBAAoB,iBAAiB,MAAM,IAAI;CAC/C,IAAI,CAAC,MACJ,OAAO,EAAE,OAAO,CAAC,EAAE;CAGpB,MAAM,IAAe,KAAK,QAAQ,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC;CACrD,MAAM,SAAS,IAAI,oBAAoB,KAAK,mBAAmB,wBAAwB;CAEvF,MAAM,WAAkB;EAAE,GAAG;GAAE,GAAG;GAAS,GAAG;EAAQ;EAAG,GAAG;GAAE,GAAG;GAAG,GAAG;EAAE;CAAE;CAG3E,IAAI,QAAQ;CACZ,IAAI,QAAQ;CACZ,MAAM,UAAU,KAAK,MAAM,2DAA2D;CACtF,IAAI,SAAS;EACZ,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK;EACnC,QAAQ,KAAK,MAAM,QAAQ,QAAS,QAAQ,EAAE,CAAC,MAAM;CACtD,OACC,QAAQ,QAAQ;CAIjB,MAAM,QAAQ,MAAM,MAAM,qBAAqB,KAAM,EAAE,OAAO,GAAG,EAAS,CAAE;CAC5E,IAAI,OAAO,GAAG;EACb,MAAM,MAAM,MAAM,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC,MAAM,QAAQ;EACvD,IAAI,OAAO,CAAC,KAAK,OAChB,sBAAsB,GAAG,IAAI,EAAE;CAEjC;CAGA,MAAM,UAAqB,CAAC;CAC5B,IAAI,KAAK,YAAY;EACpB,MAAM,OAAO,MAAM,MAAM,QAAQ;EACjC,IAAI,MACH,uBAAuB,SAAS,MAAM,QAAQ,IAAI;EAEnD,MAAM,QAAQ,wBAAwB,OAAO,IAAI;EACjD,IAAI,OACH,EAAE,YAAY;CAEhB;CAGA,IAAI,SACH,eAAe,QAAQ,IAAI,GAAG,MAAM,UAAU,SAAS,QAAQ,IAAI,QAAQ,gBAAgB;CAI5F,MAAM,UAAU,MAAM,MAAM,OAAO;CACnC,IAAI,SACH,EAAE,iBAAiB,6BAA6B,QAAQ,IAAI,IAAI;CAIjE,MAAM,SAAkB,CAAC;CACzB,MAAM,SAAS,MAAM,MAAM,WAAW;CACtC,IAAI,QACH,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAEpC,OAAO,KAAK,gBAAgB,OAAO,EAAE,CAAC,MAAM,OAAO,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAKzE,MAAM,QAAQ,MAAM,MAAM,UAAU;CACpC,IAAI,OACH,yBAAyB,GAAG,OAAO,MAAM,QAAQ,IAAI;CAItD,MAAM,UAAU,MAAM,MAAM,WAAW;CACvC,IAAI,SACH,EAAE,cAAc,0BAA0B,YAAY,QAAQ,IAAI,QAAW,QAAW,IAAI,CAAC;CAI9F,MAAM,OAAO,MAAM,MAAM,4BAA4B;CACrD,IAAI,MACH,AAAC,EAAU,aAAa,KAAK;CAI9B,IAAI,KAAK,OACR,SAAS,EAAE,IAAI,SAAS,EAAE,IAAI;CAG/B,IAAI,CAAC,EAAE,WAAW,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,GAC5E,EAAE,UAAU,YAAY,QAAQ;CAGjC,IAAI,KAAK,YAAY,KAAK,EAAE,SAAS;EACpC,MAAM,SAAS,gBAAgB,EAAE,OAAO;EACxC,IAAI,KAAK,aAAa,OAAO,EAAE,GAAG;GACjC,OAAO,EAAE,IAAI,KAAK,YAAY;GAC9B,IAAI,OAAO,EAAE,IAAI,SAAS,EAAE,GAC3B,OAAO,EAAE,IAAI,SAAS,EAAE;GAEzB,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE,GACzB,OAAO,EAAE,IAAI,OAAO,EAAE;GAEvB,IAAI,OAAO,EAAE,IAAI,SAAS,EAAE,GAC3B,OAAO,EAAE,IAAI,SAAS,EAAE;GAEzB,IAAI,OAAO,EAAE,IAAI,OAAO,EAAE,GACzB,OAAO,EAAE,IAAI,OAAO,EAAE;GAGvB,AAAC,EAAU,cAAc,EAAE;GAC3B,EAAE,UAAU,YAAY,MAAM;EAC/B;CACD;CACA,IAAI,QAAQ,SAAS,GACpB,EAAE,WAAW;CAEd,IAAI,OAAO,SAAS,GACnB,EAAE,aAAa;CAGhB,OAAO;AACR;;AAGA,SAAS,yBAAyB,QAAyB;CAC1D,IAAI,OAAO,WAAW,GACrB,OAAO;CAER,MAAM,QAAQ,CAAC,yBAAwB,OAAO,SAAS,KAAI;CAC3D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GACpC,MAAM,KAAK,sBAAqB,YAAY,OAAO,EAAE,IAAI,MAAK;CAE/D,MAAM,KAAK,eAAe;CAC1B,OAAO,MAAM,KAAK,EAAE;AACrB;AAEA,SAAS,yBAAyB,MAAqC;CACtE,IAAI,KAAK,aACR,OAAO,KAAK;CAEb,MAAM,SAAS,KAAK,UAAU;CAC9B,MAAM,SAAS,KAAK,UAAU;CAC9B,IAAI,UAAU,KAAK,UAAU,GAC5B;CAED,OAAO,WAAW;EAAE,GAAG;EAAQ,GAAG;CAAO,CAAC;AAC3C;AAEA,SAAS,wBAAwB,MAA4D;CAC5F,IAAI,KAAK,YACR,OAAO,KAAK;CAEb,IAAI,KAAK,UAAU,KAAK,QACvB,OAAO;CAER,OAAO,KAAK,SAAS,aAAa;AACnC;AAEA,SAAS,6BAA6B,IAAe,KAAqB;CACzE,MAAM,OAAO,GAAG,SAAS,EAAE,MACzB,SAAS,MAAM,UAAU,cAAc,KAAK,UAAU,KAAK,MAAM,KAAK,UAAU,KAAK,EACvF;CACA,MAAM,QAAQ,QAAQ,IAAI,uBAAqB;CAC/C,IAAI,CAAC,MACJ,OAAO,gDAA8C,QAAQ;CAE9D,MAAM,YAAoC;EAAE,OAAO;EAAU,YAAY,wBAAwB,IAAI;CAAE;CACvG,IAAI,KAAK,QACR,UAAU,SAAS,OAAO,KAAK,MAAM;CAEtC,IAAI,KAAK,QACR,UAAU,SAAS,OAAO,KAAK,MAAM;CAEtC,MAAM,cAAc,yBAAyB,IAAI;CACjD,IAAI,aACH,UAAU,cAAc;CAEzB,MAAM,OAAO,gBAAgB,QAAQ,MAAM,SAAS;CACpD,MAAM,YAAY,gBAAgB,aAAa,MAAM,EAAE,MAAM,UAAU,WAAW,CAAC;CACnF,OAAO,gDAA8C,QAAQ,MAAM,OAAO,YAAY;AACvF;;AAGA,SAAS,gBAAgB,MAAsC;CAC9D,MAAM,OAAO,OAAO,KAAK,CAAC;CAC1B,IAAI,OAAO,KAAK,MAAM,YAAY,KAAK,EAAE,WAAW,GACnD;CAED,IAAI;EACH,IAAI,gBAAgB,KAAK,GAAG,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,MAAM,MACtD,OAAO,qBAAqB,KAAK,CAAC;CAEpC,QAAQ,CAAC;AAEV;;AAGA,SAAS,gBACR,MACA,UACA,MACS;CACT,MAAM,OAAO,OAAO,KAAK,CAAC;CAC1B,MAAM,MAAM,aAAa,SAAY,QAAQ,OAAO,QAAQ;CAC5D,MAAM,WAAW,KAAK,WAAW,IAAI,GAAG;CACxC,KAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS,KAAK;CACjD,IAAI,aAAa,QAChB,OAAO;CAGR,MAAM,QAAkB,EAAE,GAAG,KAAK;CAClC,IAAI,aAAa,QAChB,MAAM,IAAI;CAEX,MAAM,QAAQ,KAAK,QAAQ;CAC3B,KAAK,QAAQ,KAAK,KAAK;CACvB,KAAK,QAAQ,UAAU,KAAK,QAAQ,UAAU,KAAK;CACnD,KAAK,WAAW,IAAI,KAAK,KAAK;CAC9B,OAAO;AACR;;;;;;;;;;;;;;AAeA,SAAgB,kBAAkB,IAAe,MAAW,MAAc,OAAsB,KAAkB;CACjH,MAAM,SAAS,IAAI,oBAAoB,KAAK,mBAAmB,wBAAwB;CACvF,MAAM,QAAkB,CAAC,UAAU;CACnC,MAAM,KACL,gBAAgB,aAAa,MAAM;EAClC,OAAO,WAAW;EAClB,WAAW;CACZ,CAAC,CACF;CAEA,MAAM,MAAM,GAAG,WAAW;CAC1B,MAAM,QAAQ,GAAG,UAAU,sBAAsB,IAAI,gBAAgB,GAAG,GAAG,MAAM,IAAI;CACrF,MAAM,eAAe,QAAQ,YAAY,KAAK,IAAI;CAClD,MAAM,KAAK,sBAAqB,eAAe,MAAK;CAEpD,MAAM,KAAK,6BAA6B,IAAI,IAAI,CAAC;CAEjD,MAAM,KAAK,0CAAwC;CAGnD,IAAI,GAAG,UAAU;EAChB,MAAM,gBAAgB,OAAO,KAAK,GAAG,QAAQ,CAAC,CAC5C,IAAI,MAAM,CAAC,CACX,QAAQ,UAAU,OAAO,cAAc,KAAK,KAAK,SAAS,KAAK,GAAG,QAAQ,CAAE,MAAM,CAAC,CACnF,MAAM,GAAG,MAAM,IAAI,CAAC;EACtB,IAAI,cAAc,MAAM,UAAU,cAAyB,GAC1D,MAAM,IAAI,UACT,oBACA,uDAAuD,kBACxD;EAED,OAAO,OAAO,6BAA6B,cAAc,MAAM;EAC/D,MAAM,KAAK,QAAQ;EACnB,KAAK,MAAM,KAAK,eAAe;GAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC;GACxB,MAAM,QAAgC;IACrC,KAAK,OAAO,IAAI,CAAC;IACjB,KAAK,OAAO,IAAI,CAAC;GAClB;GACA,IAAI,IAAI,OACP,MAAM,QAAQ,OAAO,IAAI,KAAK;QAE9B,MAAM,QAAQ;GAEf,IAAI,IAAI,QACP,MAAM,SAAS;GAEhB,MAAM,cAAc;GACpB,MAAM,KAAK,gBAAgB,OAAO,MAAM,KAAK,CAAC;EAC/C;EACA,MAAM,KAAK,SAAS;CACrB;CAEA,MAAM,KAAK,aAAa;CAExB,MAAM,QAAQ,GAAG,YAAY;CAC7B,MAAM,WAAW,OAAO,EAAE,KAAK;CAC/B,MAAM,UAAU,OAAO,EAAE,KAAK;CAC9B,MAAM,cAAc,OAAO,EAAE,KAAK;CAClC,MAAM,aAAa,OAAO,EAAE,KAAK;CACjC,MAAM,aAAa,QAAgB,aAA6B;EAC/D,MAAM,UAAU,GAAG,QAAQ,GAAG;EAC9B,MAAM,kBAAkB,WAAW,QAAQ,OAAO,SAAS,QAAQ,GAAG;EACtE,MAAM,cAAc,mBAAmB,SAAS,WAAW;EAC3D,IAAI,SAAS,WAAW,KAAK,CAAC,aAC7B;EAED,IAAI,SAAS,eAAc,SAAS,KAAK;EACzC,IAAI,SAAS;GACZ,IAAI,iBACH,UAAU,WAAU,QAAQ,MAAM;GAEnC,IAAI,QAAQ,WAAW,MACtB,UAAU;EAEZ;EACA,UAAU;EACV,MAAM,KAAK,MAAM;EACjB,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;EAC5B,MAAM,KAAK,QAAQ;CACpB;CACA,MAAM,qBAAqB,OAAO,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CACvD,IAAI,MAAM,CAAC,CACX,QAAQ,WAAW,OAAO,cAAc,MAAM,KAAK,UAAU,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC,CACxF,MAAM,GAAG,MAAM,IAAI,CAAC;CACtB,IAAI,mBAAmB,MAAM,WAAW,iBAAuB,GAC9D,MAAM,IAAI,UAAU,oBAAoB,iDAAiD,eAAe;CAEzG,OAAO,OAAO,0BAA0B,mBAAmB,MAAM;CACjE,MAAM,YAAY,mBAAmB,QAAQ,WAAW,SAAS,QAAQ,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,EAAE,CAAC;CACjH,KAAK,MAAM,UAAU,WACpB,IAAI,SAAS,QAAQ,SAAS,MAAM,EAAE,GACrC,UAAU,QAAQ,CAAC,CAAC;CAItB,KAAK,IAAI,SAAS,UAAU,UAAU,SAAS,EAAE,QAAQ;EACxD,MAAM,YAAsB,CAAC;EAC7B,KAAK,IAAI,SAAS,aAAa,UAAU,YAAY,EAAE,QAAQ;GAC9D,IAAI;GACJ,IAAI,OACH,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG;QAG/B,OAAO,GADM,WAAW;IAAE,GAAG;IAAQ,GAAG;GAAO,CAClC;GAEd,MAAM,aAAa,OAAO,kBAAkB,MAAM,IAAI,IAAI;GAE1D,IAAI,CAAC,QAAS,KAAK,MAAM,OAAO,cAAc,MAC7C;GAGD,MAAM,OAAO,WAAW;IAAE,GAAG;IAAQ,GAAG;GAAO,CAAC;GAChD,IAAI,eAAe;GACnB,IAAI,eAAe;GACnB,IAAI,eAAe;GACnB,MAAM,WAAW,KAAK,MAAM,MAAM,gBAAgB,IAAI,IAAI;GAE1D,QAAQ,KAAK,GAAb;IACC,KAAK;KACJ,eAAe,KAAK,IAAI,MAAM;KAC9B,eAAe;KACf;IACD,KAAK;KACJ,IAAI,KAAK,KAAK,MACb,eAAe,OAAO,KAAK,CAAC;KAE7B;IACD,KAAK;KACJ,eAAe,UAAU,4BAA4B,KAAK,CAAC,CAAC;KAC5D,eAAe;KACf;IACD,KAAK;KACJ,IAAI,KAAK,WAAW;MACnB,eAAgB,KAAK,EAAW,YAAY;MAC5C,eAAe;KAChB,OAEC,eAAe,OAAO,mBAAmB,KAAK,GAAW,KAAK,UAAU,SAAS,QAAQ,CAAC;KAE3F;IACD,KAAK,KACJ,IAAI,CAAC,KAAK,KAAK,KAAK,SAAS;KAC5B,eAAe,OAAO,gBAAgB,MAAM,UAAU,IAAI,CAAC;KAC3D,eAAe;IAChB,OAAO,IAAI,CAAC,KAAK,KAAK,aAAa,QAAW;KAC7C,eAAe;KACf,eAAe;KACf,eAAe;IAChB,OAAO;KACN,eAAe,UAAU,OAAO,KAAK,CAAC,CAAC;KACvC,eAAe;IAChB;GAEF;GAEA,IAAI,UAAU,YAAW,OAAO;GAChC,IAAI,cACH,WAAW,UAAS,eAAe;GAEpC,IAAI,cAAc,QAAQ,aAAa,GACtC,WAAW,UAAS,aAAa;GAElC,IAAI,KAAK,GACR,WAAW;GAEZ,IAAI,CAAC,KAAK,KAAK,iBAAiB,IAAI;IACnC,WAAW;IACX,UAAU,KAAK,OAAO;IACtB;GACD;GACA,WAAW;GACX,IAAI,KAAK,GAAG;IACX,WAAW;IACX,IAAI,KAAK,GAER,WAAW,YAAW,KAAK,IAAI;IAEhC,WAAW,MAAM,UAAU,KAAK,CAAC,IAAI;GACtC;GACA,IAAI,iBAAiB,IACpB,WAAW,MAAM,eAAe,MAAM,eAAe,OAAO,eAAe;GAE5E,WAAW;GACX,UAAU,KAAK,OAAO;EACvB;EACA,UAAU,QAAQ,SAAS;CAC5B;CAIA,KAAK,MAAM,UAAU,WACpB,IAAI,SAAS,SAAS,MAAM,EAAE,GAC7B,UAAU,QAAQ,CAAC,CAAC;CAItB,MAAM,KAAK,cAAc;CAGzB,IAAI,GAAG,cAAc,GAAG,UAAU,CAAC,SAAS,GAC3C,MAAM,KAAK,yBAAyB,GAAG,UAAU,CAAC;CAInD,IAAI,GAAG,gBACN,MAAM,KAAK,uBAAsB,GAAG,cAAc,CAAC,MAAM,MAAK;CAI/D,IAAI,GAAG,aAAa;EACnB,MAAM,UAAU,GAAG;EACnB,MAAM,KACL,gBAAgB,eAAe,MAAM;GACpC,MAAM,OAAO,QAAQ,QAAQ,EAAG;GAChC,OAAO,OAAO,QAAQ,SAAS,EAAG;GAClC,KAAK,OAAO,QAAQ,OAAO,GAAI;GAC/B,QAAQ,OAAO,QAAQ,UAAU,GAAI;GACrC,QAAQ,OAAO,QAAQ,UAAU,EAAG;GACpC,QAAQ,OAAO,QAAQ,UAAU,EAAG;EACrC,CAAC,CACF;CACD;CAEA,MAAM,gBAAgB,OAAO,OAAO,QAAQ,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAiB,aAAa,SAASC,KAAQ,GAAG;CAClH,IAAI,eACH,MAAM,KAAK,gBAAgB,iBAAiB,MAAM,EAAE,QAAQ,cAAc,GAAG,CAAC,CAAC;CAGhF,MAAM,KAAK,cAAc;CAEzB,MAAM,KAAK,MAAM,EAAE,CAAC,QAAQ,MAAM,GAAG;CACrC,OAAO,MAAM,KAAK,EAAE;AACrB;;;;;;;;;;;;;;AC1lCA,SAAgB,kBAAkB,WAAmB,KAA8B;CAClF,MAAM,KAAK,IAAI,OAAO,gBAAgB,MAAM,mCAAmC,MAAM,KAAK,GAAG;CAC7F,OAAO,UAAU,MAAM,EAAE;AAC1B;;;;;;;;;;AAWA,SAAgB,iBAAiB,WAAmB,KAA4B;CAC/E,MAAM,IAAI,kBAAkB,WAAW,GAAG;CAC1C,OAAO,IAAI,EAAE,KAAK;AACnB;;;;;;;;;;;ACZA,SAAgB,oBAAoB,OAAqC;CACxE,MAAM,MAAyB,CAAC;CAChC,MAAM,OAAO,KAAa,SAAoB;EAC7C,IAAI,CAAC,MAAM,QAAQ,MAAM,CAAC,KAAK,KAAK,EAAE,WAAW,GAChD;EAED,MAAM,WAAW,KAAK,EAAE,KAAK,aAAkB,EAAE,GAAG,QAAQ,EAAE;EAC9D,IAAI,KAAK,EAAE,UAAU,MACpB,SAAS,SAAS,KAAK,EAAE;EAE1B,IAAI,KAAK,CAAC,KAAK,QAAQ,CAAC;CACzB;CAEA,IAAK,MAAc,YAAY,MAAM;EACpC,MAAM,OAAQ,MAAc;EAC5B,KAAK,MAAM,UAAU,OAAO,KAAK,IAAI,GAAG;GACvC,MAAM,WAAW,OAAO,MAAM;GAC9B,MAAM,MAAM,KAAK;GACjB,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW,KAAK,WAAW,WAAa,CAAC,MAAM,QAAQ,GAAG,GAChG;GAED,KAAK,MAAM,aAAa,OAAO,KAAK,GAAG,GAAG;IACzC,MAAM,cAAc,OAAO,SAAS;IACpC,IAAI,CAAC,OAAO,cAAc,WAAW,KAAK,cAAc,KAAK,cAAc,OAC1E;IAED,IAAI,WAAW;KAAE,GAAG;KAAU,GAAG;IAAY,CAAC,GAAG,IAAI,YAAY;GAClE;EACD;CACD,OACC,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG;EACrC,IAAI,CAAC,uBAAuB,KAAK,GAAG,GACnC;EAED,MAAM,UAAU,WAAW,GAAG;EAC9B,IAAI,QAAQ,KAAK,WAAa,QAAQ,KAAK,SAAU,WAAW,OAAO,MAAM,KAC5E,IAAI,KAAM,MAAc,IAAI;CAE9B;CAGD,OAAO;AACR;;;;;;;;;;;;AA4BA,SAAgB,wBACf,OACA,UACA,UACA,QACO;CACP,MAAM,QAAS,MAAc,YAAY;CACzC,KAAK,MAAM,WAAW,UAAU;EAC/B,MAAM,IAAI,WAAW,QAAQ,GAAG;EAChC,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,GACpB;EAED,IAAI;EACJ,IAAI,OAAO;GACV,IAAI,CAAE,MAAc,QAAQ,CAAC,EAAE,IAC9B,AAAC,MAAc,QAAQ,CAAC,EAAE,KAAK,CAAC;GAEjC,OAAQ,MAAc,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE;EACvC,OACC,OAAQ,MAAc,QAAQ;EAG/B,IAAI,CAAC,MAAM;GACV,OAAO,EAAE,GAAG,IAAI;GAChB,IAAI,OACH,AAAC,MAAc,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK;QAEpC,AAAC,MAAc,QAAQ,OAAO;GAI/B,MAAM,QAAQ,gBAAgB,MAAM,WAAW,iBAAiB;GAChE,IAAI,MAAM,EAAE,IAAI,EAAE,GACjB,MAAM,EAAE,IAAI,EAAE;GAEf,IAAI,MAAM,EAAE,IAAI,EAAE,GACjB,MAAM,EAAE,IAAI,EAAE;GAEf,IAAI,MAAM,EAAE,IAAI,EAAE,GACjB,MAAM,EAAE,IAAI,EAAE;GAEf,IAAI,MAAM,EAAE,IAAI,EAAE,GACjB,MAAM,EAAE,IAAI,EAAE;GAEf,MAAM,UAAU,YAAY,KAAK;EAClC;EAEA,IAAI,CAAC,KAAK,GACT,KAAK,IAAI,CAAC;EAEX,MAAM,IAAS;GAAE,GAAG,QAAQ;GAAQ,GAAG,QAAQ;GAAG,GAAG,QAAQ;GAAG,GAAG;EAAS;EAC5E,IAAI,QAAQ,GACX,EAAE,IAAI,QAAQ;EAIf,KAAK,IAAI,IAAI,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,EAAE,GAAG;GAC5C,IAAI,CAAC,YAAY,KAAK,EAAE,EAAE,CAAC,GAC1B;GAED,IAAI,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,GAC1B,KAAK,EAAE,OAAO,GAAG,CAAC;EAEpB;EAEA,IAAI,YAAY,QACf;QAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GACpC,IAAI,EAAE,MAAM,OAAO,EAAE,CAAC,IAAI;IACzB,EAAE,IAAI,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1B;GACD;EACD;EAED,KAAK,EAAE,KAAK,CAAC;CACd;AACD;;AAGA,SAAS,gBAAgB,GAAgD;CACxE,IAAI,CAAC,GACJ,OAAO;EAAE,GAAG;EAAI,GAAG;EAAI,GAAG;CAAG;CAE9B,MAAM,SAAS,EAAE,MAAM,wCAAwC;CAC/D,MAAM,IAAI,SAAS,YAAY,OAAO,EAAE,IAAI;CAC5C,OAAO;EAAE;EAAG,GAAG;EAAG,GAAG;CAAE;AACxB;;;;;;;;;;AAWA,SAAgB,iBAAiB,MAAc,MAA0B;CAExE,IAAI,KAAK,MAAM,0BAA0B,GACxC,OAAO,CAAC;CAET,MAAM,UAAoB,CAAC;CAC3B,MAAM,cAA4B,CAAC;CAGnC,MAAM,UAAU,iBAAiB,MAAM,SAAS;CAChD,IAAI,SACH,QAAQ,MAAM,iBAAiB,CAAC,CAAC,SAAS,MAAM;EAC/C,IAAI,MAAM,MAAM,EAAE,KAAK,MAAM,IAC5B;EAED,MAAM,IAAI,EAAE,MAAM,+BAA+B;EACjD,IAAI,GACH,QAAQ,KAAK,YAAY,EAAE,EAAE,CAAC;CAEhC,CAAC;CAIF,MAAM,UAAU,iBAAiB,MAAM,aAAa;CACpD,IAAI,SACH,QAAQ,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM;EAChD,IAAI,MAAM,MAAM,EAAE,KAAK,MAAM,IAC5B;EAED,MAAM,KAAK,EAAE,MAAM,4BAA4B;EAC/C,IAAI,CAAC,IACJ;EAED,MAAM,IAAI,YAAY,GAAG,EAAE;EAC3B,MAAM,UAAsB;GAC3B,QAAS,EAAE,YAAY,QAAQ,EAAE,aAAc;GAC/C,KAAK,EAAE;GACP,MAAM,EAAE;GACR,GAAG;EACJ;EACA,MAAM,OAAO,WAAW,EAAE,GAAG;EAE7B,IAAI,QAAQ,KAAK,aAAa,KAAK,aAAa,KAAK,GACpD;EAED,MAAM,YAAY,iBAAiB,GAAG,MAAM;EAC5C,MAAM,KAAK,YAAY,gBAAgB,SAAS,IAAI;GAAE,GAAG;GAAI,GAAG;GAAI,GAAG;EAAG;EAC1E,QAAQ,IAAI,GAAG;EACf,IAAI,GAAG,MAAM,WAAW;GACvB,GAAG,IAAI;GACP,GAAG,IAAI;EACR;EAEA,QAAQ,KAAK,GAAG,KAAK,GAAE,CAAE,QAAQ,SAAS,IAAI,CAAC,CAAC,QAAQ,OAAO,IAAI;EACnE,IAAI,QAAQ,KAAK,UAChB,QAAQ,IAAI,GAAG;EAEhB,YAAY,KAAK,OAAO;CACzB,CAAC;CAEF,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,iBAAiB,MAAiC;CACjE,MAAM,IAAc,CAAC,YAAY,gBAAgB,YAAY,MAAM,EAAE,OAAO,WAAW,GAAG,CAAC,CAAC;CAG5F,MAAM,UAAoB,CAAC;CAC3B,EAAE,KAAK,WAAW;CAClB,KAAK,SAAS,MAAM;EACnB,EAAE,EAAE,CAAC,SAAS,MAAW;GACxB,MAAM,IAAI,UAAU,EAAE,CAAC;GACvB,IAAI,QAAQ,QAAQ,CAAC,MAAM,IAAI;IAC9B,QAAQ,KAAK,CAAC;IACd,EAAE,KAAK,aAAa,IAAI,WAAW;GACpC;GAEA,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,QAAQ,QAAQ,EAAE,EAAE,MAAM,IAAI;IACxD,QAAQ,KAAK,QAAQ,EAAE,EAAE;IACzB,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW;GAC1C;EACD,CAAC;CACF,CAAC;CACD,IAAI,QAAQ,WAAW,GAAG;EACzB,QAAQ,KAAK,SAAS;EACtB,EAAE,KAAK,0BAA0B;CAClC;CACA,EAAE,KAAK,YAAY;CACnB,EAAE,KAAK,eAAe;CAEtB,KAAK,SAAS,MAAM;EACnB,IAAI,aAAa;EACjB,MAAM,KAAe,CAAC;EACtB,IAAI,OAAO;EACX,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,IACnC,aAAa,QAAQ,QAAQ,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;EAEhD,EAAE,EAAE,CAAC,SAAS,MAAW;GACxB,IAAI,EAAE,GACL,aAAa,QAAQ,QAAQ,UAAU,EAAE,CAAC,CAAC;GAE5C,IAAI,EAAE,GACL,EAAE;GAEH,GAAG,KAAK,EAAE,KAAK,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC;EACvC,CAAC;EACD,IAAI,SAAS,GAEZ,EAAE,EAAE,CAAC,SAAS,MAAW;GACxB,EAAE,KAAK,oBAAmB,EAAE,KAAK,mBAAiB,QAAQ,QAAQ,UAAU,EAAE,CAAC,CAAC,IAAI,WAAU;GAC9F,EAAE,KAAK,YAAY,KAAK,EAAE,KAAK,OAAO,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;GAC1D,EAAE,KAAK,mBAAmB;EAC3B,CAAC;OACK;GAEN,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,IACnC,aAAa,QAAQ,QAAQ,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE;GAEhD,EAAE,KAAK,oBAAmB,EAAE,KAAK,mBAAiB,aAAa,WAAU;GACzE,IAAI,IAAI,mBAAmB,GAAG,KAAK;GACnC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,QAAQ,EAAE,GAChC,KAAK,iBAAiB,GAAG,KAAK;GAE/B,EAAE,KAAK,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC;GACrC,EAAE,KAAK,mBAAmB;EAC3B;CACD,CAAC;CACD,EAAE,KAAK,gBAAgB;CACvB,IAAI,EAAE,SAAS,GAAG;EACjB,EAAE,KAAK,aAAa;EAEpB,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,MAAM,GAAG;CAC9B;CACA,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;;;;;;;AAYA,SAAgB,cAAc,MAAc,OAA2B;CACtE,MAAM,MAAoB,CAAC;CAC3B,IAAI,UAAe,CAAC;CAEpB,IAAI,OAAO;CAEX,MAAM,8BAAc,IAAI,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,KAAK,QAAQ,eAAe,SAAS,UAAU,GAAW,KAAqB;EAC9E,MAAM,IAAS,YAAY,CAAC;EAC5B,MAAM,MAAM,eAAe,EAAE,EAAE;EAC/B,IAAI,YAAY,IAAI,GAAG,GACtB,OAAO;EAER,QAAQ,KAAR;GACC,KAAK;IACJ,UAAU;KAAE,QAAQ,EAAE;KAAU,MAAM,EAAE;KAAI,KAAK,EAAE;KAAK,GAAG;IAAE;IAC7D;GACD,KAAK;IACJ,IAAI,QAAQ,KAAK,MAChB,IAAI,KAAK,OAAO;IAEjB;GACD,KAAK;GACL,KAAK;IACJ,OAAO,MAAM,EAAE;IACf;GACD,KAAK,WAEJ,QAAQ,IAAI,YAAY,KAAK,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,SAAS,IAAI,CAAC,CAAC,QAAQ,OAAO,IAAI;EAE3F;EACA,OAAO;CACR,CAAC;CACD,OAAO;AACR;;;;;;;;;;;;AAaA,SAAgB,cAAc,UAA6B,QAAkB,MAAgC;CAC5G,MAAM,IAAc,CACnB,YACA,gBAAgB,oBAAoB,MAAM,EAAE,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,QAAQ,OAAO,GAAG,CACrF;CACA,SAAS,SAAS,SAAS;EAC1B,IAAI,SAAS;EACb,CAAC,KAAK,MAAM,CAAC,EAAC,CAAE,SAAS,GAAQ,QAAgB;GAChD,IAAI,CAAC,EAAE,GAAG;IACT,OAAO,EAAE;IACT;GACD;GACA,IAAI,EAAE,KAAK,OAAO,QAAQ,EAAE,CAAC,MAAM,IAClC,OAAO,KAAK,EAAE,CAAC;GAGhB,MAAM,SAAc;IACnB,KAAK,KAAK;IACV,IAAI,+BAA+B,iBAAiB,KAAK,OAAM,CAAE,MAAM,GAAG,IAAI;GAC/E;GACA,IAAI,QAAQ,GACX,SAAS,OAAO;QAEhB,OAAO,WAAW;GAEnB,EAAE,KAAK,OAAO;GACd,IAAI,EAAE,GAEL,OAAO,WAAW,+BAA+B,iBAAiB,OAAO,QAAQ,EAAE,CAAC,EAAC,CAAE,MAAM,GAAG,IAAI;GAErG,EAAE,KACD,gBACC,mBACA,YAAY,QAAQ,UAAU,EAAE,KAAK,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,GAC7D,MACD,CACD;EACD,CAAC;CACF,CAAC;CACD,EAAE,KAAK,qBAAqB;CAC5B,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;;;;;AAUA,SAAgB,eAAe,MAA8C;CAC5E,MAAM,MAAsC,CAAC;CAC7C,MAAM,8BAAc,IAAI,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,KAAK,QAAQ,eAAe,SAAS,WAAW,GAAmB;EAClE,MAAM,IAAS,YAAY,CAAC;EAC5B,MAAM,MAAM,eAAe,EAAE,EAAE;EAC/B,IAAI,YAAY,IAAI,GAAG,GACtB,OAAO;EAER,QAAQ,KAAR;GACC,KAAK,WACJ,IAAI,KAAK;IAAE,MAAM,YAAY,EAAE,WAAW;IAAG,IAAI,EAAE;GAAG,CAAC;EAEzD;EACA,OAAO;CACR,CAAC;CACD,OAAO;AACR;;;;;;;AAQA,SAAgB,eAAe,QAA0B;CACxD,MAAM,IAAc,CACnB,YACA,gBAAgB,cAAc,MAAM;EACnC,OAAO,MAAM;EACb,WAAW,WAAW;CACvB,CAAC,CAAC,CAAC,QAAQ,OAAO,GAAG,CACtB;CACA,OAAO,SAAS,QAAQ,QAAQ;EAC/B,EAAE,KACD,gBAAgB,UAAU,MAAM;GAC/B,aAAa,UAAU,MAAM;GAE7B,IAAI,+BAA+B,iBAAiB,IAAG,CAAE,MAAM,GAAG,IAAI;GACtE,QAAQ,UAAU,MAAM;GACxB,YAAY;EACb,CAAC,CACF;CACD,CAAC;CACD,EAAE,KAAK,eAAe;CACtB,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;ACnfA,MAAM,SAAiC;CACtC,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;AACL;;;;;;;;;;;;AAaA,SAAgB,SAAS,MAAc,OAAkB,UAAuB;CAC/E,IAAI,OAAO;CACX,CAAC,kBAAkB,MAAM,gBAAgB,KAAK,CAAC,EAAC,CAAE,SAAS,MAAM;EAChE,IAAI,OAAO;EACX,IAAI,SAAS;EACb,IAAI,OAAO;EACX,IAAI,IAAI,IACP,IAAI;EAEL,EAAE,QAAQ,eAAe,SAAU,GAAW,KAAqB;GAClE,MAAM,IAAI,YAAY,CAAC;GACvB,QAAQ,eAAe,EAAE,EAAE,GAA3B;IACC,KAAK;KACJ,IAAI,EAAE,YACL,OAAO,EAAE;KAEV;IACD,KAAK;IACL,KAAK;KACJ,SAAS;KACT;IAED,KAAK;IACL,KAAK;KACJ,OAAO,MAAM,EAAE;KACf;IACD,KAAK;KACJ,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK;KAC7B;IACD,KAAK;IACL,KAAK;KACJ,OAAO,MAAM,EAAE;KACf;IACD,KAAK,aACJ,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK;GAE/B;GACA,OAAO;EACR,CAAC;EAED,QAAQ,MAAR;GACC,KAAK,QAAQ;IAEZ,MAAM,MAAM,KAAK,KAAK,KAAK,IAAI,WAAW;KAAE,GAAG;KAAG,GAAG;IAAE,CAAC,IAAI,SAAS,KAAK,EAAE;IAC5E,MAAM,QAAS,MAAc,YAAY;IACzC,IAAI;IACJ,IAAI,OAAO;KACV,MAAM,UAAU,MAAM,WAAW,GAAG,IAAI;KACxC,MAAM,OAAQ,MAAc;KAC5B,OAAO,UAAU,OAAO,QAAQ,EAAE,GAAG,QAAQ,KAAK;IACnD,OACC,OAAQ,MAAc;IAEvB,IAAI,QAAQ,KAAK,GAChB,KAAK,EAAE,SAAS;IAEjB,EAAE;IACF;GACD;EACD;CACD,CAAC;AACF;;AAGA,SAAS,oBAAoB,GAAmC;CAC/D,OAAO,OAAO,KAAK,CAAC,CAAC,CACnB,KAAK,MAAM,MAAM,IAAI,QAAO,EAAE,KAAK,IAAG,CAAC,CACvC,KAAK,EAAE;AACV;;AAGA,SAAS,gBAAgB,GAAkB,UAA0B;CACpE,MAAM,IAAI,WAAW,EAAE,EAAE;CAEzB,MAAM,WAAgB;EAAE,QAAQ;EAAW,MAAM;CAAW;CAC5D,IAAI,SAAS,SAAS,YACrB,SAAS,QAAQ;CAElB,MAAM,WACL,SAAS,SAAS,aACf,gBAAgB,UAAU,MAAM;EAAE,MAAM;EAAoB,SAAS;CAAO,CAAC,IAC7E;CACJ,MAAM,UAAU,gBAAgB,UAAU,UAAU,QAAQ;CAG5D,OAAO;EACN,aACC,oBAAoB;GACnB,IAAI,aAAa;GACjB,MAAM;GACN,OACC,2FACC,EAAE,EAAE,CAAC,SAAS,uBAAuB;GACvC,WAAW;GACX,aAAa;EACd,CAAC,IACD;EACD;EACA,gBAAgB,YAAY,MAAM;GAfZ,IAAI;GAAK,UAAU;EAeD,CAAC;EACzC,gBAAgB,UAAU,MAAM,EAAE,iBAAiB,OAAO,CAAC;EAC3D;EACA;EACA;EACA;EAEA,YAAY,YAAY;GAAC,EAAE,IAAI;GAAG;GAAG,EAAE,IAAI;GAAG;GAAG,EAAE,IAAI;GAAG;GAAI,EAAE,IAAI;GAAG;EAAE,CAAC,CAAC,KAAK,GAAG,CAAC;EACpF,YAAY,cAAc,OAAO;EACjC,YAAY,SAAS,OAAO,EAAE,CAAC,CAAC;EAChC,YAAY,YAAY,OAAO,EAAE,CAAC,CAAC;EACnC,EAAE,EAAE,CAAC,SAAS,KAAK;EACnB;EACA;CACD,CAAC,CAAC,KAAK,EAAE;AACV;;;;;;;;;;;AAYA,SAAgB,SAAS,KAAa,UAAmC;CAExE,MAAM,QAAQ,CAAC,OAAO,KAAK;CAE3B,MAAM,OAAO;EAAC;EAAU,MAAM;EAAI,MAAM;EAAI,MAAM;EAAI,MAAM;EAAI;CAAK,CAAC,CAAC,KAAK,GAAG;CAC/E,MAAM,IAAc,CACnB,gBAAgB,OAAO,MAAM;EAC5B,WAAW,OAAO;EAClB,WAAW,OAAO;EAClB,WAAW,OAAO;EAClB,YAAY,OAAO;CACpB,CAAC,CAAC,CAAC,QAAQ,OAAO,GAAG,GACrB,gBAAgB,iBAAiB,gBAAgB,WAAW,MAAM;EAAE,SAAS;EAAQ,MAAM,OAAO,GAAG;CAAE,CAAC,GAAG,EAC1G,SAAS,OACV,CAAC,CACF;CAGA,IAAI,WAAW,QAAQ;CACvB,MAAM,YAAY,YAAY,CAAC;CAG/B,IAAI,UAAU,SAAS,GACtB,EAAE,KACD,gBACC,eACA,CACC,gBAAgB,YAAY,MAAM,EAAE,WAAW,QAAQ,CAAC,GACxD,gBAAgB,UAAU,MAAM;EAAE,iBAAiB;EAAK,iBAAiB;CAAO,CAAC,CAClF,CAAC,CAAC,KAAK,EAAE,GACT;EACC,IAAI;EACJ,WAAW,MAAM,KAAK,GAAG;EACzB,SAAS;EACT,MAAM;CACP,CACD,CACD;CAGD,UAAU,SAAS,MAAM;EACxB,EAAE;EACF,EAAE,KAAK,gBAAgB,GAAG,QAAQ,CAAC;CACpC,CAAC;CACD,EAAE,KAAK,QAAQ;CACf,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;;;;;;;;;;;;;AC3KA,SAAgB,iBAAiB,MAAc,OAAqB;CACnE,MAAM,MAAc;EAAE,OAAO,CAAC;EAAG,MAAM,CAAC;EAAG,OAAO,CAAC;CAAE;CACrD,IAAI,CAAC,MACJ,OAAO;CAIR,IAAI,WAAW;CACf,IAAI;CAEJ,MAAM,8BAAc,IAAI,IAAI;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,CAAC;CAED,KAAK,QAAQ,eAAe,SAAU,GAAmB;EACxD,MAAM,IAAS,YAAY,CAAC;EAC5B,MAAM,MAAM,eAAe,EAAE,EAAE;EAC/B,IAAI,YAAY,IAAI,GAAG,GACtB,OAAO;EAER,QAAQ,KAAR;GACC,KAAK;IACJ,IAAI,MAAM,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;IAC/B;GACD,KAAK;IAEJ,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,EAAE,GACvC,IAAI,IAAI,MAAM,EAAE,CAAC,SAAS,EAAE,MAC3B,WAAW,IAAI,MAAM;IAGvB;GACD,KAAK;IAEJ,IAAI,aAAa,GAChB,IAAI,KAAK,KAAK;KAAE,MAAM,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;KAAM,OAAO,CAAC,EAAE;IAAE,CAAC;SACtD,IAAI,aAAa,GACvB,IAAI,MAAM,KAAK;KAAE,MAAM,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;KAAM,OAAO,CAAC,EAAE;IAAE,CAAC;IAE9D;GACD,KAAK;IACJ,WAAW;IACX;GACD,KAAK;IACJ,WAAW;IACX;GACD,KAAK;IACJ,WAAW;IACX;GACD,KAAK;IACJ,WAAW;IACX;GACD,KAAK,QAEJ,IAAI,UAAU;IACb,IAAI,CAAC,SAAS,SACb,SAAS,UAAU,CAAC;IAErB,SAAS,QAAQ,KAAK,CAAC,EAAE,CAAC;GAC3B;EAEF;EACA,OAAO;CACR,CAAC;CACD,OAAO;AACR;;;;;;;;;;AAWA,SAAgB,mBAA2B;CAC1C,MAAM,IAAc,CAAC,UAAU;CAC/B,EAAE,KACD,q5BAmBD;CACA,OAAO,EAAE,KAAK,EAAE;AACjB;;;;;;;;;;;;;;ACnHA,SAAgB,kBAAkB,MAAgC;CACjE,MAAM,IAAsB,CAAC;CAC7B,IAAI,CAAC,MACJ,OAAO;CAGR,IAAI,IAAS;CACb,CAAC,KAAK,MAAM,aAAa,KAAK,CAAC,EAAC,CAAE,SAAS,MAAM;EAChD,MAAM,IAAS,YAAY,CAAC;EAC5B,QAAQ,EAAE,IAAV;GACC,KAAK,SACJ;GACD,KAAK;GACL,KAAK;GACL,KAAK,gBACJ;GACD,KAAK;IACJ,OAAO,EAAE;IACT,IAAI,EAAE,GACL,IAAI,EAAE;SAEN,EAAE,IAAI;IAEP,EAAE,KAAK,CAAC;EAEV;CACD,CAAC;CACD,OAAO;AACR;;;;;ACxBA,SAAS,kBAAkB,GAAmB;CAC7C,OAAO,EAAE,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,IAAI;AAC3C;;;;;AAMA,SAAS,aAAa,QAAgB,UAA0B;CAC/D,IAAI,OAAO,OAAO,CAAC,MAAM,KACxB,OAAO;CAGR,MAAM,SADO,SAAS,MAAM,GAAG,SAAS,YAAY,GAAG,IAAI,CACzC,IAAI,OAAM,CAAE,MAAM,GAAG;CACvC,MAAM,WAAqB,CAAC;CAC5B,KAAK,MAAM,KAAK,OACf,IAAI,MAAM,MACT,SAAS,IAAI;MACP,IAAI,MAAM,KAChB,SAAS,KAAK,CAAC;CAGjB,OAAO,SAAS,KAAK,GAAG;AACzB;;;;;AAMA,SAAS,aAAa,KAAiB,MAAc,MAAgB,MAAmC;CACvG,MAAM,IAAI,cAAc,KAAK,IAAI;CACjC,IAAI,KAAK,QAAQ,CAAC,MACjB,MAAM,IAAI,UAAU,aAAa,oBAAoB,IAAI;CAE1D,IAAI,KAAK,MACR,oBAAoB,MAAM,GAAG,IAAI;CAElC,OAAO;AACR;;AAGA,SAAS,WAAW,KAAiB,MAAc,MAAgB,MAAmC;CACrG,OAAO,aAAa,KAAK,MAAM,MAAM,IAAI;AAC1C;;AAGA,MAAM,UAAU,CACf,iFACA,mEACD;;AAGA,SAAS,eAAe,GAAmB;CAC1C,IAAI,QAAQ,QAAQ,CAAC,IAAI,IACxB,OAAO;CAER,OAAO,KAAK,EAAE,SAAS,IAAI;AAC5B;;;;;AAMA,SAAS,kBAAkB,QAAuB,QAAyD;CAC1G,IAAI,CAAC,QACJ,OAAO;CAER,IAAI;EACH,MAAM,SAAqC,OAAO,KAAK,eAAe;GACrE,MAAM,KAAM,WAAmB,MAAO,WAAmB;GAEzD,OAAO;IAAC,WAAW;IAAM,OAAO,MAAM,CAAC,GAAG,CAAC;IAAQ,eAAe,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI;GAAC;EAC1F,CAAC;EACD,OAAO,OAAO,WAAW,IAAI,OAAO;CACrC,QAAQ;EACP,OAAO;CACR;AACD;;;;;;AAOA,SAAS,2BAA2B,OAAgB,MAAyB;CAC5E,IACC,KAAK,OACJ,iBAAiB,cAAc,MAAM,SAAS,oBAAoB,MAAM,SAAS,qBAElF,MAAM;AAER;;;;;AAMA,SAAS,YACR,KACA,MACA,UACA,WACA,KACA,WACA,QACA,OACA,MACA,IACA,QACA,QACA,MACO;CAEP,IAAI,UAAU,SACb;CAGD,IAAI;CACJ,IAAI;EACH,gBAAgB,mBAAmB,aAAa,KAAK,UAAU,MAAM,IAAI,GAAG,MAAM,IAAI;CACvF,SAAS,OAAO;EACf,2BAA2B,OAAO,IAAI;EACtC,gBAAgB,mBAAmB,MAAM,MAAM,IAAI;CACpD;CACA,UAAU,aAAa;CAEvB,MAAM,OAAO,WAAW,KAAK,MAAM,OAAO,IAAI;CAE9C,MAAM,MAAM,kBAAkB,MAAM,MAAM,KAAK,eAAe,IAAI,QAAQ,MAAM;CAGhF,qBAAqB,KAAK,MAAM,IAAI;CAEpC,OAAO,aAAa;CAEpB,IAAI;EAEH,MAAM,WAAkB,CAAC;EACzB,MAAM,+BAAe,IAAI,IAAY;EACrC,IAAI,YAAmB,CAAC;EACxB,IAAI,eACH,KAAK,MAAM,KAAK,OAAO,KAAK,aAAa,GAAG;GAE3C,IAAI,MAAM,SAAS,MAAM,QACxB;GAED,MAAM,MAAM,cAAc;GAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,MAChB;GAID,IAAI,IAAI,SAASC,KAAQ,MAAM;IAE9B,MAAM,WAAW,WAAW,KADd,aAAa,IAAI,QAAQ,IACF,GAAG,MAAM,IAAI;IAClD,IAAI,UAAU;KACb,MAAM,iBAAiB,iBAAiB,UAAU,IAAI;KACtD,IAAI,kBAAkB,eAAe,SAAS,GAAG;MAChD,KAAK,MAAM,WAAW,gBACrB,IAAI,CAAC,aAAa,IAAI,QAAQ,GAAG,GAAG;OACnC,aAAa,IAAI,QAAQ,GAAG;OAC5B,SAAS,KAAK,OAAO;MACtB;MAED,wBAAwB,KAAK,gBAAgB,KAAK;KACnD;IACD;GACD;GAEA,IAAI,IAAI,SAASA,KAAQ,OAAO;IAE/B,MAAM,SAAS,WAAW,KADZ,aAAa,IAAI,QAAQ,IACJ,GAAG,MAAM,IAAI;IAChD,IAAI,QACH,YAAY,UAAU,OAAO,cAAc,QAAQ,IAAI,CAAC;GAE1D;EACD;EAED,IAAI,UAAU,SAAS,GACtB,wBAAwB,KAAK,WAAW,MAAM,KAAK,UAAU,CAAC,CAAC;EAIhE,MAAM,gBAAgB,gBAAgB,MAAM,GAAI,IAAY;EAC5D,IAAI,eAAe;GAElB,MAAM,OAAO,aAAa,KADZ,aAAa,cAAc,QAAQ,IACd,GAAG,MAAM,IAAI;GAChD,IAAI,MACH,SAAS,MAAM,KAAK,QAAQ;EAE9B;CACD,SAAS,OAAO;EACf,2BAA2B,OAAO,IAAI;CACvC;AACD;;;;;;;;;;;;;AAcA,SAAgB,SAAS,KAAiB,MAA8B;CACvE,iBAAiB;CACjB,MAAM,UAAe,QAAQ,CAAC;CAE9B,IAAI,CAAC,OAAO,KAAK,qBAAqB,GACrC,MAAM,IAAI,UAAU,eAAe,sBAAsB;CAG1D,MAAM,MAAoB,kBAAkB,aAAa,KAAK,uBAAuB,OAAO,OAAO,GAAG,OAAO;CAG7G,IAAI,IAAI,UAAU,WAAW,GAAG;EAC/B,MAAM,UAAU;EAChB,IAAI,WAAW,KAAK,SAAS,MAAM,OAAO,GACzC,IAAI,UAAU,KAAK,OAAO;CAE5B;CACA,IAAI,IAAI,UAAU,WAAW,GAC5B,MAAM,IAAI,UAAU,aAAa,yBAAyB;CAG3D,MAAM,SAAoB,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,EAAE;CAC7D,IAAI,SAAqB;EAAE,WAAW,CAAC;EAAG,QAAQ,CAAC;EAAG,OAAO,CAAC;EAAG,OAAO,CAAC;EAAG,SAAS,CAAC;CAAE;CACxF,IAAI,OAAY,CAAC;CAGjB,IAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,WAAW;EAE9C,IAAI,IAAI,KAAK;GACZ,MAAM,UAAU,WAAW,KAAK,kBAAkB,IAAI,GAAG,GAAG,OAAO,OAAO;GAC1E,OAAO,YAAY,SAAS,OAAO;EACpC;EAGA,IAAI,IAAI,OAAO,QAAQ;GACtB,MAAM,YAAY,aAAa,KAAK,IAAI,OAAO,EAAE,CAAC,QAAQ,OAAO,EAAE,GAAG,MAAM,OAAO;GACnF,IAAI,WAAW;IACd,MAAM,SAAS,gBAAgB,SAAS;IACxC,OAAO,OAAO,QAAQ,MAAM;GAC7B;EACD;EAGA,IAAI,IAAI,OAAO;GACd,MAAM,UAAU,WAAW,KAAK,kBAAkB,IAAI,KAAK,GAAG,OAAO,OAAO;GAC5E,IAAI,SACH,SAAS,eAAe,SAAS,QAAQ,OAAO;EAElD;CACD;CAGA,MAAM,KAAmB,iBACxB,WAAW,KAAK,kBAAkB,IAAI,UAAU,EAAE,GAAG,OAAO,OAAO,GACnE,OACD;CAGA,MAAM,QAAa,CAAC;CACpB,IAAI,IAAI,UAAU,QAAQ;EACzB,MAAM,WAAW,WAAW,KAAK,kBAAkB,IAAI,UAAU,EAAE,GAAG,MAAM,OAAO;EACnF,IAAI,UACH,OAAO,OAAO,OAAO,oBAAoB,QAAQ,CAAC;EAEnD,IAAI,IAAI,SAAS,QAAQ;GACxB,MAAM,UAAU,WAAW,KAAK,kBAAkB,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO;GACjF,IAAI,SACH,wBAAwB,SAAS,KAAK;EAExC;CACD;CAGA,IAAI,YAAiC,CAAC;CACtC,IAAI,CAAC,QAAQ,cAAc,QAAQ,WAClC;MAAI,IAAI,UAAU,QAAQ;GACzB,MAAM,WAAW,aAAa,KAAK,kBAAkB,IAAI,UAAU,EAAE,GAAG,MAAM,OAAO;GACrF,IAAI,UACH,YAAY,sBAAsB,UAAU,OAAO;EAErD;;CAID,MAAM,MAAW,CAAC;CAClB,IAAI,QAAQ,cAAc,QAAQ,WAAW;EAC5C,IAAI;EACJ,IAAI,GAAG,QACN,SAAS,GAAG,OAAO,KAAK,MAAkB,EAAE,IAAI;OAC1C,IAAI,MAAM,cAAc,MAAM,YAAY,SAAS,GACzD,SAAS,MAAM;EAEhB,IAAI,QAAQ,WAAW;GACtB,IAAI,QAAQ;GACZ,IAAI,YAAY;EACjB;EACA,IAAI,QAAQ,cAAc,QACzB,IAAI,aAAa;EAElB,IAAI,QAAQ,aAAa,IAAI,aAAa,QAAQ,WACjD,OAAO;CAET;CAEA,MAAM,SAAoC,OAAO,OAAO,IAAI;CAG5D,IAAI,QAAQ,YAAY,IAAI,WAC3B,kBAAkB,WAAW,KAAK,kBAAkB,IAAI,SAAS,GAAG,MAAM,OAAO,KAAK,EAAE;CAIzF,MAAM,YAA2C,OAAO,OAAO,IAAI;CACnE,MAAM,WAAW,GAAG;CACpB,MAAM,aAAa,SAAS;CAC5B,MAAM,aAAa,CAAC;CACpB,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,EAAE,GACtC,MAAM,WAAW,KAAK,SAAS,EAAE,CAAC;CAInC,MAAM,UAAU,IAAI,UAAU,EAAE,CAAC,YAAY,GAAG;CAChD,IAAI,cACH,IAAI,UAAU,EAAE,CAAC,MAAM,GAAG,UAAU,CAAC,IACrC,WACA,IAAI,UAAU,EAAE,CAAC,MAAM,UAAU,CAAC,IAClC,QAAO,CACN,QAAQ,OAAO,EAAE;CACnB,IAAI,CAAC,OAAO,KAAK,UAAU,GAC1B,aAAa;CAEd,MAAM,SAAS,mBACd,aAAa,KAAK,YAAY,MAAM,OAAO,GAC3C,WAAW,QAAQ,WAAW,KAAK,GACnC,OACD;CAGA,KAAK,IAAI,YAAY,CAAC,EAAC,CAAE,UAAU,GAClC,QAAQ,SAAS,iBAChB,WAAW,KAAK,kBAAkB,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO,KAAK,IACtE,OACD;CAID,KAAK,IAAI,UAAU,CAAC,EAAC,CAAE,UAAU,GAChC,QAAQ,SAAS,eAAe,WAAW,KAAK,kBAAkB,IAAI,OAAO,EAAE,GAAG,MAAM,OAAO,KAAK,EAAE;CAIvG,MAAM,YAAY,SAAS,kBAAkB,QAAQ,GAAG,MAAM,IAAI;CAGlE,MAAM,QAAQ,WAAW,KAAK,2BAA2B,MAAM,OAAO,IAAI,IAAI;CAE9E,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,YAAY,EAAE,GAAG;EAC1C,IAAI,QAAQ;EACZ,IAAI;EACJ,IAAI,aAAa,UAAU,IAAI;GAE9B,OAAO,QAAQ,UAAU,EAAE,CAAC,EAAE,CAAC,QAAQ,YAAY,EAAE;GACrD,IAAI,CAAC,OAAO,KAAK,IAAI,GACpB,OAAO,UAAU,EAAE,CAAC;GAErB,IAAI,CAAC,OAAO,KAAK,IAAI,GACpB,OAAO,WAAW,QAAQ,mBAAmB,EAAE,IAAI,UAAU,EAAE,CAAC;GAEjE,QAAQ,UAAU,EAAE,CAAC;EACtB,OAAO;GAEN,OAAO,yBAAyB,IAAI,IAAI,SAAS;GACjD,OAAO,KAAK,QAAQ,YAAY,QAAQ;EACzC;EAGA,IAAI,QAAQ,UAAU,MAAM;GAC3B,IAAI,OAAO,QAAQ,WAAW,YAAY,MAAM,QAAQ,QACvD;GAED,IACC,OAAO,QAAQ,WAAW,YAC1B,MAAM,WAAW,EAAE,CAAC,YAAY,MAAM,QAAQ,OAAO,YAAY,GAEjE;GAED,IAAI,MAAM,QAAQ,QAAQ,MAAM,GAAG;IAClC,IAAI,OAAO;IACX,KAAK,MAAM,KAAK,QAAQ,QAAQ;KAC/B,IAAI,OAAO,MAAM,YAAY,MAAM,GAClC,OAAO;KAER,IAAI,OAAO,MAAM,YAAY,EAAE,YAAY,MAAM,MAAM,WAAW,EAAE,CAAC,YAAY,GAChF,OAAO;IAET;IACA,IAAI,CAAC,MACJ;GAEF;EACD;EAGA,MAAM,WAAW,KAAK,QAAQ,qBAAqB,kBAAkB;EACrE,YACC,KACA,MACA,UACA,MAAM,WAAW,IACjB,GACA,WACA,QACA,OACA,SACA,IACA,QACA,QACA,IACD;CACD;CAEA,MAAM,SAAmB;EACxB,QAAQ;EACR,YAAY,MAAM;EAClB,OAAO;EACP,WAAW;EACX,UAAU;CACX;CAGA,IAAI,GAAG,SACN,OAAO,WAAW;EACjB,SAAS,GAAG;EACZ,QAAQ,GAAG;EACX,OAAO,GAAG;CACX;CAGD,OAAO;AACR;;;;;;;;;;;;;ACndA,SAAgB,aAAa,OAA2B;CACvD,IAAI,MAAM;CAEV,IAAI,IAAI,MAAM,GAAG,CAAC,MAAM,SAAS;EAChC,MAAM,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,QAAQ,UAAU;EAC/C,IAAI,MAAM,IACT,MAAM,IAAI,MAAM,IAAI,CAAC;CAEvB;CACA,MAAM,YAAY,KAAK,GAAG;CAC1B,MAAM,MAAM,UAAU;CACtB,MAAM,QAAQ,IAAI,WAAW,GAAG;CAChC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACxB,MAAM,KAAK,UAAU,WAAW,CAAC;CAElC,OAAO;AACR;;;;;;;;;AAUA,SAAgB,aAAa,MAA0B;CACtD,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAChC,aAAa,OAAO,aAAa,KAAK,EAAE;CAEzC,OAAO,KAAK,SAAS;AACtB;;;;ACnCA,SAAS,oBAAoB,KAAc,SAAmC;CAC7E,IAAI,OAAO,QAAQ,UAClB,OAAO,QAAQ,YAAY,SAAS,SAAS,OAAO,QAAQ,MAAM,IAAI;CAEvE,IAAI,OAAO,QAAQ,UAClB;CAED,IAAI,QAAQ,MAAM,SAAS,QAC1B,OAAO,OAAO,QAAQ,MAAM;CAE7B,MAAM,QAAQ,SAAS,SAAS;CAChC,OAAO,MAAM,QAAQ,MAAM,mBAAmB,SAAS,uBAAuB;AAC/E;AAEA,SAAS,wBAAwB,MAAkB,SAAmC;CACrF,OAAO,oBAAoB,KAAK,KAAK,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,OAAO;AACnF;;AAGA,SAAgB,0BAA0B,MAAkB,SAAmC;CAC9F,MAAM,MAAM,wBAAwB,MAAM,OAAO;CACjD,OAAO,MAAM,sBAAsB,GAAG,IAAI;AAC3C;AAEA,SAAS,KAAK,OAAuB;CACpC,OAAO,QAAQ,KAAK,MAAM,QAAQ,KAAK;AACxC;AAEA,SAAS,cAAc,MAAY,MAAkC;CACpE,MAAM,OAAO,KAAK,eAAe;CACjC,MAAM,QAAQ,KAAK,YAAY,IAAI;CACnC,MAAM,MAAM,KAAK,WAAW;CAC5B,MAAM,QAAQ,KAAK,YAAY;CAC/B,MAAM,UAAU,KAAK,cAAc;CACnC,MAAM,UAAU,KAAK,cAAc;CAEnC,MAAM,WAAW,GADA,OAAO,MAAO,OAAO,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,IAAI,OAAO,IAAI,EAC7C,GAAG,KAAK,KAAK,EAAE,GAAG,KAAK,GAAG;CACvD,IAAI,SAAS,QACZ,OAAO;CAER,OAAO,GAAG,SAAS,GAAG,KAAK,KAAK,EAAE,GAAG,KAAK,OAAO,EAAE,GAAG,KAAK,OAAO;AACnE;AAEA,SAAS,cAAc,MAAY,SAAmC;CACrE,MAAM,SAAS,SAAS,QAAQ;CAChC,MAAM,QAAQ,SAAS,KAAK,YAAY,IAAI,KAAK,SAAS;CAC1D,MAAM,UAAU,SAAS,KAAK,cAAc,IAAI,KAAK,WAAW;CAChE,MAAM,UAAU,SAAS,KAAK,cAAc,IAAI,KAAK,WAAW;CAChE,MAAM,KAAK,SAAS,KAAK,mBAAmB,IAAI,KAAK,gBAAgB;CACrE,OAAO,SAAS,WAAW,WAAW,KAAK,aAAa;AACzD;AAEA,SAAS,oBAAoB,MAAY,SAAqB;CAC7D,OAAO,SAAS,QAAQ,QAAQ,WAAW,IAAI,IAAI;AACpD;;;;;AAMA,SAAS,eAAe,MAAkB,OAAY,SAAuB;CAC5E,MAAM,aAAa,KAAK,MAAM,OAAO,iBAAiB;CACtD,MAAM,eAAe,wBAAwB,MAAM,OAAO;CAC1D,IAAI,gBAAgB,MACnB,IAAI;EACH,KAAK,IAAI,aACR,cACA,aAAa,mBAAmB,OAAO,SAAS,QAAQ,IAAI,OAC5D,OACD;EACA,OAAO,KAAK;CACb,QAAQ,CAAC;CAIV,IAAI;EACH,KAAK,IAAI,cACP,KAAK,MAAM,CAAC,EAAC,CAAE,aAAa,aAAa,KAAK,IAC/C,aAAa,mBAAmB,OAAO,SAAS,QAAQ,IAAI,OAC5D,OACD;EACA,OAAO,KAAK;CACb,QAAQ;EACP,OAAO,KAAK;CACb;AACD;;;;;;;;;;;;AAaA,SAAgB,WAAW,MAAkB,OAAa,SAAuB;CAEhF,IAAI,QAAQ,QAAQ,KAAK,KAAK,QAAQ,KAAK,MAAM,KAChD,OAAO;CAGR,IAAI,KAAK,MAAM,QACd,OAAO,KAAK;CAGb,IAAI,KAAK,MAAM,OAAO,CAAC,KAAK,KAAK,WAAW,QAAQ,QACnD,KAAK,IAAI,QAAQ;CAGlB,IAAI,KAAK,MAAM,KACd,OAAO,KAAK,KAAK,MAAgB,OAAO,KAAK,CAAC;CAE/C,IAAI,SAAS,MACZ,OAAO,eAAe,MAAM,KAAK,GAAG,OAAO;CAE5C,OAAO,eAAe,MAAM,OAAO,OAAO;AAC3C;;;;;;;;AASA,SAAgB,oBAAoB,MAAkB,OAAa,SAAuB;CACzF,IAAI,SAAS,eAAe,OAC3B,OAAO,WAAW,MAAM,OAAO,OAAO;CAEvC,MAAM,YAAY,SAAS,OAAO,KAAK,IAAI;CAC3C,MAAM,OAAO,0BAA0B,MAAM,OAAO;CACpD,IAAI,KAAK,MAAM,OAAO,OAAO,cAAc,UAAU;EACpD,IAAI,SAAS,UAAU,SAAS,YAC/B,OAAO,cAAc,oBAAoB,mBAAmB,WAAW,SAAS,QAAQ,GAAG,OAAO,GAAG,IAAI;EAE1G,OAAO,WAAW,MAAM,OAAO,OAAO;CACvC;CACA,IAAI,qBAAqB,MACxB,OAAO,cACN,oBAAoB,WAAW,OAAO,GACtC,SAAS,UAAU,SAAS,SAAS,cAAc,WAAW,OAAO,IAAI,IAC1E;CAED,OAAO,WAAW,MAAM,OAAO,OAAO;AACvC;;;;AC/IA,SAAS,YAAY,KAAU,KAAU,OAAkB;CAC1D,IAAI,QAAQ,eAAe,QAAQ,iBAAiB,QAAQ,aAC3D,OAAO,eAAe,KAAK,KAAK;EAAE;EAAO,YAAY;EAAM,cAAc;EAAM,UAAU;CAAK,CAAC;MAE/F,IAAI,OAAO;AAEb;;;;;;;;;AAUA,SAAS,aACR,OACA,OACA,UACA,QACA,SACA,SACiC;CACjC,MAAM,SAAS,QAAQ;CACvB,MAAM,MAAM,QAAQ,OAAO,CAAC,OAAO,OAAO,SAAS,KAAK;CACxD,IAAI,UAAU;CAEd,MAAM,MAAW,WAAW,IAAI,CAAC,IAAI,CAAC;CAItC,IAAI,WAAW,GACd,IAAI;EACH,OAAO,eAAe,KAAK,cAAc;GAAE,OAAO;GAAU,YAAY;EAAM,CAAC;CAChF,QAAQ;EACP,IAAI,aAAa;CAClB;CAGD,KAAK,IAAI,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,QAAQ;EAC3D,MAAM,MAAM,QAAQ,OAAO,UAAU,MAAM;EAC3C,IAAI,OAAO,QAAQ,IAAI,MAAM,QAAW;GAEvC,IAAI,WAAW,QACd;GAED,IAAI,QAAQ,WAAW,MACtB,YAAY,KAAK,QAAQ,SAAS,MAAM;GAEzC;EACD;EACA,IAAI,YAAiB,IAAI;EAGzB,IAAI,IAAI,MAAM,OAAO,aAAa,SAAS,IAAI,KAAK,QAAQ,IAAI,KAAK,OAAO;GAC3E,IAAI,WAAW,UAAa,QAAQ,WAAW,MAAM;IACpD,YAAY,KAAK,QAAQ,SAAS,MAAM;IACxC,UAAU;GACX;GACA;EACD;EACA,QAAQ,IAAI,GAAZ;GACC,KAAK;IACJ,IAAI,aAAa,MAChB;IAED;GACD,KAAK;IAEJ,YAAY,cAAc,IAAI,OAAO;IACrC;GACD,KAAK;GACL,KAAK,KACJ;GACD,KAAK,KAAK;IAET,MAAM,UAAU,0BAA0B,KAAK,OAAO;IACtD,IAAI,YAAY,UAAU,YAAY,QACrC;IAGD,YAAY,mBAAmB,WAAqB,QAAQ,QAAQ;IACpE,IAAI,OAAO,cAAc,UACxB;GAEF;GAEA,KAAK;IACJ,IAAI,EAAE,YAAY,QAAQ,OAAO,QAAQ,QAAQ,SAAS,QAAQ,eAAe,SAChF,YAAY,WAAW,IAAI,KAAK,SAAS,CAAC;IAE3C;GACD,SACC,MAAM,IAAI,UAAU,oBAAoB,uBAAuB,IAAI,CAAC;EACtE;EACA,IAAI,QAAQ,WAAW,MAAM;GAC5B,IAAI,aAAa,MAAM;IACtB,IAAI,IAAI,MAAM,OAAO,cAAc,MAClC,YAAY,KAAK,QAAQ,SAAS,IAAI;SAChC,IAAI,WAAW,QACrB,YAAY,KAAK,QAAQ,SAAS,MAAM;SAClC,IAAI,OAAO,cAAc,MAC/B,YAAY,KAAK,QAAQ,SAAS,IAAI;SAEtC;GAEF,OAAO;IAEN,MAAM,SAAS,IAAI,MAAM,OAAO,OAAO,QAAQ,eAAe,YAAY,QAAQ,aAAa;IAC/F,MAAM,UAAU,0BAA0B,KAAK,OAAO;IACtD,MAAM,gBACL,QAAQ,eAAe,UAAU,IAAI,MAAM,OAAO,YAAY,UAAU,YAAY;IACrF,YACC,KACA,QAAQ,SACR,iBAAiB,CAAC,SAAS,oBAAoB,KAAK,WAAW,OAAO,IAAI,SAC3E;GACD;GACA,IAAI,aAAa,MAChB,UAAU;EAEZ;CACD;CACA,OAAO;EAAE;EAAK;CAAQ;AACvB;;;;;;;;;;;;AAaA,SAAgB,YAAqB,OAAkB,MAA4B;CAClF,IAAI,SAAS,QAAQ,MAAM,WAAW,MACrC,OAAO,CAAC;CAET,IAAI,SAAS,GACZ,SAAS;CACV,MAAM,UAAiB,CAAC;CACxB,MAAM,UAAe,QAAQ,CAAC;CAC9B,MAAM,QAAQ,QAAQ,SAAS,OAAO,QAAQ,QAAQ,MAAM;CAO5D,IAAI,QAAQ,WAAW,GACtB,SAAS;MACH,IAAI,QAAQ,WAAW,KAC7B,SAAS;MACH,IAAI,MAAM,QAAQ,QAAQ,MAAM,GACtC,SAAS;MACH,IAAI,QAAQ,UAAU,MAC5B,SAAS;CAGV,MAAM,SAAS,IAAI,oBAAoB,QAAQ,mBAAmB,wBAAwB;CAC1F,IAAI;CACJ,QAAQ,OAAO,OAAf;EACC,KAAK;GACJ,eAAe,gBAAgB,KAAK;GACpC;EACD,KAAK;GAEJ,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,KAAK,kBAChD,MAAM,IAAI,UACT,oBACA,uEACD;GAED,eAAe,gBAAgB,MAAM,OAAO;GAC5C,IAAI,QAAQ,aAAa,EAAE,GAC1B,OAAO,CAAC;GAET,aAAa,EAAE,IAAI;GACnB;EACD,SACC,eAAe;CACjB;CACA,MAAM,eAAe,sBACpB,OACA,cACA,QACA,QAAQ,SAAS,QAAQ,OAAO,QAAQ,UAAU,QACnD;CACA,IAAI,CAAC,cACJ,OAAO,CAAC;CAET,eAAe;CAEf,IAAI,SAAS,GACZ,SAAS;CAGV,MAAM,MAAa,CAAC;CACpB,IAAI,cAAc;CAClB,IAAI,SAAS,aAAa,EAAE;CAC5B,MAAM,aAAqC,OAAO,OAAO,IAAI;CAC7D,MAAM,UAAkB,QAAQ,cAAc,MAAM,YAAa,CAAC;CAClE,MAAM,UAAkB,QAAQ,cAAc,MAAM,YAAa,CAAC;CAGlE,KAAK,IAAI,SAAS,aAAa,EAAE,GAAG,UAAU,aAAa,EAAE,GAAG,EAAE,QAAQ;EACzE,KAAK,QAAQ,WAAW,CAAC,EAAC,CAAE,QAC3B;EAED,MAAM,MAAM,QAAQ,OAAO,QAAQ,MAAM;EACzC,IAAI,WAAgB;EACpB,QAAQ,QAAR;GACC,KAAK;IACJ,QAAQ,UAAU,SAAS,aAAa,EAAE;IAC1C;GACD,KAAK;IACJ,QAAQ,UAAU,UAAU,MAAM;IAClC;GACD,KAAK;IACJ,QAAQ,UAAW,QAAQ,OAAoB,SAAS,aAAa,EAAE;IACvE;GACD,SAAS;IAGR,cAAc,YAAY,WADb,OAAO,OAAO;KAAE,GAAG;KAAW,GAAG;IAAI,IAAI,KACG,MAAM,OAAO;IAEtE,IAAI,UAAU,WAAW,cAAc;IACvC,IAAI,CAAC,SACJ,WAAW,aAAa;SAClB;KACN;MACC,cAAc,YAAY,MAAM;YACxB,WAAW;KACpB,WAAW,aAAa;KACxB,WAAW,eAAe;IAC3B;IACA,QAAQ,UAAU;GACnB;EACD;CACD;CAGA,KAAK,SAAS,aAAa,EAAE,IAAI,QAAQ,UAAU,aAAa,EAAE,GAAG,EAAE,QAAQ;EAC9E,KAAK,QAAQ,WAAW,CAAC,EAAC,CAAE,QAC3B;EAED,MAAM,MAAM,aAAa,OAAO,cAAc,QAAQ,QAAQ,SAAS,OAAO;EAC9E,IAAI,CAAC,IAAI,YAAY,WAAW,IAAI,QAAQ,cAAc,QAAQ,CAAC,CAAC,QAAQ,YAC3E,IAAI,iBAAiB,IAAI;CAE3B;CACA,IAAI,SAAS;CACb,OAAO;AACR;;;;;;;;;;;;;AAcA,SAAgB,eAAe,eAAiC,UAAiB,MAAkC;CAClH,MAAM,UAAe,QAAQ,CAAC;CAC9B,MAAM,QAAQ,gBAAiB,cAAsB,YAAY,OAAO,CAAC,CAAC,QAAQ;CAElF,MAAM,SAAS,CAAC,CAAC,QAAQ;CACzB,MAAM,YAAiB,iBAAiB,CAAC;CACzC,IAAI,CAAC,iBAAiB,OACrB,UAAU,WAAW,CAAC;CAGvB,IAAI,YAAY,GACf,YAAY;CACb,IAAI,aAAa,QAAQ,UAAU,MAAM;EACxC,IAAI,OAAO,QAAQ,WAAW,UAC7B,YAAY,QAAQ;OACd;GACN,MAAM,eAAe,OAAO,QAAQ,WAAW,WAAW,WAAW,QAAQ,MAAM,IAAI,QAAQ;GAC/F,YAAY,aAAa;GACzB,YAAY,aAAa;EAC1B;CACD;CAEA,MAAM,QAAe;EAAE,GAAG;GAAE,GAAG;GAAG,GAAG;EAAE;EAAG,GAAG;GAAE,GAAG;GAAW,GAAG,YAAY,SAAS,SAAS,IAAI;EAAO;CAAE;CAC3G,IAAI,UAAU,SAAS;EACtB,MAAM,gBAAgB,gBAAgB,UAAU,OAAO;EACvD,MAAM,EAAE,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;EACjD,MAAM,EAAE,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;EAEjD,IAAI,cAAc,IAAI;GACrB,YAAY,cAAc,EAAE,IAAI;GAChC,MAAM,EAAE,IAAI,YAAY,SAAS,SAAS,IAAI;EAC/C;CACD,OACC,IAAI,cAAc,IAAI;EACrB,YAAY;EACZ,MAAM,EAAE,IAAI,SAAS,SAAS,IAAI;CACnC;CAID,MAAM,UAAoB,QAAQ,UAAU,CAAC;CAC7C,IAAI,SAAS;CACb,SAAS,SAAS,QAAQ,WAAW;EACpC,IAAI,SAAS,CAAC,UAAU,QAAQ,CAAC,YAAY,SAAS,SACrD,UAAU,QAAQ,CAAC,YAAY,SAAS,UAAU,CAAC;EAEpD,MAAM,WAAW,QAAQ,UAAU,QAAQ,CAAC,YAAY,SAAS,UAAU;EAC3E,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,QAAgB;GAE5C,KAAK,SAAS,QAAQ,QAAQ,GAAG,OAAO,IACvC,QAAS,SAAS,QAAQ,UAAW;GAEtC,IAAI,QAAQ,OAAO;GACnB,IAAI,WAAW;GACf,IAAI,aAAa;GACjB,MAAM,MAAM,QAAQ,KAAK,UAAU,YAAY,MAAM,IAAI,UAAU,YAAY,SAAS,MAAM;GAC9F,MAAM,OAAY,QAAQ,SAAS,YAAY,UAAU,UAAU;GAGnE,IAAI,SAAS,OAAO,UAAU,YAAY,EAAE,iBAAiB,OAAO;IACnE,IAAI,OACH,SAAS,YAAY,UAAU;SAE/B,UAAU,OAAO;GAEnB,OAAO;IACN,IAAI,OAAO,UAAU,UACpB,WAAW;SACL,IAAI,OAAO,UAAU,WAC3B,WAAW;SACL,IAAI,OAAO,UAAU,UAC3B,WAAW;SACL,IAAI,iBAAiB,MAAM;KACjC,WAAW;KACX,IAAI,CAAC,QAAQ,KACZ,QAAQ,WAAW,KAAK;KAEzB,IAAI,CAAC,QAAQ,WAAW;MACvB,WAAW;MACX,QAAQ,mBAAmB,KAAK;KACjC;KAEA,aACC,QAAQ,QAAQ,KAAK,KAAK,aAAa,OAAO,KAAK,CAAC,CAAC,IAClD,OAAO,KAAK,CAAC,IACb,QAAQ,UAAU,YAAY;IACnC,OAAO,IAAI,UAAU,QAAQ,QAAQ,WAAW;KAC/C,WAAW;KACX,QAAQ;IACT;IAEA,IAAI,CAAC,MAAM;KAEV,MAAM,UAAe;MAAE,GAAG;MAAU,GAAG;KAAM;KAC7C,IAAI,YACH,QAAQ,IAAI;KAEb,IAAI,OACH,SAAS,YAAY,UAAU;UAE/B,UAAU,OAAO;IAEnB,OAAO;KAEN,KAAK,IAAI;KACT,KAAK,IAAI;KACT,OAAO,KAAK;KACZ,IAAI,YACH,KAAK,IAAI;IAEX;GACD;EACD,CAAC;CACF,CAAC;CAED,MAAM,EAAE,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,YAAY,QAAQ,SAAS,CAAC;CAC9D,MAAM,mBAAmB,UAAU,SAAS;CAC5C,IAAI,SAAS,CAAC,UAAU,QAAQ,CAAC,YAChC,UAAU,QAAQ,CAAC,aAAa,CAAC;CAGlC,IAAI,QACH,KAAK,SAAS,GAAG,SAAS,QAAQ,QAAQ,EAAE,QAC3C,IAAI,OACH,UAAU,QAAQ,CAAC,UAAU,CAAC,SAAS,aAAa;EAAE,GAAG;EAAK,GAAG,QAAQ;CAAQ;MAEjF,UAAU,UAAU,SAAS,SAAS,IAAI,oBAAoB;EAAE,GAAG;EAAK,GAAG,QAAQ;CAAQ;CAI9F,UAAU,UAAU,YAAY,KAAK;CACrC,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,YAAY,IAAW,MAAkC;CACxE,OAAO,eAAe,MAAM,IAAI,IAAI;AACrC;;;;;;;;;;;;;;;;ACvZA,SAAgB,gBAAgB,WAA6B,MAAe,MAAiC;CAC5G,MAAM,UAAU,QAAQ,CAAC;CACzB,MAAM,QAAQ,YAAY,UAAU,YAAY,OAAO,CAAC,CAAC,QAAQ;CACjE,MAAM,KAAgB,cAAc,QAAQ,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC;CAC/D,IAAI,SAAS,CAAC,GAAG,UAChB,GAAG,WAAW,CAAC;CAIhB,IAAI,YAAY,GACf,YAAY;CACb,IAAI,MAAM,QAAQ,UAAU,MAAM;EACjC,IAAI,OAAO,QAAQ,WAAW,UAC7B,YAAY,QAAQ;OACd;GACN,MAAM,eAAe,OAAO,QAAQ,WAAW,WAAW,WAAW,QAAQ,MAAM,IAAI,QAAQ;GAC/F,YAAY,aAAa;GACzB,YAAY,aAAa;EAC1B;CACD;CAGA,MAAM,QAAe;EAAE,GAAG;GAAE,GAAG;GAAU,GAAG;EAAS;EAAG,GAAG;GAAE,GAAG;GAAG,GAAG;EAAE;CAAE;CAC1E,IAAI,GAAG,SAAS;EAEf,MAAM,gBAAgB,gBAAgB,GAAG,OAAO;EAChD,MAAM,EAAE,IAAI,cAAc,EAAE;EAC5B,MAAM,EAAE,IAAI,cAAc,EAAE;EAC5B,MAAM,EAAE,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;EACjD,MAAM,EAAE,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;EAEjD,IAAI,cAAc,IACjB,MAAM,EAAE,IAAI,YAAY,GAAG,UAAU,cAAc,EAAE,IAAI,IAAI;CAE/D,OAAO;EACN,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;EAEhD,IAAI,cAAc,IACjB,YAAY;CAEd;CAEA,IAAI,OAAO;CACX,KAAK,IAAI,SAAS,GAAG,SAAS,KAAK,QAAQ,EAAE,QAAQ;EACpD,IAAI,CAAC,KAAK,SACT;EAED,IAAI,CAAC,MAAM,QAAQ,KAAK,OAAO,GAC9B,MAAM,IAAI,UAAU,oBAAoB,yCAAyC;EAElF,MAAM,YAAY,YAAY;EAC9B,MAAM,UAAU,KAAK;EACrB,KAAK,IAAI,SAAS,GAAG,SAAS,QAAQ,QAAQ,EAAE,QAAQ;GACvD,IAAI,QAAQ,YAAY,QACvB;GAED,IAAI,OAAY;IAAE,GAAG,QAAQ;IAAS,GAAG;GAAG;GAC5C,MAAM,YAAY,YAAY;GAG9B,IAAI,MAAM,EAAE,IAAI,WACf,MAAM,EAAE,IAAI;GAEb,IAAI,MAAM,EAAE,IAAI,WACf,MAAM,EAAE,IAAI;GAEb,IAAI,MAAM,EAAE,IAAI,WACf,MAAM,EAAE,IAAI;GAEb,IAAI,MAAM,EAAE,IAAI,WACf,MAAM,EAAE,IAAI;GAEb,OAAO;GAGP,IACC,QAAQ,WACR,OAAO,QAAQ,YAAY,YAC3B,CAAC,MAAM,QAAQ,QAAQ,OAAO,KAC9B,EAAE,QAAQ,mBAAmB,OAE7B,OAAO,QAAQ;QACT;IAEN,IAAI,MAAM,QAAQ,KAAK,CAAC,GAAG;KAC1B,KAAK,IAAI,QAAQ,OAAO,CAAC;KACzB,KAAK,IAAI,KAAK,EAAE;IACjB;IACA,IAAI,KAAK,MAAM,MAAM;KACpB,IAAI,KAAK,GACR,KAAK,IAAI;UACH,IAAI,QAAQ,WAAW;MAC7B,KAAK,IAAI;MACT,KAAK,IAAI;KACV,OAAO,IAAI,CAAC,QAAQ,YACnB;UAEA,KAAK,IAAI;IAEX,OAAO,IAAI,OAAO,KAAK,MAAM,UAAU;KACtC,IAAI,SAAS,KAAK,CAAC,GAClB,KAAK,IAAI;UACH,IAAI,MAAM,KAAK,CAAC,GAAG;MACzB,KAAK,IAAI;MACT,KAAK,IAAI;KACV,OAAO;MACN,KAAK,IAAI;MACT,KAAK,IAAI;KACV;IACD,OAAO,IAAI,OAAO,KAAK,MAAM,WAC5B,KAAK,IAAI;SACH,IAAI,KAAK,aAAa,MAAM;KAClC,KAAK,IAAI,QAAQ,UAAU,YAAY;KACvC,IAAI,CAAC,QAAQ,KACZ,KAAK,IAAI,WAAW,KAAK,CAAC;KAE3B,IAAI,QAAQ,WAAW;MACtB,KAAK,IAAI;MACT,KAAK,IAAI,aAAa,KAAK,GAAG,mBAAmB,KAAK,GAAG,QAAQ,QAAQ,CAAC;KAC3E,OAAO;MAEN,KAAK,IAAI;MACT,KAAK,IAAI,mBAAmB,KAAK,GAAG,QAAQ,QAAQ;MACpD,KAAK,IAAI,aAAa,KAAK,GAAG,KAAK,CAAC;KACrC;IACD,OACC,KAAK,IAAI;GAEX;GAGA,MAAM,eAAe,QAAQ,IAAI,WAAW,SAAS;GACrD,IAAI,cAAc,KAAK,CAAC,KAAK,GAC5B,KAAK,IAAI,aAAa;GAEvB,QAAQ,IAAI,WAAW,WAAW,IAAI;EACvC;CACD;CAEA,IAAI,QAAQ,MAAM,EAAE,IAAI,OACvB,GAAG,UAAU,YAAY,KAAK;CAE/B,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,aAAa,MAAe,MAAiC;CAC5E,OAAO,gBAAgB,MAAM,MAAM,IAAI;AACxC;;;;;;;;;;;;AAaA,SAAgB,aAA0B,OAAkB,MAA8C;CACzG,OAAO,YAAiB,OAAO;EAAE,GAAG;EAAM,QAAQ;CAAE,CAAC;AACtD;;;;;AChLA,MAAM,OAAO;AAEb,SAAS,2BAA2B,MAAc,WAA4B;CAC7E,OAAO,UAAU,SAAS,KAAK,KAAK,SAAS,UAAU,OAAO,CAAC,CAAC;AACjE;AAEA,SAAS,cAAc,MAAc,gBAAwB,iBAAyB,aAA+B;CACpH,IACC,eACA,KAAK,SAAS,IAAG,KACjB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,IAAI,KAClB,2BAA2B,MAAM,cAAc,KAC/C,2BAA2B,MAAM,eAAe,GAEhD,OAAO,OAAM,KAAK,QAAQ,MAAM,MAAI,IAAI;CAEzC,OAAO;AACR;AAEA,SAAS,kBAAkB,KAAa,SAAsB;CAC7D,IAAI,QAAQ,mBAAmB,SAAS,IAAI,WAAW,GACtD,OAAO;CAER,QAAQ,IAAI,WAAW,CAAC,GAAxB;EACC,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,IACJ,OAAO,MAAM;EACd,SACC,OAAO;CACT;AACD;;;;;;;;;;AAWA,SAAS,YACR,OACA,OACA,UACA,MACA,gBACA,iBACA,UACA,SACgB;CAChB,IAAI,UAAU;CACd,MAAM,MAAgB,CAAC;CAEvB,KAAK,IAAI,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,QAAQ;EAE3D,IAAI,CAAC,KAAK,SACT;EAED,MAAM,MAAM,QAAQ,OAAO,UAAU,MAAM;EAC3C,IAAI,MAAM;EACV,IAAI,OAAO,MACV,MAAM;OACA,IAAI,IAAI,KAAK,MAAM;GACzB,UAAU;GACV,MAAM,UAAU,0BAA0B,KAAK,OAAO;GACtD,MAAM,gBACL,QAAQ,eAAe,UAAU,IAAI,MAAM,OAAO,YAAY,UAAU,YAAY;GACrF,MACC,MACC,QAAQ,cAAc,IAAI,MAAM,OAAO,CAAC,gBACtC,IAAI,IACJ,oBAAoB,KAAK,MAAM,OAAO;GAC1C,MAAM,kBAAkB,KAAK,OAAO;GACpC,MAAM,cAAc,KAAK,gBAAgB,iBAAiB,QAAQ,WAAW;GAE7E,IAAI,QAAQ,QAAQ,aAAa,KAAK,IAAI,WAAW,GACpD,MAAM;EAER,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG;GAEnC,UAAU;GACV,MAAM,MAAM,IAAI;GAChB,MAAM,kBAAkB,KAAK,OAAO;GACpC,MAAM,cAAc,KAAK,gBAAgB,iBAAiB,QAAQ,WAAW;EAC9E,OACC,MAAM;EAEP,IAAI,KAAK,GAAG;CACb;CAEA,IAAI,QAAQ,OACX,OAAO,IAAI,GAAG,EAAE,MAAM,IACrB,EAAE,IAAI;CAGR,IAAI,QAAQ,cAAc,SAAS,SAClC,OAAO;CAER,OAAO,IAAI,KAAK,cAAc;AAC/B;;;;;;;;;;;AAYA,SAAgB,WAAW,OAAkB,MAA8B;CAC1E,MAAM,MAAgB,CAAC;CACvB,MAAM,UAAe,QAAQ,OAAO,CAAC,IAAI;CACzC,IAAI,SAAS,QAAQ,MAAM,WAAW,MACrC,OAAO;CAER,MAAM,SAAS,IAAI,oBAAoB,QAAQ,mBAAmB,wBAAwB;CAC1F,MAAM,QAAQ,sBAAsB,OAAO,gBAAgB,MAAM,OAAO,GAAG,MAAM;CACjF,IAAI,CAAC,OACJ,OAAO;CAER,MAAM,iBAAiB,QAAQ,OAAO,SAAY,QAAQ,KAAK;CAC/D,MAAM,kBAAkB,QAAQ,OAAO,SAAY,QAAQ,KAAK;CAGhE,MAAM,OAAiB,CAAC;CACxB,MAAM,UAAkB,QAAQ,cAAc,MAAM,YAAa,CAAC;CAClE,MAAM,UAAkB,QAAQ,cAAc,MAAM,YAAa,CAAC;CAElE,KAAK,IAAI,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,QACnD,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAC,CAAE,QAC5B,KAAK,UAAU,UAAU,MAAM;CAIjC,IAAI,WAAW;CACf,KAAK,IAAI,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,QAAQ;EAC3D,KAAK,QAAQ,WAAW,CAAC,EAAC,CAAE,QAC3B;EAED,MAAM,MAAM,YAAY,OAAO,OAAO,QAAQ,MAAM,gBAAgB,iBAAiB,UAAU,OAAO;EACtG,IAAI,OAAO,MACV;EAGD,IAAI,OAAO,QAAQ,cAAc,OAChC,IAAI,MAAM,aAAa,kBAAkB,MAAM,GAAG;CAEpD;CACA,OAAO,IAAI,KAAK,EAAE;AACnB;;;;;;;;;;;AAYA,SAAgB,WAAW,OAAkB,MAA8B;CAC1E,MAAM,UAAe,QAAQ,CAAC;CAC9B,QAAQ,KAAK;CACb,QAAQ,KAAK;CACb,OAAO,WAAW,OAAO,OAAO;AACjC;;;;;;AAOA,SAAS,SAAS,MAAc,KAAa,MAA8B;CAC1E,MAAM,OAAgB,CAAC;CACvB,IAAI,MAAa,CAAC;CAClB,IAAI,IAAI;CACR,MAAM,MAAM,KAAK;CACjB,IAAI,iBAAiB;CACrB,IAAI,YAAY;CAChB,IAAI,WAAW;CACf,MAAM,UAAU,qBAAqB,KAAK,kBAAkB,eAAe,kBAAkB;CAC7F,MAAM,YAAY,qBAAqB,KAAK,WAAW,GAAG,WAAW;CACrE,MAAM,SAAS,IAAI,oBAAoB,KAAK,mBAAmB,wBAAwB;CAEvF,MAAM,iBAAuB;EAC5B,IAAI,WACH;EAED,EAAE;EACF,IAAI,oBACH,MAAM,IAAI,UAAU,aAAa,mCAAmC,eAAe;EAEpF,IAAI,WAAW,SACd,MAAM,IAAI,UAAU,kBAAkB,uBAAuB,SAAS,iBAAiB,SAAS;EAEjG,YAAY;CACb;CACA,MAAM,aAAa,UAAwB;EAC1C,IAAI,IAAI,iBACP,MAAM,IAAI,UAAU,aAAa,qCAAqC,kBAAkB;EAEzF,OAAO,OAAO,kBAAkB,CAAC;EACjC,IAAI,KAAK,KAAK;CACf;CACA,MAAM,kBAA2B;EAChC,SAAS;EACT,IAAI,IAAI,WAAW,GAClB,OAAO,OAAO,kBAAkB,CAAC;EAElC,KAAK,KAAK,GAAG;EACb,MAAM,CAAC;EACP,YAAY;EACZ,iBAAiB;EACjB,OAAO,YAAY,KAAK,KAAK,UAAU;CACxC;CAEA,OAAO,IAAI,KAAK;EACf,SAAS;EACT,IAAI,KAAK,OAAO,MAAK;GAEpB,IAAI,MAAM;GACV;GACA,OAAO,IAAI,KACV,IAAI,KAAK,OAAO,MAAK;IACpB,IAAI,IAAI,IAAI,OAAO,KAAK,IAAI,OAAO,MAAK;KAEvC,OAAO;KACP,KAAK;IACN,OAAO;KAEN;KACA;IACD;GACD,OAAO;IACN,OAAO,KAAK;IACZ;GACD;GAED,UAAU,GAAG;GACb,iBAAiB;GAEjB,IAAI,IAAI,OAAO,KAAK,OAAO,KAAK;IAC/B;IACA,iBAAiB;GAClB,OAAO,IAAI,IAAI,QAAQ,KAAK,OAAO,QAAQ,KAAK,OAAO,OAAO;IAC7D,IAAI,KAAK,OAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,OAAO,MACtD;IAED;IACA,IAAI,UAAU,GACb,OAAO;GAET;EACD,OAAO,IAAI,KAAK,OAAO,KAAK;GAC3B,UAAU,EAAE;GACZ;GACA,iBAAiB;EAClB,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM;GAChD,IAAI,gBACH,UAAU,EAAE;GAEb,IAAI,KAAK,OAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,OAAO,MACtD;GAED;GACA,IAAI,UAAU,GACb,OAAO;EAET,OAAO;GAEN,IAAI,MAAM;GACV,OAAO,IAAI,OAAO,KAAK,OAAO,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,MAAM;IAC1E,OAAO,KAAK;IACZ;GACD;GACA,UAAU,GAAG;GACb,iBAAiB;GACjB,IAAI,IAAI,OAAO,KAAK,OAAO,KAAK;IAC/B;IACA,iBAAiB;GAClB,OAAO,IAAI,IAAI,QAAQ,KAAK,OAAO,QAAQ,KAAK,OAAO,OAAO;IAC7D,IAAI,KAAK,OAAO,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,OAAO,MACtD;IAED;IACA,IAAI,UAAU,GACb,OAAO;GAET;EACD;CACD;CACA,IAAI,gBACH,UAAU,EAAE;CAEb,IAAI,IAAI,SAAS,GAChB,UAAU;CAGX,OAAO;AACR;;AAGA,SAAS,YAAY,KAAwC;CAC5D,IAAI,QAAQ,IACX,OAAO;CAER,IAAI,QAAQ,UAAU,QAAQ,QAC7B,OAAO;CAER,IAAI,QAAQ,WAAW,QAAQ,SAC9B,OAAO;CAER,MAAM,MAAM,OAAO,GAAG;CACtB,IAAI,IAAI,SAAS,KAAK,CAAC,MAAM,GAAG,KAAK,SAAS,GAAG,GAChD,OAAO;CAER,OAAO;AACR;;;;;;;;AASA,SAAgB,WAAW,MAAc,MAAiC;CAIzE,MAAM,OAFO,SAAS,MADT,QAAQ,KAAK,MAAO,KACA,QAAQ,CAAC,CAEjB,CAAC,CAAC,KAAK,QAAS,IAAI,WAAW,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,UAAU,YAAY,KAAK,CAAC,CAAE;CAC5G,OAAO,aAAa,MAAM,EAAE,YAAY,KAAK,CAAC;AAC/C;;;;;;;;;AChWA,MAAa,qBAAuD;CACnE,OAAO;CACP,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,KAAK;CACL,KAAK;CACL,QAAQ;CACR,OAAO;CACP,OAAO;CACP,KAAK;CACL,OAAO;CACP,MAAM;CACN,eAAe;CACf,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,WAAW;CACX,MAAM;CACN,QAAQ;CACR,KAAK;CACL,SAAS;CACT,YAAY;CACZ,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,KAAK;CACL,sBAAsB;CACtB,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,SAAS;CACT,MAAM;CACN,SAAS;CACT,WAAW;CACX,KAAK;CACL,KAAK;CACL,WAAW;CACX,aAAa;CACb,YAAY;CACZ,aAAa;CACb,0BAA0B;CAC1B,uBAAuB;CACvB,iBAAiB;CACjB,OAAO;CACP,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,iBAAiB;CACjB,MAAM;CACN,WAAW;CACX,iCAAiC;CACjC,OAAO;CACP,MAAM;CACN,KAAK;CACL,QAAQ;CACR,IAAI;CACJ,UAAU;CACV,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,KAAK;CACL,OAAO;CACP,KAAK;CACL,kBAAkB;CAClB,gBAAgB;CAChB,wBAAwB;CACxB,kBAAkB;CAClB,kBAAkB;CAClB,SAAS;CACT,eAAe;CACf,MAAM;CACN,KAAK;CACL,QAAQ;CACR,UAAU;CACV,uBAAuB;CACvB,WAAW;CACX,iBAAiB;CACjB,iBAAiB;CACjB,sBAAsB;CACtB,eAAe;CACf,qBAAqB;CACrB,0BAA0B;CAC1B,sBAAsB;CACtB,kBAAkB;CAClB,gBAAgB;CAChB,eAAe;CACf,mBAAmB;CACnB,mBAAmB;CACnB,WAAW;CACX,cAAc;CACd,kBAAkB;CAClB,WAAW;CACX,qBAAqB;CACrB,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,oBAAoB;CACpB,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;CACT,cAAc;CACd,WAAW;CACX,MAAM;CACN,QAAQ;CACR,KAAK;CACL,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,KAAK;CACL,MAAM;CACN,KAAK;CACL,QAAQ;CACR,SAAS;CACT,OAAO;CACP,kBAAkB;CAClB,sBAAsB;CACtB,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;CACP,YAAY;CACZ,aAAa;CACb,MAAM;CACN,MAAM;CACN,KAAK;CACL,MAAM;CACN,QAAQ;CACR,cAAc;CACd,KAAK;CACL,KAAK;CACL,mBAAmB;CACnB,uBAAuB;CACvB,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,MAAM;CACN,MAAM;CACN,IAAI;CACJ,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,KAAK;CACL,MAAM;CACN,KAAK;CACL,IAAI;CACJ,MAAM;CACN,cAAc;CACd,kBAAkB;CAClB,kBAAkB;CAClB,gBAAgB;CAChB,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,MAAM;CACN,IAAI;CACJ,QAAQ;CACR,OAAO;CACP,KAAK;CACL,OAAO;CACP,KAAK;CACL,cAAc;CACd,MAAM;CACN,gBAAgB;CAChB,MAAM;CACN,QAAQ;CACR,cAAc;CACd,WAAW;CACX,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,OAAO;CACP,KAAK;CACL,MAAM;CACN,KAAK;CACL,QAAQ;CACR,IAAI;CACJ,OAAO;CACP,YAAY;CACZ,SAAS;CACT,KAAK;CACL,UAAU;CACV,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,MAAM;CACN,OAAO;CACP,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,IAAI;CACJ,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,kBAAkB;CAClB,WAAW;CACX,cAAc;CACd,qBAAqB;CACrB,aAAa;CACb,mBAAmB;CACnB,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,WAAW;CACX,gBAAgB;CAChB,iBAAiB;CACjB,SAAS;CACT,cAAc;CACd,eAAe;CACf,cAAc;CACd,iBAAiB;CACjB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,cAAc;CACd,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,WAAW;CACX,gBAAgB;CAChB,kBAAkB;CAClB,eAAe;CACf,aAAa;CACb,UAAU;CACV,gBAAgB;CAChB,WAAW;CACX,KAAK;CACL,IAAI;CACJ,YAAY;CACZ,QAAQ;CACR,eAAe;CACf,oBAAoB;CACpB,gBAAgB;CAChB,eAAe;CACf,oBAAoB;CACpB,gBAAgB;CAChB,MAAM;CACN,gBAAgB;CAChB,iBAAiB;CACjB,MAAM;CACN,KAAK;CACL,QAAQ;CACR,IAAI;CACJ,KAAK;CACL,KAAK;CACL,aAAa;CACb,WAAW;CACX,KAAK;CACL,WAAW;CACX,MAAM;CACN,MAAM;CACN,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,qBAAqB;CACrB,oBAAoB;CACpB,mBAAmB;CACnB,uBAAuB;CACvB,sBAAsB;CACtB,gBAAgB;CAChB,SAAS;CACT,KAAK;CACL,SAAS;CACT,kBAAkB;CAClB,MAAM;CACN,KAAK;CACL,cAAc;CACd,WAAW;CACX,sBAAsB;CACtB,YAAY;CACZ,UAAU;CACV,eAAe;CACf,WAAW;CACX,YAAY;CACZ,iBAAiB;CACjB,qBAAqB;CACrB,mBAAmB;CACnB,gBAAgB;CAChB,sBAAsB;CACtB,iBAAiB;CACjB,iBAAiB;CACjB,cAAc;CACd,iBAAiB;CACjB,oBAAoB;CACpB,sBAAsB;CACtB,SAAS;CACT,cAAc;CACd,gBAAgB;CAChB,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,yBAAyB;CACzB,mBAAmB;CACnB,aAAa;CACb,kBAAkB;CAClB,uBAAuB;CACvB,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,uBAAuB;CACvB,iBAAiB;CACjB,sBAAsB;CACtB,mBAAmB;CACnB,wBAAwB;CACxB,WAAW;CACX,gBAAgB;CAChB,aAAa;CACb,kBAAkB;CAClB,uBAAuB;CACvB,kBAAkB;CAClB,aAAa;CACb,kBAAkB;CAClB,UAAU;CACV,eAAe;CACf,mBAAmB;CACnB,eAAe;CACf,gBAAgB;CAChB,MAAM;CACN,QAAQ;CACR,IAAI;CACJ,OAAO;CACP,QAAQ;CACR,OAAO;CACP,KAAK;CACL,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,OAAO;CACP,OAAO;CACP,SAAS;CACT,MAAM;CACN,sBAAsB;CACtB,gBAAgB;CAChB,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,WAAW;CACX,aAAa;CACb,iBAAiB;CACjB,UAAU;CACV,KAAK;CACL,KAAK;CACL,KAAK;CACL,IAAI;CACJ,WAAW;CACX,eAAe;CACf,MAAM;CACN,IAAI;CACJ,UAAU;CACV,eAAe;CACf,oBAAoB;CACpB,eAAe;CACf,OAAO;CACP,SAAS;CACT,YAAY;CACZ,cAAc;CACd,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,OAAO;CACP,KAAK;CACL,QAAQ;CACR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,IAAI;CACJ,gBAAgB;CAChB,oBAAoB;CACpB,sBAAsB;CACtB,KAAK;CACL,KAAK;CACL,mBAAmB;CACnB,YAAY;CACZ,eAAe;CACf,qBAAqB;CACrB,cAAc;CACd,oBAAoB;CACpB,oBAAoB;CACpB,iBAAiB;CACjB,oBAAoB;CACpB,YAAY;CACZ,UAAU;CACV,eAAe;CACf,gBAAgB;CAChB,eAAe;CACf,kBAAkB;CAClB,oBAAoB;CACpB,mBAAmB;CACnB,kBAAkB;CAClB,eAAe;CACf,kBAAkB;CAClB,aAAa;CACb,gBAAgB;CAChB,YAAY;CACZ,MAAM;CACN,cAAc;CACd,aAAa;CACb,MAAM;CACN,KAAK;CACL,aAAa;CACb,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,IAAI;CACJ,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,KAAK;CACL,KAAK;CACL,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,cAAc;CACd,OAAO;CACP,aAAa;CACb,MAAM;CACN,MAAM;CACN,QAAQ;CACR,oBAAoB;CACpB,cAAc;CACd,mBAAmB;CACnB,gBAAgB;CAChB,qBAAqB;CACrB,aAAa;CACb,MAAM;CACN,MAAM;CACN,KAAK;CACL,QAAQ;CACR,aAAa;CACb,UAAU;CACV,eAAe;CACf,oBAAoB;CACpB,eAAe;CACf,UAAU;CACV,KAAK;CACL,KAAK;CACL,UAAU;CACV,eAAe;CACf,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,KAAK;CACL,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,KAAK;CACL,WAAW;CACX,OAAO;CACP,YAAY;CACZ,WAAW;CACX,OAAO;CACP,YAAY;CACZ,gBAAgB;CAChB,YAAY;CACZ,MAAM;CACN,WAAW;CACX,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,UAAU;CACV,OAAO;CACP,QAAQ;CACR,OAAO;CACP,KAAK;CACL,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,OAAO;CACP,UAAU;CACV,YAAY;CACZ,cAAc;CACd,kBAAkB;CAClB,OAAO;CACP,WAAW;CACX,OAAO;CACP,MAAM;CACN,SAAS;CACT,YAAY;CACZ,kBAAkB;CAClB,aAAa;CACb,eAAe;CACf,OAAO;CACP,YAAY;CACZ,SAAS;CACT,aAAa;CACb,gBAAgB;CAChB,iBAAiB;CACjB,MAAM;CACN,SAAS;CACT,OAAO;CACP,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,KAAK;CACL,OAAO;CACP,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,MAAM;CACN,aAAa;CACb,cAAc;CACd,mBAAmB;CACnB,eAAe;CACf,eAAe;CACf,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,KAAK;CACL,MAAM;CACN,MAAM;CACN,KAAK;CACL,IAAI;CACJ,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,MAAM;CACN,gBAAgB;CAChB,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,IAAI;CACJ,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;CACP,KAAK;CACL,OAAO;CACP,IAAI;CACJ,KAAK;CACL,QAAQ;CACR,SAAS;CACT,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,KAAK;CACL,KAAK;CACL,QAAQ;CACR,MAAM;CACN,UAAU;CACV,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,QAAQ;CACR,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,OAAO;CACP,SAAS;CACT,UAAU;CACV,QAAQ;CACR,OAAO;CACP,SAAS;CACT,OAAO;CACP,MAAM;CACN,IAAI;CACJ,KAAK;CACL,QAAQ;CACR,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,MAAM;CACN,KAAK;CACL,OAAO;CACP,SAAS;CACT,QAAQ;CACR,MAAM;CACN,UAAU;CACV,OAAO;CACP,MAAM;CACN,UAAU;CACV,aAAa;CACb,WAAW;CACX,SAAS;CACT,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,MAAM;CACN,UAAU;CACV,OAAO;CACP,KAAK;CACL,OAAO;CACP,QAAQ;CACR,SAAS;CACT,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,SAAS;CACT,KAAK;CACL,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,SAAS;CACT,UAAU;CACV,WAAW;CACX,UAAU;CACV,SAAS;CACT,iBAAiB;CACjB,eAAe;CACf,UAAU;CACV,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,cAAc;CACd,aAAa;CACb,eAAe;CACf,mBAAmB;CACnB,mBAAmB;CACnB,oBAAoB;CACpB,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,KAAK;CACL,SAAS;CACT,MAAM;CACN,MAAM;CACN,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,UAAU;CACV,SAAS;CACT,UAAU;CACV,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,UAAU;CACV,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,SAAS;CACT,MAAM;CACN,OAAO;CACP,SAAS;CACT,MAAM;CACN,WAAW;CACX,KAAK;CACL,MAAM;CACN,OAAO;CACP,WAAW;CACX,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,iBAAiB;CACjB,kBAAkB;CAClB,UAAU;CACV,UAAU;CACV,YAAY;CACZ,aAAa;CACb,aAAa;CACb,MAAM;CACN,UAAU;CACV,QAAQ;CACR,SAAS;CACT,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,MAAM;CACN,SAAS;CACT,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,SAAS;CACT,OAAO;CACP,OAAO;CACP,QAAQ;CACR,SAAS;CACT,KAAK;CACL,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,MAAM;CACN,QAAQ;CACR,SAAS;CACT,aAAa;CACb,aAAa;CACb,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,gBAAgB;CAChB,iBAAiB;CACjB,OAAO;CACP,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACP,SAAS;CACT,OAAO;CACP,QAAQ;CACR,KAAK;CACL,IAAI;CACJ,SAAS;CACT,OAAO;CACP,SAAS;CACT,KAAK;CACL,OAAO;CACP,SAAS;CACT,QAAQ;CACR,KAAK;CACL,OAAO;CACP,OAAO;CACP,MAAM;CACN,SAAS;CACT,aAAa;CACb,OAAO;CACP,KAAK;CACL,SAAS;CACT,OAAO;CACP,KAAK;CACL,QAAQ;CACR,eAAe;CACf,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,OAAO;CACP,UAAU;CACV,UAAU;CACV,SAAS;CACT,WAAW;CACX,gBAAgB;CAChB,WAAW;CACX,gBAAgB;CAChB,iBAAiB;CACjB,kBAAkB;CAClB,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,SAAS;CACT,MAAM;CACN,UAAU;CACV,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,IAAI;CACJ,OAAO;CACP,KAAK;CACL,IAAI;CACJ,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,IAAI;CACJ,UAAU;CACV,KAAK;CACL,KAAK;CACL,QAAQ;CACR,OAAO;CACP,OAAO;CACP,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,MAAM;CACN,SAAS;CACT,OAAO;CACP,QAAQ;CACR,SAAS;CACT,OAAO;CACP,YAAY;CACZ,aAAa;CACb,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,SAAS;CACT,UAAU;CACV,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,MAAM;CACN,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,OAAO;CACP,aAAa;CACb,cAAc;CACd,eAAe;CACf,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,KAAK;CACL,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,MAAM;CACN,IAAI;CACJ,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,OAAO;CACP,KAAK;CACL,MAAM;CACN,IAAI;CACJ,KAAK;CACL,KAAK;CACL,MAAM;CACN,UAAU;CACV,KAAK;CACL,OAAO;CACP,QAAQ;CACR,SAAS;CACT,UAAU;CACV,MAAM;CACN,QAAQ;CACR,KAAK;CACL,IAAI;CACJ,KAAK;CACL,OAAO;CACP,MAAM;CACN,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,UAAU;CACV,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,IAAI;CACJ,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,SAAS;CACT,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,YAAY;CACZ,SAAS;CACT,QAAQ;CACR,WAAW;CACX,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,UAAU;CACV,UAAU;CACV,OAAO;CACP,QAAQ;CACR,eAAe;CACf,gBAAgB;CAChB,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,IAAI;CACJ,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,KAAK;CACL,QAAQ;CACR,IAAI;CACJ,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,UAAU;CACV,UAAU;CACV,OAAO;CACP,MAAM;CACN,OAAO;CACP,IAAI;CACJ,QAAQ;CACR,OAAO;CACP,UAAU;CACV,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,UAAU;CACV,UAAU;CACV,UAAU;CACV,SAAS;CACT,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACP,SAAS;CACT,OAAO;CACP,QAAQ;CACR,OAAO;CACP,IAAI;CACJ,QAAQ;CACR,OAAO;CACP,MAAM;CACN,OAAO;CACP,KAAK;CACL,KAAK;CACL,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,KAAK;CACL,QAAQ;CACR,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,OAAO;CACP,IAAI;CACJ,KAAK;CACL,MAAM;CACN,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,OAAO;CACP,MAAM;CACN,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,SAAS;CACT,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,QAAQ;CACR,SAAS;CACT,UAAU;CACV,MAAM;CACN,IAAI;CACJ,WAAW;CACX,eAAe;CACf,iBAAiB;CACjB,eAAe;CACf,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,mBAAmB;CACnB,qBAAqB;CACrB,gBAAgB;CAChB,KAAK;CACL,KAAK;CACL,MAAM;CACN,UAAU;CACV,KAAK;CACL,OAAO;CACP,QAAQ;CACR,SAAS;CACT,UAAU;CACV,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,SAAS;CACT,WAAW;CACX,YAAY;CACZ,SAAS;CACT,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,IAAI;CACJ,KAAK;CACL,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,MAAM;CACN,IAAI;CACJ,OAAO;CACP,UAAU;CACV,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,YAAY;CACZ,KAAK;CACL,MAAM;CACN,UAAU;CACV,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,eAAe;CACf,oBAAoB;CACpB,YAAY;CACZ,gBAAgB;CAChB,eAAe;CACf,gBAAgB;CAChB,OAAO;CACP,MAAM;CACN,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,IAAI;CACJ,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,UAAU;CACV,SAAS;CACT,WAAW;CACX,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,SAAS;CACT,KAAK;CACL,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,OAAO;CACP,eAAe;CACf,KAAK;CACL,KAAK;CACL,OAAO;CACP,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,IAAI;CACJ,UAAU;CACV,OAAO;CACP,KAAK;CACL,KAAK;CACL,MAAM;CACN,YAAY;CACZ,iBAAiB;CACjB,KAAK;CACL,KAAK;CACL,MAAM;CACN,aAAa;CACb,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,OAAO;CACP,SAAS;CACT,UAAU;CACV,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,UAAU;CACV,MAAM;CACN,KAAK;CACL,OAAO;CACP,IAAI;CACJ,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,SAAS;CACT,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,OAAO;CACP,WAAW;CACX,MAAM;CACN,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,IAAI;CACJ,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,OAAO;CACP,MAAM;CACN,KAAK;CACL,YAAY;CACZ,iBAAiB;CACjB,MAAM;CACN,OAAO;CACP,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,KAAK;CACL,OAAO;CACP,QAAQ;CACR,UAAU;CACV,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;CACP,SAAS;CACT,SAAS;CACT,SAAS;CACT,MAAM;CACN,WAAW;CACX,QAAQ;CACR,OAAO;CACP,SAAS;CACT,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,aAAa;CACb,OAAO;CACP,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,MAAM;CACN,MAAM;CACN,WAAW;CACX,gBAAgB;CAChB,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,OAAO;CACP,SAAS;CACT,SAAS;CACT,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,WAAW;CACX,YAAY;CACZ,OAAO;CACP,SAAS;CACT,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,WAAW;CACX,YAAY;CACZ,MAAM;CACN,QAAQ;CACR,MAAM;CACN,eAAe;CACf,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,IAAI;CACJ,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;CACR,MAAM;CACN,MAAM;CACN,SAAS;CACT,QAAQ;CACR,SAAS;CACT,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,QAAQ;CACR,IAAI;CACJ,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACP,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,OAAO;CACP,KAAK;CACL,MAAM;CACN,QAAQ;CACR,KAAK;CACL,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,OAAO;CACP,KAAK;CACL,OAAO;CACP,OAAO;CACP,SAAS;CACT,MAAM;CACN,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,IAAI;CACJ,OAAO;CACP,KAAK;CACL,OAAO;CACP,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,SAAS;CACT,KAAK;CACL,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,MAAM;CACN,OAAO;CACP,KAAK;CACL,MAAM;CACN,UAAU;CACV,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,KAAK;CACL,KAAK;CACL,MAAM;CACN,QAAQ;CACR,OAAO;CACP,IAAI;CACJ,WAAW;CACX,KAAK;CACL,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,MAAM;CACN,UAAU;CACV,OAAO;CACP,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,SAAS;CACT,SAAS;CACT,IAAI;CACJ,UAAU;CACV,MAAM;CACN,OAAO;CACP,IAAI;CACJ,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,MAAM;CACN,YAAY;CACZ,aAAa;CACb,QAAQ;CACR,aAAa;CACb,UAAU;CACV,UAAU;CACV,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,UAAU;CACV,UAAU;CACV,UAAU;CACV,MAAM;CACN,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,KAAK;CACL,QAAQ;CACR,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,aAAa;CACb,SAAS;CACT,OAAO;CACP,SAAS;CACT,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,UAAU;CACV,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,MAAM;CACN,QAAQ;CACR,OAAO;CACP,SAAS;CACT,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,WAAW;CACX,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,SAAS;CACT,SAAS;CACT,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,MAAM;CACN,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,MAAM;CACN,SAAS;CACT,UAAU;CACV,OAAO;CACP,MAAM;CACN,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,OAAO;CACP,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,YAAY;CACZ,gBAAgB;CAChB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,mBAAmB;CACnB,kBAAkB;CAClB,iBAAiB;CACjB,iBAAiB;CACjB,MAAM;CACN,cAAc;CACd,OAAO;CACP,OAAO;CACP,KAAK;CACL,QAAQ;CACR,YAAY;CACZ,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,QAAQ;CACR,SAAS;CACT,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,QAAQ;CACR,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,UAAU;CACV,SAAS;CACT,IAAI;CACJ,QAAQ;CACR,OAAO;CACP,IAAI;CACJ,KAAK;CACL,MAAM;CACN,QAAQ;CACR,OAAO;CACP,KAAK;CACL,QAAQ;CACR,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,UAAU;CACV,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,MAAM;CACN,MAAM;CACN,QAAQ;CACR,UAAU;CACV,OAAO;CACP,MAAM;CACN,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,MAAM;CACN,UAAU;CACV,eAAe;CACf,KAAK;CACL,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,SAAS;CACT,OAAO;CACP,eAAe;CACf,QAAQ;CACR,UAAU;CACV,MAAM;CACN,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,WAAW;CACX,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,UAAU;CACV,YAAY;CACZ,OAAO;CACP,QAAQ;CACR,UAAU;CACV,YAAY;CACZ,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,iBAAiB;CACjB,aAAa;CACb,OAAO;CACP,KAAK;CACL,MAAM;CACN,QAAQ;CACR,MAAM;CACN,SAAS;CACT,SAAS;CACT,OAAO;CACP,OAAO;CACP,SAAS;CACT,SAAS;CACT,QAAQ;CACR,UAAU;CACV,WAAW;CACX,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,aAAa;CACb,QAAQ;CACR,aAAa;CACb,UAAU;CACV,UAAU;CACV,SAAS;CACT,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL,MAAM;CACN,QAAQ;CACR,SAAS;CACT,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;CACP,OAAO;CACP,SAAS;CACT,QAAQ;CACR,UAAU;CACV,WAAW;CACX,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,SAAS;CACT,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,MAAM;CACN,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,WAAW;CACX,OAAO;CACP,UAAU;CACV,QAAQ;CACR,aAAa;CACb,UAAU;CACV,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,MAAM;CACN,MAAM;CACN,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM;CACN,QAAQ;CACR,OAAO;CACP,UAAU;CACV,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,WAAW;CACX,eAAe;CACf,iBAAiB;CACjB,QAAQ;CACR,MAAM;CACN,UAAU;CACV,SAAS;CACT,OAAO;CACP,SAAS;CACT,UAAU;CACV,MAAM;CACN,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,kBAAkB;CAClB,mBAAmB;CACnB,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,KAAK;CACL,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,KAAK;CACL,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,OAAO;CACP,OAAO;CACP,KAAK;CACL,OAAO;CACP,MAAM;CACN,SAAS;CACT,aAAa;CACb,eAAe;CACf,gBAAgB;CAChB,OAAO;CACP,MAAM;CACN,OAAO;CACP,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,SAAS;CACT,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,OAAO;CACP,WAAW;CACX,MAAM;CACN,QAAQ;CACR,UAAU;CACV,cAAc;CACd,eAAe;CACf,cAAc;CACd,eAAe;CACf,UAAU;CACV,iBAAiB;CACjB,kBAAkB;CAClB,KAAK;CACL,OAAO;CACP,KAAK;CACL,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,KAAK;CACL,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,QAAQ;CACR,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,OAAO;CACP,KAAK;CACL,OAAO;CACP,OAAO;CACP,IAAI;CACJ,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,KAAK;CACL,KAAK;CACL,KAAK;CACL,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,KAAK;CACL,MAAM;CACN,QAAQ;CACR,MAAM;CACN,KAAK;CACL,MAAM;CACN,SAAS;CACT,MAAM;CACN,MAAM;CACN,KAAK;CACL,MAAM;AACP;;;;;AC/jEA,MAAM,aAAa;;AAEnB,MAAM,WAAW;AACjB,MAAM,wBAAwB;AAE9B,SAAS,0BAA0B,MAAuB;CACzD,OACC,QAAQ,MACR,SAAS,OACT,SAAS,OACT,SAAS,QACT,SAAS,QACR,QAAQ,QAAU,QAAQ,QAC1B,QAAQ,QAAU,QAAQ,QAC1B,QAAQ,QAAU,QAAQ,QAC3B,SAAS;AAEX;AAEA,SAAS,sBAAsB,QAAyB;CACvD,IAAI,aAAa;CACjB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GACpC,IAAI,CAAC,0BAA0B,OAAO,WAAW,CAAC,CAAC,GAClD,cAAc,OAAO;CAGvB,aAAa,WAAW,YAAY;CACpC,OAAO,CAAC,sBAAsB,KAAK,UAAU;AAC9C;AAEA,SAAS,sBAAsB,WAA2B;CACzD,MAAM,mBAA6B,CAAC;CACpC,KAAK,MAAM,eAAe,UAAU,MAAM,GAAG,GAAG;EAC/C,MAAM,YAAY,YAAY,QAAQ,GAAG;EACzC,IAAI,cAAc,IACjB;EAED,MAAM,WAAW,YAAY,MAAM,GAAG,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY;EACpE,MAAM,QAAQ,YACZ,MAAM,YAAY,CAAC,CAAC,CACpB,KAAK,CAAC,CACN,YAAY;EACd,IAAI,aAAa,qBAAqB,UAAU,aAC/C,iBAAiB,KAAK,6BAA6B;OAC7C,IACN,aAAa,2BACZ,UAAU,YAAY,UAAU,uBAAuB,UAAU,sBAElE,iBAAiB,KAAK,0BAA0B,QAAQ,GAAG;OACrD,IAAI,aAAa,eAAe,+BAA+B,KAAK,KAAK,GAC/E,iBAAiB,KAAK,eAAe,QAAQ,GAAG;OAC1C,IAAI,aAAa,iBAAiB,UAAU,WAClD,iBAAiB,KAAK,uBAAuB;OACvC,IAAI,aAAa,iBAAiB,UAAU,QAClD,iBAAiB,KAAK,oBAAoB;CAE5C;CACA,OAAO,iBAAiB,KAAK,EAAE;AAChC;;;;;;AAOA,SAAS,iBAAiB,MAAsB;CAC/C,MAAM,SAAmB,CAAC;CAC1B,MAAM,WAAqB,CAAC;CAC5B,IAAI,SAAS;CAEb,OAAO,SAAS,KAAK,QAAQ;EAC5B,MAAM,WAAW,KAAK,QAAQ,KAAK,MAAM;EACzC,IAAI,aAAa,IAAI;GACpB,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC;GAC9B;EACD;EACA,OAAO,KAAK,KAAK,MAAM,QAAQ,QAAQ,CAAC;EACxC,MAAM,SAAS,KAAK,QAAQ,KAAK,WAAW,CAAC;EAC7C,IAAI,WAAW,IAAI;GAClB,OAAO,KAAK,WAAW,KAAK,MAAM,QAAQ,CAAC,CAAC;GAC5C;EACD;EAEA,MAAM,QAAQ,KAAK,MAAM,UAAU,SAAS,CAAC;EAC7C,MAAM,aAAa,MAAM,MAAM,sBAAsB;EACrD,MAAM,cAAc,MAAM,MAAM,wBAAwB;EACxD,MAAM,WAAW,MAAM,MAAM,8CAA8C;EAE3E,IAAI,gBAAgB,KAAK,KAAK,GAC7B,OAAO,KAAK,OAAO;OACb,IAAI,YAAY;GACtB,MAAM,OAAO,WAAW,EAAE,CAAC,YAAY;GACvC,SAAS,KAAK,IAAI;GAClB,OAAO,KAAK,MAAM,OAAO,GAAG;EAC7B,OAAO,IAAI,UAAU;GACpB,SAAS,KAAK,MAAM;GACpB,OAAO,KAAK,mBAAkB,oBAAoB,sBAAsB,SAAS,EAAE,CAAC,IAAI,KAAI;EAC7F,OAAO,IAAI,aAAa;GACvB,MAAM,OAAO,YAAY,EAAE,CAAC,YAAY;GACxC,IAAI,SAAS,SAAS,SAAS,OAAO,MAAM;IAC3C,SAAS,IAAI;IACb,OAAO,KAAK,OAAO,OAAO,GAAG;GAC9B,OACC,OAAO,KAAK,WAAW,KAAK,CAAC;EAE/B,OAAO,IAAI,cAAc,KAAK,KAAK,KAAK,SAAS,SAAS,SAAS,OAAO,QAAQ;GACjF,SAAS,IAAI;GACb,OAAO,KAAK,SAAS;EACtB,OACC,OAAO,KAAK,WAAW,KAAK,CAAC;EAE9B,SAAS,SAAS;CACnB;CAEA,OAAO,SAAS,QACf,OAAO,KAAK,OAAO,SAAS,IAAI,IAAI,GAAG;CAExC,OAAO,OAAO,KAAK,EAAE;AACtB;AAWA,SAAS,oBACR,IACA,OACA,QACoC;CACpC,MAAM,SAAS,GAAG,cAAc,CAAC;CACjC,OAAO,OAAO,4BAA4B,OAAO,MAAM;CACvD,MAAM,wBAAQ,IAAI,IAAkC;CACpD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;EACvC,MAAM,QAAQ,OAAO;EACrB,eAAe,OAAO,iBAAiB;EACvC,MAAM,WAAW,KAAK,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;EAC9C,MAAM,SAAS,KAAK,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;EAC5C,MAAM,cAAc,KAAK,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;EACjD,MAAM,YAAY,KAAK,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;EAC/C,IAAI,WAAW,UAAU,cAAc,WACtC;EAED,KAAK,IAAI,MAAM,UAAU,OAAO,QAAQ,EAAE,KACzC,KAAK,IAAI,SAAS,aAAa,UAAU,WAAW,EAAE,QAAQ;GAC7D,MAAM,MAAM,MAAM,mBAAmB;GACrC,IAAI,MAAM,IAAI,GAAG,GAChB,MAAM,IAAI,UAAU,oBAAoB,kDAAkD;GAE3F,MAAM,IACL,KACA,QAAQ,MAAM,EAAE,KAAK,WAAW,MAAM,EAAE,IACrC;IAAE,SAAS,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;IAAG,SAAS,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI;GAAE,IACzE,IACJ;EACD;CAEF;CACA,OAAO;AACR;AAEA,SAAS,aACR,IACA,OACA,UACA,SACA,YACS;CACT,MAAM,QAAkB,CAAC;CAEzB,KAAK,IAAI,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,QAAQ;EAC3D,MAAM,QAAQ,WAAW,IAAI,WAAW,mBAAmB,MAAM;EACjE,IAAI,UAAU,MACb;EAED,MAAM,UAAU,OAAO,WAAW;EAClC,MAAM,UAAU,OAAO,WAAW;EAElC,MAAM,QAAQ,UAAU,MAAM,IAAI,UAAU,QAAQ;EACpD,IAAI,OAAY,QAAQ,IAAI,UAAU,MAAM;EAI5C,IAAI,QAAQ,KAAK,MAAM,OAAO,KAAK,KAAK,QAAQ,CAAC,SAAS,KAAK,CAAC,GAAG;GAClE,IAAI,MAAM,KAAK,CAAC,GACf,OAAO;IAAE,GAAG;IAAK,GAAG;IAAM,GAAG,KAAK;GAAM;QAExC,OAAO;IAAE,GAAG;IAAK,GAAG;IAAM,GAAG,KAAK;GAAM;EAE1C;EAIA,IAAI,cAAc;EAClB,IAAI,QAAQ,KAAK,KAAK,MACrB,cAAc,KAAK,IAAI,iBAAiB,KAAK,CAAC,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,KAAK,EAAE;EAG9F,MAAM,YAAoC,CAAC;EAC3C,IAAI,UAAU,GACb,UAAU,UAAU,OAAO,OAAO;EAEnC,IAAI,UAAU,GACb,UAAU,UAAU,OAAO,OAAO;EAGnC,IAAI,QAAQ,UAEX,cAAc,oCAAkC,cAAc;OACxD,IAAI,MAAM;GAEhB,UAAU,YAAa,QAAQ,KAAK,KAAM;GAC1C,IAAI,KAAK,KAAK,MACb,UAAU,YAAY,KAAK,aAAa,OAAO,KAAK,EAAE,YAAY,IAAI,OAAO,KAAK,CAAC;GAEpF,IAAI,KAAK,KAAK,MACb,UAAU,YAAY,OAAO,KAAK,CAAC;GAEpC,IAAI,KAAK,KAAK,MACb,UAAU,YAAY,KAAK;GAI5B,IACC,KAAK,MACJ,KAAK,EAAE,UAAU,IAAG,CAAE,OAAO,CAAC,MAAM,QACpC,QAAQ,kBAAkB,SAAS,sBAAsB,KAAK,EAAE,UAAU,EAAE,IAE7E,cAAc,iBAAiB,KAAK,aAAa,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC;EAE1E;EAEA,UAAU,MAAM,QAAQ,MAAM,SAAS,MAAM;EAC7C,MAAM,KAAK,iBAAiB,MAAM,aAAa,SAAS,CAAC;CAC1D;CAEA,OAAO,SAAS,MAAM,KAAK,EAAE,IAAI;AAClC;;;;;;;;;;;;AAaA,SAAgB,YAAY,IAAe,MAA+B;CACzE,MAAM,UAA0B,QAAQ,CAAC;CACzC,MAAM,SAAS,QAAQ,UAAU,OAAO,QAAQ,SAAS;CACzD,MAAM,SAAS,QAAQ,UAAU,OAAO,QAAQ,SAAS;CACzD,MAAM,MAAgB,CAAC,MAAM;CAC7B,MAAM,SAAS,IAAI,oBAAoB,QAAQ,mBAAmB,wBAAwB;CAC1F,MAAM,QAAQ,sBAAsB,IAAI,YAAY,GAAG,WAAW,IAAI,GAAG,MAAM;CAC/E,MAAM,OAAiB,CAAC;CACxB,IAAI,GAAG,WAAW,OAAO;EACxB,MAAM,aAAa,oBAAoB,IAAI,OAAO,MAAM;EACxD,KAAK,IAAI,SAAS,MAAM,EAAE,GAAG,UAAU,MAAM,EAAE,GAAG,EAAE,QACnD,KAAK,KAAK,aAAa,IAAI,OAAO,QAAQ,SAAS,UAAU,CAAC;CAEhE;CACA,IAAI,KAAK,iBAAiB,SAAS,KAAK,KAAK,EAAE,GAAG,QAAQ,KAAK,EAAE,IAAI,QAAQ,GAAG,IAAI,IAAI,CAAC;CACzF,IAAI,KAAK,MAAM;CACf,OAAO,IAAI,KAAK,EAAE;AACnB;AAEA,MAAM,iCAAmE;CACxE,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;CACN,KAAM;AACP;AAEA,SAAS,uBAAuB,WAA2B;CAC1D,IAAI,cAAc,KAAK,YAAY,WAAa,aAAa,SAAU,aAAa,OACnF,OAAO;CAER,OAAO,OAAO,cAAc,+BAA+B,cAAc,SAAS;AACnF;;AAGA,SAAS,mBAAmB,GAAmB;CAC9C,OAAO,EAAE,QAAQ,mDAAmD,QAAQ,SAAS,KAAK,SAAS;EAClG,IAAI,MAAM;GACT,MAAM,iBAAiB,OAAO,IAAI;GAClC,OAAO,OAAO,OAAO,oBAAoB,cAAc,IAAI,mBAAmB,kBAAkB;EACjG;EAEA,OAAO,uBADW,SAAS,WAAW,KAAK,UAAU,KAAK,EACpB,CAAC;CACxC,CAAC;AACF;;AAGA,SAAS,UAAU,GAAmB;CACrC,OAAO,EAAE,QAAQ,YAAY,EAAE;AAChC;;AAGA,SAAS,QAAQ,KAAa,MAA6B;CAC1D,MAAM,KAAK,IAAI,OAAO,cAAc,OAAO,uCAAuC,GAAG;CACrF,MAAM,IAAI,IAAI,MAAM,EAAE;CACtB,OAAO,IAAK,EAAE,MAAM,EAAE,KAAM;AAC7B;AAEA,SAAS,cAAc,OAAsB,MAAc,YAAY,OAAe;CACrF,IAAI,SAAS,MACZ,OAAO;CAER,IAAI,EAAE,YAAY,qBAAqB,aAAY,CAAE,KAAK,KAAK,GAC9D,MAAM,IAAI,UACT,aACA,gBAAgB,KAAK,eAAe,YAAY,iBAAiB,WAAW,SAC7E;CAED,MAAM,OAAO,OAAO,KAAK;CACzB,IAAI,CAAC,OAAO,cAAc,IAAI,GAC7B,MAAM,IAAI,UAAU,aAAa,gBAAgB,KAAK,0BAA0B;CAEjF,OAAO;AACR;;AAQA,SAAS,gBAAgB,WAAmB,UAAkC;CAC7E,MAAM,OAAuB,CAAC;CAC9B,IAAI,YAAsB,CAAC;CAC3B,MAAM,eAAe,cAA8B;EAClD,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,EAAE,GACvC,KAAK,KAAK;GAAE,MAAM,UAAU;GAAI,kBAAkB,UAAU,SAAS;EAAE,CAAC;CAE1E;CACA,MAAM,mBAAyB;EAC9B,YAAY,SAAS;EACrB,YAAY,CAAC;CACd;CACA,MAAM,aAAa;CACnB,IAAI;CACJ,OAAQ,QAAQ,WAAW,KAAK,SAAS,GACxC,IAAI,MAAM,IACT,WAAW;MACL,IAAI,MAAM,IAChB,WAAW;MACL;EACN,UAAU,KAAK,MAAM,EAAE;EACvB,IAAI,KAAK,SAAS,UAAU,UAAU,UAAU;GAC/C,WAAW;GACX,OAAO;EACR;CACD;CAED,WAAW;CACX,OAAO;AACR;;AAGA,SAAS,UAAU,MAAc,UAA4C;CAC5E,IAAI,YAAY,MAAM;EACrB,QAAQ,MAAR;GACC,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;GACjB,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;GACjB,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;GACjB,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;GACjB,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;GACjB,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;EAClB;EACA,OAAO;CACR;CACA,MAAM,eAAe,mBAAmB,QAAQ;CAChD,QAAQ,MAAR;EACC,KAAK,KAAK;GACT,MAAM,QAAQ,OAAO,YAAY;GACjC,OAAO,OAAO,SAAS,KAAK,IAAI;IAAE,GAAG;IAAK,GAAG;GAAM,IAAI;EACxD;EACA,KAAK,KACJ,OAAO;GAAE,GAAG;GAAK,GAAG,iBAAiB,UAAU,iBAAiB;EAAI;EACrE,KAAK,KAAK;GACT,MAAM,QAAQ,IAAI,KAAK,YAAY;GACnC,OAAO,OAAO,MAAM,MAAM,QAAQ,CAAC,IAAI,OAAO;IAAE,GAAG;IAAK,GAAG;GAAM;EAClE;EACA,KAAK,KAAK;GACT,MAAM,QAAQ,OAAO,YAAY;GACjC,OAAO,OAAO,SAAS,KAAK,IAAI;IAAE,GAAG;IAAK,GAAG;GAAM,IAAI;EACxD;EACA,KAAK,KACJ,OAAO;GAAE,GAAG;GAAK,GAAG;EAAa;EAClC,KAAK,KACJ,OAAO,EAAE,GAAG,IAAI;CAClB;CACA,OAAO;AACR;;AAGA,SAAS,gBAAgB,MAAyC;CACjE,IAAI,SAAS,IACZ,OAAO;CAER,IAAI,SAAS,UAAU,SAAS,QAC/B,OAAO;CAER,IAAI,SAAS,WAAW,SAAS,SAChC,OAAO;CAER,MAAM,MAAM,OAAO,IAAI;CACvB,IAAI,KAAK,SAAS,KAAK,CAAC,MAAM,GAAG,KAAK,SAAS,GAAG,GACjD,OAAO;CAER,OAAO;AACR;AAEA,SAAS,aAAa,WAA2B;CAChD,OAAO,mBAAmB,UAAU,UAAU,QAAQ,mBAAmB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;AACvF;;;;;;;;;;;;;AAcA,SAAgB,YAAY,MAAc,MAAkC;CAC3E,MAAM,UAAU,QAAQ,CAAC;CACzB,MAAM,UAAU,qBAAqB,QAAQ,kBAAkB,eAAe,kBAAkB;CAChG,MAAM,YAAY,qBAAqB,QAAQ,WAAW,GAAG,WAAW;CACxE,MAAM,SAAS,IAAI,oBAAoB,QAAQ,mBAAmB,wBAAwB;CAE1F,MAAM,aAAa,KAAK,MAAM,kCAAkC;CAChE,IAAI,CAAC,YACJ,OAAO,aAAa,CAAC,CAAC;CAGvB,MAAM,YAAY,WAAW;CAG7B,MAAM,aAAa,gBAAgB,WADlC,YAAY,IAAI,KAAK,IAAI,WAAW,gBAAgB,CAAC,IAAI,KAAK,IAAI,SAAS,aAAa,IAAI,CAChC;CAC7D,MAAM,mBAAmB,WAAW;CACpC,IAAI,4BACH,MAAM,IAAI,UAAU,aAAa,qCAAqC,eAAe;CAEtF,IAAI,mBAAmB,SACtB,MAAM,IAAI,UAAU,kBAAkB,uBAAuB,iBAAiB,iBAAiB,SAAS;CAGzG,MAAM,OAAgB,CAAC;CAEvB,MAAM,WAAoD,CAAC;CAE3D,KAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,KAAK;EAC1C,IAAI,CAAC,KAAK,IACT,KAAK,KAAK,CAAC;EAEZ,IAAI,CAAC,SAAS,IACb,SAAS,KAAK,CAAC;EAIhB,MAAM,cADU,WAAW,EAAE,CAAC,KACF,MAAM,iCAAiC,KAAK,CAAC;EAEzE,IAAI,MAAM;EACV,KAAK,IAAI,KAAK,GAAG,KAAK,YAAY,QAAQ,MAAM;GAE/C,OAAO,SAAS,EAAE,CAAC,MAClB;GAED,IAAI,cACH,MAAM,IAAI,UAAU,aAAa,sCAAsC,kBAAkB;GAG1F,MAAM,WAAW,YAAY;GAC7B,MAAM,SAAS,SAAS,QAAQ,GAAG;GACnC,MAAM,MAAM,SAAS,MAAM,GAAG,SAAS,CAAC;GAExC,MAAM,aAAa,QAAQ,KAAK,SAAS;GACzC,MAAM,aAAa,QAAQ,KAAK,SAAS;GACzC,MAAM,kBAAkB,cAAc,YAAY,WAAW,IAAI;GACjE,MAAM,KAAK,oBAAoB,IAAI,WAAW,EAAE,CAAC,mBAAmB;GACpE,MAAM,KAAK,cAAc,YAAY,SAAS;GAC9C,IAAI,IAAI,gBAAsB,MAAM,YACnC,MAAM,IAAI,UAAU,aAAa,wDAAwD;GAE1F,MAAM,kBAAkB,YAAY,IAAI,KAAK,IAAI,IAAI,YAAY,CAAC,IAAI;GACtE,OAAO,OAAO,kBAAkB,kBAAkB,EAAE;GACpD,MAAM,QAAQ,QAAQ,KAAK,QAAQ;GACnC,MAAM,QAAQ,QAAQ,KAAK,QAAQ;GACnC,MAAM,QAAQ,QAAQ,KAAK,QAAQ;GACnC,MAAM,QAAQ,QAAQ,KAAK,QAAQ;GAGnC,MAAM,YAAY,SAAS,MAAM,SAAS,GAAG,SAAS,YAAY,IAAI,CAAC;GACvE,MAAM,eAAe,QAAQ,UAAU,OAAO,KAAK,IAAI;GACvD,IAAI;GACJ,IAAI,cAAc;IACjB,IAAI,SAAS,MACZ,aAAa,IAAI,mBAAmB,KAAK;IAE1C,IAAI,SAAS,MACZ,aAAa,IAAI,mBAAmB,KAAK;IAE1C,QAAQ;GACT,OACC,QAAQ,gBAAgB,aAAa,SAAS,CAAC;GAGhD,KAAK,EAAE,CAAC,OAAO;GAGf,KAAK,IAAI,KAAK,GAAG,KAAK,iBAAiB,MACtC,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,MAAM;IAC/B,IAAI,OAAO,KAAK,OAAO,GACtB;IAED,MAAM,KAAK,IAAI;IACf,MAAM,KAAK,MAAM;IACjB,IAAI,CAAC,SAAS,KACb,SAAS,MAAM,CAAC;IAEjB,SAAS,GAAG,CAAC,MAAM;GACpB;GAID,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,MACzB,KAAK,EAAE,CAAC,MAAM,MAAM;GAGrB,OAAO;EACR;CACD;CAEA,OAAO,aAAa,IAAI;AACzB;;;;;;;;;AC9jBA,SAAS,cAAc,MAAW,MAA+B;CAChE,IAAI,gBAAgB,YACnB,OAAO;CAER,IAAI,gBAAgB,aACnB,OAAO,IAAI,WAAW,IAAI;CAE3B,IAAI,OAAO,WAAW,eAAe,OAAO,SAAS,IAAI,GAExD,OAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,MAAM;CAEhE,IAAI,OAAO,SAAS,UAAU;EAC7B,IAAI,KAAK,SAAS,UACjB,OAAO,aAAa,IAAI;EAGzB,MAAM,KAAK,IAAI,WAAW,KAAK,MAAM;EACrC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAClC,GAAG,KAAK,KAAK,WAAW,CAAC;EAE1B,OAAO;CACR;CACA,IAAI,MAAM,QAAQ,IAAI,GACrB,OAAO,IAAI,WAAW,IAAI;CAE3B,MAAM,IAAI,UAAU,oBAAoB,kCAAkC;AAC3E;;;;;;AAOA,SAAS,YAAY,MAAgC;CACpD,IAAI,gBAAgB,cAAc,gBAAgB,aACjD,OAAO;CAER,IAAI,OAAO,WAAW,eAAe,OAAO,SAAS,IAAI,GACxD,OAAO;CAER,IAAI,OAAO,SAAS,UACnB,OAAO;CAER,OAAO;AACR;;AAGA,SAAS,gBAAgB,IAAS,MAAyB;CAC1D,MAAM,IAAI,QAAQ;CAClB,OAAO;EACN,YAAY,CAAC,CAAC;EACd,QAAQ,GAAG,IAAI,GAAG;CACnB;AACD;AAsBA,SAAS,6BAA6B,SAA4B;CACjE,KAAK,MAAM,CAAC,MAAM,cAAc;EAC/B,CAAC,aAAa,QAAQ,SAAS;EAC/B,CAAC,WAAW,QAAQ,OAAO;EAC3B,CAAC,YAAY,QAAQ,QAAQ;EAC7B,CAAC,QAAQ,QAAQ,IAAI;CACtB,GACC,IAAI,WACH,MAAM,IAAI,UAAU,eAAe,gBAAgB,KAAK,mBAAmB;AAG9E;AAEA,SAAS,iBAAiB,UAAoB,SAAkC;CAC/E,IAAI,QAAQ,cAAc,QAAQ,WACjC,OAAO;EACN,YAAY,SAAS;EACrB,OAAO,SAAS,SAAS,CAAC;EAC1B,WAAW,SAAS,aAAa,CAAC;CACnC;CAED,IAAI,QAAQ,YACX,OAAO,EAAE,YAAY,SAAS,WAAW;CAE1C,IAAI,QAAQ,WACX,OAAO;EAAE,OAAO,SAAS,SAAS,CAAC;EAAG,WAAW,SAAS,aAAa,CAAC;CAAE;CAE3E,OAAO;AACR;AAkBA,eAAsB,KAAK,MAAW,MAAyC;CAC9E,MAAM,UAAuB,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;CACnD,IAAI,QAAQ,UACX,MAAM,IAAI,UAAU,eAAe,gDAAgD;CAEpF,6BAA6B,OAAO;CACpC,iBAAiB;CACjB,IAAI,CAAC,QAAQ,MACZ,QAAQ,OAAO,YAAY,IAAI;CAIhC,IAAI,QAAQ,SAAS,YAAY,OAAO,SAAS,UAAU;EAE1D,IADgB,KAAK,UACX,CAAC,CAAC,OAAO,CAAC,MAAM,KACzB,OAAO,iBAAiB,gBAAgB,YAAY,MAAM,OAAO,CAAC,GAAG,OAAO;EAE7E,OAAO,iBAAiB,gBAAgB,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO;CAC5E;CAEA,MAAM,KAAK,cAAc,MAAM,OAAO;CAGtC,IAAI,GAAG,OAAO,MAAQ,GAAG,OAAO,IAAM;EACrC,MAAM,MAAM,MAAM,QAAQ,IAAI,OAAO;EACrC,OAAO,SAAS,KAAK,OAAO;CAC7B;CAGA,IAAI,GAAG,OAAO,MAAQ,GAAG,OAAO,MAAQ,GAAG,OAAO,MAAQ,GAAG,OAAO,IACnE,MAAM,IAAI,UAAU,eAAe,+BAA+B;CAInE,IAAI,GAAG,OAAO,OAAQ,GAAG,OAAO,MAAQ,GAAG,OAAO,MAAQ,GAAG,OAAO,IACnE,MAAM,IAAI,UAAU,eAAe,qCAAqC;CAGzE,MAAM,IAAI,UAAU,eAAe,gEAAgE;AACpG;;;;;;;;;;;;;;;ACtJA,SAAgB,aAAa,IAAc,MAAuB;CAEjE,IAAI,MAAM,CAAE,GAAW,KACtB,AAAC,GAAW,MAAM,EAAE,GAAG,YAAY;CAEpC,IAAI,MAAO,GAAW,KAAK;EAC1B,iBAAiB;EACjB,gBAAiB,GAAW,GAAG;CAChC;CAGA,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE;CACxB,KAAK,SAAS,EAAE,OAAO,CAAC,EAAE;CAC1B,KAAK,UAAU,CAAC;CAChB,KAAK,QAAQ,QAAQ;CACrB,KAAK,QAAQ,SAAS;CACtB,KAAK,6BAAa,IAAI,IAAI;CAE1B,MAAM,KAAK,mBAAmB;CAC9B,MAAM,MAAM,UAAU;CACtB,IAAI,WAAW;CAEf,KAAK,UAAU,CAAC;CAChB,IAAI,KAAK,YACR,KAAK,gBAAgB,mBAAmB,IAAI,IAAI;CAGjD,IAAI,CAAC,GAAG,OACP,GAAG,QAAQ,CAAC;CAIb,WAAW;CACX,aAAa,KAAK,UAAU,oBAAoB,GAAG,OAAO,IAAI,CAAC;CAC/D,GAAG,UAAU,KAAK,QAAQ;CAC1B,gBAAgB,KAAK,MAAM,GAAG,UAAUC,KAAQ,UAAU;CAG1D,WAAW;CACX,IAAI,GAAG,SAAU,GAAG,MAAc,YAAY,CAE9C,OAAO,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,SAAS,QACvC,AAAC,GAAG,MAAc,aAAa,GAAG;MAC5B;EAEN,MAAM,oBAA8B,CAAC;EACrC,KAAK,IAAI,WAAW,GAAG,WAAW,GAAG,WAAW,QAAQ,EAAE,UACzD,KAAK,GAAG,SAAS,OAAO,aAAc,CAAC,EAAS,CAAE,WAAW,GAC5D,kBAAkB,KAAK,GAAG,WAAW,SAAS;EAGhD,AAAC,GAAG,MAAc,aAAa;CAChC;CACA,AAAC,GAAG,MAAc,aAAc,GAAG,MAAc,WAAW;CAC5D,aAAa,KAAK,UAAU,wBAAwB,GAAG,KAAK,CAAC;CAC7D,GAAG,SAAS,KAAK,QAAQ;CACzB,gBAAgB,KAAK,MAAM,GAAG,UAAUA,KAAQ,SAAS;CAGzD,IAAI,GAAG,cAAc,GAAG,SAAS,OAAO,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG;EAC5E,WAAW;EACX,aAAa,KAAK,UAAU,sBAAsB,GAAG,SAAS,CAAC;EAC/D,GAAG,UAAU,KAAK,QAAQ;EAC1B,gBAAgB,KAAK,MAAM,GAAG,UAAUA,KAAQ,UAAU;CAC3D;CAGA,MAAM,SAAmB,CAAC,SAAS;CACnC,KAAK,OAAO;CAGZ,KAAK,IAAI,MAAM,GAAG,OAAO,GAAG,WAAW,QAAQ,EAAE,KAAK;EACrD,MAAM,SAAwB,EAAE,OAAO,CAAC,EAAE;EAC1C,MAAM,KAAK,GAAG,OAAO,GAAG,WAAW,MAAM;EACzC,IAAI,WAA8B,CAAC;EACnC,IAAI,SAAS;EAEb,IAAI,IAAI;GACP,WAAW,oBAAoB,EAAE;GAEjC,IAAI,SAAS,WAAW,KAAK,MAAM,QAAS,GAAW,YAAY,GAClE,WAAY,GAAW,YAAY,CAAC,KAAK,CAAC,KAAK,UAA2B;IACzE,MAAM,SAAS,KAAK,KAAK,aAAa,EAAE,GAAG,QAAQ,EAAE;IACrD,IAAK,KAAa,UAAU,MAC3B,AAAC,OAAe,SAAU,KAAa;IAExC,OAAO,CAAC,KAAK,MAAM;GACpB,CAAC;GAIF,KAAK,MAAM,GAAG,SAAS,UACtB,IAAI,KAAK,MAAM,YAAY,QAAQ,MAAM,IAAI,GAC5C,KAAK,MAAM,WAAW,MACrB,QAAQ,IAAI;GAIf,SAAS,SAAS,MAAM,GAAG,UAAU,KAAK,MAAM,YAAY,QAAQ,MAAM,IAAI,CAAC;GAC/E,IAAI,QACH,gBAAgB,QAAQ,IAAI,wCAAwC,MAAM,QAAQA,KAAQ,KAAK;GAEhG,IAAI,SAAS,SAAS,GAAG;IACxB,gBAAgB,QAAQ,IAAI,gBAAgB,MAAM,QAAQA,KAAQ,IAAI;IACtE,gBAAgB,QAAQ,IAAI,2BAA2B,MAAM,QAAQA,KAAQ,GAAG;GACjF;EACD;EAEA,WAAW,wBAAwB,MAAM;EACzC,aAAa,KAAK,UAAU,kBAAkB,MAAO,CAAC,GAAW,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;EAC3F,GAAG,OAAO,KAAK,QAAQ;EACvB,gBAAgB,KAAK,QAAQ,IAAI,qBAAqB,MAAM,QAAQA,KAAQ,KAAK;EAEjF,IAAI,SAAS,SAAS,GAAG;GAExB,IAAI,QAAQ;IACX,MAAM,KAAK,wCAAwC,MAAM;IACzD,aAAa,KAAK,IAAI,cAAc,UAAU,QAAQ,IAAI,CAAC;IAC3D,GAAG,iBAAiB,KAAK,EAAE;GAC5B;GAGA,MAAM,MAAM,gBAAgB,MAAM;GAClC,aAAa,KAAK,KAAK,iBAAiB,QAAQ,CAAC;GACjD,GAAG,SAAS,KAAK,GAAG;GAGpB,aAAa,KAAK,2BAA2B,MAAM,QAAQ,SAAS,KAAK,QAAQ,CAAC;EACnF;EAGA,IAAK,OAAO,MAAM,CAAS,MAC1B,aAAa,KAAK,YAAY,QAAQ,GAAG,mBAAmB,MAAM,CAAC;CAErE;CAGA,IAAI,KAAK,WAAW,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACpD,WAAW;EACX,aAAa,KAAK,UAAU,YAAY,KAAK,SAAS,IAAI,CAAC;EAC3D,GAAG,KAAK,KAAK,QAAQ;EACrB,gBAAgB,KAAK,QAAQ,IAAI,qBAAqBA,KAAQ,GAAG;CAClE;CAGA,WAAW;CACX,aAAa,KAAK,UAAU,iBAAiB,EAAE,CAAC;CAChD,GAAG,UAAU,KAAK,QAAQ;CAC1B,gBAAgB,KAAK,MAAM,GAAG,UAAUA,KAAQ,EAAE;CAGlD,WAAW;CACX,aAAa,KAAK,UAAU,gBAAgB,CAAC;CAC7C,GAAG,OAAO,KAAK,QAAQ;CACvB,gBAAgB,KAAK,QAAQ,IAAI,oBAAoBA,KAAQ,KAAK;CAGlE,WAAW;CACX,aAAa,KAAK,UAAU,eAAe,IAAI,IAAI,CAAC;CACpD,GAAG,OAAO,KAAK,QAAQ;CACvB,gBAAgB,KAAK,QAAQ,IAAI,cAAcA,KAAQ,GAAG;CAG1D,WAAW;CACX,aAAa,KAAK,UAAU,iBAAiB,CAAC;CAC9C,GAAG,SAAS,KAAK,QAAQ;CACzB,gBAAgB,KAAK,QAAQ,IAAI,gBAAgBA,KAAQ,IAAI;CAG7D,IAAI,OAAO,SAAS,GAAG;EACtB,WAAW;EACX,aAAa,KAAK,UAAU,eAAe,MAAM,CAAC;EAClD,GAAG,OAAO,KAAK,QAAQ;EACvB,gBAAgB,KAAK,QAAQ,IAAI,sBAAsBA,KAAQ,MAAM;CACtE;CAGA,aAAa,KAAK,uBAAuB,kBAAkB,IAAI,IAAI,CAAC;CACpE,aAAa,KAAK,eAAe,mBAAmB,KAAK,IAAI,CAAC;CAC9D,aAAa,KAAK,8BAA8B,mBAAmB,KAAK,MAAM,CAAC;CAE/E,OAAO;AACR;;;;;AC1MA,SAAS,iBAAiB,MAA0B;CACnD,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI;AACrC;;AAGA,SAAS,WAAW,MAAc,MAA4B;CAC7D,QAAQ,MAAR;EACC,KAAK,UACJ,OAAO;EACR,KAAK,UACJ,OAAO,aAAa,iBAAiB,IAAI,CAAC;EAC3C,KAAK;GACJ,IAAI,OAAO,WAAW,aACrB,OAAO,OAAO,KAAK,MAAM,MAAM;GAEhC,OAAO,iBAAiB,IAAI;EAC7B,KAAK,SACJ,OAAO,iBAAiB,IAAI;EAC7B,SACC,OAAO;CACT;AACD;AAaA,SAAS,cAAc,OAAyB;CAC/C,IAAI,SAAS,MACZ,OAAO;CAER,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GACnD,OAAO,MAAM,SAAS;CAEvB,IAAI,iBAAiB,eAAe,YAAY,OAAO,KAAK,GAC3D,OAAO,MAAM,aAAa;CAE3B,OAAO;AACR;AAEA,SAAS,8BAA8B,IAAc,SAA6B;CACjF,IAAI,QAAQ,SACX,MAAM,IAAI,UAAU,eAAe,2CAAyC;CAE7E,IAAI,QAAQ,WACX,MAAM,IAAI,UAAU,eAAe,6CAA2C;CAE/E,IAAI,cAAc,IAAI,MAAM,GAC3B,MAAM,IAAI,UAAU,eAAe,iDAAiD;AAEtF;;AAGA,SAAS,WAAW,IAAc;CACjC,OAAO,GAAG,OAAO,GAAG,WAAW;AAChC;AAeA,eAAsB,MAAM,IAAc,MAA2C;CACpF,MAAM,UAAe,EAAE,GAAG,KAAK;CAC/B,IAAI,QAAQ,UACX,MAAM,IAAI,UAAU,eAAe,gDAAgD;CAEpF,8BAA8B,IAAI,OAAO;CACzC,iBAAiB;CACjB,IAAI,CAAC,QAAQ,CAAE,KAAa,QAC3B,iBAAiB,EAAE;CAGpB,IAAI,QAAQ,YAAY;EACvB,QAAQ,SAAS;EACjB,QAAQ,aAAa;CACtB;CAIA,QAFiB,QAAQ,YAAY,QAErC;EACC,KAAK,OAAO;GACX,MAAM,KAAK,WAAW,EAAE;GACxB,OAAO,WAAW,KAAK,WAAW,IAAI,OAAO,IAAI,IAAI,QAAQ,IAAI;EAClE;EACA,KAAK,OAAO;GACX,MAAM,KAAK,WAAW,EAAE;GACxB,OAAO,WAAW,KAAK,WAAW,IAAI,OAAO,IAAI,IAAI,QAAQ,IAAI;EAClE;EACA,KAAK,QAAQ;GACZ,MAAM,KAAK,WAAW,EAAE;GACxB,OAAO,WAAW,KAAK,YAAY,IAAI,OAAO,IAAI,IAAI,QAAQ,IAAI;EACnE;EACA,SAAS;GACR,MAAM,MAAM,aAAa,IAAI,OAAO;GACpC,MAAM,aAAa,MAAM,SAAS,KAAK,CAAC,CAAC,QAAQ,WAAW;GAE5D,QAAQ,QAAQ,MAAhB;IACC,KAAK,UACJ,OAAO,gBAAgB,UAAU;IAClC,KAAK;KACJ,IAAI,OAAO,WAAW,aACrB,OAAO,OAAO,KAAK,WAAW,QAAQ,WAAW,YAAY,WAAW,UAAU;KAEnF,OAAO;IACR,KAAK,SACJ,OAAO;IACR,SACC,OAAO;GACT;EACD;CACD;AACD;;AAGA,SAAS,gBAAgB,MAA0B;CAClD,OAAO,aAAa,IAAI;AACzB;;;;;;;;;;;ACzHA,SAAgB,eAAe,IAAgB,QAA2B;CACzE,MAAM,KAAe;EAAE,YAAY,CAAC;EAAG,QAAQ,CAAC;CAAE;CAClD,IAAI,IACH,YAAY,IAAI,IAAI,UAAU,QAAQ;CAEvC,OAAO;AACR;;;;;;;;;;;;;;AAeA,SAAgB,YAAY,IAAc,IAAe,MAAe,MAAwB;CAC/F,IAAI,IAAI;CACR,IAAI,CAAC,MAEJ;SAAO,KAAK,OAAQ,EAAE,GAAG,OAAO,QAC/B,IAAI,GAAG,WAAW,QAAS,OAAO,UAAU,CAAE,MAAM,IACnD;CAEF;CAED,IAAI,CAAC,QAAQ,GAAG,WAAW,UAAU,OACpC,MAAM,IAAI,UAAU,kBAAkB,qBAAqB;CAG5D,IAAI,QAAQ,GAAG,WAAW,QAAQ,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI;EACjE,MAAM,IAAI,KAAK,MAAM,MAAM;EAC3B,IAAK,KAAK,CAAC,EAAE,MAAO;EACpB,MAAM,OAAQ,KAAK,KAAK,MAAM,GAAG,EAAE,KAAK,KAAM;EAC9C,KAAK,EAAE,GAAG,KAAK,OAAQ,EAAE,GACxB,IAAI,GAAG,WAAW,QAAS,OAAO,OAAO,CAAE,MAAM,IAChD;CAGH;CACA,kBAAkB,IAAI;CACtB,IAAI,GAAG,WAAW,QAAQ,IAAI,KAAK,GAClC,MAAM,IAAI,UAAU,aAAa,0BAA0B,OAAO,mBAAmB;CAGtF,GAAG,WAAW,KAAK,IAAI;CAGvB,OAAO,eAAe,GAAG,QAAQ,MAAM;EACtC,OAAO;EACP,YAAY;EACZ,cAAc;EACd,UAAU;CACX,CAAC;CACD,OAAO;AACR;;;;;;;AAQA,SAAgB,YAAY,MAAuC;CAClE,MAAM,MAAW,CAAC;CAClB,IAAI,MAAM,OACT,IAAI,WAAW,CAAC;CAEjB,OAAO;AACR;;;;;;;;;AAUA,SAAgB,cAAc,IAAc,IAA6B;CACxE,IAAI,OAAO,OAAO,UAAU;EAC3B,IAAI,MAAM,KAAK,GAAG,WAAW,SAAS,IACrC,OAAO;EAER,MAAM,IAAI,UAAU,aAAa,yBAAyB,EAAE;CAC7D,OAAO,IAAI,OAAO,OAAO,UAAU;EAClC,MAAM,MAAM,GAAG,WAAW,QAAQ,EAAE;EACpC,IAAI,QAAQ,IACX,OAAO;EAER,MAAM,IAAI,UAAU,aAAa,6BAA6B,KAAK,GAAG;CACvE;CACA,MAAM,IAAI,UAAU,aAAa,wBAAwB,KAAK,GAAG;AAClE;;;;;;;;;;AAWA,SAAgB,mBAAmB,IAAc,IAAqB,KAAsB;CAC3F,IAAI,CAAC,GAAG,UACP,GAAG,WAAW,CAAC;CAEhB,IAAI,CAAC,GAAG,SAAS,QAChB,GAAG,SAAS,SAAS,CAAC;CAGvB,MAAM,MAAM,cAAc,IAAI,EAAE;CAChC,IAAI,CAAC,GAAG,SAAS,OAAO,MACvB,GAAG,SAAS,OAAO,OAAO,CAAC;CAG5B,QAAQ,KAAR;EACC,KAAK;EACL,KAAK;EACL,KAAK,GACJ;EACD,SACC,MAAM,IAAI,UAAU,oBAAoB,kCAAkC,GAAG;CAC/E;CACA,GAAG,SAAS,OAAO,IAAI,CAAC,SAAS;AAClC;;;;;;;;AASA,SAAgB,oBAAoB,MAAkB,KAAkC;CACvF,KAAK,IAAI;CACT,OAAO,KAAK;CACZ,OAAO;AACR;;;;;;AAOA,SAAgB,aAAa,MAAkB,OAA8B;CAC5E,KAAK,IAAI;CACT,OAAO;AACR;AAEA,SAAS,eAAe,IAAe,OAAoB;CAC1D,IAAI,CAAC,GAAG,SAAS;EAChB,GAAG,UAAU,YAAY,KAAK;EAC9B;CACD;CACA,MAAM,UAAU,YAAY,GAAG,OAAO;CACtC,IAAI,QAAQ,EAAE,IAAI,MAAM,EAAE,GACzB,QAAQ,EAAE,IAAI,MAAM,EAAE;CAEvB,IAAI,QAAQ,EAAE,IAAI,MAAM,EAAE,GACzB,QAAQ,EAAE,IAAI,MAAM,EAAE;CAEvB,IAAI,QAAQ,EAAE,IAAI,MAAM,EAAE,GACzB,QAAQ,EAAE,IAAI,MAAM,EAAE;CAEvB,IAAI,QAAQ,EAAE,IAAI,MAAM,EAAE,GACzB,QAAQ,EAAE,IAAI,MAAM,EAAE;CAEvB,GAAG,UAAU,YAAY,OAAO;AACjC;;;;;;;AAQA,SAAgB,WACf,IACA,OACA,OACA,MACY;CACZ,MAAM,MAAM,OAAO,UAAU,WAAW,gBAAgB,KAAK,IAAI;CACjE,MAAM,cAAc,CAAC,CAAC,MAAM;CAC5B,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GACrC,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG;EACxC,MAAM,OAAO,cAAc,gBAAgB,IAAI,GAAG,CAAC,IAAI,QAAQ,IAAI,GAAG,CAAC;EACvE,IAAI,MACH,KAAK,IAAI;CAEX;CAED,IAAI,aACH,eAAe,IAAI,GAAG;CAEvB,OAAO;AACR;;;;;;AAOA,SAAgB,WAAW,IAAe,OAAkC;CAC3E,MAAM,MAAM,OAAO,UAAU,WAAW,gBAAgB,KAAK,IAAI;CACjE,IAAI,CAAC,GAAG,YACP,GAAG,aAAa,CAAC;CAElB,GAAG,UAAU,CAAC,KAAK,GAAG;CACtB,eAAe,IAAI,GAAG;CACtB,OAAO;AACR;;;;;;;AAQA,SAAgB,aAAa,IAAe,KAAa,KAAwB;CAChF,IAAI,CAAC,GAAG,UACP,GAAG,WAAW,CAAC;CAEhB,IAAI,CAAC,GAAG,QAAQ,CAAC,MAChB,GAAG,QAAQ,CAAC,OAAO,CAAC;CAErB,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM;CACvB,OAAO;AACR;;;;;;;AAQA,SAAgB,eAAe,IAAe,KAAa,OAA0B;CACpF,IAAI,CAAC,GAAG,UACP,GAAG,WAAW,CAAC;CAEhB,IAAI,CAAC,GAAG,QAAQ,CAAC,MAChB,GAAG,QAAQ,CAAC,OAAO,CAAC;CAErB,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ;CACzB,OAAO;AACR;;;;;;AAOA,SAAgB,YAAY,IAAe,MAAuD;CACjG,GAAG,YAAY,CACd;EACC,OAAO;EACP,QAAQ,KAAK;EACb,QAAQ,KAAK;CACd,CACD;CACA,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,iBAAiB,MAAkB,QAAiB,SAA8B;CACjG,IAAI,CAAC,QACJ,OAAO,KAAK;MACN;EACN,KAAK,IAAI,EAAE,QAAQ,OAAO;EAC1B,IAAI,SACH,KAAK,EAAE,UAAU;CAEnB;CACA,OAAO;AACR;;;;;;;;;;;AAYA,SAAgB,oBAAoB,MAAkB,OAAe,SAA8B;CAClG,OAAO,iBAAiB,MAAM,MAAM,OAAO,OAAO;AACnD;;;;;;;;;;;AAYA,SAAgB,eAAe,MAAkB,MAAc,QAAuB;CACrF,IAAI,CAAC,KAAK,GACT,KAAK,IAAI,CAAC;CAEX,KAAK,EAAE,KAAK;EAAE,GAAG;EAAM,GAAG,UAAU;CAAU,CAAC;AAChD;;;;;;;;;;;;;;AAeA,SAAgB,gBACf,IACA,OACA,SACA,SACY;CACZ,MAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,gBAAgB,KAAK;CACrE,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,YAAY,KAAK;CAEpE,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GACrC,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG;EACxC,MAAM,OAAO,gBAAgB,IAAI,GAAG,CAAC;EACrC,KAAK,IAAI;EACT,KAAK,IAAI;EACT,OAAO,KAAK;EAEZ,IAAI,MAAM,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,GAAG;GACnC,KAAK,IAAI;GACT,IAAI,SACH,KAAK,IAAI;EAEX;CACD;CAID,IAAI,GAAG,SAAS;EACf,MAAM,MAAM,YAAY,GAAG,OAAO;EAClC,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GACnB,IAAI,EAAE,IAAI,IAAI,EAAE;EAEjB,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GACnB,IAAI,EAAE,IAAI,IAAI,EAAE;EAEjB,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GACnB,IAAI,EAAE,IAAI,IAAI,EAAE;EAEjB,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GACnB,IAAI,EAAE,IAAI,IAAI,EAAE;EAEjB,GAAG,UAAU,YAAY,GAAG;CAC7B,OACC,GAAG,UAAU,YAAY,GAAG;CAE7B,OAAO;AACR;;;;;;;;;;;;AAaA,SAAgB,gBAAgB,IAAe,MAAqC;CACnF,IAAI,MAAM,QAAQ,GAAG,WAAW,MAC/B,OAAO,CAAC;CAET,MAAM,SAAS,IAAI,oBAAoB,MAAM,mBAAmB,wBAAwB;CACxF,MAAM,IAAI,sBAAsB,IAAI,gBAAgB,GAAG,OAAO,GAAG,MAAM;CACvE,IAAI,CAAC,GACJ,OAAO,CAAC;CAET,MAAM,OAAiB,CAAC;CACxB,MAAM,OAAiB,CAAC;CAGxB,KAAK,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,GACjC,KAAK,KAAK,UAAU,CAAC;CAGtB,KAAK,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG;EACpC,MAAM,KAAK,UAAU,CAAC;EACtB,KAAK,IAAI,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG;GACpC,MAAM,IAAI,KAAK,KAAK;GACpB,MAAM,IAAI,QAAQ,IAAI,GAAG,CAAC;GAC1B,IAAI,MAAM,QACT;GAED,IAAI,MAAM;GACV,IAAI,MAAM;GAEV,IAAI,EAAE,KAAK,MAAM;IAChB,MAAM,EAAE;IACR,IAAI,CAAC,EAAE,GACN;IAED,MAAM,EAAE;IAER,IAAI,IAAI,QAAQ,GAAG,MAAM,IACxB,MAAM,MAAM,MAAM;GAEpB;GACA,IAAI,EAAE,KAAK,MACV,MAAM,EAAE;QACF,IAAI,EAAE,MAAM,KAClB;QACM,IAAI,EAAE,MAAM,OAAO,EAAE,KAAK,MAChC,MAAM,KAAK,EAAE;QACP,IAAI,EAAE,MAAM,KAClB,MAAM,EAAE,IAAI,SAAS;QACf,IAAI,EAAE,MAAM,QAClB,MAAM,MAAM,EAAE;QACR,IAAI,EAAE,MAAM,QAClB;QACM,IAAI,EAAE,MAAM,KAClB,MAAM,MAAM,EAAE;QAEd,MAAM,KAAK,EAAE;GAEd,KAAK,KAAK,MAAM,MAAM,GAAG;EAC1B;CACD;CACA,OAAO;AACR;;;;AClXA,MAAa,UAAU"}